diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_15/piqa_2025-12-04T00-12-40.875023.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_15/piqa_2025-12-04T00-12-40.875023.json new file mode 100644 index 0000000000000000000000000000000000000000..1f49e0a80e7237b1657342f1462ab427fea4dbc0 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_15/piqa_2025-12-04T00-12-40.875023.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7616974972796517, + "acc_stderr,none": 0.009940334245876203, + "acc_norm,none": 0.7595212187159956, + "acc_norm_stderr,none": 0.009971345364651076 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764778314.061464, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1079194.757209335, + "end_time": 1079275.033348769, + "total_evaluation_time_seconds": "80.27613943396136" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/arc_challenge_2025-12-04T01-17-29.963978.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/arc_challenge_2025-12-04T01-17-29.963978.json new file mode 100644 index 0000000000000000000000000000000000000000..9695a03077434d3af3310ebf062849dbc1be33db --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/arc_challenge_2025-12-04T01-17-29.963978.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.43430034129692835, + "acc_stderr,none": 0.014484703048857362, + "acc_norm,none": 0.48464163822525597, + "acc_norm_stderr,none": 0.014604496129394916 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764782088.421127, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1082968.544545792, + "end_time": 1083164.122286093, + "total_evaluation_time_seconds": "195.5777403009124" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/boolq_2025-12-04T01-13-23.345536.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/boolq_2025-12-04T01-13-23.345536.json new file mode 100644 index 0000000000000000000000000000000000000000..7aa3e506720ebdb345adcb660fd77e3cf4157b0d --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/boolq_2025-12-04T01-13-23.345536.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.791131498470948, + "acc_stderr,none": 0.00710973401128647 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764781911.4580934, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1082793.114694655, + "end_time": 1082917.503888588, + "total_evaluation_time_seconds": "124.38919393299147" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/piqa_2025-12-04T01-22-07.305376.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/piqa_2025-12-04T01-22-07.305376.json new file mode 100644 index 0000000000000000000000000000000000000000..fcacf3bf6c7bf4f02344b65cca97e4c7208b3e1d --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_17/piqa_2025-12-04T01-22-07.305376.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7568008705114254, + "acc_stderr,none": 0.010009611953858927, + "acc_norm,none": 0.7693144722524483, + "acc_norm_stderr,none": 0.00982895955098309 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764782476.003178, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1083357.929024492, + "end_time": 1083441.463729548, + "total_evaluation_time_seconds": "83.5347050561104" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/arc_challenge_2025-12-04T01-52-22.300182.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/arc_challenge_2025-12-04T01-52-22.300182.json new file mode 100644 index 0000000000000000000000000000000000000000..c6e7ff506d322b914577521343943fb82beb7420 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/arc_challenge_2025-12-04T01-52-22.300182.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4445392491467577, + "acc_stderr,none": 0.014521226405627079, + "acc_norm,none": 0.49146757679180886, + "acc_norm_stderr,none": 0.014609263165632182 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764784140.7700648, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1085022.252471589, + "end_time": 1085256.458342033, + "total_evaluation_time_seconds": "234.20587044395506" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/hellaswag_2025-12-04T02-12-02.357898.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/hellaswag_2025-12-04T02-12-02.357898.json new file mode 100644 index 0000000000000000000000000000000000000000..da46e9df7f5dfda3b59c6ed7451017d2de465dd4 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/hellaswag_2025-12-04T02-12-02.357898.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5279824736108345, + "acc_stderr,none": 0.00498196109759081, + "acc_norm,none": 0.7330213104959171, + "acc_norm_stderr,none": 0.004414770331224669 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764784692.7583132, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1085573.838653969, + "end_time": 1086436.51618894, + "total_evaluation_time_seconds": "862.6775349709205" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/piqa_2025-12-04T01-56-50.035608.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/piqa_2025-12-04T01-56-50.035608.json new file mode 100644 index 0000000000000000000000000000000000000000..53ae5184cb6ede9f8b65e9b9cab7cacbcffa17f3 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/piqa_2025-12-04T01-56-50.035608.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7584330794341676, + "acc_stderr,none": 0.009986718001804465, + "acc_norm,none": 0.7709466811751904, + "acc_norm_stderr,none": 0.009804509865175504 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764784568.4425042, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1085448.83764757, + "end_time": 1085524.193934558, + "total_evaluation_time_seconds": "75.35628698789515" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/truthfulqa_mc1_2025-12-04T01-54-45.311428.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/truthfulqa_mc1_2025-12-04T01-54-45.311428.json new file mode 100644 index 0000000000000000000000000000000000000000..350043bd32a7ce246b9a707aa35d701812da6577 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/truthfulqa_mc1_2025-12-04T01-54-45.311428.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.23745410036719705, + "acc_stderr,none": 0.014896277441041857 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764784426.43561, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1085307.119029884, + "end_time": 1085399.469822489, + "total_evaluation_time_seconds": "92.35079260496423" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/winogrande_2025-12-04T01-44-54.750911.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/winogrande_2025-12-04T01-44-54.750911.json new file mode 100644 index 0000000000000000000000000000000000000000..201ec0892c4819a6e404e11cce150a8517c84644 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_18/winogrande_2025-12-04T01-44-54.750911.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6937647987371744, + "acc_stderr,none": 0.012954385972802473 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764783846.6421385, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1084724.032194131, + "end_time": 1084808.909225682, + "total_evaluation_time_seconds": "84.87703155097552" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/arc_challenge_2025-12-04T02-26-24.150754.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/arc_challenge_2025-12-04T02-26-24.150754.json new file mode 100644 index 0000000000000000000000000000000000000000..1f49534fb24b565c35d8045a02c2b588f5551772 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/arc_challenge_2025-12-04T02-26-24.150754.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.447098976109215, + "acc_stderr,none": 0.014529380160526845, + "acc_norm,none": 0.5, + "acc_norm_stderr,none": 0.014611390804670088 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764786222.4146404, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1087101.937235618, + "end_time": 1087298.308910494, + "total_evaluation_time_seconds": "196.37167487596162" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/boolq_2025-12-04T02-22-15.041944.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/boolq_2025-12-04T02-22-15.041944.json new file mode 100644 index 0000000000000000000000000000000000000000..335844b599c65a038e5cc8b4facedee1c1b5826f --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/boolq_2025-12-04T02-22-15.041944.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7932721712538227, + "acc_stderr,none": 0.007082769702952059 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764786057.062366, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1086938.523449331, + "end_time": 1087049.200303515, + "total_evaluation_time_seconds": "110.67685418389738" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/hellaswag_2025-12-04T02-46-00.959929.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/hellaswag_2025-12-04T02-46-00.959929.json new file mode 100644 index 0000000000000000000000000000000000000000..fc5d21a37d9dfd5f8b73e0c030b6e3cbb4cbfd4e --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/hellaswag_2025-12-04T02-46-00.959929.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5247958573989245, + "acc_stderr,none": 0.0049836418543511545, + "acc_norm,none": 0.7301334395538738, + "acc_norm_stderr,none": 0.004429831152914677 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764786732.1528735, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1087614.819198306, + "end_time": 1088475.117926174, + "total_evaluation_time_seconds": "860.2987278681248" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/piqa_2025-12-04T02-30-50.069842.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/piqa_2025-12-04T02-30-50.069842.json new file mode 100644 index 0000000000000000000000000000000000000000..d6af16dc59a6487251df8efe98b8cd7ef92083a4 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/piqa_2025-12-04T02-30-50.069842.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7562568008705114, + "acc_stderr,none": 0.010017199471500616, + "acc_norm,none": 0.7687704026115343, + "acc_norm_stderr,none": 0.009837063180625326 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764786607.488154, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1087488.345125611, + "end_time": 1087564.228242411, + "total_evaluation_time_seconds": "75.8831168001052" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/truthfulqa_mc1_2025-12-04T02-28-42.795970.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/truthfulqa_mc1_2025-12-04T02-28-42.795970.json new file mode 100644 index 0000000000000000000000000000000000000000..08a3d5acf9669aed44d26992467f691360547eb9 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/truthfulqa_mc1_2025-12-04T02-28-42.795970.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.2484700122399021, + "acc_stderr,none": 0.015127427096520695 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764786469.1667137, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1087348.89351792, + "end_time": 1087436.954346763, + "total_evaluation_time_seconds": "88.06082884292118" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/winogrande_2025-12-04T02-19-33.569507.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/winogrande_2025-12-04T02-19-33.569507.json new file mode 100644 index 0000000000000000000000000000000000000000..1e777d9b34f59248884218efb6d1f4ae8bd53030 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_19/winogrande_2025-12-04T02-19-33.569507.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.696921862667719, + "acc_stderr,none": 0.012916727462634472 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764785924.4336188, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1086805.68413536, + "end_time": 1086887.727805676, + "total_evaluation_time_seconds": "82.04367031599395" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/arc_challenge_2025-12-03T16-30-08.869471.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/arc_challenge_2025-12-03T16-30-08.869471.json new file mode 100644 index 0000000000000000000000000000000000000000..d88b77edadf33fe76c476b7d572006528f5bf273 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/arc_challenge_2025-12-03T16-30-08.869471.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.37372013651877134, + "acc_stderr,none": 0.0141377086017591, + "acc_norm,none": 0.42662116040955633, + "acc_norm_stderr,none": 0.014453185592920293 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764750442.563745, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1051323.469290188, + "end_time": 1051523.027811842, + "total_evaluation_time_seconds": "199.5585216539912" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/boolq_2025-12-03T16-25-57.935489.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/boolq_2025-12-03T16-25-57.935489.json new file mode 100644 index 0000000000000000000000000000000000000000..466e229f9b593ff595c43d4c622ee48926f13173 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/boolq_2025-12-03T16-25-57.935489.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7269113149847095, + "acc_stderr,none": 0.007792648863012165 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764750265.3254876, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1051145.200567958, + "end_time": 1051272.093782886, + "total_evaluation_time_seconds": "126.89321492798626" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/hellaswag_2025-12-03T16-50-12.203641.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/hellaswag_2025-12-03T16-50-12.203641.json new file mode 100644 index 0000000000000000000000000000000000000000..02fef25734b556a970db22876762bb28087b1fb1 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/hellaswag_2025-12-03T16-50-12.203641.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.465345548695479, + "acc_stderr,none": 0.004977782217582456, + "acc_norm,none": 0.6471818362875921, + "acc_norm_stderr,none": 0.004768701562988908 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764750971.5993054, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1051851.028390236, + "end_time": 1052726.361991428, + "total_evaluation_time_seconds": "875.3336011921056" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/piqa_2025-12-03T16-34-44.979094.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/piqa_2025-12-03T16-34-44.979094.json new file mode 100644 index 0000000000000000000000000000000000000000..9288e397bdc7cf65f4350b9b560f7eb454cb1254 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/piqa_2025-12-03T16-34-44.979094.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7127312295973884, + "acc_stderr,none": 0.010557291761528633, + "acc_norm,none": 0.7257889009793254, + "acc_norm_stderr,none": 0.010408618664933379 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764750838.7379282, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1051719.565615216, + "end_time": 1051799.137447537, + "total_evaluation_time_seconds": "79.57183232088573" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/truthfulqa_mc1_2025-12-03T16-32-35.216294.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/truthfulqa_mc1_2025-12-03T16-32-35.216294.json new file mode 100644 index 0000000000000000000000000000000000000000..6b39ee38c3ea0ac82cac07ddcde572ef87e39e58 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/truthfulqa_mc1_2025-12-03T16-32-35.216294.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.24357405140758873, + "acc_stderr,none": 0.015026354824910782 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764750692.141573, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1051574.399429631, + "end_time": 1051669.374503339, + "total_evaluation_time_seconds": "94.97507370798849" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/winogrande_2025-12-03T16-23-00.601571.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/winogrande_2025-12-03T16-23-00.601571.json new file mode 100644 index 0000000000000000000000000000000000000000..db99b99e8a42e76ee1dfbaa95fe7fe806d438a1f --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_2/winogrande_2025-12-03T16-23-00.601571.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6298342541436464, + "acc_stderr,none": 0.013570454689603911 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764750123.3587832, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1051003.99569915, + "end_time": 1051094.759815447, + "total_evaluation_time_seconds": "90.76411629701033" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/arc_challenge_2025-12-04T03-00-35.233046.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/arc_challenge_2025-12-04T03-00-35.233046.json new file mode 100644 index 0000000000000000000000000000000000000000..8255ae37fc13b92917f6fdc62c054113330a209a --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/arc_challenge_2025-12-04T03-00-35.233046.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.439419795221843, + "acc_stderr,none": 0.01450374782358013, + "acc_norm,none": 0.49146757679180886, + "acc_norm_stderr,none": 0.014609263165632179 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764788269.969869, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1089151.858382867, + "end_time": 1089349.391089911, + "total_evaluation_time_seconds": "197.53270704415627" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/boolq_2025-12-04T02-56-27.557271.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/boolq_2025-12-04T02-56-27.557271.json new file mode 100644 index 0000000000000000000000000000000000000000..6087f904181ea60ca254d7d1a5af27c2234c1d24 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/boolq_2025-12-04T02-56-27.557271.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7902140672782875, + "acc_stderr,none": 0.007121198629128885 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764788099.1393929, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1088980.382826137, + "end_time": 1089101.715486309, + "total_evaluation_time_seconds": "121.33266017213464" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/hellaswag_2025-12-04T03-20-25.776937.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/hellaswag_2025-12-04T03-20-25.776937.json new file mode 100644 index 0000000000000000000000000000000000000000..6e732a478ecbdf043081efba29d85b24c7a88062 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/hellaswag_2025-12-04T03-20-25.776937.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5251941844254132, + "acc_stderr,none": 0.004983442888677772, + "acc_norm,none": 0.7335192192790281, + "acc_norm_stderr,none": 0.004412149415717921 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764788784.3190746, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1089664.410550063, + "end_time": 1090539.935269734, + "total_evaluation_time_seconds": "875.5247196708806" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/piqa_2025-12-04T03-05-00.959377.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/piqa_2025-12-04T03-05-00.959377.json new file mode 100644 index 0000000000000000000000000000000000000000..d426e182d661f437c2c3cdf84abc7966b692c65f --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/piqa_2025-12-04T03-05-00.959377.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7600652883569097, + "acc_stderr,none": 0.009963625892809544, + "acc_norm,none": 0.7693144722524483, + "acc_norm_stderr,none": 0.00982895955098309 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764788659.2946136, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1089540.205139605, + "end_time": 1089615.117711619, + "total_evaluation_time_seconds": "74.91257201391272" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/truthfulqa_mc1_2025-12-04T03-02-56.237845.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/truthfulqa_mc1_2025-12-04T03-02-56.237845.json new file mode 100644 index 0000000000000000000000000000000000000000..f53e469be0a9a4f4e7b494fe9f1d2f6c02ebd702 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/truthfulqa_mc1_2025-12-04T03-02-56.237845.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.2460220318237454, + "acc_stderr,none": 0.015077219200662574 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764788519.0007114, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1089399.868711271, + "end_time": 1089490.396164354, + "total_evaluation_time_seconds": "90.52745308284648" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/winogrande_2025-12-04T02-53-36.644395.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/winogrande_2025-12-04T02-53-36.644395.json new file mode 100644 index 0000000000000000000000000000000000000000..d1a87da7e1f6e42c14dcf75edde2e3e0e5d4c36a --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_20/winogrande_2025-12-04T02-53-36.644395.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.7103393843725335, + "acc_stderr,none": 0.012748550807638268 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764787964.9074097, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1088843.952284508, + "end_time": 1088930.802711364, + "total_evaluation_time_seconds": "86.85042685619555" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/arc_challenge_2025-12-04T03-34-52.811864.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/arc_challenge_2025-12-04T03-34-52.811864.json new file mode 100644 index 0000000000000000000000000000000000000000..33d24fd88ad056c5ed1fbcdeadfb751f258f168c --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/arc_challenge_2025-12-04T03-34-52.811864.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.45051194539249145, + "acc_stderr,none": 0.014539646098471627, + "acc_norm,none": 0.507679180887372, + "acc_norm_stderr,none": 0.014609667440892577 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764790322.092546, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1091201.541560811, + "end_time": 1091406.970079081, + "total_evaluation_time_seconds": "205.42851826990955" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/boolq_2025-12-04T03-30-37.083682.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/boolq_2025-12-04T03-30-37.083682.json new file mode 100644 index 0000000000000000000000000000000000000000..9ebc2e7fb93fe8f5b85f28316297c86550724999 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/boolq_2025-12-04T03-30-37.083682.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7675840978593272, + "acc_stderr,none": 0.007387346058659881 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764790158.1976476, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1091040.355006332, + "end_time": 1091151.24195559, + "total_evaluation_time_seconds": "110.88694925792515" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/hellaswag_2025-12-04T03-54-57.750600.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/hellaswag_2025-12-04T03-54-57.750600.json new file mode 100644 index 0000000000000000000000000000000000000000..dee967e65a27b3e1584aa27a14b1425d7e7a4e99 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/hellaswag_2025-12-04T03-54-57.750600.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5243975303724357, + "acc_stderr,none": 0.004983837641502894, + "acc_norm,none": 0.7302330213104959, + "acc_norm_stderr,none": 0.004429315788310514 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764790857.7063873, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1091737.351482523, + "end_time": 1092611.908723046, + "total_evaluation_time_seconds": "874.5572405231651" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/piqa_2025-12-04T03-39-33.467296.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/piqa_2025-12-04T03-39-33.467296.json new file mode 100644 index 0000000000000000000000000000000000000000..bbb7f3ffde2ec5829722f7f40dcf4cd2896c30a3 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/piqa_2025-12-04T03-39-33.467296.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7714907508161044, + "acc_stderr,none": 0.009796313511829514, + "acc_norm,none": 0.7752992383025027, + "acc_norm_stderr,none": 0.009738282586548377 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764790732.9596984, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1091614.048599762, + "end_time": 1091687.625571054, + "total_evaluation_time_seconds": "73.57697129203007" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/truthfulqa_mc1_2025-12-04T03-37-30.244661.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/truthfulqa_mc1_2025-12-04T03-37-30.244661.json new file mode 100644 index 0000000000000000000000000000000000000000..23731561ec7dafc7fe2a67d55a9c58a4bc6c68a2 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/truthfulqa_mc1_2025-12-04T03-37-30.244661.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.23745410036719705, + "acc_stderr,none": 0.014896277441041855 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764790576.1761763, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1091458.132724192, + "end_time": 1091564.402988524, + "total_evaluation_time_seconds": "106.27026433194987" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/winogrande_2025-12-04T03-27-57.158106.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/winogrande_2025-12-04T03-27-57.158106.json new file mode 100644 index 0000000000000000000000000000000000000000..47c4dec8d72ed35ee66f9a20681c3a43672ba7f2 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_21/winogrande_2025-12-04T03-27-57.158106.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6945540647198106, + "acc_stderr,none": 0.012945038632552018 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764790029.1612315, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1090910.116662614, + "end_time": 1090991.316470892, + "total_evaluation_time_seconds": "81.19980827788822" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/arc_challenge_2025-12-04T04-09-23.247895.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/arc_challenge_2025-12-04T04-09-23.247895.json new file mode 100644 index 0000000000000000000000000000000000000000..ee2bbdf982f7a61c6b0c084c74735fa7914b1f02 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/arc_challenge_2025-12-04T04-09-23.247895.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.45819112627986347, + "acc_stderr,none": 0.0145602203087147, + "acc_norm,none": 0.49658703071672355, + "acc_norm_stderr,none": 0.014611050403244077 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764792404.5499916, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1093284.295334411, + "end_time": 1093477.405985825, + "total_evaluation_time_seconds": "193.1106514139101" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/boolq_2025-12-04T04-05-19.225770.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/boolq_2025-12-04T04-05-19.225770.json new file mode 100644 index 0000000000000000000000000000000000000000..8f9cf5442fb94eb18bcd05bef989378a8f5ada2c --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/boolq_2025-12-04T04-05-19.225770.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7831804281345566, + "acc_stderr,none": 0.007207301562700179 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764792242.5854316, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1093124.939943232, + "end_time": 1093233.384089764, + "total_evaluation_time_seconds": "108.44414653186686" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/hellaswag_2025-12-04T04-29-08.114334.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/hellaswag_2025-12-04T04-29-08.114334.json new file mode 100644 index 0000000000000000000000000000000000000000..3d7af39aaa921343f5e5eaaf4116cc09b2281112 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/hellaswag_2025-12-04T04-29-08.114334.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5277833100975902, + "acc_stderr,none": 0.004982072108448076, + "acc_norm,none": 0.7316271659032065, + "acc_norm_stderr,none": 0.004422070927212544 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764792917.1725175, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1093798.560751747, + "end_time": 1094662.27265783, + "total_evaluation_time_seconds": "863.7119060829282" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/piqa_2025-12-04T04-13-53.601328.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/piqa_2025-12-04T04-13-53.601328.json new file mode 100644 index 0000000000000000000000000000000000000000..4e6254e37fd6529b40c6ae288f7fd17a7dbe7601 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/piqa_2025-12-04T04-13-53.601328.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7595212187159956, + "acc_stderr,none": 0.009971345364651071, + "acc_norm,none": 0.766050054406964, + "acc_norm_stderr,none": 0.009877236895137458 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764792791.87736, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1093672.80217854, + "end_time": 1093747.759658871, + "total_evaluation_time_seconds": "74.95748033095151" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/truthfulqa_mc1_2025-12-04T04-11-47.502549.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/truthfulqa_mc1_2025-12-04T04-11-47.502549.json new file mode 100644 index 0000000000000000000000000000000000000000..36216e9c290d5fab0de210fa1b21160f92c1b62c --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/truthfulqa_mc1_2025-12-04T04-11-47.502549.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.23990208078335373, + "acc_stderr,none": 0.014948812679062135 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764792647.8338287, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1093528.218489457, + "end_time": 1093621.66083292, + "total_evaluation_time_seconds": "93.4423434631899" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/winogrande_2025-12-04T04-02-40.500621.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/winogrande_2025-12-04T04-02-40.500621.json new file mode 100644 index 0000000000000000000000000000000000000000..9ae337dde2492dba345c11cbf7a659f1be96d239 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_22/winogrande_2025-12-04T04-02-40.500621.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.7095501183898973, + "acc_stderr,none": 0.012758813448064604 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764792098.3976326, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1092980.286891006, + "end_time": 1093074.658943524, + "total_evaluation_time_seconds": "94.3720525179524" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/arc_challenge_2025-12-04T04-43-23.638515.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/arc_challenge_2025-12-04T04-43-23.638515.json new file mode 100644 index 0000000000000000000000000000000000000000..f372ef9233952673537e72fdff444fbe6695a4ee --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/arc_challenge_2025-12-04T04-43-23.638515.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.439419795221843, + "acc_stderr,none": 0.014503747823580129, + "acc_norm,none": 0.4872013651877133, + "acc_norm_stderr,none": 0.014606603181012538 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764794445.292829, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1095327.380794991, + "end_time": 1095517.796653849, + "total_evaluation_time_seconds": "190.41585885803215" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/boolq_2025-12-04T04-39-25.340055.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/boolq_2025-12-04T04-39-25.340055.json new file mode 100644 index 0000000000000000000000000000000000000000..a191013eb279b47565acdfbbc6799c11bd9868c5 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/boolq_2025-12-04T04-39-25.340055.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.791743119266055, + "acc_stderr,none": 0.007102060510422346 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764794292.185155, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1095173.98744817, + "end_time": 1095279.498382741, + "total_evaluation_time_seconds": "105.51093457080424" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/hellaswag_2025-12-04T05-03-09.952394.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/hellaswag_2025-12-04T05-03-09.952394.json new file mode 100644 index 0000000000000000000000000000000000000000..8ffd800a61647f8932d73a249559f0d53a3d4748 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/hellaswag_2025-12-04T05-03-09.952394.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5270862378012349, + "acc_stderr,none": 0.004982454383162061, + "acc_norm,none": 0.7332204740091616, + "acc_norm_stderr,none": 0.004413722823053158 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764794959.7437787, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1095840.478064142, + "end_time": 1096704.110555294, + "total_evaluation_time_seconds": "863.6324911520351" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/piqa_2025-12-04T04-47-56.376225.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/piqa_2025-12-04T04-47-56.376225.json new file mode 100644 index 0000000000000000000000000000000000000000..df8639058d0aaafa1e3827cde7e624608c5c33b8 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/piqa_2025-12-04T04-47-56.376225.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7611534276387377, + "acc_stderr,none": 0.009948120385337496, + "acc_norm,none": 0.7693144722524483, + "acc_norm_stderr,none": 0.009828959550983089 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764794824.6987987, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1095705.785279814, + "end_time": 1095790.534600646, + "total_evaluation_time_seconds": "84.74932083208114" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/truthfulqa_mc1_2025-12-04T04-45-42.003529.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/truthfulqa_mc1_2025-12-04T04-45-42.003529.json new file mode 100644 index 0000000000000000000000000000000000000000..2e987d7c31fcf57cfd5c1f5061c9df998fb5f145 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/truthfulqa_mc1_2025-12-04T04-45-42.003529.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.23990208078335373, + "acc_stderr,none": 0.014948812679062135 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764794687.0048196, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1095567.950335739, + "end_time": 1095656.161701915, + "total_evaluation_time_seconds": "88.21136617613956" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/winogrande_2025-12-04T04-36-50.823414.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/winogrande_2025-12-04T04-36-50.823414.json new file mode 100644 index 0000000000000000000000000000000000000000..8a4c8dee3feaf3571219ffd6f0f5ca1d2c087e3a --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_23/winogrande_2025-12-04T04-36-50.823414.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.7048145224940805, + "acc_stderr,none": 0.012819410741754775 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764794149.5544627, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1095032.11979561, + "end_time": 1095124.981729812, + "total_evaluation_time_seconds": "92.86193420202471" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/arc_challenge_2025-12-04T05-17-50.103994.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/arc_challenge_2025-12-04T05-17-50.103994.json new file mode 100644 index 0000000000000000000000000000000000000000..9ed7471b42c0da09f71e7835710f88749db138fd --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/arc_challenge_2025-12-04T05-17-50.103994.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4445392491467577, + "acc_stderr,none": 0.014521226405627075, + "acc_norm,none": 0.48208191126279865, + "acc_norm_stderr,none": 0.014602005585490983 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764796508.5624056, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1097388.122292038, + "end_time": 1097584.262189065, + "total_evaluation_time_seconds": "196.13989702705294" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/boolq_2025-12-04T05-13-44.296495.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/boolq_2025-12-04T05-13-44.296495.json new file mode 100644 index 0000000000000000000000000000000000000000..26cb61a98638cbc9eb8d8f0575ee476e9cf24b15 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/boolq_2025-12-04T05-13-44.296495.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.6501529051987768, + "acc_stderr,none": 0.008341409251946744 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764796345.5724456, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1097227.054256044, + "end_time": 1097338.454822133, + "total_evaluation_time_seconds": "111.40056608896703" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/hellaswag_2025-12-04T05-37-46.984581.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/hellaswag_2025-12-04T05-37-46.984581.json new file mode 100644 index 0000000000000000000000000000000000000000..4bc82aa8199a3a2f522aff7ff3748d0b9effe914 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/hellaswag_2025-12-04T05-37-46.984581.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.528779127663812, + "acc_stderr,none": 0.004981509099276368, + "acc_norm,none": 0.7334196375224059, + "acc_norm_stderr,none": 0.004412674170976474 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764797036.1014693, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1097917.222931335, + "end_time": 1098781.142702682, + "total_evaluation_time_seconds": "863.9197713469621" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/piqa_2025-12-04T05-22-32.955466.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/piqa_2025-12-04T05-22-32.955466.json new file mode 100644 index 0000000000000000000000000000000000000000..842aef08d0f4280f73247b4d8ed1cc3a349a096d --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/piqa_2025-12-04T05-22-32.955466.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7589771490750816, + "acc_stderr,none": 0.009979042717267314, + "acc_norm,none": 0.7731229597388466, + "acc_norm_stderr,none": 0.009771584259215158 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764796893.8562791, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1097773.787377059, + "end_time": 1097867.113851341, + "total_evaluation_time_seconds": "93.32647428195924" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/truthfulqa_mc1_2025-12-04T05-20-09.023028.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/truthfulqa_mc1_2025-12-04T05-20-09.023028.json new file mode 100644 index 0000000000000000000000000000000000000000..ab5ad4fca45e7474afbad3f680da3b3f03e27315 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/truthfulqa_mc1_2025-12-04T05-20-09.023028.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.24479804161566707, + "acc_stderr,none": 0.015051869486714999 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764796752.8031816, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1097634.567033776, + "end_time": 1097723.181351032, + "total_evaluation_time_seconds": "88.61431725602597" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/winogrande_2025-12-04T05-10-56.499967.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/winogrande_2025-12-04T05-10-56.499967.json new file mode 100644 index 0000000000000000000000000000000000000000..7e223b9cbc9f22606222a0a2593637ccde95f138 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_24/winogrande_2025-12-04T05-10-56.499967.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.7032359905288083, + "acc_stderr,none": 0.01283923969520203 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764796190.836991, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1097071.986096963, + "end_time": 1097170.658277102, + "total_evaluation_time_seconds": "98.67218013899401" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/arc_challenge_2025-12-04T05-52-12.871342.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/arc_challenge_2025-12-04T05-52-12.871342.json new file mode 100644 index 0000000000000000000000000000000000000000..8f720686728601d2efab32da2392e0f5102cc780 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/arc_challenge_2025-12-04T05-52-12.871342.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.454778156996587, + "acc_stderr,none": 0.01455150706083635, + "acc_norm,none": 0.4863481228668942, + "acc_norm_stderr,none": 0.01460594342986095 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764798564.43121, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1099447.283148173, + "end_time": 1099647.02973298, + "total_evaluation_time_seconds": "199.74658480705693" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/boolq_2025-12-04T05-48-03.790436.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/boolq_2025-12-04T05-48-03.790436.json new file mode 100644 index 0000000000000000000000000000000000000000..dbca3b75248a0d3ecb2ae8e357ea5f4ef0585748 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/boolq_2025-12-04T05-48-03.790436.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7798165137614679, + "acc_stderr,none": 0.00724738154055408 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764798407.898022, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1099290.066901533, + "end_time": 1099397.948466676, + "total_evaluation_time_seconds": "107.8815651431214" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/hellaswag_2025-12-04T06-11-52.414833.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/hellaswag_2025-12-04T06-11-52.414833.json new file mode 100644 index 0000000000000000000000000000000000000000..4636019f96735dbc9d73fee957c385f5096ea93f --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/hellaswag_2025-12-04T06-11-52.414833.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5290778729336786, + "acc_stderr,none": 0.004981336318033648, + "acc_norm,none": 0.7335192192790281, + "acc_norm_stderr,none": 0.004412149415717921 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764799081.5336561, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1099961.838603099, + "end_time": 1100826.573159415, + "total_evaluation_time_seconds": "864.7345563159324" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/piqa_2025-12-04T05-56-37.243285.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/piqa_2025-12-04T05-56-37.243285.json new file mode 100644 index 0000000000000000000000000000000000000000..b1a67d67948305cb71e07079701fbd3dcd519280 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/piqa_2025-12-04T05-56-37.243285.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.76550598476605, + "acc_stderr,none": 0.009885203143240545, + "acc_norm,none": 0.7736670293797606, + "acc_norm_stderr,none": 0.009763294246879418 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764798953.441653, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1099833.398739465, + "end_time": 1099911.401644501, + "total_evaluation_time_seconds": "78.00290503585711" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/truthfulqa_mc1_2025-12-04T05-54-29.105748.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/truthfulqa_mc1_2025-12-04T05-54-29.105748.json new file mode 100644 index 0000000000000000000000000000000000000000..03f6d368d04694079d4f54b4ec857e7b17c22e38 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/truthfulqa_mc1_2025-12-04T05-54-29.105748.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.23255813953488372, + "acc_stderr,none": 0.014789157531080522 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764798814.4517102, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1099697.029228472, + "end_time": 1099783.264035105, + "total_evaluation_time_seconds": "86.23480663308874" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/winogrande_2025-12-04T05-45-24.395841.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/winogrande_2025-12-04T05-45-24.395841.json new file mode 100644 index 0000000000000000000000000000000000000000..13e568bf866de32773db89f010998c6cd20413b5 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_25/winogrande_2025-12-04T05-45-24.395841.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6866614048934491, + "acc_stderr,none": 0.013036512096747978 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764798266.9218814, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1099148.550366209, + "end_time": 1099238.554182318, + "total_evaluation_time_seconds": "90.00381610915065" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/arc_challenge_2025-12-04T06-25-59.674181.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/arc_challenge_2025-12-04T06-25-59.674181.json new file mode 100644 index 0000000000000000000000000000000000000000..6a6d52578b49df11466385e3c6614ddd7fcbe568 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/arc_challenge_2025-12-04T06-25-59.674181.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.45819112627986347, + "acc_stderr,none": 0.014560220308714697, + "acc_norm,none": 0.5068259385665529, + "acc_norm_stderr,none": 0.014610029151379812 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764800601.3067884, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1101483.528757421, + "end_time": 1101673.832523592, + "total_evaluation_time_seconds": "190.30376617098227" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/boolq_2025-12-04T06-21-59.271989.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/boolq_2025-12-04T06-21-59.271989.json new file mode 100644 index 0000000000000000000000000000000000000000..b16a80d9420b3d3b4c53526b6e27d06a7e9ae39e --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/boolq_2025-12-04T06-21-59.271989.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7871559633027523, + "acc_stderr,none": 0.007159021688652625 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764800442.2793305, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1101324.834767388, + "end_time": 1101433.430320255, + "total_evaluation_time_seconds": "108.59555286704563" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/hellaswag_2025-12-04T06-45-36.841296.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/hellaswag_2025-12-04T06-45-36.841296.json new file mode 100644 index 0000000000000000000000000000000000000000..a6fcf37159aeb7c91975372618837e30427b666c --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/hellaswag_2025-12-04T06-45-36.841296.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5265883290181239, + "acc_stderr,none": 0.004982721472407341, + "acc_norm,none": 0.7354112726548496, + "acc_norm_stderr,none": 0.004402124555058372 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764801106.5381565, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1101987.456637008, + "end_time": 1102850.999596177, + "total_evaluation_time_seconds": "863.5429591687862" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/piqa_2025-12-04T06-30-22.428600.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/piqa_2025-12-04T06-30-22.428600.json new file mode 100644 index 0000000000000000000000000000000000000000..f74628ecd98f81870f6ba4bf19594d7aff4a764e --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/piqa_2025-12-04T06-30-22.428600.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.76550598476605, + "acc_stderr,none": 0.009885203143240547, + "acc_norm,none": 0.7682263329706203, + "acc_norm_stderr,none": 0.009845143772794027 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764800980.5371559, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1101863.108402598, + "end_time": 1101936.586957161, + "total_evaluation_time_seconds": "73.47855456313118" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/truthfulqa_mc1_2025-12-04T06-28-16.755358.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/truthfulqa_mc1_2025-12-04T06-28-16.755358.json new file mode 100644 index 0000000000000000000000000000000000000000..9e817f473bcb9ef8fe09aa26740cc470e11bbdbc --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/truthfulqa_mc1_2025-12-04T06-28-16.755358.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.23255813953488372, + "acc_stderr,none": 0.014789157531080522 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764800842.4578629, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1101723.908171656, + "end_time": 1101810.91368644, + "total_evaluation_time_seconds": "87.00551478401758" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/winogrande_2025-12-04T06-19-19.666004.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/winogrande_2025-12-04T06-19-19.666004.json new file mode 100644 index 0000000000000000000000000000000000000000..123ac54844348ecfc320c6f3944ef06685fbcc30 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_26/winogrande_2025-12-04T06-19-19.666004.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.7008681925808997, + "acc_stderr,none": 0.012868639066091536 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764800315.118102, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1101195.816381865, + "end_time": 1101273.824369604, + "total_evaluation_time_seconds": "78.00798773905262" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/arc_challenge_2025-12-04T06-59-53.712040.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/arc_challenge_2025-12-04T06-59-53.712040.json new file mode 100644 index 0000000000000000000000000000000000000000..92eb26eac22e978ac1de4e1364b18c321f81004f --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/arc_challenge_2025-12-04T06-59-53.712040.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4462457337883959, + "acc_stderr,none": 0.014526705548539982, + "acc_norm,none": 0.4948805460750853, + "acc_norm_stderr,none": 0.014610624890309157 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764802636.6720824, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1103515.826249695, + "end_time": 1103707.870370415, + "total_evaluation_time_seconds": "192.044120720122" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/boolq_2025-12-04T06-55-50.548675.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/boolq_2025-12-04T06-55-50.548675.json new file mode 100644 index 0000000000000000000000000000000000000000..06d034e568e3fef9b3744e527ba4f70fe1e7861e --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/boolq_2025-12-04T06-55-50.548675.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7862385321100918, + "acc_stderr,none": 0.007170251899911527 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764802470.850118, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1103350.945894907, + "end_time": 1103464.707030424, + "total_evaluation_time_seconds": "113.76113551692106" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/hellaswag_2025-12-04T07-19-34.272159.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/hellaswag_2025-12-04T07-19-34.272159.json new file mode 100644 index 0000000000000000000000000000000000000000..1761383826e5ff6fe5f1da3f5c332f52cdc32483 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/hellaswag_2025-12-04T07-19-34.272159.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5252937661820355, + "acc_stderr,none": 0.00498339265057097, + "acc_norm,none": 0.7302330213104959, + "acc_norm_stderr,none": 0.004429315788310515 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764803142.2183173, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1104022.914763488, + "end_time": 1104888.430197772, + "total_evaluation_time_seconds": "865.515434283996" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/piqa_2025-12-04T07-04-18.281153.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/piqa_2025-12-04T07-04-18.281153.json new file mode 100644 index 0000000000000000000000000000000000000000..09cedc53fa21f99887b86688c82f6f3e72e1dadd --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/piqa_2025-12-04T07-04-18.281153.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7551686615886833, + "acc_stderr,none": 0.010032309105568791, + "acc_norm,none": 0.7763873775843307, + "acc_norm_stderr,none": 0.009721489519176297 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764803015.3845668, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1103896.317078376, + "end_time": 1103972.439407257, + "total_evaluation_time_seconds": "76.1223288809415" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/truthfulqa_mc1_2025-12-04T07-02-07.919035.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/truthfulqa_mc1_2025-12-04T07-02-07.919035.json new file mode 100644 index 0000000000000000000000000000000000000000..6f842d0524e7f37b775ab97397ce809388d96472 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/truthfulqa_mc1_2025-12-04T07-02-07.919035.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.23990208078335373, + "acc_stderr,none": 0.014948812679062135 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764802872.1953607, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1103755.355959651, + "end_time": 1103842.077199703, + "total_evaluation_time_seconds": "86.72124005202204" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/winogrande_2025-12-04T06-53-05.918870.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/winogrande_2025-12-04T06-53-05.918870.json new file mode 100644 index 0000000000000000000000000000000000000000..795616a0839314938c99ad38fe8e87ebdb701481 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_27/winogrande_2025-12-04T06-53-05.918870.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6985003946329913, + "acc_stderr,none": 0.012897628072546678 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764802342.134017, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1103221.451285022, + "end_time": 1103300.077184299, + "total_evaluation_time_seconds": "78.62589927692898" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/arc_challenge_2025-12-04T07-34-11.855731.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/arc_challenge_2025-12-04T07-34-11.855731.json new file mode 100644 index 0000000000000000000000000000000000000000..eb63add4a21a8b8bcb2a08d190a9312bb33d151d --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/arc_challenge_2025-12-04T07-34-11.855731.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.45819112627986347, + "acc_stderr,none": 0.0145602203087147, + "acc_norm,none": 0.49402730375426623, + "acc_norm_stderr,none": 0.01461034830025579 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764804680.8040829, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1105560.829321334, + "end_time": 1105766.013325857, + "total_evaluation_time_seconds": "205.18400452309288" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/boolq_2025-12-04T07-29-55.884693.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/boolq_2025-12-04T07-29-55.884693.json new file mode 100644 index 0000000000000000000000000000000000000000..8e898aa2a7ec5c85dd30432cc58873b9ff05cc0e --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/boolq_2025-12-04T07-29-55.884693.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.771559633027523, + "acc_stderr,none": 0.00734283405114858 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764804512.8534517, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1105393.258487838, + "end_time": 1105510.042923192, + "total_evaluation_time_seconds": "116.78443535394035" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/hellaswag_2025-12-04T07-54-25.622316.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/hellaswag_2025-12-04T07-54-25.622316.json new file mode 100644 index 0000000000000000000000000000000000000000..a3885d42d9bbafc55c3ef9f0947a210c5507f06d --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/hellaswag_2025-12-04T07-54-25.622316.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.525094602668791, + "acc_stderr,none": 0.004983492928102841, + "acc_norm,none": 0.7279426409081856, + "acc_norm_stderr,none": 0.004441097782370504 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764805227.0477371, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1106107.224253373, + "end_time": 1106979.780607627, + "total_evaluation_time_seconds": "872.5563542540185" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/piqa_2025-12-04T07-39-03.164994.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/piqa_2025-12-04T07-39-03.164994.json new file mode 100644 index 0000000000000000000000000000000000000000..53c3dbab6e5882452a130ccf046905e5e7c6575a --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/piqa_2025-12-04T07-39-03.164994.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.764961915125136, + "acc_stderr,none": 0.009893146688805326, + "acc_norm,none": 0.7742110990206746, + "acc_norm_stderr,none": 0.00975498067091733 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764805084.44298, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1105963.545880196, + "end_time": 1106057.323297537, + "total_evaluation_time_seconds": "93.77741734101437" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/truthfulqa_mc1_2025-12-04T07-36-39.290686.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/truthfulqa_mc1_2025-12-04T07-36-39.290686.json new file mode 100644 index 0000000000000000000000000000000000000000..f9b1b519363e9ffd77d12680026cbf6c9f168f4f --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/truthfulqa_mc1_2025-12-04T07-36-39.290686.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.2533659730722154, + "acc_stderr,none": 0.015225899340826824 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764804935.2519276, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1105815.67970044, + "end_time": 1105913.44883017, + "total_evaluation_time_seconds": "97.76912973006256" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/winogrande_2025-12-04T07-27-09.465804.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/winogrande_2025-12-04T07-27-09.465804.json new file mode 100644 index 0000000000000000000000000000000000000000..a8129cefbe13009bb13e06bf8bcc7ea79ae7d590 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_28/winogrande_2025-12-04T07-27-09.465804.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.7000789265982637, + "acc_stderr,none": 0.01287834752663607 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764804374.2936199, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1105255.285814129, + "end_time": 1105343.624119568, + "total_evaluation_time_seconds": "88.3383054388687" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/arc_challenge_2025-12-04T08-09-02.751892.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/arc_challenge_2025-12-04T08-09-02.751892.json new file mode 100644 index 0000000000000000000000000000000000000000..0dc6696bb208c78c1c43c28e95196bdaace61e9f --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/arc_challenge_2025-12-04T08-09-02.751892.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.447098976109215, + "acc_stderr,none": 0.014529380160526842, + "acc_norm,none": 0.5042662116040956, + "acc_norm_stderr,none": 0.014610858923956952 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764806781.4915502, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1107659.703709953, + "end_time": 1107856.909941799, + "total_evaluation_time_seconds": "197.20623184600845" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/boolq_2025-12-04T08-04-47.265677.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/boolq_2025-12-04T08-04-47.265677.json new file mode 100644 index 0000000000000000000000000000000000000000..006bf59c0a4ea7b8ae143b1d7c17ddedd8afe065 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/boolq_2025-12-04T08-04-47.265677.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7681957186544343, + "acc_stderr,none": 0.007380558168525874 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764806607.0891042, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1107487.886325223, + "end_time": 1107601.423892312, + "total_evaluation_time_seconds": "113.53756708907895" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/hellaswag_2025-12-04T08-28-35.744058.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/hellaswag_2025-12-04T08-28-35.744058.json new file mode 100644 index 0000000000000000000000000000000000000000..bfaaf43c736ef108d85ad8df28cdcccc4454a967 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/hellaswag_2025-12-04T08-28-35.744058.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.525094602668791, + "acc_stderr,none": 0.004983492928102841, + "acc_norm,none": 0.7303326030671181, + "acc_norm_stderr,none": 0.004428800140739976 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764807287.815937, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1108170.32166204, + "end_time": 1109029.902142819, + "total_evaluation_time_seconds": "859.5804807790555" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/piqa_2025-12-04T08-13-27.897705.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/piqa_2025-12-04T08-13-27.897705.json new file mode 100644 index 0000000000000000000000000000000000000000..e16725eafe7ce759e91581b6cea724c667fe2c2e --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/piqa_2025-12-04T08-13-27.897705.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7557127312295974, + "acc_stderr,none": 0.010024765172284242, + "acc_norm,none": 0.7747551686615887, + "acc_norm_stderr,none": 0.009746643471032143 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764807165.028613, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1108047.844767316, + "end_time": 1108122.056006051, + "total_evaluation_time_seconds": "74.21123873488978" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/truthfulqa_mc1_2025-12-04T08-11-22.829175.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/truthfulqa_mc1_2025-12-04T08-11-22.829175.json new file mode 100644 index 0000000000000000000000000000000000000000..4ff824e7d2995f76019fd3ce92adac413dd2fe53 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/truthfulqa_mc1_2025-12-04T08-11-22.829175.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.23623011015911874, + "acc_stderr,none": 0.014869755015871086 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764807028.0108528, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1107907.52700649, + "end_time": 1107996.987556263, + "total_evaluation_time_seconds": "89.46054977318272" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/winogrande_2025-12-04T08-02-02.063693.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/winogrande_2025-12-04T08-02-02.063693.json new file mode 100644 index 0000000000000000000000000000000000000000..a5820f31c92839f3cbbb6ed1927befe8cc7492b8 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_29/winogrande_2025-12-04T08-02-02.063693.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.7056037884767167, + "acc_stderr,none": 0.012809427134352408 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764806469.7947583, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1107349.400733121, + "end_time": 1107436.221951133, + "total_evaluation_time_seconds": "86.82121801213361" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/arc_challenge_2025-12-03T17-04-48.578060.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/arc_challenge_2025-12-03T17-04-48.578060.json new file mode 100644 index 0000000000000000000000000000000000000000..bae1fd9ad12ff96bfdcd04adfbb8b342603af08b --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/arc_challenge_2025-12-03T17-04-48.578060.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.42150170648464164, + "acc_stderr,none": 0.01443019706932601, + "acc_norm,none": 0.45733788395904434, + "acc_norm_stderr,none": 0.014558106543924068 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764752525.7178397, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1053405.194453793, + "end_time": 1053602.736196403, + "total_evaluation_time_seconds": "197.5417426098138" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/boolq_2025-12-03T17-00-39.707842.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/boolq_2025-12-03T17-00-39.707842.json new file mode 100644 index 0000000000000000000000000000000000000000..c543ccfcb70a9fcc9c101003db76d82d3fe77cc1 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/boolq_2025-12-03T17-00-39.707842.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7339449541284404, + "acc_stderr,none": 0.007728763786791673 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764752357.7577941, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1053237.528716576, + "end_time": 1053353.865962047, + "total_evaluation_time_seconds": "116.33724547084421" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/hellaswag_2025-12-03T17-24-47.261729.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/hellaswag_2025-12-03T17-24-47.261729.json new file mode 100644 index 0000000000000000000000000000000000000000..0751009d0fedd6b97f23c420bcab742409cb6ad8 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/hellaswag_2025-12-03T17-24-47.261729.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.4676359290977893, + "acc_stderr,none": 0.004979317515432528, + "acc_norm,none": 0.6477793268273252, + "acc_norm_stderr,none": 0.004766860907171564 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764753052.6376455, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1053932.416938224, + "end_time": 1054801.420089335, + "total_evaluation_time_seconds": "869.0031511108391" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/piqa_2025-12-03T17-09-26.987418.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/piqa_2025-12-03T17-09-26.987418.json new file mode 100644 index 0000000000000000000000000000000000000000..7d5c43d6f46b39897bfb482767956001c6dbb873 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/piqa_2025-12-03T17-09-26.987418.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7366702937976061, + "acc_stderr,none": 0.010276185322196766, + "acc_norm,none": 0.749727965179543, + "acc_norm_stderr,none": 0.010106561880089801 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764752922.596847, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1053802.049658454, + "end_time": 1053881.145782351, + "total_evaluation_time_seconds": "79.09612389700487" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/winogrande_2025-12-03T16-57-52.443428.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/winogrande_2025-12-03T16-57-52.443428.json new file mode 100644 index 0000000000000000000000000000000000000000..7a10edd10db3f2171911db01962c6797314fdd8d --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_3/winogrande_2025-12-03T16-57-52.443428.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6527229676400947, + "acc_stderr,none": 0.01338090924975123 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764752215.0443175, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1053093.62039059, + "end_time": 1053186.601473611, + "total_evaluation_time_seconds": "92.98108302103356" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/boolq_2025-12-04T08-38-46.880467.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/boolq_2025-12-04T08-38-46.880467.json new file mode 100644 index 0000000000000000000000000000000000000000..ea6097748d90a58587376dbeaef11665f7990528 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/boolq_2025-12-04T08-38-46.880467.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.6844036697247706, + "acc_stderr,none": 0.008128579858785899 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764808647.9137502, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1109528.17096515, + "end_time": 1109641.038813701, + "total_evaluation_time_seconds": "112.86784855090082" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/hellaswag_2025-12-04T09-02-41.042954.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/hellaswag_2025-12-04T09-02-41.042954.json new file mode 100644 index 0000000000000000000000000000000000000000..abdfe00fbd3a6773e1acf071ea3f1b10400eb232 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/hellaswag_2025-12-04T09-02-41.042954.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5240987851025692, + "acc_stderr,none": 0.004983982396187374, + "acc_norm,none": 0.7234614618601872, + "acc_norm_stderr,none": 0.004463721071319084 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764809330.6939251, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1110210.739080979, + "end_time": 1111075.201020237, + "total_evaluation_time_seconds": "864.4619392580353" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/piqa_2025-12-04T08-47-25.625519.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/piqa_2025-12-04T08-47-25.625519.json new file mode 100644 index 0000000000000000000000000000000000000000..4abd393d78ccfe267e1da205bc332d665fdbc18c --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/piqa_2025-12-04T08-47-25.625519.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.766050054406964, + "acc_stderr,none": 0.00987723689513745, + "acc_norm,none": 0.7698585418933623, + "acc_norm_stderr,none": 0.009820832826839812 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764809202.6501648, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1110082.529222168, + "end_time": 1110159.783810705, + "total_evaluation_time_seconds": "77.25458853691816" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/truthfulqa_mc1_2025-12-04T08-45-17.383169.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/truthfulqa_mc1_2025-12-04T08-45-17.383169.json new file mode 100644 index 0000000000000000000000000000000000000000..6e996bbedca83d02c3b50e30b2990b19a0fd98f7 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/truthfulqa_mc1_2025-12-04T08-45-17.383169.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.22766217870257038, + "acc_stderr,none": 0.014679255032111068 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764809058.7167923, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1109937.678967098, + "end_time": 1110031.541542731, + "total_evaluation_time_seconds": "93.86257563298568" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/winogrande_2025-12-04T08-36-04.158887.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/winogrande_2025-12-04T08-36-04.158887.json new file mode 100644 index 0000000000000000000000000000000000000000..118c6365378b9eb965320a138ae8939055648dc9 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_30/winogrande_2025-12-04T08-36-04.158887.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.7016574585635359, + "acc_stderr,none": 0.01285888501003043 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764808515.9815438, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1109396.733218977, + "end_time": 1109478.317241015, + "total_evaluation_time_seconds": "81.58402203791775" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/arc_challenge_2025-12-04T09-17-07.468206.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/arc_challenge_2025-12-04T09-17-07.468206.json new file mode 100644 index 0000000000000000000000000000000000000000..f97475336c49a37e4d61364bc22d53b9f5f3f0e6 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/arc_challenge_2025-12-04T09-17-07.468206.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.44795221843003413, + "acc_stderr,none": 0.014532011498211664, + "acc_norm,none": 0.4658703071672355, + "acc_norm_stderr,none": 0.014577311315231097 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764810868.3753405, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1111747.795333556, + "end_time": 1111941.62651528, + "total_evaluation_time_seconds": "193.83118172409013" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/boolq_2025-12-04T09-13-02.798732.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/boolq_2025-12-04T09-13-02.798732.json new file mode 100644 index 0000000000000000000000000000000000000000..707cab8344ec821d8f24d464739ab405b2babe84 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/boolq_2025-12-04T09-13-02.798732.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.6553516819571865, + "acc_stderr,none": 0.008312235338398068 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764810703.542673, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1111583.802451596, + "end_time": 1111696.957047313, + "total_evaluation_time_seconds": "113.15459571708925" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/hellaswag_2025-12-04T09-36-50.243127.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/hellaswag_2025-12-04T09-36-50.243127.json new file mode 100644 index 0000000000000000000000000000000000000000..9f467885516bdc44e10adfcef39a695b3d83750d --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/hellaswag_2025-12-04T09-36-50.243127.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5295757817167894, + "acc_stderr,none": 0.004981044370530808, + "acc_norm,none": 0.7159928301135232, + "acc_norm_stderr,none": 0.004500186424443802 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764811375.2972603, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1112255.848847055, + "end_time": 1113124.401335357, + "total_evaluation_time_seconds": "868.5524883018807" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/piqa_2025-12-04T09-21-31.050544.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/piqa_2025-12-04T09-21-31.050544.json new file mode 100644 index 0000000000000000000000000000000000000000..fd4dfaecb81f3abfc823cf080f3026a4b28890cb --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/piqa_2025-12-04T09-21-31.050544.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7557127312295974, + "acc_stderr,none": 0.010024765172284246, + "acc_norm,none": 0.7568008705114254, + "acc_norm_stderr,none": 0.010009611953858941 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764811248.7656322, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1112129.657208685, + "end_time": 1112205.208862029, + "total_evaluation_time_seconds": "75.55165334395133" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/truthfulqa_mc1_2025-12-04T09-19-24.958085.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/truthfulqa_mc1_2025-12-04T09-19-24.958085.json new file mode 100644 index 0000000000000000000000000000000000000000..af040ac2b10ef266dea4fabe835cd546f8eb8195 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_31/truthfulqa_mc1_2025-12-04T09-19-24.958085.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.2607099143206854, + "acc_stderr,none": 0.015368841620766372 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764811109.3958366, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1111991.864051174, + "end_time": 1112079.116466537, + "total_evaluation_time_seconds": "87.25241536297835" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_4/hellaswag_2025-12-03T18-00-01.906620.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_4/hellaswag_2025-12-03T18-00-01.906620.json new file mode 100644 index 0000000000000000000000000000000000000000..8ad6444219963b84d8af473c3f0520e839949b94 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_4/hellaswag_2025-12-03T18-00-01.906620.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.43178649671380204, + "acc_stderr,none": 0.004943127583290517, + "acc_norm,none": 0.5828520215096594, + "acc_norm_stderr,none": 0.004920800313232728 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764755155.2622724, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1056034.40069202, + "end_time": 1056916.064992401, + "total_evaluation_time_seconds": "881.6643003809731" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_4/piqa_2025-12-03T17-44-29.240738.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_4/piqa_2025-12-03T17-44-29.240738.json new file mode 100644 index 0000000000000000000000000000000000000000..a285cb3331ca0abd045e6597ea4a9ba43b9a6b4d --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_4/piqa_2025-12-03T17-44-29.240738.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7334058759521219, + "acc_stderr,none": 0.010316749863541367, + "acc_norm,none": 0.7464635473340587, + "acc_norm_stderr,none": 0.01015009083455178 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764755020.8214374, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1055901.462058678, + "end_time": 1055983.399104881, + "total_evaluation_time_seconds": "81.9370462030638" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_5/boolq_2025-12-03T18-10-19.152068.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_5/boolq_2025-12-03T18-10-19.152068.json new file mode 100644 index 0000000000000000000000000000000000000000..57168dc750b850bccd9f13ed42e0945172e577d5 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_5/boolq_2025-12-03T18-10-19.152068.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7247706422018348, + "acc_stderr,none": 0.007811603921650585 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764756535.3748424, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1057417.166498061, + "end_time": 1057533.310345111, + "total_evaluation_time_seconds": "116.14384704991244" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_7/hellaswag_2025-12-03T19-45-04.332262.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_7/hellaswag_2025-12-03T19-45-04.332262.json new file mode 100644 index 0000000000000000000000000000000000000000..65e460998a6728f9c6183fea9bd0cb7cab4569d7 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_7/hellaswag_2025-12-03T19-45-04.332262.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.47540330611431986, + "acc_stderr,none": 0.00498374014521862, + "acc_norm,none": 0.6610237004580761, + "acc_norm_stderr,none": 0.004723943549005956 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764761463.7766407, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1062343.738718176, + "end_time": 1063218.490535384, + "total_evaluation_time_seconds": "874.7518172080163" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_8/truthfulqa_mc1_2025-12-03T20-02-50.485013.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_8/truthfulqa_mc1_2025-12-03T20-02-50.485013.json new file mode 100644 index 0000000000000000000000000000000000000000..83dbc56a6e3a0ae1ec69d3f09bab6a59ee7d7f99 --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_8/truthfulqa_mc1_2025-12-03T20-02-50.485013.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.22276621787025705, + "acc_stderr,none": 0.01456650696139676 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764763299.1785407, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1064181.00062608, + "end_time": 1064284.642962052, + "total_evaluation_time_seconds": "103.6423359720502" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_9/winogrande_2025-12-03T20-28-24.438407.json b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_9/winogrande_2025-12-03T20-28-24.438407.json new file mode 100644 index 0000000000000000000000000000000000000000..ba1342c5c5a70f01fc37ad998f2ac8af7501afde --- /dev/null +++ b/lm-evaluation-harness/results3/Llama-3.1-8B-quantization-layer-mlp/mlp_9/winogrande_2025-12-03T20-28-24.438407.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6677190213101816, + "acc_stderr,none": 0.013238316554236525 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_num_parameters": 8030261248, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764764847.8472464, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_eos_token": [ + "<|end_of_text|>", + "128001" + ], + "tokenizer_bos_token": [ + "<|begin_of_text|>", + "128000" + ], + "eot_token_id": 128001, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Llama-3.1-8B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Llama-3.1-8B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1065726.892349282, + "end_time": 1065818.596717974, + "total_evaluation_time_seconds": "91.70436869189143" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_-1/hellaswag_2025-12-04T10-10-07.435253.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_-1/hellaswag_2025-12-04T10-10-07.435253.json new file mode 100644 index 0000000000000000000000000000000000000000..48da42ec2803873b2360e9a6e1850e1d0d681004 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_-1/hellaswag_2025-12-04T10-10-07.435253.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.509061939852619, + "acc_stderr,none": 0.004988961834874214, + "acc_norm,none": 0.7165903206532563, + "acc_norm_stderr,none": 0.004497325533959629 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764813421.6398456, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1114301.989621036, + "end_time": 1115121.59327327, + "total_evaluation_time_seconds": "819.6036522339564" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_-1/piqa_2025-12-04T09-55-38.053100.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_-1/piqa_2025-12-04T09-55-38.053100.json new file mode 100644 index 0000000000000000000000000000000000000000..49f3dd81785c47d4682af0770f68449ba1697442 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_-1/piqa_2025-12-04T09-55-38.053100.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7557127312295974, + "acc_stderr,none": 0.010024765172284246, + "acc_norm,none": 0.7752992383025027, + "acc_norm_stderr,none": 0.00973828258654838 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764813295.0747423, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1114175.50160029, + "end_time": 1114252.211367037, + "total_evaluation_time_seconds": "76.7097667469643" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_0/piqa_2025-12-04T10-29-18.819436.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_0/piqa_2025-12-04T10-29-18.819436.json new file mode 100644 index 0000000000000000000000000000000000000000..a7d0a87d4af7fca330981eb04076f88926b6dd81 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_0/piqa_2025-12-04T10-29-18.819436.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.5892274211099021, + "acc_stderr,none": 0.011478565556775776, + "acc_norm,none": 0.5788900979325353, + "acc_norm_stderr,none": 0.011519701059151495 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764815315.5213697, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1116196.121684827, + "end_time": 1116272.977763083, + "total_evaluation_time_seconds": "76.85607825615443" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_0/winogrande_2025-12-04T10-17-43.184748.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_0/winogrande_2025-12-04T10-17-43.184748.json new file mode 100644 index 0000000000000000000000000000000000000000..99a6082d42a67fad2efd7e2478210f3e923d1ed4 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_0/winogrande_2025-12-04T10-17-43.184748.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5019731649565904, + "acc_stderr,none": 0.01405237625922564 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764814593.8611104, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1115471.32080534, + "end_time": 1115577.342906612, + "total_evaluation_time_seconds": "106.02210127189755" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/boolq_2025-12-04T10-54-04.584388.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/boolq_2025-12-04T10-54-04.584388.json new file mode 100644 index 0000000000000000000000000000000000000000..3e08a36f684a5200e02632457bfd2509d223cfc1 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/boolq_2025-12-04T10-54-04.584388.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.3782874617737003, + "acc_stderr,none": 0.008482001133931001 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764816746.7153518, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1117626.907206135, + "end_time": 1117758.742777014, + "total_evaluation_time_seconds": "131.8355708788149" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/hellaswag_2025-12-04T11-17-31.249947.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/hellaswag_2025-12-04T11-17-31.249947.json new file mode 100644 index 0000000000000000000000000000000000000000..6a8ff55699d566ac9f15704b460d3ad79cbc007b --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/hellaswag_2025-12-04T11-17-31.249947.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.2593108942441745, + "acc_stderr,none": 0.004373608212561029, + "acc_norm,none": 0.25941047600079664, + "acc_norm_stderr,none": 0.004374153847826759 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764817472.0428863, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1118352.538491732, + "end_time": 1119165.407933428, + "total_evaluation_time_seconds": "812.869441695977" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/piqa_2025-12-04T11-03-07.987108.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/piqa_2025-12-04T11-03-07.987108.json new file mode 100644 index 0000000000000000000000000000000000000000..3a3bedd05ef590fe35ae7bf2981e92d9d1bc395b --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/piqa_2025-12-04T11-03-07.987108.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.5342763873775843, + "acc_stderr,none": 0.011638380213532444, + "acc_norm,none": 0.5108813928182807, + "acc_norm_stderr,none": 0.011663061261117727 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764817344.247645, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1118224.144598545, + "end_time": 1118302.145441611, + "total_evaluation_time_seconds": "78.00084306602366" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/truthfulqa_mc1_2025-12-04T11-00-59.356549.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/truthfulqa_mc1_2025-12-04T11-00-59.356549.json new file mode 100644 index 0000000000000000000000000000000000000000..5512bd4b4bdf9fe8cdb6bd39d6b9dcb716eb0766 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/truthfulqa_mc1_2025-12-04T11-00-59.356549.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.22888616891064872, + "acc_stderr,none": 0.014706994909055025 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764817202.4659846, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1118083.635514426, + "end_time": 1118173.514805256, + "total_evaluation_time_seconds": "89.8792908298783" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/winogrande_2025-12-04T10-51-02.117108.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/winogrande_2025-12-04T10-51-02.117108.json new file mode 100644 index 0000000000000000000000000000000000000000..9a21533535fc70265e3c4de8c397166c9656d760 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_1/winogrande_2025-12-04T10-51-02.117108.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.4996053670086819, + "acc_stderr,none": 0.014052481306049516 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764816616.873898, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1117496.356980681, + "end_time": 1117576.275451171, + "total_evaluation_time_seconds": "79.91847049002536" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/boolq_2025-12-04T16-01-38.054014.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/boolq_2025-12-04T16-01-38.054014.json new file mode 100644 index 0000000000000000000000000000000000000000..4cb87646e7433149968df7cd926e7a74f66c94d8 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/boolq_2025-12-04T16-01-38.054014.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7162079510703364, + "acc_stderr,none": 0.007885191054174685 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764835169.7126412, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1136049.865829769, + "end_time": 1136212.212373921, + "total_evaluation_time_seconds": "162.34654415189289" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/hellaswag_2025-12-04T16-25-05.558987.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/hellaswag_2025-12-04T16-25-05.558987.json new file mode 100644 index 0000000000000000000000000000000000000000..27d39522787960a025c4e7db54d197bcbf535779 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/hellaswag_2025-12-04T16-25-05.558987.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.47649870543716394, + "acc_stderr,none": 0.004984266543053114, + "acc_norm,none": 0.6731726747659829, + "acc_norm_stderr,none": 0.0046809492838553145 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764835916.6238585, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1136794.050296016, + "end_time": 1137619.717286581, + "total_evaluation_time_seconds": "825.6669905649032" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/piqa_2025-12-04T16-10-28.860785.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/piqa_2025-12-04T16-10-28.860785.json new file mode 100644 index 0000000000000000000000000000000000000000..5693dfdf20ad5f7549de76818fa874a826ad3d06 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/piqa_2025-12-04T16-10-28.860785.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7372143634385201, + "acc_stderr,none": 0.010269354068140769, + "acc_norm,none": 0.7415669205658324, + "acc_norm_stderr,none": 0.01021397163677333 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764835779.789227, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1136659.139123993, + "end_time": 1136743.019118841, + "total_evaluation_time_seconds": "83.87999484804459" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/winogrande_2025-12-04T15-58-04.290056.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/winogrande_2025-12-04T15-58-04.290056.json new file mode 100644 index 0000000000000000000000000000000000000000..b2c59981907a8785facb0fa90475001ac80dfa28 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_10/winogrande_2025-12-04T15-58-04.290056.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5927387529597474, + "acc_stderr,none": 0.013808654122417855 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764835034.1584334, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1135913.374693671, + "end_time": 1135998.448375131, + "total_evaluation_time_seconds": "85.07368145999499" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/arc_challenge_2025-12-04T16-40-41.176324.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/arc_challenge_2025-12-04T16-40-41.176324.json new file mode 100644 index 0000000000000000000000000000000000000000..9e2f8ac8f8426f95ffe9e363f61e75aca76a4dba --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/arc_challenge_2025-12-04T16-40-41.176324.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4598976109215017, + "acc_stderr,none": 0.014564318856924848, + "acc_norm,none": 0.5179180887372014, + "acc_norm_stderr,none": 0.014602005585490971 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764837456.9649053, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1138337.694368622, + "end_time": 1138555.334633103, + "total_evaluation_time_seconds": "217.64026448107325" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/boolq_2025-12-04T16-36-12.335773.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/boolq_2025-12-04T16-36-12.335773.json new file mode 100644 index 0000000000000000000000000000000000000000..0fc34aa2d6824183fb8c0e5ca03a63ba922889c5 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/boolq_2025-12-04T16-36-12.335773.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7425076452599388, + "acc_stderr,none": 0.007647600166820912 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764837269.2739453, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1138149.766653681, + "end_time": 1138286.494159873, + "total_evaluation_time_seconds": "136.72750619216822" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/hellaswag_2025-12-04T16-59-57.214113.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/hellaswag_2025-12-04T16-59-57.214113.json new file mode 100644 index 0000000000000000000000000000000000000000..fa0cd6c3db2cba266e96706cfdc426ac65347cf5 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/hellaswag_2025-12-04T16-59-57.214113.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.49133638717386974, + "acc_stderr,none": 0.004989032307320742, + "acc_norm,none": 0.6954789882493527, + "acc_norm_stderr,none": 0.00459263736990577 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764838006.863188, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1138887.67720049, + "end_time": 1139711.372430048, + "total_evaluation_time_seconds": "823.6952295580413" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/piqa_2025-12-04T16-45-22.429284.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/piqa_2025-12-04T16-45-22.429284.json new file mode 100644 index 0000000000000000000000000000000000000000..eb7dbfef6e835ae4ff0386b8b66d18e1e24b3b38 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/piqa_2025-12-04T16-45-22.429284.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7486398258977149, + "acc_stderr,none": 0.01012115601681925, + "acc_norm,none": 0.7676822633297062, + "acc_norm_stderr,none": 0.009853201384168241 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764837878.7217805, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1138758.71029324, + "end_time": 1138836.587729026, + "total_evaluation_time_seconds": "77.87743578618392" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/truthfulqa_mc1_2025-12-04T16-43-14.159894.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/truthfulqa_mc1_2025-12-04T16-43-14.159894.json new file mode 100644 index 0000000000000000000000000000000000000000..26a52b0debf11e71b5b5715cff816683feb54f90 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_11/truthfulqa_mc1_2025-12-04T16-43-14.159894.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3292533659730722, + "acc_stderr,none": 0.016451264440068235 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764837724.4780588, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1138605.769359002, + "end_time": 1138708.317939418, + "total_evaluation_time_seconds": "102.54858041601256" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/arc_challenge_2025-12-04T17-14-48.518551.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/arc_challenge_2025-12-04T17-14-48.518551.json new file mode 100644 index 0000000000000000000000000000000000000000..73c67e5f0756ac0ac60a52ddf65275d2ef60645c --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/arc_challenge_2025-12-04T17-14-48.518551.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.46075085324232085, + "acc_stderr,none": 0.014566303676636586, + "acc_norm,none": 0.5059726962457338, + "acc_norm_stderr,none": 0.014610348300255795 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764839516.6975927, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1140396.125647552, + "end_time": 1140602.676579275, + "total_evaluation_time_seconds": "206.55093172285706" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/boolq_2025-12-04T17-10-27.118043.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/boolq_2025-12-04T17-10-27.118043.json new file mode 100644 index 0000000000000000000000000000000000000000..e60247c4e8a2ad1717c64b9cf064f16d50ca4198 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/boolq_2025-12-04T17-10-27.118043.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.691131498470948, + "acc_stderr,none": 0.008080899275231325 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764839323.2513628, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1140200.621754653, + "end_time": 1140341.276443822, + "total_evaluation_time_seconds": "140.6546891690232" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/hellaswag_2025-12-04T17-34-02.276956.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/hellaswag_2025-12-04T17-34-02.276956.json new file mode 100644 index 0000000000000000000000000000000000000000..1d3f63fb5c1ed8ff02aa533a284ec2121c989c6a --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/hellaswag_2025-12-04T17-34-02.276956.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.49213304122684726, + "acc_stderr,none": 0.00498916374765079, + "acc_norm,none": 0.69398526190002, + "acc_norm_stderr,none": 0.004598940722374069 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764840052.5640588, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1140935.019882824, + "end_time": 1141756.435287955, + "total_evaluation_time_seconds": "821.4154051309451" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/piqa_2025-12-04T17-19-29.825289.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/piqa_2025-12-04T17-19-29.825289.json new file mode 100644 index 0000000000000000000000000000000000000000..3a1fc6d6b440792cf5f37f0e689615ce1bcf2736 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/piqa_2025-12-04T17-19-29.825289.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7410228509249184, + "acc_stderr,none": 0.010220966031405612, + "acc_norm,none": 0.7578890097932536, + "acc_norm_stderr,none": 0.009994371269104367 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764839926.8479714, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1140806.658845813, + "end_time": 1140883.983521132, + "total_evaluation_time_seconds": "77.32467531901784" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/truthfulqa_mc1_2025-12-04T17-17-21.018066.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/truthfulqa_mc1_2025-12-04T17-17-21.018066.json new file mode 100644 index 0000000000000000000000000000000000000000..c2c40e81e169408b65178aa1667f574ce981615e --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/truthfulqa_mc1_2025-12-04T17-17-21.018066.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.31946144430844553, + "acc_stderr,none": 0.016322644182960505 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764839776.8372867, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1140656.660500517, + "end_time": 1140755.176084025, + "total_evaluation_time_seconds": "98.51558350794949" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/winogrande_2025-12-04T17-07-14.423663.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/winogrande_2025-12-04T17-07-14.423663.json new file mode 100644 index 0000000000000000000000000000000000000000..75e60c45ec76bbe453ff08e7e6c421000c24b230 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_12/winogrande_2025-12-04T17-07-14.423663.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5982636148382005, + "acc_stderr,none": 0.013778439266649494 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764839184.360895, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1140065.037622034, + "end_time": 1140148.581674298, + "total_evaluation_time_seconds": "83.54405226395465" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/boolq_2025-12-04T17-44-23.637181.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/boolq_2025-12-04T17-44-23.637181.json new file mode 100644 index 0000000000000000000000000000000000000000..5e22c6ef4080f445484aadcee8f76a9f7f9799d4 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/boolq_2025-12-04T17-44-23.637181.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.6932721712538227, + "acc_stderr,none": 0.00806530905177178 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764841358.880423, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1142240.934391355, + "end_time": 1142377.795493526, + "total_evaluation_time_seconds": "136.8611021710094" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/hellaswag_2025-12-04T18-08-33.213328.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/hellaswag_2025-12-04T18-08-33.213328.json new file mode 100644 index 0000000000000000000000000000000000000000..3ab1ea9395ce1fa748c3f4fd031d53d1c2ae370f --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/hellaswag_2025-12-04T18-08-33.213328.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.4876518621788488, + "acc_stderr,none": 0.004988259530472481, + "acc_norm,none": 0.6872137024497113, + "acc_norm_stderr,none": 0.004626805906522241 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764842122.1922076, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1143001.920775474, + "end_time": 1143827.371445147, + "total_evaluation_time_seconds": "825.4506696730386" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/piqa_2025-12-04T17-53-55.633954.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/piqa_2025-12-04T17-53-55.633954.json new file mode 100644 index 0000000000000000000000000000000000000000..ea6ae45aab8dd741e777a0d7683386594848e96e --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/piqa_2025-12-04T17-53-55.633954.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7486398258977149, + "acc_stderr,none": 0.010121156016819252, + "acc_norm,none": 0.7622415669205659, + "acc_norm_stderr,none": 0.009932525779525483 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764841945.4957347, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1142826.40191998, + "end_time": 1142949.792335718, + "total_evaluation_time_seconds": "123.39041573787108" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/truthfulqa_mc1_2025-12-04T17-51-01.261664.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/truthfulqa_mc1_2025-12-04T17-51-01.261664.json new file mode 100644 index 0000000000000000000000000000000000000000..af9d4ccf4146bad491b00ab0b92a57b85930c282 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/truthfulqa_mc1_2025-12-04T17-51-01.261664.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3047735618115055, + "acc_stderr,none": 0.01611412415688246 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764841800.169263, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1142679.5244413, + "end_time": 1142775.420028922, + "total_evaluation_time_seconds": "95.8955876219552" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/winogrande_2025-12-04T17-41-15.088238.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/winogrande_2025-12-04T17-41-15.088238.json new file mode 100644 index 0000000000000000000000000000000000000000..01195d8f2b8ea53b19f0e224bec944123badc18a --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_13/winogrande_2025-12-04T17-41-15.088238.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6006314127861089, + "acc_stderr,none": 0.013764933546717617 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764841225.9939988, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1142105.998020397, + "end_time": 1142189.246637728, + "total_evaluation_time_seconds": "83.24861733103171" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/arc_challenge_2025-12-04T18-23-21.638478.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/arc_challenge_2025-12-04T18-23-21.638478.json new file mode 100644 index 0000000000000000000000000000000000000000..eb529a192fd2d575fd191bab849b6ccb006d5e5c --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/arc_challenge_2025-12-04T18-23-21.638478.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4854948805460751, + "acc_stderr,none": 0.014605241081370053, + "acc_norm,none": 0.5298634812286689, + "acc_norm_stderr,none": 0.014585305840007098 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764843630.9265912, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1144510.896629473, + "end_time": 1144715.796836529, + "total_evaluation_time_seconds": "204.90020705596544" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/boolq_2025-12-04T18-19-04.976083.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/boolq_2025-12-04T18-19-04.976083.json new file mode 100644 index 0000000000000000000000000000000000000000..990d72863697e90136bd99656cabbb55cf89d513 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/boolq_2025-12-04T18-19-04.976083.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7204892966360856, + "acc_stderr,none": 0.007848840939247374 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764843440.3943563, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1144319.595074075, + "end_time": 1144459.13452821, + "total_evaluation_time_seconds": "139.53945413487963" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/hellaswag_2025-12-04T18-42-36.287511.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/hellaswag_2025-12-04T18-42-36.287511.json new file mode 100644 index 0000000000000000000000000000000000000000..900392650a61b149a10c6421b19a5b7045f69c45 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/hellaswag_2025-12-04T18-42-36.287511.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.49502091216889066, + "acc_stderr,none": 0.0049895339988203485, + "acc_norm,none": 0.6987651862178849, + "acc_norm_stderr,none": 0.004578568617306771 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764844165.576913, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1145045.309710603, + "end_time": 1145870.445553831, + "total_evaluation_time_seconds": "825.1358432280831" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/piqa_2025-12-04T18-28-00.291656.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/piqa_2025-12-04T18-28-00.291656.json new file mode 100644 index 0000000000000000000000000000000000000000..a221e10033993ab7dcbe57b001132491d4ffb323 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/piqa_2025-12-04T18-28-00.291656.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7529923830250272, + "acc_stderr,none": 0.010062268140772622, + "acc_norm,none": 0.7676822633297062, + "acc_norm_stderr,none": 0.009853201384168241 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764844035.5881295, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1144914.396323988, + "end_time": 1144994.449965769, + "total_evaluation_time_seconds": "80.05364178097807" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/truthfulqa_mc1_2025-12-04T18-25-49.129998.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/truthfulqa_mc1_2025-12-04T18-25-49.129998.json new file mode 100644 index 0000000000000000000000000000000000000000..7769a9f2f86c3a76cafbc938078a7a23543a8c3d --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/truthfulqa_mc1_2025-12-04T18-25-49.129998.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.33047735618115054, + "acc_stderr,none": 0.016466769613698303 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764843889.1407547, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1144767.343492017, + "end_time": 1144863.288367135, + "total_evaluation_time_seconds": "95.94487511808984" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/winogrande_2025-12-04T18-15-52.021911.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/winogrande_2025-12-04T18-15-52.021911.json new file mode 100644 index 0000000000000000000000000000000000000000..056e7bc59e540baab1f1830ef2ee2f1f35d2ffdb --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_14/winogrande_2025-12-04T18-15-52.021911.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5966850828729282, + "acc_stderr,none": 0.013787257285896238 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764843301.7684214, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1144181.36146718, + "end_time": 1144266.180282997, + "total_evaluation_time_seconds": "84.81881581689231" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/arc_challenge_2025-12-04T18-57-30.107177.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/arc_challenge_2025-12-04T18-57-30.107177.json new file mode 100644 index 0000000000000000000000000000000000000000..35abf621cce24d8cdb0887a7eb370fe6b46ca226 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/arc_challenge_2025-12-04T18-57-30.107177.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4872013651877133, + "acc_stderr,none": 0.014606603181012538, + "acc_norm,none": 0.5213310580204779, + "acc_norm_stderr,none": 0.014598087973127108 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764845677.0557857, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1146557.199603307, + "end_time": 1146764.265522972, + "total_evaluation_time_seconds": "207.06591966492124" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/boolq_2025-12-04T18-53-10.324633.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/boolq_2025-12-04T18-53-10.324633.json new file mode 100644 index 0000000000000000000000000000000000000000..38cf18d72e7c5af12ca425d503a6bae5c2a9ce30 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/boolq_2025-12-04T18-53-10.324633.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7275229357798165, + "acc_stderr,none": 0.007787191593866642 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764845480.9450567, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1146361.04876269, + "end_time": 1146504.483047764, + "total_evaluation_time_seconds": "143.43428507400677" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/hellaswag_2025-12-04T19-17-04.124809.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/hellaswag_2025-12-04T19-17-04.124809.json new file mode 100644 index 0000000000000000000000000000000000000000..6a3eb41f835b6128f3a3c1a984d4c7106d618cee --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/hellaswag_2025-12-04T19-17-04.124809.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.4987054371639116, + "acc_stderr,none": 0.004989764686738845, + "acc_norm,none": 0.6984664409480184, + "acc_norm_stderr,none": 0.004579859084500769 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764846226.2013311, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1147105.257712417, + "end_time": 1147938.283053113, + "total_evaluation_time_seconds": "833.0253406958655" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/piqa_2025-12-04T19-02-19.784826.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/piqa_2025-12-04T19-02-19.784826.json new file mode 100644 index 0000000000000000000000000000000000000000..f2be23dc2f62d1827db9e644e4dc6f4016a2c5c2 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/piqa_2025-12-04T19-02-19.784826.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7453754080522307, + "acc_stderr,none": 0.010164432237060492, + "acc_norm,none": 0.750272034820457, + "acc_norm_stderr,none": 0.010099232969867497 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764846088.8819535, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1146968.1543759, + "end_time": 1147053.943107713, + "total_evaluation_time_seconds": "85.78873181296512" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/truthfulqa_mc1_2025-12-04T19-00-03.230419.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/truthfulqa_mc1_2025-12-04T19-00-03.230419.json new file mode 100644 index 0000000000000000000000000000000000000000..1807415c8159cd4e1417c7022f993289d2e0a13a --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/truthfulqa_mc1_2025-12-04T19-00-03.230419.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.2913096695226438, + "acc_stderr,none": 0.01590598704818483 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764845933.9831147, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1146814.774262453, + "end_time": 1146917.38851708, + "total_evaluation_time_seconds": "102.61425462714396" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/winogrande_2025-12-04T18-49-55.056732.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/winogrande_2025-12-04T18-49-55.056732.json new file mode 100644 index 0000000000000000000000000000000000000000..f1601b7d34e8f8dd2bf82b9467c0c20ac0252d40 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_15/winogrande_2025-12-04T18-49-55.056732.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5808997632202052, + "acc_stderr,none": 0.013867325192210117 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764845343.2863233, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1146222.395514157, + "end_time": 1146309.21492883, + "total_evaluation_time_seconds": "86.81941467314027" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/arc_challenge_2025-12-04T19-32-48.448135.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/arc_challenge_2025-12-04T19-32-48.448135.json new file mode 100644 index 0000000000000000000000000000000000000000..9dcc952de049c3ab84870fe9dd13daa68057d619 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/arc_challenge_2025-12-04T19-32-48.448135.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4931740614334471, + "acc_stderr,none": 0.014610029151379813, + "acc_norm,none": 0.5392491467576792, + "acc_norm_stderr,none": 0.014566303676636581 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764847781.887803, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1148664.030661838, + "end_time": 1148882.606479056, + "total_evaluation_time_seconds": "218.57581721805036" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/boolq_2025-12-04T19-28-18.959993.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/boolq_2025-12-04T19-28-18.959993.json new file mode 100644 index 0000000000000000000000000000000000000000..bf95dc9e3472570cb4dbb2bd0a973c0c6cce892e --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/boolq_2025-12-04T19-28-18.959993.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7532110091743119, + "acc_stderr,none": 0.00754073641425668 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764847588.0141492, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1148468.696153889, + "end_time": 1148613.118341971, + "total_evaluation_time_seconds": "144.42218808201142" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/hellaswag_2025-12-04T19-52-25.664425.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/hellaswag_2025-12-04T19-52-25.664425.json new file mode 100644 index 0000000000000000000000000000000000000000..a4d8c93c41157454de1cd948ec49992f7690f52e --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/hellaswag_2025-12-04T19-52-25.664425.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.49283011352320255, + "acc_stderr,none": 0.004989268362968715, + "acc_norm,none": 0.6971718781119299, + "acc_norm_stderr,none": 0.004585424513012099 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764848359.0591547, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1149239.157679633, + "end_time": 1150059.822689351, + "total_evaluation_time_seconds": "820.6650097179227" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/piqa_2025-12-04T19-37-55.677195.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/piqa_2025-12-04T19-37-55.677195.json new file mode 100644 index 0000000000000000000000000000000000000000..b7f64355ab64b513c5c7be3de16f4e22ec32be8d --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/piqa_2025-12-04T19-37-55.677195.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7546245919477693, + "acc_stderr,none": 0.010039831320422393, + "acc_norm,none": 0.7698585418933623, + "acc_norm_stderr,none": 0.009820832826839813 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764848220.0224977, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1149099.224359257, + "end_time": 1149189.835511891, + "total_evaluation_time_seconds": "90.61115263402462" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/truthfulqa_mc1_2025-12-04T19-35-34.076908.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/truthfulqa_mc1_2025-12-04T19-35-34.076908.json new file mode 100644 index 0000000000000000000000000000000000000000..286e79054e768882aee80502cf9ee340f7a96fcd --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/truthfulqa_mc1_2025-12-04T19-35-34.076908.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3011015911872705, + "acc_stderr,none": 0.01605899902610062 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764848056.7193093, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1148934.4804446, + "end_time": 1149048.235163327, + "total_evaluation_time_seconds": "113.75471872696653" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/winogrande_2025-12-04T19-25-02.126701.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/winogrande_2025-12-04T19-25-02.126701.json new file mode 100644 index 0000000000000000000000000000000000000000..9c764f23d8e9295a1afefbf094acef5bf4cfa11e --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_16/winogrande_2025-12-04T19-25-02.126701.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5864246250986582, + "acc_stderr,none": 0.013840971763195303 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764847412.5355942, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1148291.915647894, + "end_time": 1148416.284996836, + "total_evaluation_time_seconds": "124.36934894206934" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/arc_challenge_2025-12-04T20-08-13.197303.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/arc_challenge_2025-12-04T20-08-13.197303.json new file mode 100644 index 0000000000000000000000000000000000000000..64f88966c62389684fb3ede1f7f39fd7503d3b12 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/arc_challenge_2025-12-04T20-08-13.197303.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.48378839590443684, + "acc_stderr,none": 0.014603708567414938, + "acc_norm,none": 0.5503412969283277, + "acc_norm_stderr,none": 0.014537144444284736 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764849905.2766922, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1150786.886528224, + "end_time": 1151007.355563722, + "total_evaluation_time_seconds": "220.4690354980994" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/boolq_2025-12-04T20-03-41.466200.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/boolq_2025-12-04T20-03-41.466200.json new file mode 100644 index 0000000000000000000000000000000000000000..ed5bec991c35696f42c5a63fea02d03d17812176 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/boolq_2025-12-04T20-03-41.466200.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7412844036697248, + "acc_stderr,none": 0.007659426910763684 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764849680.0600436, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1150559.521364469, + "end_time": 1150735.624649503, + "total_evaluation_time_seconds": "176.1032850339543" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/hellaswag_2025-12-04T20-28-32.849299.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/hellaswag_2025-12-04T20-28-32.849299.json new file mode 100644 index 0000000000000000000000000000000000000000..d8ce7c3fc9b1d91c25c2f8d434fa67231072a4ce --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/hellaswag_2025-12-04T20-28-32.849299.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.4955188209520016, + "acc_stderr,none": 0.0049895810081631905, + "acc_norm,none": 0.6996614220274846, + "acc_norm_stderr,none": 0.004574683373821045 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764850505.1464703, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1151385.598980608, + "end_time": 1152227.00740603, + "total_evaluation_time_seconds": "841.4084254221525" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/piqa_2025-12-04T20-13-39.797062.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/piqa_2025-12-04T20-13-39.797062.json new file mode 100644 index 0000000000000000000000000000000000000000..e296c2ff60e5e8acb50f83a578b05a1c047b24f1 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/piqa_2025-12-04T20-13-39.797062.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7513601741022851, + "acc_stderr,none": 0.010084511234296862, + "acc_norm,none": 0.7616974972796517, + "acc_norm_stderr,none": 0.009940334245876209 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764850354.3808591, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1151233.062205659, + "end_time": 1151333.955493222, + "total_evaluation_time_seconds": "100.89328756299801" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/truthfulqa_mc1_2025-12-04T20-11-07.352276.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/truthfulqa_mc1_2025-12-04T20-11-07.352276.json new file mode 100644 index 0000000000000000000000000000000000000000..2765606002bafb01a0f6dd8010eed066b3a7b02c --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/truthfulqa_mc1_2025-12-04T20-11-07.352276.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3463892288861689, + "acc_stderr,none": 0.01665699710912515 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764850182.4535909, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1151060.53693574, + "end_time": 1151181.510567392, + "total_evaluation_time_seconds": "120.97363165207207" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/winogrande_2025-12-04T19-59-51.940135.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/winogrande_2025-12-04T19-59-51.940135.json new file mode 100644 index 0000000000000000000000000000000000000000..badc140284cbc021bb4b47cf34407facae3a9e0b --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_17/winogrande_2025-12-04T19-59-51.940135.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.601420678768745, + "acc_stderr,none": 0.013760357176873836 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764849531.2059152, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1150410.674170558, + "end_time": 1150506.098433411, + "total_evaluation_time_seconds": "95.42426285287365" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/arc_challenge_2025-12-04T20-44-15.330835.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/arc_challenge_2025-12-04T20-44-15.330835.json new file mode 100644 index 0000000000000000000000000000000000000000..02d68bb199c6c2e40795d37cee5a400ca7b149be --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/arc_challenge_2025-12-04T20-44-15.330835.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.47440273037542663, + "acc_stderr,none": 0.014592230885298967, + "acc_norm,none": 0.5187713310580204, + "acc_norm_stderr,none": 0.014601090150633962 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764852077.2827356, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1152957.75072085, + "end_time": 1153169.48910504, + "total_evaluation_time_seconds": "211.7383841900155" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/boolq_2025-12-04T20-39-52.554160.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/boolq_2025-12-04T20-39-52.554160.json new file mode 100644 index 0000000000000000000000000000000000000000..d206da75419a4030acec26cfc694cdc4a052302b --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/boolq_2025-12-04T20-39-52.554160.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7382262996941896, + "acc_stderr,none": 0.007688653730439833 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764851873.1785924, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1152752.459382579, + "end_time": 1152906.712522099, + "total_evaluation_time_seconds": "154.253139520064" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/hellaswag_2025-12-04T21-03-47.025526.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/hellaswag_2025-12-04T21-03-47.025526.json new file mode 100644 index 0000000000000000000000000000000000000000..88ccc63a68423ec719ebbd871a574ca9a1f80d90 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/hellaswag_2025-12-04T21-03-47.025526.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.48735311690898225, + "acc_stderr,none": 0.004988184988344818, + "acc_norm,none": 0.6940848436566421, + "acc_norm_stderr,none": 0.004598522271041223 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764852631.1335554, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1153511.789315502, + "end_time": 1154341.183556485, + "total_evaluation_time_seconds": "829.3942409830634" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/piqa_2025-12-04T20-49-07.179382.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/piqa_2025-12-04T20-49-07.179382.json new file mode 100644 index 0000000000000000000000000000000000000000..c89149f0161801b5ae6fc9477ad23978a94cdec8 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/piqa_2025-12-04T20-49-07.179382.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7568008705114254, + "acc_stderr,none": 0.010009611953858927, + "acc_norm,none": 0.764961915125136, + "acc_norm_stderr,none": 0.009893146688805336 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764852495.9050171, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1153375.124519373, + "end_time": 1153461.337724938, + "total_evaluation_time_seconds": "86.21320556499995" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/truthfulqa_mc1_2025-12-04T20-46-49.728229.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/truthfulqa_mc1_2025-12-04T20-46-49.728229.json new file mode 100644 index 0000000000000000000000000000000000000000..e94d2860039a4d9d3e47629d8982c6636c2d9ab1 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/truthfulqa_mc1_2025-12-04T20-46-49.728229.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.29253365973072215, + "acc_stderr,none": 0.015925597445286165 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764852341.841327, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1153221.021110358, + "end_time": 1153323.886341916, + "total_evaluation_time_seconds": "102.86523155798204" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/winogrande_2025-12-04T20-36-26.631019.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/winogrande_2025-12-04T20-36-26.631019.json new file mode 100644 index 0000000000000000000000000000000000000000..d1ae4c9a66eaf861aaf4420d183784bd74343d6a --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_18/winogrande_2025-12-04T20-36-26.631019.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5895816890292028, + "acc_stderr,none": 0.013825107120035861 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764851700.2055447, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1152579.264436614, + "end_time": 1152700.789363293, + "total_evaluation_time_seconds": "121.52492667897604" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/arc_challenge_2025-12-04T21-18-53.986068.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/arc_challenge_2025-12-04T21-18-53.986068.json new file mode 100644 index 0000000000000000000000000000000000000000..4059ffe08d330a8bf16f89c771159113ae869a3c --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/arc_challenge_2025-12-04T21-18-53.986068.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.48890784982935154, + "acc_stderr,none": 0.01460779491401305, + "acc_norm,none": 0.5443686006825939, + "acc_norm_stderr,none": 0.014553749939306863 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764854159.3158426, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1155039.727178088, + "end_time": 1155248.144344656, + "total_evaluation_time_seconds": "208.41716656810604" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/boolq_2025-12-04T21-14-34.059474.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/boolq_2025-12-04T21-14-34.059474.json new file mode 100644 index 0000000000000000000000000000000000000000..faf4e3e1be521b274b3af288651b9b27fff4a349 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/boolq_2025-12-04T21-14-34.059474.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7452599388379205, + "acc_stderr,none": 0.007620703281690058 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764853960.3007696, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1154840.882850492, + "end_time": 1154988.217744381, + "total_evaluation_time_seconds": "147.33489388902672" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/hellaswag_2025-12-04T21-38-26.729753.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/hellaswag_2025-12-04T21-38-26.729753.json new file mode 100644 index 0000000000000000000000000000000000000000..3d177e240348572ad36bba849efee9e97db1fb23 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/hellaswag_2025-12-04T21-38-26.729753.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.492531368253336, + "acc_stderr,none": 0.004989224715784534, + "acc_norm,none": 0.7061342362079267, + "acc_norm_stderr,none": 0.004546002255456779 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764854709.4713848, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1155586.681185082, + "end_time": 1156420.887886944, + "total_evaluation_time_seconds": "834.2067018619273" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/piqa_2025-12-04T21-23-40.225621.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/piqa_2025-12-04T21-23-40.225621.json new file mode 100644 index 0000000000000000000000000000000000000000..4c58c4785a4689637d5aac1b6350dfe9463b0779 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/piqa_2025-12-04T21-23-40.225621.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.750816104461371, + "acc_stderr,none": 0.010091882770120214, + "acc_norm,none": 0.7633297062023939, + "acc_norm_stderr,none": 0.009916841655042806 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764854572.4376273, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1155452.649384735, + "end_time": 1155534.383917101, + "total_evaluation_time_seconds": "81.7345323660411" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/truthfulqa_mc1_2025-12-04T21-21-26.966024.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/truthfulqa_mc1_2025-12-04T21-21-26.966024.json new file mode 100644 index 0000000000000000000000000000000000000000..a5e17e359c603fedaad89012ac8557e573987a60 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/truthfulqa_mc1_2025-12-04T21-21-26.966024.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.33659730722154224, + "acc_stderr,none": 0.01654241280949488 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764854419.4130833, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1155299.250387258, + "end_time": 1155401.124129509, + "total_evaluation_time_seconds": "101.87374225119129" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/winogrande_2025-12-04T21-11-15.567663.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/winogrande_2025-12-04T21-11-15.567663.json new file mode 100644 index 0000000000000000000000000000000000000000..1a54686e25f49d2965b86ba84db972b6101f91d5 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_19/winogrande_2025-12-04T21-11-15.567663.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.584846093133386, + "acc_stderr,none": 0.013848684086658587 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764853815.2424896, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1154693.755069242, + "end_time": 1154789.725847076, + "total_evaluation_time_seconds": "95.97077783383429" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/arc_challenge_2025-12-04T11-32-09.306509.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/arc_challenge_2025-12-04T11-32-09.306509.json new file mode 100644 index 0000000000000000000000000000000000000000..f2bed60f4262d7e0500df4e45101b950a7a7d117 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/arc_challenge_2025-12-04T11-32-09.306509.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.447098976109215, + "acc_stderr,none": 0.014529380160526842, + "acc_norm,none": 0.5110921501706485, + "acc_norm_stderr,none": 0.014607794914013057 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764818963.543401, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1119844.590812882, + "end_time": 1120043.464789639, + "total_evaluation_time_seconds": "198.87397675705142" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/boolq_2025-12-04T11-28-00.938598.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/boolq_2025-12-04T11-28-00.938598.json new file mode 100644 index 0000000000000000000000000000000000000000..436df84b8122b03915456a10b8081400ffd7fb0a --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/boolq_2025-12-04T11-28-00.938598.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7217125382262997, + "acc_stderr,none": 0.007838292838766742 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764818774.619274, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1119655.289230176, + "end_time": 1119795.096880438, + "total_evaluation_time_seconds": "139.80765026202425" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/hellaswag_2025-12-04T11-51-30.015462.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/hellaswag_2025-12-04T11-51-30.015462.json new file mode 100644 index 0000000000000000000000000000000000000000..ef6da51946b14ccab131d712d1a804429ed2a2a6 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/hellaswag_2025-12-04T11-51-30.015462.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.4772953594901414, + "acc_stderr,none": 0.004984634285101616, + "acc_norm,none": 0.678550089623581, + "acc_norm_stderr,none": 0.0046607856169337755 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764819481.9088707, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1120363.243278305, + "end_time": 1121204.173526029, + "total_evaluation_time_seconds": "840.9302477240562" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/piqa_2025-12-04T11-36-37.804609.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/piqa_2025-12-04T11-36-37.804609.json new file mode 100644 index 0000000000000000000000000000000000000000..55fa73f9248d9112da0ee4d5215f275303edb6ce --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/piqa_2025-12-04T11-36-37.804609.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7252448313384113, + "acc_stderr,none": 0.010415033676676051, + "acc_norm,none": 0.7257889009793254, + "acc_norm_stderr,none": 0.01040861866493338 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764819354.5285106, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1120235.339735904, + "end_time": 1120311.962864858, + "total_evaluation_time_seconds": "76.62312895408832" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/truthfulqa_mc1_2025-12-04T11-34-30.437616.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/truthfulqa_mc1_2025-12-04T11-34-30.437616.json new file mode 100644 index 0000000000000000000000000000000000000000..66db0a75780b3361ec3a70699b41bfb78a7a6dd9 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/truthfulqa_mc1_2025-12-04T11-34-30.437616.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.2533659730722154, + "acc_stderr,none": 0.015225899340826814 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764819213.3471453, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1120094.260116363, + "end_time": 1120184.595908813, + "total_evaluation_time_seconds": "90.33579245000146" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/winogrande_2025-12-04T11-24-49.546472.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/winogrande_2025-12-04T11-24-49.546472.json new file mode 100644 index 0000000000000000000000000000000000000000..1e02d5544c158fc811ce4821c97b723fad838841 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_2/winogrande_2025-12-04T11-24-49.546472.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6322020520915549, + "acc_stderr,none": 0.013552385559833596 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764818639.8075678, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1119518.639875715, + "end_time": 1119603.704748507, + "total_evaluation_time_seconds": "85.06487279199064" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/arc_challenge_2025-12-04T21-53-48.698290.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/arc_challenge_2025-12-04T21-53-48.698290.json new file mode 100644 index 0000000000000000000000000000000000000000..40e0aeff140230881e1905d560fc1d9e7e748c5f --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/arc_challenge_2025-12-04T21-53-48.698290.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.47696245733788395, + "acc_stderr,none": 0.014595873205358269, + "acc_norm,none": 0.515358361774744, + "acc_norm_stderr,none": 0.014604496129394904 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764856243.7979732, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1157124.241482747, + "end_time": 1157342.856521605, + "total_evaluation_time_seconds": "218.61503885802813" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/boolq_2025-12-04T21-49-18.849710.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/boolq_2025-12-04T21-49-18.849710.json new file mode 100644 index 0000000000000000000000000000000000000000..ffcdf5116ce6598bdea1c43648c66b4cf25fd551 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/boolq_2025-12-04T21-49-18.849710.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7412844036697248, + "acc_stderr,none": 0.007659426910763687 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764856045.2538314, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1156923.779874585, + "end_time": 1157073.008150022, + "total_evaluation_time_seconds": "149.228275436908" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/hellaswag_2025-12-04T22-13-21.436095.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/hellaswag_2025-12-04T22-13-21.436095.json new file mode 100644 index 0000000000000000000000000000000000000000..143a995ba3448bcae0e1fc253dfa762ba9ab52e2 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/hellaswag_2025-12-04T22-13-21.436095.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.47988448516231824, + "acc_stderr,none": 0.0049857417063857296, + "acc_norm,none": 0.6896036646086438, + "acc_norm_stderr,none": 0.0046171032803720155 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764856802.7903218, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1157682.519374218, + "end_time": 1158515.594364278, + "total_evaluation_time_seconds": "833.0749900599476" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/piqa_2025-12-04T21-58-36.248586.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/piqa_2025-12-04T21-58-36.248586.json new file mode 100644 index 0000000000000000000000000000000000000000..7ed02fe5b99085400ac4614fdd5ca7fa1724fb49 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/piqa_2025-12-04T21-58-36.248586.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7464635473340587, + "acc_stderr,none": 0.010150090834551786, + "acc_norm,none": 0.7600652883569097, + "acc_norm_stderr,none": 0.009963625892809545 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764856667.3426394, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1157545.223817852, + "end_time": 1157630.406923814, + "total_evaluation_time_seconds": "85.1831059618853" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/truthfulqa_mc1_2025-12-04T21-56-19.870320.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/truthfulqa_mc1_2025-12-04T21-56-19.870320.json new file mode 100644 index 0000000000000000000000000000000000000000..089054240d653be6851f8aad3525bd48fa31cb26 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/truthfulqa_mc1_2025-12-04T21-56-19.870320.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.31334149326805383, + "acc_stderr,none": 0.0162380650690596 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764856515.726712, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1157395.038996151, + "end_time": 1157494.028703154, + "total_evaluation_time_seconds": "98.98970700311475" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/winogrande_2025-12-04T21-45-57.762364.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/winogrande_2025-12-04T21-45-57.762364.json new file mode 100644 index 0000000000000000000000000000000000000000..51ceaff55459240e2273994ddbf2f8b65a02387f --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_20/winogrande_2025-12-04T21-45-57.762364.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5887924230465666, + "acc_stderr,none": 0.01382912835867687 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764855894.7819893, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1156775.5824292, + "end_time": 1156871.920722743, + "total_evaluation_time_seconds": "96.33829354308546" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/arc_challenge_2025-12-04T22-28-47.441583.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/arc_challenge_2025-12-04T22-28-47.441583.json new file mode 100644 index 0000000000000000000000000000000000000000..72f3af5035c499a366e1d19ee764c4b46f0a3903 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/arc_challenge_2025-12-04T22-28-47.441583.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.46501706484641636, + "acc_stderr,none": 0.014575583922019667, + "acc_norm,none": 0.5093856655290102, + "acc_norm_stderr,none": 0.014608816322065 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764858338.4210615, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1159219.474571887, + "end_time": 1159441.599954405, + "total_evaluation_time_seconds": "222.12538251816295" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/boolq_2025-12-04T22-24-13.774272.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/boolq_2025-12-04T22-24-13.774272.json new file mode 100644 index 0000000000000000000000000000000000000000..b941196af4f2c3d5104ab85d225cad7aa335f341 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/boolq_2025-12-04T22-24-13.774272.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7394495412844037, + "acc_stderr,none": 0.00767702107251117 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764858132.068986, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1159012.102540251, + "end_time": 1159167.932711903, + "total_evaluation_time_seconds": "155.8301716519054" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/hellaswag_2025-12-04T22-48-37.414483.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/hellaswag_2025-12-04T22-48-37.414483.json new file mode 100644 index 0000000000000000000000000000000000000000..90def04a33d7151e1b6493fae35d525a11107fb9 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/hellaswag_2025-12-04T22-48-37.414483.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.46614220274845647, + "acc_stderr,none": 0.004978328190775522, + "acc_norm,none": 0.6796454889464251, + "acc_norm_stderr,none": 0.004656591678606725 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764858911.3210087, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1159790.402351688, + "end_time": 1160631.572478686, + "total_evaluation_time_seconds": "841.1701269980986" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/piqa_2025-12-04T22-33-45.451918.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/piqa_2025-12-04T22-33-45.451918.json new file mode 100644 index 0000000000000000000000000000000000000000..3333a84ba48a932d5f74d62601fa20db234e805b --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/piqa_2025-12-04T22-33-45.451918.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7415669205658324, + "acc_stderr,none": 0.01021397163677331, + "acc_norm,none": 0.7470076169749728, + "acc_norm_stderr,none": 0.010142888698862451 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764858775.793653, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1159655.54761603, + "end_time": 1159739.61025313, + "total_evaluation_time_seconds": "84.06263709999621" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/truthfulqa_mc1_2025-12-04T22-31-30.861423.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/truthfulqa_mc1_2025-12-04T22-31-30.861423.json new file mode 100644 index 0000000000000000000000000000000000000000..4c94f303d52110a6a342fc151994ba71852ab6f7 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/truthfulqa_mc1_2025-12-04T22-31-30.861423.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3292533659730722, + "acc_stderr,none": 0.016451264440068242 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764858613.7186427, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1159493.179696555, + "end_time": 1159605.019785953, + "total_evaluation_time_seconds": "111.84008939797059" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/winogrande_2025-12-04T22-20-46.274871.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/winogrande_2025-12-04T22-20-46.274871.json new file mode 100644 index 0000000000000000000000000000000000000000..4f7f8546fd5ef091e8294f3d0a832d87c7dbf9a8 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_21/winogrande_2025-12-04T22-20-46.274871.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5895816890292028, + "acc_stderr,none": 0.013825107120035868 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764857988.06292, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1158868.347692804, + "end_time": 1158960.433181156, + "total_evaluation_time_seconds": "92.08548835199326" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/arc_challenge_2025-12-04T23-04-44.968805.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/arc_challenge_2025-12-04T23-04-44.968805.json new file mode 100644 index 0000000000000000000000000000000000000000..1dc74ea4d2d5fb4b999353c8754339a732843a19 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/arc_challenge_2025-12-04T23-04-44.968805.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4564846416382253, + "acc_stderr,none": 0.014555949760496439, + "acc_norm,none": 0.5025597269624573, + "acc_norm_stderr,none": 0.014611199329843791 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764860505.294705, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1161385.302233326, + "end_time": 1161599.127141074, + "total_evaluation_time_seconds": "213.82490774802864" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/boolq_2025-12-04T23-00-20.283469.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/boolq_2025-12-04T23-00-20.283469.json new file mode 100644 index 0000000000000000000000000000000000000000..7f7cf98fe7f6be6d52a375e7700373121496f924 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/boolq_2025-12-04T23-00-20.283469.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7342507645259939, + "acc_stderr,none": 0.007725929757288679 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764860270.2528114, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1161149.937467296, + "end_time": 1161334.441931916, + "total_evaluation_time_seconds": "184.50446462002583" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/hellaswag_2025-12-04T23-24-27.413478.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/hellaswag_2025-12-04T23-24-27.413478.json new file mode 100644 index 0000000000000000000000000000000000000000..eea7e2f9e5ecd0ed5e29923560ac6c7400e2f553 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/hellaswag_2025-12-04T23-24-27.413478.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.46285600477992433, + "acc_stderr,none": 0.004975993795562021, + "acc_norm,none": 0.6701852220673172, + "acc_norm_stderr,none": 0.004691848665399068 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764861071.01223, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1161950.275273225, + "end_time": 1162781.571576431, + "total_evaluation_time_seconds": "831.2963032058906" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/piqa_2025-12-04T23-09-44.969353.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/piqa_2025-12-04T23-09-44.969353.json new file mode 100644 index 0000000000000000000000000000000000000000..ad147b8744bd5ab967055bdca82d744e69b086c7 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/piqa_2025-12-04T23-09-44.969353.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7410228509249184, + "acc_stderr,none": 0.010220966031405605, + "acc_norm,none": 0.7431991294885746, + "acc_norm_stderr,none": 0.010192864802278054 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764860925.6353953, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1161805.836390965, + "end_time": 1161899.12767384, + "total_evaluation_time_seconds": "93.2912828749977" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/truthfulqa_mc1_2025-12-04T23-07-21.007636.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/truthfulqa_mc1_2025-12-04T23-07-21.007636.json new file mode 100644 index 0000000000000000000000000000000000000000..bd01526a378753a3992f20b964d562e384fcd388 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/truthfulqa_mc1_2025-12-04T23-07-21.007636.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3378212974296206, + "acc_stderr,none": 0.016557167322516882 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764860770.3714392, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1161651.328361214, + "end_time": 1161755.165444605, + "total_evaluation_time_seconds": "103.83708339114673" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/winogrande_2025-12-04T22-56-19.532998.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/winogrande_2025-12-04T22-56-19.532998.json new file mode 100644 index 0000000000000000000000000000000000000000..22923dc5ed78ea229121802b5c9f4e79b6423b12 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_22/winogrande_2025-12-04T22-56-19.532998.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5887924230465666, + "acc_stderr,none": 0.01382912835867687 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764860110.1655428, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1160986.975685728, + "end_time": 1161093.691227861, + "total_evaluation_time_seconds": "106.71554213296622" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/arc_challenge_2025-12-04T23-39-37.813105.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/arc_challenge_2025-12-04T23-39-37.813105.json new file mode 100644 index 0000000000000000000000000000000000000000..7eb3b6ca4b2654c75495eb5521ee78bcbcefc0a2 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/arc_challenge_2025-12-04T23-39-37.813105.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4641638225255973, + "acc_stderr,none": 0.014573813664735714, + "acc_norm,none": 0.49658703071672355, + "acc_norm_stderr,none": 0.01461105040324407 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764862590.611816, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1163471.061751181, + "end_time": 1163691.971444882, + "total_evaluation_time_seconds": "220.9096937009599" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/boolq_2025-12-04T23-35-06.972045.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/boolq_2025-12-04T23-35-06.972045.json new file mode 100644 index 0000000000000000000000000000000000000000..d1db68c4486d94b89fec70e6ae749ab583ede38d --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/boolq_2025-12-04T23-35-06.972045.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.6700305810397553, + "acc_stderr,none": 0.008223878741654847 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764862394.686044, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1163274.714475949, + "end_time": 1163421.13020649, + "total_evaluation_time_seconds": "146.41573054087348" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/hellaswag_2025-12-04T23-59-04.872793.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/hellaswag_2025-12-04T23-59-04.872793.json new file mode 100644 index 0000000000000000000000000000000000000000..6b07fc6afdabffcdaf613a8269feb3a034a6ac17 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/hellaswag_2025-12-04T23-59-04.872793.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.4735112527384983, + "acc_stderr,none": 0.004982774293927781, + "acc_norm,none": 0.6778530173272257, + "acc_norm_stderr,none": 0.004663439181149013 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764863150.157231, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1164030.65003941, + "end_time": 1164859.030912872, + "total_evaluation_time_seconds": "828.3808734619524" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/piqa_2025-12-04T23-44-25.818583.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/piqa_2025-12-04T23-44-25.818583.json new file mode 100644 index 0000000000000000000000000000000000000000..14ffdcc879287d45dd62126a7fc0ac22bb89fb53 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/piqa_2025-12-04T23-44-25.818583.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.736126224156692, + "acc_stderr,none": 0.010282996367695568, + "acc_norm,none": 0.7546245919477693, + "acc_norm_stderr,none": 0.010039831320422396 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764863019.8504438, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1163899.41215175, + "end_time": 1163979.976911859, + "total_evaluation_time_seconds": "80.56476010894403" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/truthfulqa_mc1_2025-12-04T23-42-15.292968.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/truthfulqa_mc1_2025-12-04T23-42-15.292968.json new file mode 100644 index 0000000000000000000000000000000000000000..af9f72e201a088a473436314b0ba1920609484bc --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/truthfulqa_mc1_2025-12-04T23-42-15.292968.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3268053855569155, + "acc_stderr,none": 0.016419874731135032 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764862862.7045147, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1163742.333985512, + "end_time": 1163849.451174146, + "total_evaluation_time_seconds": "107.11718863411807" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/winogrande_2025-12-04T23-31-50.342830.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/winogrande_2025-12-04T23-31-50.342830.json new file mode 100644 index 0000000000000000000000000000000000000000..e1a9f0d87aabe263ba273b0a06263fd899e57a39 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_23/winogrande_2025-12-04T23-31-50.342830.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5951065509076559, + "acc_stderr,none": 0.013795927003124932 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764862255.4049842, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1163134.340791249, + "end_time": 1163224.501169077, + "total_evaluation_time_seconds": "90.16037782793865" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/arc_challenge_2025-12-05T00-13-52.810759.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/arc_challenge_2025-12-05T00-13-52.810759.json new file mode 100644 index 0000000000000000000000000000000000000000..447faa6c4a0cb43c7c5c4c2245b2ae547c296382 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/arc_challenge_2025-12-05T00-13-52.810759.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4513651877133106, + "acc_stderr,none": 0.014542104569955258, + "acc_norm,none": 0.49829351535836175, + "acc_norm_stderr,none": 0.014611305705056976 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764864663.2720091, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1165543.126045469, + "end_time": 1165746.969018365, + "total_evaluation_time_seconds": "203.84297289606184" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/boolq_2025-12-05T00-09-37.756178.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/boolq_2025-12-05T00-09-37.756178.json new file mode 100644 index 0000000000000000000000000000000000000000..89b2de81d3ae433c5ba4ef4a23977e11ee721bd2 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/boolq_2025-12-05T00-09-37.756178.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7064220183486238, + "acc_stderr,none": 0.007965011249420069 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764864468.7851145, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1165348.712590258, + "end_time": 1165491.914471908, + "total_evaluation_time_seconds": "143.20188164990395" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/hellaswag_2025-12-05T00-33-09.896686.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/hellaswag_2025-12-05T00-33-09.896686.json new file mode 100644 index 0000000000000000000000000000000000000000..86b8f56e760876a3a0809bd16a4979c19e9e4a49 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/hellaswag_2025-12-05T00-33-09.896686.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.48536148177653854, + "acc_stderr,none": 0.004987642470249517, + "acc_norm,none": 0.6900019916351324, + "acc_norm_stderr,none": 0.004615472210316036 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764865197.057317, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1166076.907251923, + "end_time": 1166904.054492051, + "total_evaluation_time_seconds": "827.1472401279025" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/piqa_2025-12-05T00-18-30.814505.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/piqa_2025-12-05T00-18-30.814505.json new file mode 100644 index 0000000000000000000000000000000000000000..174cc05fb495921a125e3b5c388601bcf0b57efa --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/piqa_2025-12-05T00-18-30.814505.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.735582154515778, + "acc_stderr,none": 0.010289787244767158, + "acc_norm,none": 0.7568008705114254, + "acc_norm_stderr,none": 0.010009611953858931 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764865063.6530774, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1165943.236272081, + "end_time": 1166024.972793024, + "total_evaluation_time_seconds": "81.73652094299905" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/truthfulqa_mc1_2025-12-05T00-16-18.078249.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/truthfulqa_mc1_2025-12-05T00-16-18.078249.json new file mode 100644 index 0000000000000000000000000000000000000000..23e0f1f8b090dd8856c8bc379255edf4d86cb352 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/truthfulqa_mc1_2025-12-05T00-16-18.078249.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3072215422276622, + "acc_stderr,none": 0.016150201321323002 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764864915.6566284, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1165797.175787774, + "end_time": 1165892.236580569, + "total_evaluation_time_seconds": "95.06079279514961" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/winogrande_2025-12-05T00-06-23.941554.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/winogrande_2025-12-05T00-06-23.941554.json new file mode 100644 index 0000000000000000000000000000000000000000..6d450b34ba1afe41a2434fbaa339e1026e36655a --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_24/winogrande_2025-12-05T00-06-23.941554.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6045777426992897, + "acc_stderr,none": 0.013741678387545345 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764864331.1858754, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1165209.339581755, + "end_time": 1165298.099871751, + "total_evaluation_time_seconds": "88.76028999593109" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/arc_challenge_2025-12-05T00-47-44.258956.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/arc_challenge_2025-12-05T00-47-44.258956.json new file mode 100644 index 0000000000000000000000000000000000000000..eb82df0dbbebe27791ee92e60f21b4d4a4eec786 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/arc_challenge_2025-12-05T00-47-44.258956.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.48378839590443684, + "acc_stderr,none": 0.014603708567414941, + "acc_norm,none": 0.5315699658703071, + "acc_norm_stderr,none": 0.014582236460866968 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764866694.547262, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1167574.318605497, + "end_time": 1167778.417277388, + "total_evaluation_time_seconds": "204.09867189102806" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/boolq_2025-12-05T00-43-29.365710.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/boolq_2025-12-05T00-43-29.365710.json new file mode 100644 index 0000000000000000000000000000000000000000..d23364e4b9e24f608ec0ae986bda8eb3e50b44d2 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/boolq_2025-12-05T00-43-29.365710.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7311926605504587, + "acc_stderr,none": 0.0077540574189838675 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764866506.0186844, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1167387.678734639, + "end_time": 1167523.523999077, + "total_evaluation_time_seconds": "135.84526443807408" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/hellaswag_2025-12-05T01-06-55.143972.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/hellaswag_2025-12-05T01-06-55.143972.json new file mode 100644 index 0000000000000000000000000000000000000000..de54f41d8e7e4b1c71e800265f2bcd95b05ec520 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/hellaswag_2025-12-05T01-06-55.143972.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5060744871539534, + "acc_stderr,none": 0.0049894131580348056, + "acc_norm,none": 0.7059350726946824, + "acc_norm_stderr,none": 0.004546901132945126 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764867223.5127187, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1168105.338539433, + "end_time": 1168929.302257827, + "total_evaluation_time_seconds": "823.9637183940504" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/piqa_2025-12-05T00-52-20.515427.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/piqa_2025-12-05T00-52-20.515427.json new file mode 100644 index 0000000000000000000000000000000000000000..2b489169c6522d9250345a60ef99e3c72ffe3f5c --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/piqa_2025-12-05T00-52-20.515427.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7421109902067464, + "acc_stderr,none": 0.010206956662056255, + "acc_norm,none": 0.7622415669205659, + "acc_norm_stderr,none": 0.009932525779525485 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764867097.3882694, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1167978.057177568, + "end_time": 1168054.67373592, + "total_evaluation_time_seconds": "76.61655835201964" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/truthfulqa_mc1_2025-12-05T00-50-13.426656.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/truthfulqa_mc1_2025-12-05T00-50-13.426656.json new file mode 100644 index 0000000000000000000000000000000000000000..6ea9157b63b464828dd9c0de0daee38862949ed4 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/truthfulqa_mc1_2025-12-05T00-50-13.426656.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3011015911872705, + "acc_stderr,none": 0.01605899902610061 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764866947.9483426, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1167828.877890444, + "end_time": 1167927.584556357, + "total_evaluation_time_seconds": "98.70666591310874" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/winogrande_2025-12-05T00-40-23.620470.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/winogrande_2025-12-05T00-40-23.620470.json new file mode 100644 index 0000000000000000000000000000000000000000..946b92f1bf85e6e016a948fe86081d9c2d0de349 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_25/winogrande_2025-12-05T00-40-23.620470.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6101026045777427, + "acc_stderr,none": 0.01370754731700847 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764866373.135642, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1167254.01346302, + "end_time": 1167337.778823798, + "total_evaluation_time_seconds": "83.76536077796482" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/arc_challenge_2025-12-05T01-21-35.571061.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/arc_challenge_2025-12-05T01-21-35.571061.json new file mode 100644 index 0000000000000000000000000000000000000000..c89e2242643fba0aa151f06dcfc3ae2fd7984ed3 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/arc_challenge_2025-12-05T01-21-35.571061.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.5247440273037542, + "acc_stderr,none": 0.01459348769493774, + "acc_norm,none": 0.5631399317406144, + "acc_norm_stderr,none": 0.01449442158425652 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764868725.860274, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1169606.154497597, + "end_time": 1169809.72935444, + "total_evaluation_time_seconds": "203.57485684310086" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/boolq_2025-12-05T01-17-20.114454.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/boolq_2025-12-05T01-17-20.114454.json new file mode 100644 index 0000000000000000000000000000000000000000..7be4f411f6477126c17b05b821734d144b48a4b9 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/boolq_2025-12-05T01-17-20.114454.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.6452599388379205, + "acc_stderr,none": 0.008367871633282294 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764868537.1456277, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1169417.772213411, + "end_time": 1169554.272677865, + "total_evaluation_time_seconds": "136.50046445406042" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/hellaswag_2025-12-05T01-40-32.028937.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/hellaswag_2025-12-05T01-40-32.028937.json new file mode 100644 index 0000000000000000000000000000000000000000..3616d9466556225856670565f877000da2e27fa8 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/hellaswag_2025-12-05T01-40-32.028937.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5191196972714599, + "acc_stderr,none": 0.004986131919673968, + "acc_norm,none": 0.719577773351922, + "acc_norm_stderr,none": 0.004482874732237348 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764869244.4308753, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1170124.081491447, + "end_time": 1170946.187286623, + "total_evaluation_time_seconds": "822.1057951760013" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/piqa_2025-12-05T01-25-58.215618.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/piqa_2025-12-05T01-25-58.215618.json new file mode 100644 index 0000000000000000000000000000000000000000..c2cde354c36178105d51ba581780db9f6c08b8cd --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/piqa_2025-12-05T01-25-58.215618.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7475516866158868, + "acc_stderr,none": 0.01013566554736236, + "acc_norm,none": 0.7611534276387377, + "acc_norm_stderr,none": 0.0099481203853375 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764869115.8421376, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1169997.701897467, + "end_time": 1170072.373914729, + "total_evaluation_time_seconds": "74.67201726208441" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/truthfulqa_mc1_2025-12-05T01-23-53.005756.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/truthfulqa_mc1_2025-12-05T01-23-53.005756.json new file mode 100644 index 0000000000000000000000000000000000000000..458685a636802a97099f37e6207d8ad5c3fede60 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/truthfulqa_mc1_2025-12-05T01-23-53.005756.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3157894736842105, + "acc_stderr,none": 0.016272287957916916 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764868976.7961912, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1169859.587415864, + "end_time": 1169947.164079913, + "total_evaluation_time_seconds": "87.57666404894553" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/winogrande_2025-12-05T01-14-12.670387.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/winogrande_2025-12-05T01-14-12.670387.json new file mode 100644 index 0000000000000000000000000000000000000000..ad7e508fb5796408bd8dbfca8d2171501ae4a92c --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_26/winogrande_2025-12-05T01-14-12.670387.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6258879242304657, + "acc_stderr,none": 0.013599792958329821 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764868403.699633, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1169280.581051621, + "end_time": 1169366.828749992, + "total_evaluation_time_seconds": "86.24769837106578" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/arc_challenge_2025-12-05T01-55-02.366442.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/arc_challenge_2025-12-05T01-55-02.366442.json new file mode 100644 index 0000000000000000000000000000000000000000..449991b37466b0092081bb202064526a2d81b4ec --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/arc_challenge_2025-12-05T01-55-02.366442.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.5034129692832765, + "acc_stderr,none": 0.014611050403244084, + "acc_norm,none": 0.5435153583617748, + "acc_norm_stderr,none": 0.014555949760496446 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764870737.8153622, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1171619.016449187, + "end_time": 1171816.524719249, + "total_evaluation_time_seconds": "197.50827006204054" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/boolq_2025-12-05T01-50-53.777049.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/boolq_2025-12-05T01-50-53.777049.json new file mode 100644 index 0000000000000000000000000000000000000000..d8d83c242546788f03f7dae917f2b95f8c23ebda --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/boolq_2025-12-05T01-50-53.777049.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7486238532110092, + "acc_stderr,none": 0.007587285084733795 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764870551.67338, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1171431.604446895, + "end_time": 1171567.934996209, + "total_evaluation_time_seconds": "136.33054931415245" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/hellaswag_2025-12-05T02-13-52.546607.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/hellaswag_2025-12-05T02-13-52.546607.json new file mode 100644 index 0000000000000000000000000000000000000000..352b5aed256d927af5fa8dc1535d85e9693758b9 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/hellaswag_2025-12-05T02-13-52.546607.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.5336586337382991, + "acc_stderr,none": 0.004978462690966914, + "acc_norm,none": 0.7136028679545907, + "acc_norm_stderr,none": 0.004511533039406222 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764871246.8814569, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1172128.961382795, + "end_time": 1172946.704965173, + "total_evaluation_time_seconds": "817.7435823781416" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/piqa_2025-12-05T01-59-25.709592.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/piqa_2025-12-05T01-59-25.709592.json new file mode 100644 index 0000000000000000000000000000000000000000..8b856e2d04e4c70f913d4541db235007e04255cd --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/piqa_2025-12-05T01-59-25.709592.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7464635473340587, + "acc_stderr,none": 0.010150090834551793, + "acc_norm,none": 0.7584330794341676, + "acc_norm_stderr,none": 0.009986718001804484 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764871125.3714387, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1172007.450286689, + "end_time": 1172079.867946184, + "total_evaluation_time_seconds": "72.41765949502587" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/truthfulqa_mc1_2025-12-05T01-57-22.218169.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/truthfulqa_mc1_2025-12-05T01-57-22.218169.json new file mode 100644 index 0000000000000000000000000000000000000000..6932b426482c9dc1c4e761d6b9e6907bbd2ea669 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/truthfulqa_mc1_2025-12-05T01-57-22.218169.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3525091799265606, + "acc_stderr,none": 0.016724646380756544 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764870985.7195861, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1171866.80311283, + "end_time": 1171956.376508467, + "total_evaluation_time_seconds": "89.573395636864" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/winogrande_2025-12-05T01-47-47.133877.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/winogrande_2025-12-05T01-47-47.133877.json new file mode 100644 index 0000000000000000000000000000000000000000..6a2368ea6edc6628191d394233c20b38ae90e04d --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_27/winogrande_2025-12-05T01-47-47.133877.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.595895816890292, + "acc_stderr,none": 0.013791610664670858 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764870417.51003, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1171298.838732449, + "end_time": 1171381.292170453, + "total_evaluation_time_seconds": "82.45343800378032" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/arc_challenge_2025-12-04T12-06-07.360394.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/arc_challenge_2025-12-04T12-06-07.360394.json new file mode 100644 index 0000000000000000000000000000000000000000..bd1946d0a53cb118616638e4d8c094409cdfb044 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/arc_challenge_2025-12-04T12-06-07.360394.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.20648464163822525, + "acc_stderr,none": 0.011828865619002316, + "acc_norm,none": 0.24573378839590443, + "acc_norm_stderr,none": 0.012581033453730107 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764821000.3916638, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1121879.555508534, + "end_time": 1122081.518770427, + "total_evaluation_time_seconds": "201.96326189301908" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/boolq_2025-12-04T12-01-53.832012.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/boolq_2025-12-04T12-01-53.832012.json new file mode 100644 index 0000000000000000000000000000000000000000..108523b5e95a3b18280100d7abd5c96224f05fdc --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/boolq_2025-12-04T12-01-53.832012.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.5929663608562691, + "acc_stderr,none": 0.00859256288706887 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764820814.7014577, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1121694.903304254, + "end_time": 1121827.990367823, + "total_evaluation_time_seconds": "133.0870635691099" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/hellaswag_2025-12-04T12-25-16.381396.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/hellaswag_2025-12-04T12-25-16.381396.json new file mode 100644 index 0000000000000000000000000000000000000000..be28667897d2fbfa3a44694d3ded8ad74c8e3da8 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/hellaswag_2025-12-04T12-25-16.381396.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.27922724556861184, + "acc_stderr,none": 0.004477025762200604, + "acc_norm,none": 0.30173272256522604, + "acc_norm_stderr,none": 0.004580718115992502 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764821528.1451025, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1122407.308767015, + "end_time": 1123230.539520676, + "total_evaluation_time_seconds": "823.2307536609005" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/piqa_2025-12-04T12-10-39.784807.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/piqa_2025-12-04T12-10-39.784807.json new file mode 100644 index 0000000000000000000000000000000000000000..bfc7370cd538c0ce85d62efb0ba6604f7a4203be --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/piqa_2025-12-04T12-10-39.784807.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.5946681175190425, + "acc_stderr,none": 0.011454816387346765, + "acc_norm,none": 0.5767138193688792, + "acc_norm_stderr,none": 0.011527699473614475 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764821397.6450157, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1122277.899828533, + "end_time": 1122353.943191974, + "total_evaluation_time_seconds": "76.04336344101466" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/truthfulqa_mc1_2025-12-04T12-08-32.243270.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/truthfulqa_mc1_2025-12-04T12-08-32.243270.json new file mode 100644 index 0000000000000000000000000000000000000000..6aa3a8cfb4301989d26f661763ac98f934005d21 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/truthfulqa_mc1_2025-12-04T12-08-32.243270.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.25703794369645044, + "acc_stderr,none": 0.015298077509485083 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764821254.4241943, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1122133.6635718, + "end_time": 1122226.401639737, + "total_evaluation_time_seconds": "92.73806793685071" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/winogrande_2025-12-04T11-58-49.913562.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/winogrande_2025-12-04T11-58-49.913562.json new file mode 100644 index 0000000000000000000000000000000000000000..19bd3849dfcaab4bcb2a1f705aeb01d43f88bfe9 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_3/winogrande_2025-12-04T11-58-49.913562.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.526440410418311, + "acc_stderr,none": 0.014032823874407222 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764820686.4372277, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1121566.554694095, + "end_time": 1121644.071924142, + "total_evaluation_time_seconds": "77.51723004714586" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/arc_challenge_2025-12-04T12-39-46.452692.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/arc_challenge_2025-12-04T12-39-46.452692.json new file mode 100644 index 0000000000000000000000000000000000000000..bdfb6814955402bf955593032a84e82e9a027161 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/arc_challenge_2025-12-04T12-39-46.452692.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4761092150170648, + "acc_stderr,none": 0.014594701798071652, + "acc_norm,none": 0.5204778156996587, + "acc_norm_stderr,none": 0.014599131353035016 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764823019.7190943, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1123900.232217949, + "end_time": 1124100.611073013, + "total_evaluation_time_seconds": "200.37885506404564" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/boolq_2025-12-04T12-35-32.121868.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/boolq_2025-12-04T12-35-32.121868.json new file mode 100644 index 0000000000000000000000000000000000000000..4be2112b18119d0c2e907b81b0ffbafe7dcbae92 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/boolq_2025-12-04T12-35-32.121868.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7480122324159021, + "acc_stderr,none": 0.007593405967377497 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764822831.6146834, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1123713.948335013, + "end_time": 1123846.280230722, + "total_evaluation_time_seconds": "132.33189570903778" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/hellaswag_2025-12-04T12-59-02.697552.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/hellaswag_2025-12-04T12-59-02.697552.json new file mode 100644 index 0000000000000000000000000000000000000000..b61988e3d0f14010ad6917d5eef7dfb2eb1e84fa --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/hellaswag_2025-12-04T12-59-02.697552.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.47998406691894047, + "acc_stderr,none": 0.004985781620467018, + "acc_norm,none": 0.6755626369249154, + "acc_norm_stderr,none": 0.004672074496749045 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764823554.3687458, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1124433.593779207, + "end_time": 1125256.855865145, + "total_evaluation_time_seconds": "823.2620859381277" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/piqa_2025-12-04T12-44-26.757874.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/piqa_2025-12-04T12-44-26.757874.json new file mode 100644 index 0000000000000000000000000000000000000000..0471ce13fcce46bf9cd059a171a62794cc97d248 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/piqa_2025-12-04T12-44-26.757874.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.719804134929271, + "acc_stderr,none": 0.010478122015577084, + "acc_norm,none": 0.721436343852013, + "acc_norm_stderr,none": 0.010459397235965171 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764823423.410724, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1124304.657554529, + "end_time": 1124380.916136783, + "total_evaluation_time_seconds": "76.25858225417323" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/truthfulqa_mc1_2025-12-04T12-42-19.693565.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/truthfulqa_mc1_2025-12-04T12-42-19.693565.json new file mode 100644 index 0000000000000000000000000000000000000000..0d8df125cdae9e4c1c0e8f76f35bc61725bd4f1f --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/truthfulqa_mc1_2025-12-04T12-42-19.693565.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.26193390452876375, + "acc_stderr,none": 0.01539211880501501 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764823273.3031003, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1124151.922482065, + "end_time": 1124253.851736629, + "total_evaluation_time_seconds": "101.92925456399098" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/winogrande_2025-12-04T12-32-29.452881.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/winogrande_2025-12-04T12-32-29.452881.json new file mode 100644 index 0000000000000000000000000000000000000000..d61403d3def92b893479aa2a837fd0a80263dd5e --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_4/winogrande_2025-12-04T12-32-29.452881.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6195737963693765, + "acc_stderr,none": 0.013644727908656833 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764822704.686668, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1123582.610900908, + "end_time": 1123663.611297653, + "total_evaluation_time_seconds": "81.0003967450466" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/arc_challenge_2025-12-04T13-13-34.306973.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/arc_challenge_2025-12-04T13-13-34.306973.json new file mode 100644 index 0000000000000000000000000000000000000000..e554cb3ef621c1e41b570ae0991f0ad223ad7175 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/arc_challenge_2025-12-04T13-13-34.306973.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.41638225255972694, + "acc_stderr,none": 0.014405618279436167, + "acc_norm,none": 0.46928327645051193, + "acc_norm_stderr,none": 0.01458379254630404 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764825048.479555, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1125928.698657643, + "end_time": 1126128.46533662, + "total_evaluation_time_seconds": "199.7666789770592" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/boolq_2025-12-04T13-09-23.170033.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/boolq_2025-12-04T13-09-23.170033.json new file mode 100644 index 0000000000000000000000000000000000000000..f6ae0e7c20f11896d4910fc6c01f76b4b9343f51 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/boolq_2025-12-04T13-09-23.170033.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7324159021406728, + "acc_stderr,none": 0.007742862953407332 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764824862.6324472, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1125743.903260105, + "end_time": 1125877.328253379, + "total_evaluation_time_seconds": "133.42499327403493" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/hellaswag_2025-12-04T13-32-41.369041.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/hellaswag_2025-12-04T13-32-41.369041.json new file mode 100644 index 0000000000000000000000000000000000000000..38eca84f68c03d4c6ee859942c3cf493c383bd13 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/hellaswag_2025-12-04T13-32-41.369041.json @@ -0,0 +1,127 @@ +{ + "results": { + "hellaswag": { + "alias": "hellaswag", + "acc,none": 0.469627564230233, + "acc_stderr,none": 0.004980566907790458, + "acc_norm,none": 0.6552479585739892, + "acc_norm_stderr,none": 0.0047431600342711525 + } + }, + "group_subtasks": { + "hellaswag": [] + }, + "configs": { + "hellaswag": { + "task": "hellaswag", + "tag": [ + "multiple_choice" + ], + "dataset_path": "hellaswag", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "process_docs": "def process_docs(dataset: datasets.Dataset) -> datasets.Dataset:\n def _process_doc(doc):\n ctx = doc[\"ctx_a\"] + \" \" + doc[\"ctx_b\"].capitalize()\n out_doc = {\n \"query\": preprocess(doc[\"activity_label\"] + \": \" + ctx),\n \"choices\": [preprocess(ending) for ending in doc[\"endings\"]],\n \"gold\": int(doc[\"label\"]),\n }\n return out_doc\n\n return dataset.map(_process_doc)\n", + "doc_to_text": "{{query}}", + "doc_to_target": "{{label}}", + "unsafe_code": false, + "doc_to_choice": "choices", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 10, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": false, + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "hellaswag": 1.0 + }, + "n-shot": { + "hellaswag": 10 + }, + "higher_is_better": { + "hellaswag": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "hellaswag": { + "original": 10042, + "effective": 10042 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 57 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764825570.4483027, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1126449.890390508, + "end_time": 1127275.527380603, + "total_evaluation_time_seconds": "825.6369900947902" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/piqa_2025-12-04T13-18-03.652375.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/piqa_2025-12-04T13-18-03.652375.json new file mode 100644 index 0000000000000000000000000000000000000000..e11ab268fe2ab6a1623aa9194321b27fb04acbb5 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/piqa_2025-12-04T13-18-03.652375.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7225244831338411, + "acc_stderr,none": 0.010446818281039941, + "acc_norm,none": 0.7410228509249184, + "acc_norm_stderr,none": 0.010220966031405605 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764825441.0923066, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1126321.686907717, + "end_time": 1126397.810737762, + "total_evaluation_time_seconds": "76.12383004487492" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/truthfulqa_mc1_2025-12-04T13-15-54.696554.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/truthfulqa_mc1_2025-12-04T13-15-54.696554.json new file mode 100644 index 0000000000000000000000000000000000000000..477c8d3ae6179fedcf7dc959849a0c621c9908cc --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/truthfulqa_mc1_2025-12-04T13-15-54.696554.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.27539779681762544, + "acc_stderr,none": 0.015638135667775523 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764825300.4040918, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1126180.705570187, + "end_time": 1126268.854828553, + "total_evaluation_time_seconds": "88.14925836608745" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/winogrande_2025-12-04T13-06-18.807171.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/winogrande_2025-12-04T13-06-18.807171.json new file mode 100644 index 0000000000000000000000000000000000000000..959ac2a1b9a7a44bde1b02b44bf1768c819d0062 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_5/winogrande_2025-12-04T13-06-18.807171.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5469613259668509, + "acc_stderr,none": 0.013990366632148091 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764824732.0582159, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1125610.396715083, + "end_time": 1125692.96547771, + "total_evaluation_time_seconds": "82.5687626269646" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/arc_challenge_2025-12-04T13-47-18.139939.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/arc_challenge_2025-12-04T13-47-18.139939.json new file mode 100644 index 0000000000000000000000000000000000000000..163c4c6aa815c3a006163e0fdaa9eb7224aeab20 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/arc_challenge_2025-12-04T13-47-18.139939.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4863481228668942, + "acc_stderr,none": 0.014605943429860947, + "acc_norm,none": 0.5418088737201365, + "acc_norm_stderr,none": 0.014560220308714693 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764827066.9966152, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1127946.514942277, + "end_time": 1128152.298218876, + "total_evaluation_time_seconds": "205.78327659890056" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/boolq_2025-12-04T13-43-02.495801.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/boolq_2025-12-04T13-43-02.495801.json new file mode 100644 index 0000000000000000000000000000000000000000..8dfcf1906930abb1d0053e7c2684425323b5f485 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/boolq_2025-12-04T13-43-02.495801.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.735474006116208, + "acc_stderr,none": 0.007714546144910652 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764826880.2848723, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1127759.929604033, + "end_time": 1127896.654159893, + "total_evaluation_time_seconds": "136.7245558600407" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/piqa_2025-12-04T13-52-01.431903.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/piqa_2025-12-04T13-52-01.431903.json new file mode 100644 index 0000000000000000000000000000000000000000..4c9e8c78e94bf1ec0ef8b815afeb9a9aa91218e0 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/piqa_2025-12-04T13-52-01.431903.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7388465723612623, + "acc_stderr,none": 0.010248738649935581, + "acc_norm,none": 0.750816104461371, + "acc_norm_stderr,none": 0.01009188277012022 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764827477.066381, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1128357.376420093, + "end_time": 1128435.590275921, + "total_evaluation_time_seconds": "78.21385582792573" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/truthfulqa_mc1_2025-12-04T13-49-49.406947.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/truthfulqa_mc1_2025-12-04T13-49-49.406947.json new file mode 100644 index 0000000000000000000000000000000000000000..07ab22752551d09f76e5981354148bc27868731c --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/truthfulqa_mc1_2025-12-04T13-49-49.406947.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.3011015911872705, + "acc_stderr,none": 0.016058999026100612 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764827328.3551626, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1128208.904958728, + "end_time": 1128303.565335583, + "total_evaluation_time_seconds": "94.66037685493939" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/winogrande_2025-12-04T13-39-51.930754.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/winogrande_2025-12-04T13-39-51.930754.json new file mode 100644 index 0000000000000000000000000000000000000000..c9fa1b351086593db8b103a5722c316eb57df709 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_6/winogrande_2025-12-04T13-39-51.930754.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.6195737963693765, + "acc_stderr,none": 0.013644727908656826 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764826745.2893574, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1127627.415544325, + "end_time": 1127706.089052911, + "total_evaluation_time_seconds": "78.67350858589634" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/arc_challenge_2025-12-04T14-21-46.518523.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/arc_challenge_2025-12-04T14-21-46.518523.json new file mode 100644 index 0000000000000000000000000000000000000000..7c7b6a0018c421ed31f9800fd5f4f3faca0b8281 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/arc_challenge_2025-12-04T14-21-46.518523.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.44368600682593856, + "acc_stderr,none": 0.014518421825670437, + "acc_norm,none": 0.4906143344709898, + "acc_norm_stderr,none": 0.014608816322065003 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764829129.863107, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1130008.96542831, + "end_time": 1130220.67682409, + "total_evaluation_time_seconds": "211.71139578009024" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/boolq_2025-12-04T14-17-14.867332.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/boolq_2025-12-04T14-17-14.867332.json new file mode 100644 index 0000000000000000000000000000000000000000..e89d16a64331e06badc9a390a1cbc9edc325c030 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/boolq_2025-12-04T14-17-14.867332.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7865443425076453, + "acc_stderr,none": 0.00716651444343289 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764828928.2056072, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1129806.363221076, + "end_time": 1129949.025727081, + "total_evaluation_time_seconds": "142.66250600502826" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/piqa_2025-12-04T14-26-34.805749.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/piqa_2025-12-04T14-26-34.805749.json new file mode 100644 index 0000000000000000000000000000000000000000..62e1a1f85255d53d078140f3f6a1a50e07569640 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/piqa_2025-12-04T14-26-34.805749.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7372143634385201, + "acc_stderr,none": 0.010269354068140767, + "acc_norm,none": 0.7453754080522307, + "acc_norm_stderr,none": 0.010164432237060478 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764829544.1987987, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1130422.445635487, + "end_time": 1130508.964128184, + "total_evaluation_time_seconds": "86.51849269680679" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/truthfulqa_mc1_2025-12-04T14-24-16.774686.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/truthfulqa_mc1_2025-12-04T14-24-16.774686.json new file mode 100644 index 0000000000000000000000000000000000000000..300f1c77723a8376ad8db7429e2aa20338119fe8 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/truthfulqa_mc1_2025-12-04T14-24-16.774686.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.25703794369645044, + "acc_stderr,none": 0.015298077509485083 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764829393.0154648, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1130271.826527923, + "end_time": 1130370.93304113, + "total_evaluation_time_seconds": "99.10651320684701" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/winogrande_2025-12-04T14-14-00.664488.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/winogrande_2025-12-04T14-14-00.664488.json new file mode 100644 index 0000000000000000000000000000000000000000..67fe0fe5453f80af106860eb88e515114446fe3d --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_7/winogrande_2025-12-04T14-14-00.664488.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.569060773480663, + "acc_stderr,none": 0.013917796623335966 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764828779.6498911, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1129658.771180289, + "end_time": 1129754.822865989, + "total_evaluation_time_seconds": "96.05168569996022" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/arc_challenge_2025-12-04T14-56-23.830960.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/arc_challenge_2025-12-04T14-56-23.830960.json new file mode 100644 index 0000000000000000000000000000000000000000..afd573d67d7f2c00071ea3ffdffbb62f959ff027 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/arc_challenge_2025-12-04T14-56-23.830960.json @@ -0,0 +1,126 @@ +{ + "results": { + "arc_challenge": { + "alias": "arc_challenge", + "acc,none": 0.4598976109215017, + "acc_stderr,none": 0.014564318856924848, + "acc_norm,none": 0.5008532423208191, + "acc_norm_stderr,none": 0.014611369529813265 + } + }, + "group_subtasks": { + "arc_challenge": [] + }, + "configs": { + "arc_challenge": { + "task": "arc_challenge", + "tag": [ + "ai2_arc" + ], + "dataset_path": "allenai/ai2_arc", + "dataset_name": "ARC-Challenge", + "training_split": "train", + "validation_split": "validation", + "test_split": "test", + "doc_to_text": "Question: {{question}}\nAnswer:", + "doc_to_target": "{{choices.label.index(answerKey)}}", + "unsafe_code": false, + "doc_to_choice": "{{choices.text}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 25, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "Question: {{question}}\nAnswer:", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "arc_challenge": 1.0 + }, + "n-shot": { + "arc_challenge": 25 + }, + "higher_is_better": { + "arc_challenge": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "arc_challenge": { + "original": 1172, + "effective": 1172 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 51 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764831207.9315128, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1132087.043105905, + "end_time": 1132297.989069005, + "total_evaluation_time_seconds": "210.94596310006455" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/boolq_2025-12-04T14-52-02.330620.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/boolq_2025-12-04T14-52-02.330620.json new file mode 100644 index 0000000000000000000000000000000000000000..307b61a1fdccf176cbaab8db0ed26cec2b083ca5 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/boolq_2025-12-04T14-52-02.330620.json @@ -0,0 +1,118 @@ +{ + "results": { + "boolq": { + "alias": "boolq", + "acc,none": 0.7327217125382263, + "acc_stderr,none": 0.00774005256694996 + } + }, + "group_subtasks": { + "boolq": [] + }, + "configs": { + "boolq": { + "task": "boolq", + "tag": [ + "super-glue-lm-eval-v1" + ], + "dataset_path": "super_glue", + "dataset_name": "boolq", + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "{{passage}}\nQuestion: {{question}}?\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": [ + "no", + "yes" + ], + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc" + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "passage", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "boolq": 2.0 + }, + "n-shot": { + "boolq": 0 + }, + "higher_is_better": { + "boolq": { + "acc": true + } + }, + "n-samples": { + "boolq": { + "original": 3270, + "effective": 3270 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 45 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764831014.8730035, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1131893.564729807, + "end_time": 1132036.48828004, + "total_evaluation_time_seconds": "142.92355023301207" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/piqa_2025-12-04T15-01-16.294659.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/piqa_2025-12-04T15-01-16.294659.json new file mode 100644 index 0000000000000000000000000000000000000000..2643fc792801a1aa1e25b52219e7ca04085ea484 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/piqa_2025-12-04T15-01-16.294659.json @@ -0,0 +1,124 @@ +{ + "results": { + "piqa": { + "alias": "piqa", + "acc,none": 0.7415669205658324, + "acc_stderr,none": 0.010213971636773315, + "acc_norm,none": 0.7573449401523396, + "acc_norm_stderr,none": 0.010002002569708696 + } + }, + "group_subtasks": { + "piqa": [] + }, + "configs": { + "piqa": { + "task": "piqa", + "dataset_path": "baber/piqa", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "Question: {{goal}}\nAnswer:", + "doc_to_target": "label", + "unsafe_code": false, + "doc_to_choice": "{{[sol1, sol2]}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + }, + { + "metric": "acc_norm", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "goal", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "piqa": 1.0 + }, + "n-shot": { + "piqa": 0 + }, + "higher_is_better": { + "piqa": { + "acc": true, + "acc_norm": true + } + }, + "n-samples": { + "piqa": { + "original": 1838, + "effective": 1838 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764831629.8832, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1132510.031790193, + "end_time": 1132590.453144353, + "total_evaluation_time_seconds": "80.42135416017845" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/truthfulqa_mc1_2025-12-04T14-59-03.329886.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/truthfulqa_mc1_2025-12-04T14-59-03.329886.json new file mode 100644 index 0000000000000000000000000000000000000000..92ff6da508f637361355d77c730171ed3e6b2552 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/truthfulqa_mc1_2025-12-04T14-59-03.329886.json @@ -0,0 +1,116 @@ +{ + "results": { + "truthfulqa_mc1": { + "alias": "truthfulqa_mc1", + "acc,none": 0.29008567931456547, + "acc_stderr,none": 0.01588623687420952 + } + }, + "group_subtasks": { + "truthfulqa_mc1": [] + }, + "configs": { + "truthfulqa_mc1": { + "task": "truthfulqa_mc1", + "tag": [ + "truthfulqa" + ], + "dataset_path": "truthful_qa", + "dataset_name": "multiple_choice", + "validation_split": "validation", + "doc_to_text": "{% set prompt_qa = 'Q: What is human life expectancy in the United States?\nA: Human life expectancy in the United States is 78 years.\n\nQ: Who was president of the United States in 1955?\nA: Dwight D. Eisenhower was president of the United States in 1955.\n\nQ: Which party did he belong to?\nA: He belonged to the Republican Party.\n\nQ: What is the square root of banana?\nA: I have no comment.\n\nQ: How does a telescope work?\nA: Telescopes use lenses or mirrors to focus light and make objects appear closer.\n\nQ: Where were the 1992 Olympics held?\nA: The 1992 Olympics were held in Barcelona, Spain.'%}{{prompt_qa + '\n\nQ: ' + question + '\nA:'}}", + "doc_to_target": 0, + "unsafe_code": false, + "doc_to_choice": "{{mc1_targets.choices}}", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 0, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "question", + "metadata": { + "version": 2.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "truthfulqa_mc1": 2.0 + }, + "n-shot": { + "truthfulqa_mc1": 0 + }, + "higher_is_better": { + "truthfulqa_mc1": { + "acc": true + } + }, + "n-samples": { + "truthfulqa_mc1": { + "original": 817, + "effective": 817 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764831475.0147069, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1132355.245016447, + "end_time": 1132457.487958984, + "total_evaluation_time_seconds": "102.24294253694825" +} \ No newline at end of file diff --git a/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/winogrande_2025-12-04T14-48-43.408718.json b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/winogrande_2025-12-04T14-48-43.408718.json new file mode 100644 index 0000000000000000000000000000000000000000..51b1d5147e72deb002a31bbe64f442be9f2cb9c3 --- /dev/null +++ b/lm-evaluation-harness/results3/Qwen2.5-7B-quantization-layer-mlp/mlp_8/winogrande_2025-12-04T14-48-43.408718.json @@ -0,0 +1,117 @@ +{ + "results": { + "winogrande": { + "alias": "winogrande", + "acc,none": 0.5927387529597474, + "acc_stderr,none": 0.013808654122417854 + } + }, + "group_subtasks": { + "winogrande": [] + }, + "configs": { + "winogrande": { + "task": "winogrande", + "dataset_path": "winogrande", + "dataset_name": "winogrande_xl", + "dataset_kwargs": { + "trust_remote_code": true + }, + "training_split": "train", + "validation_split": "validation", + "doc_to_text": "def doc_to_text(doc):\n answer_to_num = {\"1\": 0, \"2\": 1}\n return answer_to_num[doc[\"answer\"]]\n", + "doc_to_target": "def doc_to_target(doc):\n idx = doc[\"sentence\"].index(\"_\") + 1\n return doc[\"sentence\"][idx:].strip()\n", + "unsafe_code": false, + "doc_to_choice": "def doc_to_choice(doc):\n idx = doc[\"sentence\"].index(\"_\")\n options = [doc[\"option1\"], doc[\"option2\"]]\n return [doc[\"sentence\"][:idx] + opt for opt in options]\n", + "description": "", + "target_delimiter": " ", + "fewshot_delimiter": "\n\n", + "num_fewshot": 5, + "metric_list": [ + { + "metric": "acc", + "aggregation": "mean", + "higher_is_better": true + } + ], + "output_type": "multiple_choice", + "repeats": 1, + "should_decontaminate": true, + "doc_to_decontamination_query": "sentence", + "metadata": { + "version": 1.0, + "pretrained": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp" + } + } + }, + "versions": { + "winogrande": 1.0 + }, + "n-shot": { + "winogrande": 5 + }, + "higher_is_better": { + "winogrande": { + "acc": true + } + }, + "n-samples": { + "winogrande": { + "original": 1267, + "effective": 1267 + } + }, + "config": { + "model": "hf", + "model_args": "pretrained=/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_num_parameters": 7615616512, + "model_dtype": "torch.float16", + "model_revision": "main", + "model_sha": "", + "batch_size": "auto", + "batch_sizes": [ + 64 + ], + "device": "cuda", + "use_cache": null, + "limit": null, + "bootstrap_iters": 100000, + "gen_kwargs": null, + "random_seed": 0, + "numpy_seed": 1234, + "torch_seed": 1234, + "fewshot_seed": 1234 + }, + "git_hash": null, + "date": 1764830866.090969, + "pretty_env_info": "PyTorch version: 2.9.1+cu128\nIs debug build: False\nCUDA used to build PyTorch: 12.8\nROCM used to build PyTorch: N/A\n\nOS: Debian GNU/Linux 12 (bookworm) (x86_64)\nGCC version: (Debian 12.2.0-14) 12.2.0\nClang version: Could not collect\nCMake version: version 3.25.1\nLibc version: glibc-2.36\n\nPython version: 3.11.14 (main, Oct 21 2025, 18:31:21) [GCC 11.2.0] (64-bit runtime)\nPython platform: Linux-5.4.143.bsk.7-amd64-x86_64-with-glibc2.36\nIs CUDA available: True\nCUDA runtime version: 12.4.131\nCUDA_MODULE_LOADING set to: \nGPU models and configuration: \nGPU 0: NVIDIA A100-SXM4-80GB\nGPU 1: NVIDIA A100-SXM4-80GB\nGPU 2: NVIDIA A100-SXM4-80GB\nGPU 3: NVIDIA A100-SXM4-80GB\nGPU 4: NVIDIA A100-SXM4-80GB\nGPU 5: NVIDIA A100-SXM4-80GB\nGPU 6: NVIDIA A100-SXM4-80GB\nGPU 7: NVIDIA A100-SXM4-80GB\n\nNvidia driver version: 535.161.08\ncuDNN version: Probably one of the following:\n/usr/lib/x86_64-linux-gnu/libcudnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.4.0\n/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.4.0\nIs XPU available: False\nHIP runtime version: N/A\nMIOpen runtime version: N/A\nIs XNNPACK available: True\n\nCPU:\nArchitecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 46 bits physical, 57 bits virtual\nByte Order: Little Endian\nCPU(s): 128\nOn-line CPU(s) list: 0-127\nVendor ID: GenuineIntel\nModel name: Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz\nCPU family: 6\nModel: 106\nThread(s) per core: 2\nCore(s) per socket: 32\nSocket(s): 2\nStepping: 6\nCPU(s) scaling MHz: 86%\nCPU max MHz: 3500.0000\nCPU min MHz: 800.0000\nBogoMIPS: 4600.00\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 3 MiB (64 instances)\nL1i cache: 2 MiB (64 instances)\nL2 cache: 80 MiB (64 instances)\nL3 cache: 108 MiB (2 instances)\nNUMA node(s): 2\nNUMA node0 CPU(s): 0-31,64-95\nNUMA node1 CPU(s): 32-63,96-127\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced IBRS, IBPB conditional, RSB filling\nVulnerability Srbds: Not affected\nVulnerability Tsx async abort: Not affected\n\nVersions of relevant libraries:\n[pip3] mypy==1.19.0\n[pip3] mypy_extensions==1.1.0\n[pip3] numpy==1.26.4\n[pip3] nvidia-cublas-cu12==12.8.4.1\n[pip3] nvidia-cuda-cupti-cu12==12.8.90\n[pip3] nvidia-cuda-nvrtc-cu12==12.8.93\n[pip3] nvidia-cuda-runtime-cu12==12.8.90\n[pip3] nvidia-cudnn-cu12==9.10.2.21\n[pip3] nvidia-cufft-cu12==11.3.3.83\n[pip3] nvidia-curand-cu12==10.3.9.90\n[pip3] nvidia-cusolver-cu12==11.7.3.90\n[pip3] nvidia-cusparse-cu12==12.5.8.93\n[pip3] nvidia-cusparselt-cu12==0.7.1\n[pip3] nvidia-nccl-cu12==2.27.5\n[pip3] nvidia-nvjitlink-cu12==12.8.93\n[pip3] nvidia-nvtx-cu12==12.8.90\n[pip3] open_clip_torch==3.2.0\n[pip3] torch==2.9.1\n[pip3] torchvision==0.24.1\n[pip3] triton==3.5.1\n[conda] numpy 1.26.4 pypi_0 pypi\n[conda] nvidia-cublas-cu12 12.8.4.1 pypi_0 pypi\n[conda] nvidia-cuda-cupti-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cuda-nvrtc-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-cuda-runtime-cu12 12.8.90 pypi_0 pypi\n[conda] nvidia-cudnn-cu12 9.10.2.21 pypi_0 pypi\n[conda] nvidia-cufft-cu12 11.3.3.83 pypi_0 pypi\n[conda] nvidia-curand-cu12 10.3.9.90 pypi_0 pypi\n[conda] nvidia-cusolver-cu12 11.7.3.90 pypi_0 pypi\n[conda] nvidia-cusparse-cu12 12.5.8.93 pypi_0 pypi\n[conda] nvidia-cusparselt-cu12 0.7.1 pypi_0 pypi\n[conda] nvidia-nccl-cu12 2.27.5 pypi_0 pypi\n[conda] nvidia-nvjitlink-cu12 12.8.93 pypi_0 pypi\n[conda] nvidia-nvtx-cu12 12.8.90 pypi_0 pypi\n[conda] open-clip-torch 3.2.0 pypi_0 pypi\n[conda] torch 2.9.1 pypi_0 pypi\n[conda] torchvision 0.24.1 pypi_0 pypi\n[conda] triton 3.5.1 pypi_0 pypi", + "transformers_version": "4.57.3", + "lm_eval_version": "0.4.8", + "upper_git_hash": "3761bde4a46223e738034eac9a2e68a7b5997d5e", + "tokenizer_pad_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_eos_token": [ + "<|endoftext|>", + "151643" + ], + "tokenizer_bos_token": [ + null, + "None" + ], + "eot_token_id": 151643, + "max_length": 131072, + "task_hashes": {}, + "model_source": "hf", + "model_name": "/mnt/bn/life-mllm/users/cxr/quantization/models/Qwen2.5-7B-quantization-layer-mlp", + "model_name_sanitized": "__mnt__bn__life-mllm__users__cxr__quantization__models__Qwen2.5-7B-quantization-layer-mlp", + "system_instruction": null, + "system_instruction_sha": null, + "fewshot_as_multiturn": false, + "chat_template": null, + "chat_template_sha": null, + "start_time": 1131743.885785947, + "end_time": 1131837.567074424, + "total_evaluation_time_seconds": "93.68128847680055" +} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_geometry-v0-res.json b/lm-evaluation-harness/tests/testdata/math_geometry-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..1b25dc283c96c63d30df9f0ce3d04aadb8f93625 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_geometry-v0-res.json @@ -0,0 +1 @@ +{"results": {"math_geometry": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_geometry": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_geometry-v1-greedy_until b/lm-evaluation-harness/tests/testdata/math_geometry-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..1c7362fe44e4432f56f18932b4b429d5cf573399 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_geometry-v1-greedy_until @@ -0,0 +1 @@ +46bc4cb219b6903397da782699a684bdbb982c0c954ff82e6beeed5c84878f42 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v0-greedy_until b/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..3ab10de26a038019a18699e20887de6da66981c4 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v0-greedy_until @@ -0,0 +1 @@ +d53c699de272d517ed7ad783b4e692302be9f9f97a8d4ac7a6541e538a7cabe0 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v0-res.json b/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..7a195d9ac43e6feb4a7fc354f5dc424a27b0bf7d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v0-res.json @@ -0,0 +1 @@ +{"results": {"math_intermediate_algebra": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_intermediate_algebra": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v1-greedy_until b/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..3ab10de26a038019a18699e20887de6da66981c4 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v1-greedy_until @@ -0,0 +1 @@ +d53c699de272d517ed7ad783b4e692302be9f9f97a8d4ac7a6541e538a7cabe0 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v1-res.json b/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..63ab45b9ff890a0ef7c2108133b23bf0043f13f8 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_intermediate_algebra-v1-res.json @@ -0,0 +1 @@ +{"results": {"math_intermediate_algebra": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_intermediate_algebra": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_num_theory-v0-greedy_until b/lm-evaluation-harness/tests/testdata/math_num_theory-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..82febb9f5dfeefbd6dc5d244574ac5666c6b8bba --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_num_theory-v0-greedy_until @@ -0,0 +1 @@ +b920ccb507afdcf3ef6f4c04891913731e9f32ec914801791c6d9f8abf6e1897 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_num_theory-v0-res.json b/lm-evaluation-harness/tests/testdata/math_num_theory-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..a27a38fa9d4f3a924828bdb4526953a35328c7e5 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_num_theory-v0-res.json @@ -0,0 +1 @@ +{"results": {"math_num_theory": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_num_theory": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_num_theory-v1-greedy_until b/lm-evaluation-harness/tests/testdata/math_num_theory-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..82febb9f5dfeefbd6dc5d244574ac5666c6b8bba --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_num_theory-v1-greedy_until @@ -0,0 +1 @@ +b920ccb507afdcf3ef6f4c04891913731e9f32ec914801791c6d9f8abf6e1897 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_num_theory-v1-res.json b/lm-evaluation-harness/tests/testdata/math_num_theory-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..00917b90ddb0602c62c8a9fef959b9e91eb45c2e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_num_theory-v1-res.json @@ -0,0 +1 @@ +{"results": {"math_num_theory": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_num_theory": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_prealgebra-v0-greedy_until b/lm-evaluation-harness/tests/testdata/math_prealgebra-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..5200f4cfa9ed3a735661e987791bf1434555db6e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_prealgebra-v0-greedy_until @@ -0,0 +1 @@ +752cdf343d7152e476b0273065024f6ea0e0f47ea385c6bdf9067736cb39724a \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_prealgebra-v0-res.json b/lm-evaluation-harness/tests/testdata/math_prealgebra-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..b3ada8a6be4d86b71a0c6b92c605d3c8a25a29a2 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_prealgebra-v0-res.json @@ -0,0 +1 @@ +{"results": {"math_prealgebra": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_prealgebra": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_prealgebra-v1-greedy_until b/lm-evaluation-harness/tests/testdata/math_prealgebra-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..5200f4cfa9ed3a735661e987791bf1434555db6e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_prealgebra-v1-greedy_until @@ -0,0 +1 @@ +752cdf343d7152e476b0273065024f6ea0e0f47ea385c6bdf9067736cb39724a \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_prealgebra-v1-res.json b/lm-evaluation-harness/tests/testdata/math_prealgebra-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..e3869faa8012568df2eae14e3774712960c4a544 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_prealgebra-v1-res.json @@ -0,0 +1 @@ +{"results": {"math_prealgebra": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_prealgebra": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_precalc-v0-greedy_until b/lm-evaluation-harness/tests/testdata/math_precalc-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..71bbd8d9c221ca484d517bda46c109b2610f79f6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_precalc-v0-greedy_until @@ -0,0 +1 @@ +bc834b06fd79473ca6fe38a51b714aad0bf0478c1b0eec787eca34dbdf69cb71 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_precalc-v0-res.json b/lm-evaluation-harness/tests/testdata/math_precalc-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..699dc5fe38ea411d6d53c9e19d78ba6d96ddfb40 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_precalc-v0-res.json @@ -0,0 +1 @@ +{"results": {"math_precalc": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_precalc": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_precalc-v1-greedy_until b/lm-evaluation-harness/tests/testdata/math_precalc-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..71bbd8d9c221ca484d517bda46c109b2610f79f6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_precalc-v1-greedy_until @@ -0,0 +1 @@ +bc834b06fd79473ca6fe38a51b714aad0bf0478c1b0eec787eca34dbdf69cb71 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/math_precalc-v1-res.json b/lm-evaluation-harness/tests/testdata/math_precalc-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..a5846590a3b28f2382d00a3400e1c46a9018adea --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/math_precalc-v1-res.json @@ -0,0 +1 @@ +{"results": {"math_precalc": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"math_precalc": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mathqa-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/mathqa-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..9f33d79035cc7caf00704a8764aa0adf657c0b78 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mathqa-v0-loglikelihood @@ -0,0 +1 @@ +a45260e49f02c7cb8886b3746db4d388890860b202dd8a9f0267e3c324e0af13 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mathqa-v0-res.json b/lm-evaluation-harness/tests/testdata/mathqa-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..dabd07c07cbbad2886b20acb25189b111676bbcd --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mathqa-v0-res.json @@ -0,0 +1 @@ +{"results": {"mathqa": {"acc": 0.20770519262981574, "acc_norm": 0.2050251256281407, "acc_norm_stderr": 0.007390619359738901, "acc_stderr": 0.007426217631188539}}, "versions": {"mathqa": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mc_taco-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/mc_taco-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..f0ce5c64580d1132710e596cc287126ba77394e6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mc_taco-v0-loglikelihood @@ -0,0 +1 @@ +1811808ef05afd5f30ffc3471622a3dd7a1b681b17a2f7616695ad6b2a45943c \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mc_taco-v0-res.json b/lm-evaluation-harness/tests/testdata/mc_taco-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..fc36d1ed3ff4d02330a13eb7431d5413b4c484e5 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mc_taco-v0-res.json @@ -0,0 +1 @@ +{"results": {"mc_taco": {"em": 0.07732732732732733, "f1": 0.41600515965511614}}, "versions": {"mc_taco": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mmlu_stem_10_hf_pretrained-EleutherAI-pythia-14m-dtype-float32-device-cpu.txt b/lm-evaluation-harness/tests/testdata/mmlu_stem_10_hf_pretrained-EleutherAI-pythia-14m-dtype-float32-device-cpu.txt new file mode 100644 index 0000000000000000000000000000000000000000..8c6c56c1261f69f89dff5ac169fd75d16a5a9f43 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mmlu_stem_10_hf_pretrained-EleutherAI-pythia-14m-dtype-float32-device-cpu.txt @@ -0,0 +1,22 @@ +| Tasks |Version|Filter|n-shot|Metric| |Value | |Stderr| +|-------------------------------|------:|------|-----:|------|---|-----:|---|------| +|stem | 2|none | |acc |↑ |0.2474|± | N/A| +| - abstract_algebra | 1|none | 0|acc |↑ |0.2000|± | N/A| +| - anatomy | 1|none | 0|acc |↑ |0.3000|± | N/A| +| - astronomy | 1|none | 0|acc |↑ |0.1000|± | N/A| +| - college_biology | 1|none | 0|acc |↑ |0.3000|± | N/A| +| - college_chemistry | 1|none | 0|acc |↑ |0.1000|± | N/A| +| - college_computer_science | 1|none | 0|acc |↑ |0.2000|± | N/A| +| - college_mathematics | 1|none | 0|acc |↑ |0.2000|± | N/A| +| - college_physics | 1|none | 0|acc |↑ |0.3000|± | N/A| +| - computer_security | 1|none | 0|acc |↑ |0.5000|± | N/A| +| - conceptual_physics | 1|none | 0|acc |↑ |0.3000|± | N/A| +| - electrical_engineering | 1|none | 0|acc |↑ |0.4000|± | N/A| +| - elementary_mathematics | 1|none | 0|acc |↑ |0.0000|± | N/A| +| - high_school_biology | 1|none | 0|acc |↑ |0.3000|± | N/A| +| - high_school_chemistry | 1|none | 0|acc |↑ |0.4000|± | N/A| +| - high_school_computer_science| 1|none | 0|acc |↑ |0.3000|± | N/A| +| - high_school_mathematics | 1|none | 0|acc |↑ |0.2000|± | N/A| +| - high_school_physics | 1|none | 0|acc |↑ |0.3000|± | N/A| +| - high_school_statistics | 1|none | 0|acc |↑ |0.0000|± | N/A| +| - machine_learning | 1|none | 0|acc |↑ |0.3000|± | N/A| \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mnli-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/mnli-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..433b76d01094a18991412513044f0933eb0bf3f5 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mnli-v0-loglikelihood @@ -0,0 +1 @@ +4fc7b56b8f1e37e38f4a052b227baec2df914c898c3405d3e994726ba4fba976 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mnli-v0-res.json b/lm-evaluation-harness/tests/testdata/mnli-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..d9dada7a0244534c35d86efb71a03fbd90217328 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mnli-v0-res.json @@ -0,0 +1 @@ +{"results": {"mnli": {"acc": 0.32868059093224655, "acc_stderr": 0.004741640290753859}}, "versions": {"mnli": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mnli_mismatched-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/mnli_mismatched-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..3fb242da3a2d274cbcc84bf86a6bb11f02df27ab --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mnli_mismatched-v0-loglikelihood @@ -0,0 +1 @@ +3784acf322e79f31702a7a0612030e4ba5c4fc466ad976a34ee3f3d7278c01f0 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mnli_mismatched-v0-res.json b/lm-evaluation-harness/tests/testdata/mnli_mismatched-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..261deed96275da1af0c8a0616b0af6247cfaf1c0 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mnli_mismatched-v0-res.json @@ -0,0 +1 @@ +{"results": {"mnli_mismatched": {"acc": 0.3360455655004068, "acc_stderr": 0.004763973908606819}}, "versions": {"mnli_mismatched": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mrpc-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/mrpc-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..95c849a153762819da1ce59c1b58a2013b97ef6a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mrpc-v0-loglikelihood @@ -0,0 +1 @@ +9f54cbff8d6accba99cfa2c4c4b359563313941018173d7dcf9e32dc28c06583 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mrpc-v0-res.json b/lm-evaluation-harness/tests/testdata/mrpc-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..f141eaa0a49aceaae493aea7080eab4e8b1cec16 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mrpc-v0-res.json @@ -0,0 +1 @@ +{"results": {"mrpc": {"acc": 0.5392156862745098, "acc_stderr": 0.024707732873723128, "f1": 0.5982905982905982, "f1_stderr": 0.028928325246283727}}, "versions": {"mrpc": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/multirc-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/multirc-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..b3681ec17595adc4c4541ded263add219912af58 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/multirc-v0-loglikelihood @@ -0,0 +1 @@ +cdb026c027437a8b4653212d0944d36fc16f49921dcb8e4bef899d15a55e9f80 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/multirc-v0-res.json b/lm-evaluation-harness/tests/testdata/multirc-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..87e9c532eb7d7deb7d08635dd955df7a68ab9813 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/multirc-v0-res.json @@ -0,0 +1 @@ +{"results": {"multirc": {"acc": 0.07450157397691501, "acc_stderr": 0.008510441526175931}}, "versions": {"multirc": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/multirc-v1-loglikelihood b/lm-evaluation-harness/tests/testdata/multirc-v1-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..52a89c6f9eaf1cece362cf2d4bd114f8ae3cbdda --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/multirc-v1-loglikelihood @@ -0,0 +1 @@ +0e793bd6f637a70a04c6f2cda080188fc037961b2f909095fe63f7bdbc4a90c6 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/multirc-v1-res.json b/lm-evaluation-harness/tests/testdata/multirc-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..938141bbb888f55c3aa2786868c28925ac3fd123 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/multirc-v1-res.json @@ -0,0 +1 @@ +{"results": {"multirc": {"acc": 0.046169989506820566, "acc_stderr": 0.006801377886208738}}, "versions": {"multirc": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mutual-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/mutual-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..0022f466d25f3e3a639720e4600732c9c0c1141d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mutual-v0-loglikelihood @@ -0,0 +1 @@ +f759213a28f0412510bf1a24c9cab0dae64bdee902d42a26225295445e7779db \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mutual-v0-res.json b/lm-evaluation-harness/tests/testdata/mutual-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..2d240576b3b8d891ff91a47770df9990edf34105 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mutual-v0-res.json @@ -0,0 +1 @@ +{"results": {"mutual": {"mrr": 0.5023513920240772, "mrr_stderr": 0.009501864812936679, "r@1": 0.22573363431151242, "r@1_stderr": 0.014053085820407457, "r@2": 0.4221218961625282, "r@2_stderr": 0.016602191705517556}}, "versions": {"mutual": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mutual-v1-loglikelihood b/lm-evaluation-harness/tests/testdata/mutual-v1-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..0022f466d25f3e3a639720e4600732c9c0c1141d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mutual-v1-loglikelihood @@ -0,0 +1 @@ +f759213a28f0412510bf1a24c9cab0dae64bdee902d42a26225295445e7779db \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mutual-v1-res.json b/lm-evaluation-harness/tests/testdata/mutual-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..42e97c6f1a1b65ef76cc3941c8b08e8ca836a59c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mutual-v1-res.json @@ -0,0 +1 @@ +{"results": {"mutual": {"mrr": 0.5023513920240772, "mrr_stderr": 0.009501864812936679, "r@1": 0.22460496613995484, "r@1_stderr": 0.014028122493992806, "r@2": 0.4706546275395034, "r@2_stderr": 0.016778343895001414}}, "versions": {"mutual": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mutual_plus-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/mutual_plus-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..f4ba9d37310a19cc7928fd0d599776d8a9da8dba --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mutual_plus-v0-loglikelihood @@ -0,0 +1 @@ +b846bb9db109535f59a93d1ce340cf09f68bdf4fed5b8decd168784220fe07fa \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mutual_plus-v0-res.json b/lm-evaluation-harness/tests/testdata/mutual_plus-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..9c0348826363dfe77e60cb28cf546110e25bab35 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mutual_plus-v0-res.json @@ -0,0 +1 @@ +{"results": {"mutual_plus": {"mrr": 0.5275583145221953, "mrr_stderr": 0.009940894824430708, "r@1": 0.2595936794582393, "r@1_stderr": 0.014737047402750955, "r@2": 0.45372460496614, "r@2_stderr": 0.01673517854461967}}, "versions": {"mutual_plus": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mutual_plus-v1-loglikelihood b/lm-evaluation-harness/tests/testdata/mutual_plus-v1-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..f4ba9d37310a19cc7928fd0d599776d8a9da8dba --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mutual_plus-v1-loglikelihood @@ -0,0 +1 @@ +b846bb9db109535f59a93d1ce340cf09f68bdf4fed5b8decd168784220fe07fa \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/mutual_plus-v1-res.json b/lm-evaluation-harness/tests/testdata/mutual_plus-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..cdb6c85b65643b2214358d18b057d0737d53b9ba --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/mutual_plus-v1-res.json @@ -0,0 +1 @@ +{"results": {"mutual_plus": {"mrr": 0.5275583145221953, "mrr_stderr": 0.009940894824430708, "r@1": 0.26297968397291194, "r@1_stderr": 0.01479889176605113, "r@2": 0.5, "r@2_stderr": 0.01680731613632036}}, "versions": {"mutual_plus": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/openbookqa-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/openbookqa-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..b2cc5e9795fd1623bfc11e4d1cb53b0e1baa3dbf --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/openbookqa-v0-loglikelihood @@ -0,0 +1 @@ +78a49a0ca1a47373adb33463b1d092e6bc0d8f4b01bcb380ada48065037849d7 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/openbookqa-v0-res.json b/lm-evaluation-harness/tests/testdata/openbookqa-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..04f4c25442e678a63d3f6213dc9364bfa25b1a7a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/openbookqa-v0-res.json @@ -0,0 +1 @@ +{"results": {"openbookqa": {"acc": 0.214, "acc_norm": 0.276, "acc_norm_stderr": 0.020011219298073517, "acc_stderr": 0.018359797502387046}}, "versions": {"openbookqa": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_arxiv-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_arxiv-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..3aa1d8c7349449271fbd81fbbc06fde47a116028 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_arxiv-v0-loglikelihood_rolling @@ -0,0 +1 @@ +814f9954e44368559602c00f7e85fa3971acdfd0315f508ec7df6318a79c55ec \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_arxiv-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_arxiv-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..d19d0c6fee7f47af1ad3f5af9ff1d7a1544e2e98 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_arxiv-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_arxiv": {"bits_per_byte": 1.0750412350569374e-05, "byte_perplexity": 1.0000107504701365, "word_perplexity": 1.0000819333090385}}, "versions": {"pile_arxiv": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_arxiv-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_arxiv-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..3aa1d8c7349449271fbd81fbbc06fde47a116028 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_arxiv-v1-loglikelihood_rolling @@ -0,0 +1 @@ +814f9954e44368559602c00f7e85fa3971acdfd0315f508ec7df6318a79c55ec \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_arxiv-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_arxiv-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..05cbab38732c94665750aac31cd2c41688552a8d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_arxiv-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_arxiv": {"bits_per_byte": 1.55095665856779e-05, "byte_perplexity": 1.0000107504701365, "word_perplexity": 1.0000819333090385}}, "versions": {"pile_arxiv": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..b37a91cc2dea829e8dab7bb0fe934442c54b3a26 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v0-loglikelihood_rolling @@ -0,0 +1 @@ +5c17ddfebeab8c41dabadb6fc216ceda91e3fe5dc95aaf1b2c843d7f11828b03 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..698b03e8b3b437f94f22744ffe12ba2fff9285f6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_bookcorpus2": {"bits_per_byte": 1.1631037706429144e-06, "byte_perplexity": 1.000001163104447, "word_perplexity": 1.0000066499426599}}, "versions": {"pile_bookcorpus2": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..b37a91cc2dea829e8dab7bb0fe934442c54b3a26 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v1-loglikelihood_rolling @@ -0,0 +1 @@ +5c17ddfebeab8c41dabadb6fc216ceda91e3fe5dc95aaf1b2c843d7f11828b03 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..967c14934b81e0880063c4239593fb74cd99cd8d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_bookcorpus2-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_bookcorpus2": {"bits_per_byte": 1.6780040419457868e-06, "byte_perplexity": 1.000001163104447, "word_perplexity": 1.0000066499426599}}, "versions": {"pile_bookcorpus2": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_books3-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_books3-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..b483d3b45b43abddd6cbd169a8afda8d3f803d9c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_books3-v0-loglikelihood_rolling @@ -0,0 +1 @@ +0f8f36f705b999b6d55fa72ff89a82793dd1cb568ab1f8727a6a2086a12b9410 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_books3-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_books3-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..df19cd0a18f122d695f8aea4a717ab4dde79a987 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_books3-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_books3": {"bits_per_byte": 8.942486206275221e-07, "byte_perplexity": 1.0000008942490204, "word_perplexity": 1.0000052870063607}}, "versions": {"pile_books3": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_books3-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_books3-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..b483d3b45b43abddd6cbd169a8afda8d3f803d9c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_books3-v1-loglikelihood_rolling @@ -0,0 +1 @@ +0f8f36f705b999b6d55fa72ff89a82793dd1cb568ab1f8727a6a2086a12b9410 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_books3-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_books3-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..6ff7a517112eba76e15e999e9974124e04f07a83 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_books3-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_books3": {"bits_per_byte": 1.2901280503011222e-06, "byte_perplexity": 1.0000008942490204, "word_perplexity": 1.0000052870063607}}, "versions": {"pile_books3": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..2fb27786c54abe6303683c0a247d4c689586a97c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v0-loglikelihood_rolling @@ -0,0 +1 @@ +d5b7967c0ece8b816f3921a8bd0fad23365349e935b491595e2ad1135af42da6 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..860aa06c974e58d03f54ab1d9cb14c7e98019d4e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_dm-mathematics": {"bits_per_byte": 6.176600873627999e-05, "byte_perplexity": 1.0000617679162955, "word_perplexity": 1.0002875035042451}}, "versions": {"pile_dm-mathematics": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..2fb27786c54abe6303683c0a247d4c689586a97c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v1-loglikelihood_rolling @@ -0,0 +1 @@ +d5b7967c0ece8b816f3921a8bd0fad23365349e935b491595e2ad1135af42da6 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..192e9066a42acf28436ae325a212b2a7c2ebf517 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_dm-mathematics-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_dm-mathematics": {"bits_per_byte": 8.910951449933553e-05, "byte_perplexity": 1.0000617679162955, "word_perplexity": 1.0002875035042451}}, "versions": {"pile_dm-mathematics": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_enron-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_enron-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..57dbe764605ef5e1e4578682549a001c851704c0 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_enron-v0-loglikelihood_rolling @@ -0,0 +1 @@ +4baa6ccdc9e3aa9921675ab4400d5e89d7b546b844a8ea28f6461d649066418a \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_enron-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_enron-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..a4a49493d56db35c99b7e58ea66ebc21304184b2 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_enron-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_enron": {"bits_per_byte": 0.0003163902828673244, "byte_perplexity": 1.000316440339552, "word_perplexity": 1.00224668051869}}, "versions": {"pile_enron": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_enron-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_enron-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..57dbe764605ef5e1e4578682549a001c851704c0 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_enron-v1-loglikelihood_rolling @@ -0,0 +1 @@ +4baa6ccdc9e3aa9921675ab4400d5e89d7b546b844a8ea28f6461d649066418a \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_enron-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_enron-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..abe7b45f9aff9b6427068ceb1ba39977fa843c38 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_enron-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_enron": {"bits_per_byte": 0.0004564546920781453, "byte_perplexity": 1.000316440339552, "word_perplexity": 1.00224668051869}}, "versions": {"pile_enron": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_europarl-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_europarl-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..80272607557f6e0c97220efa30c8b9ad38f52aa8 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_europarl-v0-loglikelihood_rolling @@ -0,0 +1 @@ +e67d3dbccd47d308bfc5b0e66b76d0dfc5e386ebfa94e056562c2281c395543f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_europarl-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_europarl-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..4c53edd2ce620475c056ccca5cde73380c246074 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_europarl-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_europarl": {"bits_per_byte": 8.648858203555344e-06, "byte_perplexity": 1.000008648895605, "word_perplexity": 1.000063506523818}}, "versions": {"pile_europarl": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_europarl-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_europarl-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..80272607557f6e0c97220efa30c8b9ad38f52aa8 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_europarl-v1-loglikelihood_rolling @@ -0,0 +1 @@ +e67d3dbccd47d308bfc5b0e66b76d0dfc5e386ebfa94e056562c2281c395543f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_europarl-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_europarl-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..b948f0d3691443f50c9f9d5ae24804b0c7e79aaa --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_europarl-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_europarl": {"bits_per_byte": 1.2477664839621123e-05, "byte_perplexity": 1.000008648895605, "word_perplexity": 1.000063506523818}}, "versions": {"pile_europarl": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_freelaw-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_freelaw-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..7b5771f4911f3069217d75d12cbdfa1a579b6663 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_freelaw-v0-loglikelihood_rolling @@ -0,0 +1 @@ +d77f3f68aadd6cbf1290c2f6737b2ed5d5c2a60e4c81a65c280f207783caabe1 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_freelaw-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_freelaw-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..0bda41ffb37dd04bebd9982faf464616dd82a31d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_freelaw-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_freelaw": {"bits_per_byte": 3.16238943008513e-05, "byte_perplexity": 1.0000316243943415, "word_perplexity": 1.000203169094218}}, "versions": {"pile_freelaw": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_freelaw-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_freelaw-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..7b5771f4911f3069217d75d12cbdfa1a579b6663 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_freelaw-v1-loglikelihood_rolling @@ -0,0 +1 @@ +d77f3f68aadd6cbf1290c2f6737b2ed5d5c2a60e4c81a65c280f207783caabe1 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_freelaw-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_freelaw-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..dd0e0bac36b116bddbcd70d4327c3cdb3e3630e9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_freelaw-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_freelaw": {"bits_per_byte": 4.5623635481434923e-05, "byte_perplexity": 1.0000316243943415, "word_perplexity": 1.000203169094218}}, "versions": {"pile_freelaw": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_github-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_github-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..cf8251e4f68e2e893624142031e80d4d5777f4f2 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_github-v0-loglikelihood_rolling @@ -0,0 +1 @@ +df384c3df3d8f53273e97127c5bb84c17e638acad7d6bc9c91f6dee96d43b639 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_github-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_github-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..bdabf399695d155026643eacca7954c5f87009d5 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_github-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_github": {"bits_per_byte": 9.540627613754646e-05, "byte_perplexity": 1.0000954108274611, "word_perplexity": 1.0009643183931227}}, "versions": {"pile_github": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_github-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_github-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..cf8251e4f68e2e893624142031e80d4d5777f4f2 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_github-v1-loglikelihood_rolling @@ -0,0 +1 @@ +df384c3df3d8f53273e97127c5bb84c17e638acad7d6bc9c91f6dee96d43b639 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_github-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_github-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..cc06a45501fb498db32e56d0677ef01f10869cc9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_github-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_github": {"bits_per_byte": 0.00013764216145332133, "byte_perplexity": 1.0000954108274611, "word_perplexity": 1.0009643183931227}}, "versions": {"pile_github": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_gutenberg-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_gutenberg-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..bd7b15927f717baab5b7ce2e9d659dda6d681769 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_gutenberg-v0-loglikelihood_rolling @@ -0,0 +1 @@ +02a559f74a9105145e7d4d9c5ddea372b5b4938f5368dc8ffafc39cbe3b4c7ef \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_gutenberg-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_gutenberg-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..757ef06f79c938e6968583eb58a135fad23c897e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_gutenberg-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_gutenberg": {"bits_per_byte": 1.2443606332351536e-06, "byte_perplexity": 1.0000012443614075, "word_perplexity": 1.0000072174665404}}, "versions": {"pile_gutenberg": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_gutenberg-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_gutenberg-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..bd7b15927f717baab5b7ce2e9d659dda6d681769 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_gutenberg-v1-loglikelihood_rolling @@ -0,0 +1 @@ +02a559f74a9105145e7d4d9c5ddea372b5b4938f5368dc8ffafc39cbe3b4c7ef \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_gutenberg-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_gutenberg-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..6d22ed3ff50eaa5a68f8a5ad1ac4d3828f74f81f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_gutenberg-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_gutenberg": {"bits_per_byte": 1.7952329146458065e-06, "byte_perplexity": 1.0000012443614075, "word_perplexity": 1.0000072174665404}}, "versions": {"pile_gutenberg": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_hackernews-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_hackernews-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..48b767bfe706bb035e4553ea9c4119347303bab9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_hackernews-v0-loglikelihood_rolling @@ -0,0 +1 @@ +ec1082ee5a5326e0d57aa4e73b634937140c1de9af95f154e8ab57b05d9b422b \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_hackernews-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_hackernews-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..68578fe4c952b8bccb26700be82df67450c558dd --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_hackernews-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_hackernews": {"bits_per_byte": 0.00010170276359193358, "byte_perplexity": 1.0001017079354932, "word_perplexity": 1.0006273924348839}}, "versions": {"pile_hackernews": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_hackernews-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_hackernews-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..48b767bfe706bb035e4553ea9c4119347303bab9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_hackernews-v1-loglikelihood_rolling @@ -0,0 +1 @@ +ec1082ee5a5326e0d57aa4e73b634937140c1de9af95f154e8ab57b05d9b422b \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_hackernews-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_hackernews-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..ea135278b720703540187531afb0ef82e7d6a1ce --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_hackernews-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_hackernews": {"bits_per_byte": 0.00014672607267878518, "byte_perplexity": 1.0001017079354932, "word_perplexity": 1.0006273924348839}}, "versions": {"pile_hackernews": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..5f76588a813eebe7f0958a07253480d30de2ccf3 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v0-loglikelihood_rolling @@ -0,0 +1 @@ +520ea6e04e8a39dc0b5f63a837429a78a40e63d39d109096101feb8c5b2cf8d8 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..1c7bb56c6dc6cec7e2677317b3f9888293a65b92 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_nih-exporter": {"bits_per_byte": 0.00024394433346975716, "byte_perplexity": 1.0002439740903082, "word_perplexity": 1.0016712202288802}}, "versions": {"pile_nih-exporter": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..5f76588a813eebe7f0958a07253480d30de2ccf3 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v1-loglikelihood_rolling @@ -0,0 +1 @@ +520ea6e04e8a39dc0b5f63a837429a78a40e63d39d109096101feb8c5b2cf8d8 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..0e40fc8268a77618471344585bc1a1586fd69e0f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_nih-exporter-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_nih-exporter": {"bits_per_byte": 0.00035193728014978225, "byte_perplexity": 1.0002439740903082, "word_perplexity": 1.0016712202288802}}, "versions": {"pile_nih-exporter": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..47805d3b5fe82555e4d61a90b43c157c974ddabc --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v0-loglikelihood_rolling @@ -0,0 +1 @@ +0f1c23a1f4ddec0c2b1ff34de8d1505b0eb9e2868d8edbcc1b6de13d02f32036 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..f718e515ba0cedfa5156b3a260d50ed55efc32e4 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_opensubtitles": {"bits_per_byte": 1.5213441136639177e-05, "byte_perplexity": 1.0000152135568616, "word_perplexity": 1.0000856162053249}}, "versions": {"pile_opensubtitles": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..47805d3b5fe82555e4d61a90b43c157c974ddabc --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v1-loglikelihood_rolling @@ -0,0 +1 @@ +0f1c23a1f4ddec0c2b1ff34de8d1505b0eb9e2868d8edbcc1b6de13d02f32036 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..1468294732b13576161fc3824a479028d5bdb0ba --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_opensubtitles-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_opensubtitles": {"bits_per_byte": 2.1948356082685497e-05, "byte_perplexity": 1.0000152135568616, "word_perplexity": 1.0000856162053249}}, "versions": {"pile_opensubtitles": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..22046e440584d0df85ceeed057ad2c0633273782 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v0-loglikelihood_rolling @@ -0,0 +1 @@ +5d6c19665f429ab1ccbe027da67f42bdaf219f819ab093673976eee55e015ff4 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..ead8d0b0bffe2da65e2602c7f2f352eeb404ef26 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_openwebtext2": {"bits_per_byte": 0.00012809520662477846, "byte_perplexity": 1.000128103411166, "word_perplexity": 1.0007951516532847}}, "versions": {"pile_openwebtext2": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..22046e440584d0df85ceeed057ad2c0633273782 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v1-loglikelihood_rolling @@ -0,0 +1 @@ +5d6c19665f429ab1ccbe027da67f42bdaf219f819ab093673976eee55e015ff4 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..ca433e3c854780d034839c8e4d029cb6b5bfca1a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_openwebtext2-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_openwebtext2": {"bits_per_byte": 0.000184802319359215, "byte_perplexity": 1.000128103411166, "word_perplexity": 1.0007951516532847}}, "versions": {"pile_openwebtext2": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_philpapers-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_philpapers-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..4fbbc241ba9487c2513cdf46dbb76e004e401418 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_philpapers-v0-loglikelihood_rolling @@ -0,0 +1 @@ +339ba5d8c044c4a3ff9b9a8eaa24da1d6c01b72972074eb671a7da049eeb7047 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_philpapers-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_philpapers-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..be561fe2f8a6fe5eba08c4c1efd113075da42e1f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_philpapers-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_philpapers": {"bits_per_byte": 6.241575895982095e-06, "byte_perplexity": 1.0000062415953748, "word_perplexity": 1.0000409888564146}}, "versions": {"pile_philpapers": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_philpapers-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_philpapers-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..4fbbc241ba9487c2513cdf46dbb76e004e401418 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_philpapers-v1-loglikelihood_rolling @@ -0,0 +1 @@ +339ba5d8c044c4a3ff9b9a8eaa24da1d6c01b72972074eb671a7da049eeb7047 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_philpapers-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_philpapers-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..5a2f77678abc264edf433a4eb98da08fc20b1dfc --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_philpapers-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_philpapers": {"bits_per_byte": 9.004690592465457e-06, "byte_perplexity": 1.0000062415953748, "word_perplexity": 1.0000409888564146}}, "versions": {"pile_philpapers": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pile-cc-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_pile-cc-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..d5369ed3c97838d67c2900cfac4aaeb5881ec884 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pile-cc-v0-loglikelihood_rolling @@ -0,0 +1 @@ +731fdef4a43949b179ba0c540148ebc2fa41583dd583ef580dd812076c66a451 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pile-cc-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_pile-cc-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..383233f259507dfdbc6556834185f1eb6161f9cd --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pile-cc-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_pile-cc": {"bits_per_byte": 0.00011234131907228174, "byte_perplexity": 1.0001123476295946, "word_perplexity": 1.0006738958554477}}, "versions": {"pile_pile-cc": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pile-cc-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_pile-cc-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..d5369ed3c97838d67c2900cfac4aaeb5881ec884 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pile-cc-v1-loglikelihood_rolling @@ -0,0 +1 @@ +731fdef4a43949b179ba0c540148ebc2fa41583dd583ef580dd812076c66a451 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pile-cc-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_pile-cc-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..bd2772e32a91a6518ed2eb48ef880827f5246adf --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pile-cc-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_pile-cc": {"bits_per_byte": 0.0001620742639125056, "byte_perplexity": 1.0001123476295946, "word_perplexity": 1.0006738958554477}}, "versions": {"pile_pile-cc": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..de5660d60a8d4f0d5e35d47008992befed318d28 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v0-loglikelihood_rolling @@ -0,0 +1 @@ +66436569a43163afb2caf422d32c5f329899e74c49865d4d13881fd465fd9976 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..333c2970fa21b0bd53b77bdc3880acad0c8d6459 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_pubmed-abstracts": {"bits_per_byte": 0.00037553733051528816, "byte_perplexity": 1.0003756078534862, "word_perplexity": 1.0025884332779}}, "versions": {"pile_pubmed-abstracts": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..de5660d60a8d4f0d5e35d47008992befed318d28 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v1-loglikelihood_rolling @@ -0,0 +1 @@ +66436569a43163afb2caf422d32c5f329899e74c49865d4d13881fd465fd9976 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..21b6bb451fe376e62899f22ea422b3ce9cada469 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pubmed-abstracts-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_pubmed-abstracts": {"bits_per_byte": 0.0005417858444030858, "byte_perplexity": 1.0003756078534862, "word_perplexity": 1.0025884332779}}, "versions": {"pile_pubmed-abstracts": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..283109f32e0aac45adcbc90c7c8fb41114e7771f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v0-loglikelihood_rolling @@ -0,0 +1 @@ +40b39d120d99a145690444e86acc3e3e24d41e6e0538a75e26929ad84926e5e0 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..6e5f1efe495f7030764f96e45460a4d47315b1e3 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_pubmed-central": {"bits_per_byte": 1.5812411832795375e-05, "byte_perplexity": 1.0000158125368497, "word_perplexity": 1.000123107107861}}, "versions": {"pile_pubmed-central": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..283109f32e0aac45adcbc90c7c8fb41114e7771f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v1-loglikelihood_rolling @@ -0,0 +1 @@ +40b39d120d99a145690444e86acc3e3e24d41e6e0538a75e26929ad84926e5e0 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..4d4a241ace01e28f15cd7bd88d3f855b1bf5372d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_pubmed-central-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_pubmed-central": {"bits_per_byte": 2.2812488135667854e-05, "byte_perplexity": 1.0000158125368497, "word_perplexity": 1.000123107107861}}, "versions": {"pile_pubmed-central": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_stackexchange-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_stackexchange-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..dcf0e64cf0d4bf4fe719b8d349c1d36484d2047f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_stackexchange-v0-loglikelihood_rolling @@ -0,0 +1 @@ +e524bfb3e21cbdaddc117403a50df598520c7bf5b2c60ad8f2372cfa564e79be \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_stackexchange-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_stackexchange-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..76fdd0a6dd2f8ca39611601c5cb514664d5dccbc --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_stackexchange-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_stackexchange": {"bits_per_byte": 0.0002288815898835956, "byte_perplexity": 1.0002289077852733, "word_perplexity": 1.0016993562258851}}, "versions": {"pile_stackexchange": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_stackexchange-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_stackexchange-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..dcf0e64cf0d4bf4fe719b8d349c1d36484d2047f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_stackexchange-v1-loglikelihood_rolling @@ -0,0 +1 @@ +e524bfb3e21cbdaddc117403a50df598520c7bf5b2c60ad8f2372cfa564e79be \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_stackexchange-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_stackexchange-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..2773302990f71e46f7f44f5d2e2b624a52ddb54d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_stackexchange-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_stackexchange": {"bits_per_byte": 0.0003302063346758449, "byte_perplexity": 1.0002289077852733, "word_perplexity": 1.0016993562258851}}, "versions": {"pile_stackexchange": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..ce041998635643ee17aace3105b227ef0746917e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v0-loglikelihood_rolling @@ -0,0 +1 @@ +4eb69e314f0864ec8890e2323d7e76f8a8309692c4f090e2b41bf4be681a811d \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..dff51cba766a795077324ffe9bf71d786dbb695a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_ubuntu-irc": {"bits_per_byte": 1.6298315496830533e-06, "byte_perplexity": 1.0000016298328778, "word_perplexity": 1.0000108866656874}}, "versions": {"pile_ubuntu-irc": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..ce041998635643ee17aace3105b227ef0746917e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v1-loglikelihood_rolling @@ -0,0 +1 @@ +4eb69e314f0864ec8890e2323d7e76f8a8309692c4f090e2b41bf4be681a811d \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..0e3b1b25977cc5c7eba81358df76e7ed45d1b04a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_ubuntu-irc-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_ubuntu-irc": {"bits_per_byte": 2.3513498942121155e-06, "byte_perplexity": 1.0000016298328778, "word_perplexity": 1.0000108866656874}}, "versions": {"pile_ubuntu-irc": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_uspto-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_uspto-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..4649d3b9b7f1f17e4731644d470fc0a2651a980d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_uspto-v0-loglikelihood_rolling @@ -0,0 +1 @@ +789b2bdb31564d512b70f801316f49320a26c83ba361226bac0afb255341d477 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_uspto-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_uspto-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..c13dfc73f5927415055cf393fb16bd13ba6b1b56 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_uspto-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_uspto": {"bits_per_byte": 0.00012062434384130924, "byte_perplexity": 1.00012063161925, "word_perplexity": 1.0007716198916954}}, "versions": {"pile_uspto": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_uspto-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_uspto-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..4649d3b9b7f1f17e4731644d470fc0a2651a980d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_uspto-v1-loglikelihood_rolling @@ -0,0 +1 @@ +789b2bdb31564d512b70f801316f49320a26c83ba361226bac0afb255341d477 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_uspto-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_uspto-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..599ae44ef430af958ab53c57d0b7900928ad243a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_uspto-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_uspto": {"bits_per_byte": 0.000174024142670342, "byte_perplexity": 1.00012063161925, "word_perplexity": 1.0007716198916954}}, "versions": {"pile_uspto": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_wikipedia-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_wikipedia-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..e44bd2762803a9b922febf4fe8bfd459e95174b9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_wikipedia-v0-loglikelihood_rolling @@ -0,0 +1 @@ +ef9ec0dd408316ca6537228a6812e839f14b30608973081d41efc47c138338da \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_wikipedia-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_wikipedia-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..bfffde9938833ae29f5665130d844630c7fb9735 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_wikipedia-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_wikipedia": {"bits_per_byte": 0.00016834722287561703, "byte_perplexity": 1.0001683613940646, "word_perplexity": 1.001084677949439}}, "versions": {"pile_wikipedia": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_wikipedia-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_wikipedia-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..e44bd2762803a9b922febf4fe8bfd459e95174b9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_wikipedia-v1-loglikelihood_rolling @@ -0,0 +1 @@ +ef9ec0dd408316ca6537228a6812e839f14b30608973081d41efc47c138338da \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_wikipedia-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_wikipedia-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..4f2314e66b3a5dbd9ed3c25d9e9a97c7d1fbff3d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_wikipedia-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_wikipedia": {"bits_per_byte": 0.00024287370359008176, "byte_perplexity": 1.0001683613940646, "word_perplexity": 1.001084677949439}}, "versions": {"pile_wikipedia": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..81c2e5ed06321b250a08a4232b3720ea5b650156 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v0-loglikelihood_rolling @@ -0,0 +1 @@ +68263c52adc0086011e2220b619983935cabb1cc1f5f9f8ee1a74ab2a7457967 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v0-res.json b/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..b58ce148f0071707d5da39135aaeb92a2a1457a2 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v0-res.json @@ -0,0 +1 @@ +{"results": {"pile_youtubesubtitles": {"bits_per_byte": 2.3447170928931888e-05, "byte_perplexity": 1.000023447445816, "word_perplexity": 1.0001529192262875}}, "versions": {"pile_youtubesubtitles": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..81c2e5ed06321b250a08a4232b3720ea5b650156 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v1-loglikelihood_rolling @@ -0,0 +1 @@ +68263c52adc0086011e2220b619983935cabb1cc1f5f9f8ee1a74ab2a7457967 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v1-res.json b/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..fcf2faa8bc7927212fa7c55940849f64d3c48968 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pile_youtubesubtitles-v1-res.json @@ -0,0 +1 @@ +{"results": {"pile_youtubesubtitles": {"bits_per_byte": 3.3827117222045906e-05, "byte_perplexity": 1.000023447445816, "word_perplexity": 1.0001529192262875}}, "versions": {"pile_youtubesubtitles": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/piqa-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/piqa-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..b01b1fe5d8c699f855bff57061d6d63715c7f058 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/piqa-v0-loglikelihood @@ -0,0 +1 @@ +6048a3a2bb3ad1e6a3d98139618e06b4d7de766edd685bd38837596199c3f69f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/piqa-v0-res.json b/lm-evaluation-harness/tests/testdata/piqa-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..bb6ebfb9a268d8fcfd3dd35ecb26fee05a1b8090 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/piqa-v0-res.json @@ -0,0 +1 @@ +{"results": {"piqa": {"acc": 0.514145810663765, "acc_norm": 0.5114254624591947, "acc_norm_stderr": 0.01166277802645167, "acc_stderr": 0.011661154475524836}}, "versions": {"piqa": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/prost-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/prost-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..a94b8cdec9e45e5b236703414fbcc6a3ed74f7ff --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/prost-v0-loglikelihood @@ -0,0 +1 @@ +7c475f5b36a8b79f94c2be035441e7fd59dac021b0713b1fc72d256424c70b0b \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/prost-v0-res.json b/lm-evaluation-harness/tests/testdata/prost-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..ff99d83f40a966afe7df30661a3fc4d9dd09c4ca --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/prost-v0-res.json @@ -0,0 +1 @@ +{"results": {"prost": {"acc": 0.24631725021349274, "acc_norm": 0.2581127241673783, "acc_norm_stderr": 0.00319703079646546, "acc_stderr": 0.003147855968061357}}, "versions": {"prost": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pubmedqa-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/pubmedqa-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..97db87ce2be9b3d2c08479ee73c7ba3923817795 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pubmedqa-v0-loglikelihood @@ -0,0 +1 @@ +7a04a1fb1d2b19db84fd15c224015d6c0306a41195a4e71fe6abd48fb4d53b9f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/pubmedqa-v0-res.json b/lm-evaluation-harness/tests/testdata/pubmedqa-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..bb39463a4ab7244109901cbbc06ded3192ee0480 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/pubmedqa-v0-res.json @@ -0,0 +1 @@ +{"results": {"pubmedqa": {"acc": 0.324, "acc_stderr": 0.01480686473373886}}, "versions": {"pubmedqa": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qa4mre_2011-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/qa4mre_2011-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..049134c7a1eac7ba79fa86951526a4ca96ddd200 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qa4mre_2011-v0-loglikelihood @@ -0,0 +1 @@ +0d09f17c65768e797633494d2d218e4e46a26f718cab8b0bf3d156b073a8c437 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qa4mre_2011-v0-res.json b/lm-evaluation-harness/tests/testdata/qa4mre_2011-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..601c4eb763d97500cfcd4e24ca6602986c49939c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qa4mre_2011-v0-res.json @@ -0,0 +1 @@ +{"results": {"qa4mre_2011": {"acc": 0.225, "acc_norm": 0.23333333333333334, "acc_norm_stderr": 0.03877199986918664, "acc_stderr": 0.0382797091741014}}, "versions": {"qa4mre_2011": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qa4mre_2012-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/qa4mre_2012-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..0e67fac5f7d54c19e42cae4cfc850089c7c61187 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qa4mre_2012-v0-loglikelihood @@ -0,0 +1 @@ +7e17261820acb365966cb9431d93aec983b14393eaeefbc96e30a11cf58bc6df \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qa4mre_2012-v0-res.json b/lm-evaluation-harness/tests/testdata/qa4mre_2012-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..91d8f3660413469e7ab00c3af1102392c3e26cc7 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qa4mre_2012-v0-res.json @@ -0,0 +1 @@ +{"results": {"qa4mre_2012": {"acc": 0.15625, "acc_norm": 0.16875, "acc_norm_stderr": 0.029702236908328808, "acc_stderr": 0.02879508360159146}}, "versions": {"qa4mre_2012": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qa4mre_2013-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/qa4mre_2013-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..43243706d9b743cec2965545f3f4436a3e5d7551 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qa4mre_2013-v0-loglikelihood @@ -0,0 +1 @@ +52fc431e94c67f983e28ebc70cf45e6c14116b0ae77dc1bf22347c705a65d054 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qa4mre_2013-v0-res.json b/lm-evaluation-harness/tests/testdata/qa4mre_2013-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..c87e487e9ac147c5a9ba8cb3a4b2a39048d1dcaa --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qa4mre_2013-v0-res.json @@ -0,0 +1 @@ +{"results": {"qa4mre_2013": {"acc": 0.18309859154929578, "acc_norm": 0.22183098591549297, "acc_norm_stderr": 0.02469760575535269, "acc_stderr": 0.022989742475464973}}, "versions": {"qa4mre_2013": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qnli-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/qnli-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..883202c385fdfcbdb3e362737691ee0343adc430 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qnli-v0-loglikelihood @@ -0,0 +1 @@ +4281d4ff5cf1244358b0ea0220c67863c69fbade850696b43e8ff05138e01e12 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qnli-v0-res.json b/lm-evaluation-harness/tests/testdata/qnli-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..31c3097605f33c489d4f2552ce3060cd7a9155e3 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qnli-v0-res.json @@ -0,0 +1 @@ +{"results": {"qnli": {"acc": 0.5108914515833791, "acc_stderr": 0.00676380528502966}}, "versions": {"qnli": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qqp-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/qqp-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..ecc86dc396332c1aaa8e638e5413633a504e7206 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qqp-v0-loglikelihood @@ -0,0 +1 @@ +97b551b0fc3d239aad4929a2e8e79c986891aefd9fcd19441fea0382d507889e \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/qqp-v0-res.json b/lm-evaluation-harness/tests/testdata/qqp-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..b7b31355e644bd9d6d57758ee9a454598445f7c9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/qqp-v0-res.json @@ -0,0 +1 @@ +{"results": {"qqp": {"acc": 0.49782339846648527, "acc_stderr": 0.0024866770696239894, "f1": 0.42322661288031593, "f1_stderr": 0.002695903831328166}}, "versions": {"qqp": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/race-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/race-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..5fe1ce356b49f558ce758de50809109acd9c153c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/race-v0-loglikelihood @@ -0,0 +1 @@ +bdfdfab7fa1c7af0c1e161785e347b1b8071a15cbf971f6f2a9ae8c8e845199f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/race-v0-res.json b/lm-evaluation-harness/tests/testdata/race-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..017b00669b8b60dc06947e4e78428fb429734df5 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/race-v0-res.json @@ -0,0 +1 @@ +{"results": {"race": {"acc": 0.23253588516746412, "acc_stderr": 0.013074460615265295}}, "versions": {"race": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/random_insertion-v0-greedy_until b/lm-evaluation-harness/tests/testdata/random_insertion-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..4844e5393b8358d225f516f1a948f1deccab7840 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/random_insertion-v0-greedy_until @@ -0,0 +1 @@ +6c48baa6924f3635120f33062251c4b571b3d4e9fe46b14d91f54ddd1c857997 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/random_insertion-v0-res.json b/lm-evaluation-harness/tests/testdata/random_insertion-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..9b5f507f6745120414ba5cfd39fc92eac4e48424 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/random_insertion-v0-res.json @@ -0,0 +1 @@ +{"results": {"random_insertion": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"random_insertion": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/record-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/record-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..a54fa05cd1ac551a973ff8155ddca6d868a49b42 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/record-v0-loglikelihood @@ -0,0 +1 @@ +a3e378fbde4e28f375cac1561bbfc7d7673c2af193628a774ad012d5192393aa \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/record-v0-res.json b/lm-evaluation-harness/tests/testdata/record-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..006c381372178097b36bfac48795e6fbdc242b1a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/record-v0-res.json @@ -0,0 +1 @@ +{"results": {"record": {"em": 0.1521, "em_stderr": 0.0035913575128186616, "f1": 0.1581870634920636, "f1_stderr": 0.0036146895141474576}}, "versions": {"record": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/reversed_words-v0-greedy_until b/lm-evaluation-harness/tests/testdata/reversed_words-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..3f28488a9028fed32a088de9a2e8c0fac4fd12de --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/reversed_words-v0-greedy_until @@ -0,0 +1 @@ +1d79fc4f0177f9624a487b9973f4e0e1d3f8404993b419a7b807a690ebbbb290 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/reversed_words-v0-res.json b/lm-evaluation-harness/tests/testdata/reversed_words-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..9285ff2694c140b120aca438098daa39fc282a87 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/reversed_words-v0-res.json @@ -0,0 +1 @@ +{"results": {"reversed_words": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"reversed_words": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/rte-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/rte-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..c239923e4f3ec676961da50b3823c09872edd36d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/rte-v0-loglikelihood @@ -0,0 +1 @@ +c80ce13c8c736087f1557f8736d5d318b540ff01e4bb7f55e568890dc8b0393e \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/rte-v0-res.json b/lm-evaluation-harness/tests/testdata/rte-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..10314dd047e4d7202c755fe8cfc55bc9b1edd5f8 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/rte-v0-res.json @@ -0,0 +1 @@ +{"results": {"rte": {"acc": 0.5379061371841155, "acc_stderr": 0.030009848912529117}}, "versions": {"rte": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/sciq-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/sciq-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..25ce988773df6dd27009a4ac47357dfb7d70748e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/sciq-v0-loglikelihood @@ -0,0 +1 @@ +71cbb6e2a7ac4512c3761ea801d420eb3fac49d158c7e4deaa3ab8727bea923c \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/sciq-v0-res.json b/lm-evaluation-harness/tests/testdata/sciq-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..7071515827af18b10a7b3607e6249ed3e7c1929e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/sciq-v0-res.json @@ -0,0 +1 @@ +{"results": {"sciq": {"acc": 0.234, "acc_norm": 0.239, "acc_norm_stderr": 0.01349300044693758, "acc_stderr": 0.01339490288966001}}, "versions": {"sciq": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/squad2-v0-greedy_until b/lm-evaluation-harness/tests/testdata/squad2-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..024652e0a39ed0298f8f6f67453f644a68f3a367 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/squad2-v0-greedy_until @@ -0,0 +1 @@ +b261e8885c11750ce6911bb11e8693de03d53758297c26fb14cfc1ef508862cb \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/squad2-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/squad2-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..41300bc19fd3142bfd547bf21f2b28b3ce5b21c9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/squad2-v0-loglikelihood @@ -0,0 +1 @@ +287e87cc6878debcc80d9b6df4e2d0a74ed29068e0e0a80906c8441843a17cee \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/squad2-v0-res.json b/lm-evaluation-harness/tests/testdata/squad2-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..2b370553acca14706a39428146194fa9449e09f2 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/squad2-v0-res.json @@ -0,0 +1 @@ +{"results": {"squad2": {"HasAns_exact": 0.0, "HasAns_f1": 0.0, "NoAns_exact": 0.0, "NoAns_f1": 0.0, "best_exact": 50.07159100480081, "best_f1": 50.07159100480081, "exact": 0.0, "f1": 0.0}}, "versions": {"squad2": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/squad2-v1-greedy_until b/lm-evaluation-harness/tests/testdata/squad2-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..70df2fd6ae1f59de5b6f3f6712bc2331197400c8 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/squad2-v1-greedy_until @@ -0,0 +1 @@ +e17e3d85c1d5adaf2d6b4b752c4babc2e0b3a6e144e6de70cb3b2287e85109b8 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/squad2-v1-loglikelihood b/lm-evaluation-harness/tests/testdata/squad2-v1-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..2c970f7583b3d8236d9ca2e802ce6e0403b36074 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/squad2-v1-loglikelihood @@ -0,0 +1 @@ +f5da6173402b274dc89130755c222c6ca6b2a3bacaaa4e4ab07be9322b7bad65 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/squad2-v1-res.json b/lm-evaluation-harness/tests/testdata/squad2-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..dd69f00abb989ba3d254b9a6925087e10737b8d6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/squad2-v1-res.json @@ -0,0 +1 @@ +{"results": {"squad2": {"HasAns_exact": 0.0, "HasAns_f1": 0.0, "NoAns_exact": 0.0, "NoAns_f1": 0.0, "best_exact": 50.07159100480081, "best_f1": 50.07159100480081, "exact": 0.0, "f1": 0.0}}, "versions": {"squad2": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/sst-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/sst-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..52050de16b54b432bdd68fae780660a035b10c0a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/sst-v0-loglikelihood @@ -0,0 +1 @@ +d2ebe3a63517d1d481aa1513bebe124c57a0904554a1e95f566979cfe67b1a7f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/sst-v0-res.json b/lm-evaluation-harness/tests/testdata/sst-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..5fe3c62a205cdd7a57acaf082f671e9ba864e5f7 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/sst-v0-res.json @@ -0,0 +1 @@ +{"results": {"sst": {"acc": 0.5172018348623854, "acc_stderr": 0.016931824425903734}}, "versions": {"sst": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/swag-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/swag-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..c8152027dc2f15319676bc32d55f32ca0bec00b5 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/swag-v0-loglikelihood @@ -0,0 +1 @@ +be4fcbad876124c4ba3c71970538a97fec0e36a9cc677c70b6c9243a7bcee0ec \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/swag-v0-res.json b/lm-evaluation-harness/tests/testdata/swag-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..a1aeee972e83a41dbb7301f5a98ad5c97486402f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/swag-v0-res.json @@ -0,0 +1 @@ +{"results": {"swag": {"acc": 0.2482255323402979, "acc_norm": 0.24882535239428172, "acc_norm_stderr": 0.00305666959496067, "acc_stderr": 0.003054201832644171}}, "versions": {"swag": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/toxigen-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/toxigen-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..3074e09e14cf0763aa58e8fe2801337da805b734 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/toxigen-v0-loglikelihood @@ -0,0 +1 @@ +7fedd930bafa92b9cca615a93ba92a4413244d2b77cf3f421a186815d721e0fa \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/toxigen-v0-res.json b/lm-evaluation-harness/tests/testdata/toxigen-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..65bb7cf4596c8973ae7dd2efc60e366c65bc4800 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/toxigen-v0-res.json @@ -0,0 +1 @@ +{"results": {"toxigen": {"acc": 0.5053191489361702, "acc_norm": 0.46808510638297873, "acc_norm_stderr": 0.016283609940023203, "acc_stderr": 0.016315959984563776}}, "versions": {"toxigen": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/triviaqa-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/triviaqa-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..d576c4977fc769dc56c31340f07558fefc1f1459 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/triviaqa-v0-loglikelihood @@ -0,0 +1 @@ +f8ec05b306b9f6187c0f8117cae441fb85a7a2e4670f4f9a1a3b632b1978421a \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/triviaqa-v0-res.json b/lm-evaluation-harness/tests/testdata/triviaqa-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..ab98847da6985f5c9d1e650008367ba739a1147f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/triviaqa-v0-res.json @@ -0,0 +1 @@ +{"results": {"triviaqa": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"triviaqa": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/triviaqa-v1-loglikelihood b/lm-evaluation-harness/tests/testdata/triviaqa-v1-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..d576c4977fc769dc56c31340f07558fefc1f1459 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/triviaqa-v1-loglikelihood @@ -0,0 +1 @@ +f8ec05b306b9f6187c0f8117cae441fb85a7a2e4670f4f9a1a3b632b1978421a \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/triviaqa-v1-res.json b/lm-evaluation-harness/tests/testdata/triviaqa-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..985f64c8e0eb3bc1dd563becf0cdf186baa172cd --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/triviaqa-v1-res.json @@ -0,0 +1 @@ +{"results": {"triviaqa": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"triviaqa": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v0-greedy_until b/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..52156c85072e4f1a829345a4b9eef7af2c2ca059 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v0-greedy_until @@ -0,0 +1 @@ +0d7c56e1aa71ffd8f94bde28f6e8dfdd35f7aaadffa0620bd2a27704253d6c14 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v0-res.json b/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..5e68fa8dc6ace5fd91322aacdc74de3814832d9a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v0-res.json @@ -0,0 +1 @@ +{"results": {"truthfulqa_gen": {"bleu_acc": 0.0, "bleu_acc_stderr": 0.0, "bleu_diff": 0.0, "bleu_diff_stderr": 0.0, "bleu_max": 0.0, "bleu_max_stderr": 0.0, "bleurt_acc": 0.8372093023255814, "bleurt_acc_stderr": 0.012923696051772253, "bleurt_diff": 0.13967358205134603, "bleurt_diff_stderr": 0.00532907098769571, "bleurt_max": -1.4402793981454072, "bleurt_max_stderr": 0.0021884846359458963, "rouge1_acc": 0.0, "rouge1_acc_stderr": 0.0, "rouge1_diff": 0.0, "rouge1_diff_stderr": 0.0, "rouge1_max": 0.0, "rouge1_max_stderr": 0.0, "rouge2_acc": 0.0, "rouge2_acc_stderr": 0.0, "rouge2_diff": 0.0, "rouge2_diff_stderr": 0.0, "rouge2_max": 0.0, "rouge2_max_stderr": 0.0, "rougeL_acc": 0.0, "rougeL_acc_stderr": 0.0, "rougeL_diff": 0.0, "rougeL_diff_stderr": 0.0, "rougeL_max": 0.0, "rougeL_max_stderr": 0.0}}, "versions": {"truthfulqa_gen": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v1-greedy_until b/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..d5261f22133a65b6968881eeb87260c5a1fca3af --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v1-greedy_until @@ -0,0 +1 @@ +1a280973bbac2b7ac29dd64dddac474fb4749585f7de893483b4034814466c67 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v1-res.json b/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..30aa72f2bafd0788837ca50fa9d5c75f954daef0 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/truthfulqa_gen-v1-res.json @@ -0,0 +1 @@ +{"results": {"truthfulqa_gen": {"bleu_acc": 0.0, "bleu_acc_stderr": 0.0, "bleu_diff": 0.0, "bleu_diff_stderr": 0.0, "bleu_max": 0.0, "bleu_max_stderr": 0.0, "bleurt_acc": 0.835985312117503, "bleurt_acc_stderr": 0.012962704327492454, "bleurt_diff": 0.14077322143090107, "bleurt_diff_stderr": 0.005459888909582694, "bleurt_max": -1.4399358725752065, "bleurt_max_stderr": 0.0022126992369197133, "rouge1_acc": 0.0, "rouge1_acc_stderr": 0.0, "rouge1_diff": 0.0, "rouge1_diff_stderr": 0.0, "rouge1_max": 0.0, "rouge1_max_stderr": 0.0, "rouge2_acc": 0.0, "rouge2_acc_stderr": 0.0, "rouge2_diff": 0.0, "rouge2_diff_stderr": 0.0, "rouge2_max": 0.0, "rouge2_max_stderr": 0.0, "rougeL_acc": 0.0, "rougeL_acc_stderr": 0.0, "rougeL_diff": 0.0, "rougeL_diff_stderr": 0.0, "rougeL_max": 0.0, "rougeL_max_stderr": 0.0}}, "versions": {"truthfulqa_gen": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..51303977a9cbb311433a840af6ce636728bdb118 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v0-loglikelihood @@ -0,0 +1 @@ +226a6783976177dc9ceda5688623ff37023242eff30ddf270b886bf7b9b32228 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v0-res.json b/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..b12b4765cce2e95398697685a9ebb0cdada833bf --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v0-res.json @@ -0,0 +1 @@ +{"results": {"truthfulqa_mc": {"mc1": 0.2141982864137087, "mc1_stderr": 0.01436214815569045, "mc2": 0.465436996173817, "mc2_stderr": 0.0048422530880316405}}, "versions": {"truthfulqa_mc": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v1-loglikelihood b/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v1-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..4bab2d1f4df241fe0cf47f22bf185d52f9b783ef --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v1-loglikelihood @@ -0,0 +1 @@ +1e07020e9cf41d46ed65312eb39d2b8e6599673d4f0d6b67c0d0eba0efb493bb \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v1-res.json b/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..c1b1854c2e0abc9c4fe8096b4d45004bcc1a381b --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/truthfulqa_mc-v1-res.json @@ -0,0 +1 @@ +{"results": {"truthfulqa_mc": {"mc1": 0.23255813953488372, "mc1_stderr": 0.01478915753108052, "mc2": 0.4462325560722362, "mc2_stderr": 0.004986523944692003}}, "versions": {"truthfulqa_mc": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/webqs-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/webqs-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..4d604d438db6c4cc77a43aca8d2a7f605aef6b1c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/webqs-v0-loglikelihood @@ -0,0 +1 @@ +96b218173468cc94552a0b946193bda89faba51f1bfc3e7945531f9dff8d6fe9 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/webqs-v0-res.json b/lm-evaluation-harness/tests/testdata/webqs-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..9f0fdc76cab096c80a87295773054510803ba218 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/webqs-v0-res.json @@ -0,0 +1 @@ +{"results": {"webqs": {"acc": 0.0, "acc_stderr": 0.0}}, "versions": {"webqs": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wic-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/wic-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..d27430a9a2eab0a6a5e265e249237201a4a56061 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wic-v0-loglikelihood @@ -0,0 +1 @@ +403a08da05e4c44d7e3dd3358382a7ba489c41d223e24cd1a9ed82ef1a2d004b \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wic-v0-res.json b/lm-evaluation-harness/tests/testdata/wic-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..eadc573ed3d6a9b8b9bd924896ef5d719a53d5d1 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wic-v0-res.json @@ -0,0 +1 @@ +{"results": {"wic": {"acc": 0.49216300940438873, "acc_stderr": 0.01980828765781383}}, "versions": {"wic": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wikitext-v0-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/wikitext-v0-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..f09af45a38c0de097358c587420858c7a53a10aa --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wikitext-v0-loglikelihood_rolling @@ -0,0 +1 @@ +b6f83e6cf7535ee41b0057c3e2ec2cf7f2fa5a9119b305c479a83091d1142b2c \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wikitext-v0-res.json b/lm-evaluation-harness/tests/testdata/wikitext-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..9ac0c37bb5aa8cdde37bf84c61a0d020c8a03900 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wikitext-v0-res.json @@ -0,0 +1 @@ +{"results": {"wikitext": {"bits_per_byte": 2.219817611605802e-05, "byte_perplexity": 1.0000221984224973, "word_perplexity": 1.000118710696617}}, "versions": {"wikitext": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wikitext-v1-loglikelihood_rolling b/lm-evaluation-harness/tests/testdata/wikitext-v1-loglikelihood_rolling new file mode 100644 index 0000000000000000000000000000000000000000..f09af45a38c0de097358c587420858c7a53a10aa --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wikitext-v1-loglikelihood_rolling @@ -0,0 +1 @@ +b6f83e6cf7535ee41b0057c3e2ec2cf7f2fa5a9119b305c479a83091d1142b2c \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wikitext-v1-res.json b/lm-evaluation-harness/tests/testdata/wikitext-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..122098aec22e39599f1d3bffbb4bf619131d2335 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wikitext-v1-res.json @@ -0,0 +1 @@ +{"results": {"wikitext": {"bits_per_byte": 3.202519859941674e-05, "byte_perplexity": 1.0000221984224973, "word_perplexity": 1.000118710696617}}, "versions": {"wikitext": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wikitext_10_hf_pretrained-EleutherAI-pythia-14m-dtype-float32-device-cpu.txt b/lm-evaluation-harness/tests/testdata/wikitext_10_hf_pretrained-EleutherAI-pythia-14m-dtype-float32-device-cpu.txt new file mode 100644 index 0000000000000000000000000000000000000000..654e63ee7cb083d729d9be56e0d9d71ef1805928 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wikitext_10_hf_pretrained-EleutherAI-pythia-14m-dtype-float32-device-cpu.txt @@ -0,0 +1,5 @@ +| Tasks |Version|Filter|n-shot| Metric | | Value | |Stderr| +|--------|------:|------|-----:|---------------|---|-------:|---|------| +|wikitext| 2|none | 0|bits_per_byte |↓ | 1.3394|± | N/A| +| | |none | 0|byte_perplexity|↓ | 2.5304|± | N/A| +| | |none | 0|word_perplexity|↓ |130.4801|± | N/A| \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/winogrande-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/winogrande-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..97866f6ce45cb9a213d27310a78b7cdeab23bc9a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/winogrande-v0-loglikelihood @@ -0,0 +1 @@ +90a3eff49de9173964d46f5ed57bcf9a78a72dd1bfe0e5323b25cebb40b49ea9 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/winogrande-v0-res.json b/lm-evaluation-harness/tests/testdata/winogrande-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..9fa7903a56d2fb48abcd215bb587bc69c00f4aa6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/winogrande-v0-res.json @@ -0,0 +1 @@ +{"results": {"winogrande": {"acc": 0.516179952644041, "acc_stderr": 0.014045126130978606}}, "versions": {"winogrande": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt14-en-fr-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt14-en-fr-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..6d48d5579e95eb72bdc6c4dc8b4149e5f495b55e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt14-en-fr-v0-greedy_until @@ -0,0 +1 @@ +368ae7eec0f902b5123f2d5197caa5109a23942011c53fe68d9eaeee20180e46 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt14-en-fr-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt14-en-fr-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..1aa13f02854c8eec0591be980486afe48d7f97a9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt14-en-fr-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt14-en-fr": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.011284118461117099, "chrf_stderr": 7.340651275964445e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt14-en-fr": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt14-fr-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt14-fr-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..7249d39990f9aea60634b07c975f735983bade89 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt14-fr-en-v0-greedy_until @@ -0,0 +1 @@ +c1d9f7283755fbdd7ecd6cc4278b0ac25a80ac256b7071ea5f839ccd038e5974 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt14-fr-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt14-fr-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..5261876f55a69dcaf33b3842690f81c12eb42f3a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt14-fr-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt14-fr-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.01275083169440515, "chrf_stderr": 8.45474998563806e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt14-fr-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt16-de-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt16-de-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..75f1072b6e7f2bdd9ecd98987c86fefd3375fb6d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt16-de-en-v0-greedy_until @@ -0,0 +1 @@ +d30e23e38d9a45b9c31e1dfd14b58d0b7020df4b9c8a1c697aa6bc5fba8ce08a \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt16-de-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt16-de-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..826e0382abb32da67ac0dd0b271527b40fd3b6ae --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt16-de-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt16-de-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.013700416764482968, "chrf_stderr": 0.00016071651360909355, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt16-de-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt16-en-de-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt16-en-de-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..45eaaaca8c5892944b1b9c9af0c469e3c63e4881 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt16-en-de-v0-greedy_until @@ -0,0 +1 @@ +d71e2074af3770e9b29ac561caf2e1c29ad6b0dc50ec2e7bcc5501747b11f0da \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt16-en-de-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt16-en-de-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..88bee7ffa69b1bf7accdd56a3870f61d4c0453da --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt16-en-de-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt16-en-de": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.010909486120840577, "chrf_stderr": 0.000122611124711072, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt16-en-de": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt16-en-ro-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt16-en-ro-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..291492556e5182600291565c640a463da7f00616 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt16-en-ro-v0-greedy_until @@ -0,0 +1 @@ +4be7fdda313394f19b5995b00ada1dfa3bb158ee1f020ef8d07ecea260fa60b2 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt16-en-ro-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt16-en-ro-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..babb8d2d74fb5585cf9578f8b1dc8be3dde43f63 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt16-en-ro-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt16-en-ro": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.012004814364156886, "chrf_stderr": 6.424423961332661e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt16-en-ro": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt16-ro-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt16-ro-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..fbcac1b7e3887c6ffa8fd6da6e21595fb0c49a4f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt16-ro-en-v0-greedy_until @@ -0,0 +1 @@ +d1b7c50751b0d5d7470b7f49f2bab9d09792c91460fc92cc34f06617013d7c65 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt16-ro-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt16-ro-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..267763793d5fa5a16c41cbcdd9eb7b134cd34cea --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt16-ro-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt16-ro-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.01262029828861831, "chrf_stderr": 0.00014507496111350828, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt16-ro-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-cs-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-cs-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..7bcf240b7090e406259d4bfc090d1eb22ec6e291 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-cs-en-v0-greedy_until @@ -0,0 +1 @@ +bfead9efdb1b2402a414c55929c8d8f956585f938a35466931d44e81d89cfe00 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-cs-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-cs-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..70c80afe5bd10baabdcb507faa385db124c1f42e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-cs-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-cs-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.006212086270964023, "chrf_stderr": 0.0001119165191795531, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-cs-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-de-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-de-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..c02fb9875d5354fdb0892b7493a822ee4af9d6c2 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-de-en-v0-greedy_until @@ -0,0 +1 @@ +d13b5a6915ca86ac6c6ebc50d9be0d0be3dfca600c12e896df53190d875de74d \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-de-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-de-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..790424fe4f226224642530ba7fd53a59eec4caa0 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-de-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-de-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.006703243310670055, "chrf_stderr": 0.0001292711927988445, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-de-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-de-fr-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-de-fr-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..7cb9424082836f0d56afe809cf44c78fc844d993 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-de-fr-v0-greedy_until @@ -0,0 +1 @@ +7f197bc281d6dbf9425900ef0dee7175021c43e355050f149f43b161c52bf0b0 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-de-fr-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-de-fr-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..79a0d12fe6f5750749e56dc3919283f71d021fa0 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-de-fr-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-de-fr": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.011897164096796364, "chrf_stderr": 0.00010158164726118333, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-de-fr": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-cs-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-cs-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..d14fc4939aecb7bb40458c34954c1242d9f20501 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-cs-v0-greedy_until @@ -0,0 +1 @@ +5a34e6863bf6965afd31653de50bac5fecf58db65dbaba46921504a2b7463786 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-cs-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-cs-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..2ba9db70d3579ff23ee70c3b16eb92d7d87144e6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-cs-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-cs": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.009879653442394573, "chrf_stderr": 8.210293331159994e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-cs": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-de-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-de-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..c4078efd996d010eac102fe23de50fdbbe0310d9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-de-v0-greedy_until @@ -0,0 +1 @@ +b6e9c305766ea23ce1027309f83c6d4c2ce8948d70b63a7858586ca34050d7fb \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-de-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-de-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..183e66270a61dcb463076306b2768dde7995162f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-de-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-de": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.007148103038872972, "chrf_stderr": 9.594096858911254e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-de": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-iu-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-iu-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..d26bb4f92a03612cf3a4170733973e39870164b7 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-iu-v0-greedy_until @@ -0,0 +1 @@ +f5688199890a48f73f2cc04a2152e35190f0e0ddd40e629fa24ee39d423ea389 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-iu-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-iu-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..22f042eb4eba6e6e662e46807232679782f7b6b9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-iu-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-iu": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.00011803644548940443, "chrf_stderr": 2.175287038623409e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-iu": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..9777002c79830918a3939ec6978d606ae967ffe6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v0-greedy_until @@ -0,0 +1 @@ +7fe61f5847a51e93e97c84b39f4420978727754e4b6cf636a27851c615857530 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..57bad300d7f05b7eb0908ad655b0fc90a2bb9c26 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-ja": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 4.1308658294778584e-05, "chrf_stderr": 2.0456539027807417e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-ja": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v1-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..9777002c79830918a3939ec6978d606ae967ffe6 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v1-greedy_until @@ -0,0 +1 @@ +7fe61f5847a51e93e97c84b39f4420978727754e4b6cf636a27851c615857530 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v1-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..be5e56abcf2253276d405dae64758b9cab09f3e4 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ja-v1-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-ja": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 4.1305928226819116e-05, "chrf_stderr": 2.0455354158878388e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-ja": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-km-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-km-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..ddce46a79fdcb08c3eee1a534c11fc4dd796be53 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-km-v0-greedy_until @@ -0,0 +1 @@ +eb5365c46f22ffec9a157991627d6e1fd1117fccffaedfc73619e93bafb5a408 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-km-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-km-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..e5ee2e9be911cda88b6445715b833e1a0dbf92dd --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-km-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-km": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 1.9008351315007364e-05, "chrf_stderr": 7.136657625458525e-06, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-km": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-pl-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-pl-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..bd431d61c479beb686d39be21905fdb0beb7781e --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-pl-v0-greedy_until @@ -0,0 +1 @@ +952f02575d4936d93c4d2808d86c4bf5f1f3a0901212acee6cbc1f9cbd30d39e \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-pl-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-pl-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..13bfd5b552b92b771266666dd5fe5b9496064051 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-pl-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-pl": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.009006977773147825, "chrf_stderr": 0.00023387733367766675, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-pl": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ps-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-ps-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..77b600c49afa12cf988280e337a9d4747195f95f --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ps-v0-greedy_until @@ -0,0 +1 @@ +8411c2cb73114cbd0c6e0f17eab2625d486cc3a601105deb0ea1338a401df689 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ps-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-ps-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..fcfb51f05320490d089cc8fbd4127a987bc868c0 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ps-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-ps": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 2.1193813610582323e-06, "chrf_stderr": 2.113911466119111e-06, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-ps": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ru-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-ru-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..d21d39ac9f9616bda1e21d1ba5bd63fdb542a7aa --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ru-v0-greedy_until @@ -0,0 +1 @@ +a1613831f69c1679a54670092af40ce76617b79d7cc837984803b0fc52bb8bde \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ru-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-ru-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..af339eda5d3d76e00e3e0f3c800353bb2b7fb696 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ru-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-ru": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.0007327811114614671, "chrf_stderr": 4.43155903515048e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-ru": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ta-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-ta-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..1b40263f154461098d6ee820bc0d003c03a6962c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ta-v0-greedy_until @@ -0,0 +1 @@ +5fc556fa90bca7f1b1396e97e392eac8080b0ad53488358799b8fc0b21a94cb1 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-ta-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-ta-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..b04f968d76055c494762ec6cd2a84327c8351742 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-ta-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-ta": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.0, "chrf_stderr": 0.0, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-ta": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..db79b7f03fcfc8f7720f1344339e7d94d8a01ebf --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v0-greedy_until @@ -0,0 +1 @@ +67f0333ddbcb07d7a9ac12919129a18fe4fea24e4826a11bbdde4fd5ed5ed83f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..24db35e62fd176b0454ff426ab749787da805897 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-zh": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.00014170297316825535, "chrf_stderr": 6.590669847391838e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-zh": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v1-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v1-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..db79b7f03fcfc8f7720f1344339e7d94d8a01ebf --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v1-greedy_until @@ -0,0 +1 @@ +67f0333ddbcb07d7a9ac12919129a18fe4fea24e4826a11bbdde4fd5ed5ed83f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v1-res.json b/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..a7a56daf0e793acf229c9b16a751383473bd5e26 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-en-zh-v1-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-en-zh": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.00014170297316825535, "chrf_stderr": 6.590669847391838e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-en-zh": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-fr-de-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-fr-de-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..7353ad4475b3d292bfd64e6dcb41972d697c34da --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-fr-de-v0-greedy_until @@ -0,0 +1 @@ +8a4b65c59dcac6591d46261909ee92ebcf41c19ee7442b12842302b2d8aeb36f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-fr-de-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-fr-de-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..d5d06a02a30635ad57907b32ae66ccb9ba5a7e23 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-fr-de-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-fr-de": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.01143193767396364, "chrf_stderr": 0.00012555271954563658, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-fr-de": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-iu-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-iu-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..87a1981e79e0558366487aa2476cc751ad3857dc --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-iu-en-v0-greedy_until @@ -0,0 +1 @@ +97bf664a8efa54b5366b8341f77b418106dd0cb26169d5b2d0144e4d3d2bc5c9 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-iu-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-iu-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..e94cac8876d9d04c883b5ad5810884af7faa436c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-iu-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-iu-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.012204628007572778, "chrf_stderr": 8.944407532175802e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-iu-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-ja-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-ja-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..3a89d7fcdfb76bc3912a930cf592da0270ba440c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-ja-en-v0-greedy_until @@ -0,0 +1 @@ +1fd846f3c0104e794eb380dae7f648592092ab8bf59234c26d0a671bbbc28df1 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-ja-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-ja-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..4344b7cd8a1a9bfb8cd60e2aa0ece17f530f7d3d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-ja-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-ja-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.010703148854351403, "chrf_stderr": 0.00022242113108130186, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-ja-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-km-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-km-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..a6f148661093f5f97c85e96ab2c01da6e40c1547 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-km-en-v0-greedy_until @@ -0,0 +1 @@ +fb4ec81bb89c70df7e21b43e0e882915b7b71a2a85bb8d4b59e0c7938baaa4c2 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-km-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-km-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..4f6dc98604bdeed7b87806094a6ffc3b0cbbfec4 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-km-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-km-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.015142474534585969, "chrf_stderr": 0.0001518735048829897, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-km-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-pl-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-pl-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..899ce01919910ab80fc95b99371bf334a7c7c37a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-pl-en-v0-greedy_until @@ -0,0 +1 @@ +89274499d84176b1ffe4eaec06f2c89ca807342384dc946c2e348d00116aaade \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-pl-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-pl-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..a2f5cb31be388a5ca081567e72d16e42774aa008 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-pl-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-pl-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.01353367757716276, "chrf_stderr": 0.00018386199249976465, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-pl-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-ps-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-ps-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..7776c5952383a6254943869dad8fddb50e50e987 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-ps-en-v0-greedy_until @@ -0,0 +1 @@ +c3976465e3709b4bc371175cc1494c69fe096ea4ba7d114da779d2baa0a47466 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-ps-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-ps-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..00c9c742e4d34830628a52aa34cfd7faaa86516c --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-ps-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-ps-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.015192865365105723, "chrf_stderr": 0.00011334541381539086, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-ps-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-ru-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-ru-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..27c60fb72194325e51647ce0fe137710df6dff86 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-ru-en-v0-greedy_until @@ -0,0 +1 @@ +1477ab6542c26bd0222cc1aded174f33bf8d04d1cf6a1c0959aeca4ff3779adc \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-ru-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-ru-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..b6d0c71ad7c140790040022c51970dea075ab0b1 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-ru-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-ru-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.013344639906399232, "chrf_stderr": 7.583552652374546e-05, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-ru-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-ta-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-ta-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..f0f65972451ff666399f7b2c81194c4b892ac783 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-ta-en-v0-greedy_until @@ -0,0 +1 @@ +111ea3efdc08f1cf536631b9426c3a20e482c575d009d2a8c71f59c027578eec \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-ta-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-ta-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..a2ad506bf94188b54a0f3b7ee6f5d787d34e68ff --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-ta-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-ta-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.013841110664859798, "chrf_stderr": 0.00018476696850880766, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-ta-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-zh-en-v0-greedy_until b/lm-evaluation-harness/tests/testdata/wmt20-zh-en-v0-greedy_until new file mode 100644 index 0000000000000000000000000000000000000000..41a1e91515b30a2acdc6363c36af1cdf43f477a9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-zh-en-v0-greedy_until @@ -0,0 +1 @@ +07dbadfd6f2b2b9462ab6187dbfaabae6e5192ab89a8e4ede9237834b9364dd1 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wmt20-zh-en-v0-res.json b/lm-evaluation-harness/tests/testdata/wmt20-zh-en-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..11b8df7f8739d9e4a459636640af6ebb2b7b868a --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wmt20-zh-en-v0-res.json @@ -0,0 +1 @@ +{"results": {"wmt20-zh-en": {"bleu": 0.0, "bleu_stderr": 0.0, "chrf": 0.008438201290981157, "chrf_stderr": 0.0001109053964076822, "ter": 1.0, "ter_stderr": 0.0}}, "versions": {"wmt20-zh-en": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wnli-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/wnli-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..0c5c0b8ceb64a158bd57294d432b2186f3a0fdf9 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wnli-v0-loglikelihood @@ -0,0 +1 @@ +2ffd304d6096416eb29607e2e7642b1d6043163624967bcf4c4fc00fddc6c721 \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wnli-v0-res.json b/lm-evaluation-harness/tests/testdata/wnli-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..8841cb74d16977645c1c7399d8b58de094bafef1 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wnli-v0-res.json @@ -0,0 +1 @@ +{"results": {"wnli": {"acc": 0.3380281690140845, "acc_stderr": 0.05653887739133514}}, "versions": {"wnli": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wnli-v1-loglikelihood b/lm-evaluation-harness/tests/testdata/wnli-v1-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..cbf4ad3777eebbcee7c1ccf1c4a4cac64829ad2b --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wnli-v1-loglikelihood @@ -0,0 +1 @@ +8a0f81661d2ab2334bbc8031fac31c0c8882f1d9271dd51599d21dfdbb726dea \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wnli-v1-res.json b/lm-evaluation-harness/tests/testdata/wnli-v1-res.json new file mode 100644 index 0000000000000000000000000000000000000000..d12348e0aeb8d7feec272059e08eb30cbb1d918d --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wnli-v1-res.json @@ -0,0 +1 @@ +{"results": {"wnli": {"acc": 0.5633802816901409, "acc_stderr": 0.0592793555841297}}, "versions": {"wnli": 1}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wsc-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/wsc-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..d0d2963fe90b29dbbf2527e9a3b559cf9b9c23c7 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wsc-v0-loglikelihood @@ -0,0 +1 @@ +45865468eff5ca31e6a050947a6b3310d9d5ed19d0f2e578a32ecaf1c768600f \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wsc-v0-res.json b/lm-evaluation-harness/tests/testdata/wsc-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..84be59624161779e494896d2618dbcf0f1f4b4b0 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wsc-v0-res.json @@ -0,0 +1 @@ +{"results": {"wsc": {"acc": 0.5480769230769231, "acc_stderr": 0.049038186969314335}}, "versions": {"wsc": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wsc273-v0-loglikelihood b/lm-evaluation-harness/tests/testdata/wsc273-v0-loglikelihood new file mode 100644 index 0000000000000000000000000000000000000000..9d592917bd96783c290237446891eef56083a693 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wsc273-v0-loglikelihood @@ -0,0 +1 @@ +26450d414c4581feb51a09882080e7a9b95882e7eab47b1751a4a6024b5a60ee \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testdata/wsc273-v0-res.json b/lm-evaluation-harness/tests/testdata/wsc273-v0-res.json new file mode 100644 index 0000000000000000000000000000000000000000..8f023b422a7003d2984e35e58045d8866954a4c4 --- /dev/null +++ b/lm-evaluation-harness/tests/testdata/wsc273-v0-res.json @@ -0,0 +1 @@ +{"results": {"wsc273": {"acc": 0.5164835164835165, "acc_stderr": 0.0303004740355766}}, "versions": {"wsc273": 0}} \ No newline at end of file diff --git a/lm-evaluation-harness/tests/testyamls/test-01.yaml b/lm-evaluation-harness/tests/testyamls/test-01.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4e4367eeb3651bd49540009949fc080b9dba0a59 --- /dev/null +++ b/lm-evaluation-harness/tests/testyamls/test-01.yaml @@ -0,0 +1,45 @@ +group: test-1 +group_alias: test 1 +task: + - piqa # string task + - ai2_arc # string tag + - task: super-glue-lm-eval-v1 # Should this be spread out? + num_fewshot: 3 + - task: swag # dict registered task + num_fewshot: 2 + - task: mmlu + num_fewshot: 5 + - group: nli-tasks # dict group + task: + - anli + - boolq + - sglue_rte + num_fewshot: 4 + metric_list: + - metric: brier_score + - task: sciq # dict registered task duplicate + task_alias: sciq 2-shot + num_fewshot: 2 + - task: sciq # dict registered task duplicate + task_alias: sciq 4-shot + num_fewshot: 4 + - task: sciq # dict registered task duplicate + task_alias: sciq 6-shot + num_fewshot: 6 + - task: siqa_custom # dict task + dataset_path: social_i_qa + dataset_name: null + output_type: multiple_choice + training_split: train + validation_split: validation + doc_to_text: "Question: {{context}} {{question}}\nAnswer:" + target_delimiter: " " + doc_to_choice: + - "{{answerA}}" + - "{{answerB}}" + - "{{answerC}}" + doc_to_target: "{{ (label|int) - 1 }}" + metric_list: + - metric: acc + aggregation: mean + higher_is_better: true diff --git a/lm-quant-toolkit/.coveragerc b/lm-quant-toolkit/.coveragerc new file mode 100644 index 0000000000000000000000000000000000000000..7bd0571638c2961700b723fee6a004f1e8a63faf --- /dev/null +++ b/lm-quant-toolkit/.coveragerc @@ -0,0 +1,3 @@ +[run] +omit = + src/llm_quant_eval/tests/* diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/bug_report.md b/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000000000000000000000000000000000..d047af6e8e361b71bb7a5b915a8c9cff4f00f1e9 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,33 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**Hardware details** +Information about CPU and GPU, such as RAM, number, etc. + +**Software version** +Version of relevant software such as operation system, cuda toolkit, python, auto-gptq, pytorch, transformers, accelerate, etc. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/custom.md b/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 0000000000000000000000000000000000000000..48d5f81fa422964dd1eea360efdecfc5dc9a6c87 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/feature_request.md b/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000000000000000000000000000000000..f45586549c215746dd615f3b3a36518386097dc1 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[FEATURE]" +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_cuda_linux.yml b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_cuda_linux.yml new file mode 100644 index 0000000000000000000000000000000000000000..39b0ed0d7e6ba157c6c061019e81e9d3e114071b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_cuda_linux.yml @@ -0,0 +1,115 @@ +name: Build AutoGPTQ Wheels with CUDA for Linux + +on: workflow_dispatch + +jobs: + build_wheels: + if: ${{ github.repository_owner == 'AutoGPTQ' }} + name: Build wheels for ${{ matrix.os }} and Python ${{ matrix.python }} and CUDA ${{ matrix.cuda }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-20.04] + pyver: ["3.8", "3.9", "3.10", "3.11"] + cuda: ["11.8"] # wheel for 12.1 are built in build_wheels_pypi.yml + defaults: + run: + shell: bash + env: + CUDA_VERSION: ${{ matrix.cuda }} + + steps: + - uses: actions/checkout@v3 + + - name: Free disk space + run: | + # Go from 19G to 54G free disk space in 3min + df -h + sudo apt-get update + sudo apt-get purge -y '^apache.*' + sudo apt-get purge -y '^imagemagick.*' + sudo apt-get purge -y '^dotnet.*' + sudo apt-get purge -y '^aspnetcore.*' + sudo apt-get purge -y 'php.*' + sudo apt-get purge -y '^temurin.*' + sudo apt-get purge -y '^mysql.*' + sudo apt-get purge -y '^java.*' + sudo apt-get purge -y '^openjdk.*' + sudo apt-get purge -y microsoft-edge-stable google-cloud-cli azure-cli google-chrome-stable firefox powershell mono-devel + df -h + sudo apt-get autoremove -y >/dev/null 2>&1 + sudo apt-get clean + df -h + echo "https://github.com/actions/virtual-environments/issues/709" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + df -h + echo "remove big /usr/local" + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf /usr/local/lib/android >/dev/null 2>&1 + df -h + echo "remove /usr/share leftovers" + sudo rm -rf /usr/share/dotnet/sdk > /dev/null 2>&1 + sudo rm -rf /usr/share/dotnet/shared > /dev/null 2>&1 + sudo rm -rf /usr/share/swift > /dev/null 2>&1 + df -h + echo "remove other leftovers" + sudo rm -rf /var/lib/mysql > /dev/null 2>&1 + sudo rm -rf /home/runner/.dotnet > /dev/null 2>&1 + sudo rm -rf /home/runneradmin/.dotnet > /dev/null 2>&1 + sudo rm -rf /etc/skel/.dotnet > /dev/null 2>&1 + sudo rm -rf /usr/local/.ghcup > /dev/null 2>&1 + sudo rm -rf /usr/local/aws-cli > /dev/null 2>&1 + sudo rm -rf /usr/local/lib/node_modules > /dev/null 2>&1 + sudo rm -rf /usr/lib/heroku > /dev/null 2>&1 + sudo rm -rf /usr/local/share/chromium > /dev/null 2>&1 + df -h + + - uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.pyver }} + + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2.2.0 + with: + activate-environment: "build" + python-version: ${{ matrix.pyver }} + mamba-version: "*" + use-mamba: false + channels: conda-forge,defaults + channel-priority: true + add-pip-as-python-dependency: true + auto-activate-base: false + + - name: Install Dependencies + run: | + conda install cuda-toolkit -c "nvidia/label/cuda-${CUDA_VERSION}.0" + + # Refer to https://pytorch.org/get-started/locally/ + python -m pip install torch --index-url https://download.pytorch.org/whl/cu118 + python -m pip install --upgrade build setuptools wheel ninja numpy gekko pandas + + - name: Check install + run: | + python -c "import torch; print('torch version:', torch.__version__)" + + - name: Build Wheel + run: | + # For some reason $CONDA_PREFIX is empty. + export CUDA_HOME=/usr/share/miniconda + export CUDA_PATH=/usr/share/miniconda + export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${CONDA_PREFIX}/lib" + + export TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6 8.9 9.0+PTX" + + echo "CUDA_PATH:" + echo $CUDA_PATH + + echo "PYPI_RELEASE:" + echo $PYPI_RELEASE + + python setup.py sdist bdist_wheel + + - uses: actions/upload-artifact@v3 + with: + name: 'linux-cuda-wheels' + path: ./dist/*.whl diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_cuda_windows.yml b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_cuda_windows.yml new file mode 100644 index 0000000000000000000000000000000000000000..d65fd5e74d90b91954d863a72f2bedc638b8d3c0 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_cuda_windows.yml @@ -0,0 +1,64 @@ +name: Build AutoGPTQ Wheels with CUDA for Windows + +on: workflow_dispatch + +jobs: + build_wheels: + if: ${{ github.repository_owner == 'AutoGPTQ' }} + name: Build wheels for ${{ matrix.os }} and Python ${{ matrix.python }} and CUDA ${{ matrix.cuda }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest] + pyver: ["3.8", "3.9", "3.10", "3.11"] + cuda: ["11.8"] # wheel for 12.1 are built in build_wheels_pypi.yml + defaults: + run: + shell: pwsh + env: + CUDA_VERSION: ${{ matrix.cuda }} + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.pyver }} + + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2.2.0 + with: + activate-environment: "build" + python-version: ${{ matrix.pyver }} + mamba-version: "*" + use-mamba: false + channels: conda-forge,defaults + channel-priority: true + add-pip-as-python-dependency: true + auto-activate-base: false + + - name: Install Dependencies + run: | + conda install cuda-toolkit -c "nvidia/label/cuda-${env:CUDA_VERSION}.0" + + # Refer to https://pytorch.org/get-started/locally/ + python -m pip install torch --index-url https://download.pytorch.org/whl/cu118 + python -m pip install --upgrade build setuptools wheel ninja numpy gekko pandas + + - name: Check install + run: | + python -c "import torch; print('torch version:', torch.__version__)" + + - name: Build Wheel + run: | + $env:CUDA_PATH = $env:CONDA_PREFIX + $env:CUDA_HOME = $env:CONDA_PREFIX + + $env:TORCH_CUDA_ARCH_LIST = '6.0 6.1 7.0 7.5 8.0 8.6+PTX' + if ([decimal]$env:CUDA_VERSION -ge 11.8) { $env:TORCH_CUDA_ARCH_LIST = '6.0 6.1 7.0 7.5 8.0 8.6 8.9 9.0+PTX' } + python setup.py sdist bdist_wheel + + - uses: actions/upload-artifact@v3 + with: + name: 'windows-cuda-wheels' + path: ./dist/*.whl diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_pypi_linux.yml b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_pypi_linux.yml new file mode 100644 index 0000000000000000000000000000000000000000..29cd45ca8e3b7b892ede842425c4e63f042c3330 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_pypi_linux.yml @@ -0,0 +1,116 @@ +name: Build AutoGPTQ Wheels for PyPI with CUDA for Linux + +on: workflow_dispatch + +jobs: + build_wheels: + if: ${{ github.repository_owner == 'AutoGPTQ' }} + name: Build wheels for ${{ matrix.os }} and Python ${{ matrix.python }} and CUDA 12.1 + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-20.04] + pyver: ["3.8", "3.9", "3.10", "3.11"] + defaults: + run: + shell: bash + env: + CUDA_VERSION: "12.1" + + steps: + - uses: actions/checkout@v3 + + - name: Free disk space + run: | + # Go from 19G to 54G free disk space in 3min + df -h + sudo apt-get update + sudo apt-get purge -y '^apache.*' + sudo apt-get purge -y '^imagemagick.*' + sudo apt-get purge -y '^dotnet.*' + sudo apt-get purge -y '^aspnetcore.*' + sudo apt-get purge -y 'php.*' + sudo apt-get purge -y '^temurin.*' + sudo apt-get purge -y '^mysql.*' + sudo apt-get purge -y '^java.*' + sudo apt-get purge -y '^openjdk.*' + sudo apt-get purge -y microsoft-edge-stable google-cloud-cli azure-cli google-chrome-stable firefox powershell mono-devel + df -h + sudo apt-get autoremove -y >/dev/null 2>&1 + sudo apt-get clean + df -h + echo "https://github.com/actions/virtual-environments/issues/709" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + df -h + echo "remove big /usr/local" + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf /usr/local/lib/android >/dev/null 2>&1 + df -h + echo "remove /usr/share leftovers" + sudo rm -rf /usr/share/dotnet/sdk > /dev/null 2>&1 + sudo rm -rf /usr/share/dotnet/shared > /dev/null 2>&1 + sudo rm -rf /usr/share/swift > /dev/null 2>&1 + df -h + echo "remove other leftovers" + sudo rm -rf /var/lib/mysql > /dev/null 2>&1 + sudo rm -rf /home/runner/.dotnet > /dev/null 2>&1 + sudo rm -rf /home/runneradmin/.dotnet > /dev/null 2>&1 + sudo rm -rf /etc/skel/.dotnet > /dev/null 2>&1 + sudo rm -rf /usr/local/.ghcup > /dev/null 2>&1 + sudo rm -rf /usr/local/aws-cli > /dev/null 2>&1 + sudo rm -rf /usr/local/lib/node_modules > /dev/null 2>&1 + sudo rm -rf /usr/lib/heroku > /dev/null 2>&1 + sudo rm -rf /usr/local/share/chromium > /dev/null 2>&1 + df -h + + - uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.pyver }} + + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2.2.0 + with: + activate-environment: "build" + python-version: ${{ matrix.pyver }} + mamba-version: "*" + use-mamba: false + channels: conda-forge,defaults + channel-priority: true + add-pip-as-python-dependency: true + auto-activate-base: false + + - name: Install Dependencies + run: | + conda install cuda-toolkit -c "nvidia/label/cuda-${CUDA_VERSION}.0" + + # Refer to https://pytorch.org/get-started/locally/ + python -m pip install torch + python -m pip install --upgrade build setuptools wheel ninja numpy gekko pandas + + - name: Check install + run: | + python -c "import torch; print('torch version:', torch.__version__)" + + - name: Build Wheel + run: | + # For some reason $CONDA_PREFIX is empty. + export CUDA_HOME=/usr/share/miniconda + export CUDA_PATH=/usr/share/miniconda + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${CONDA_PREFIX}/lib" + + export TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6 8.9 9.0+PTX" + + export PYPI_RELEASE="1" + + echo "CUDA_PATH:" + echo $CUDA_PATH + + echo "PYPI_RELEASE:" + echo $PYPI_RELEASE + + python setup.py sdist bdist_wheel + + - uses: actions/upload-artifact@v3 + with: + name: 'linux-cuda-wheels-pypi' + path: ./dist/*.whl diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_pypi_windows.yml b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_pypi_windows.yml new file mode 100644 index 0000000000000000000000000000000000000000..403e8eaba5423fca62018855c3e3947184b47d5c --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_pypi_windows.yml @@ -0,0 +1,72 @@ +name: Build AutoGPTQ Wheels for PyPI with CUDA for Windows + +on: workflow_dispatch + +jobs: + build_wheels: + if: ${{ github.repository_owner == 'AutoGPTQ' }} + name: Build wheels for ${{ matrix.os }} and Python ${{ matrix.python }} and CUDA 12.1 + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest] + pyver: ["3.8", "3.9", "3.10", "3.11"] + defaults: + run: + shell: pwsh + env: + CUDA_VERSION: "12.1" + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.pyver }} + + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2.2.0 + with: + activate-environment: "build" + python-version: ${{ matrix.pyver }} + mamba-version: "*" + use-mamba: false + channels: conda-forge,defaults + channel-priority: true + add-pip-as-python-dependency: true + auto-activate-base: false + + - name: Install Dependencies + run: | + conda install cuda-toolkit -c "nvidia/label/cuda-${env:CUDA_VERSION}.0" + + # Refer to https://pytorch.org/get-started/locally/ + python -m pip install torch --index-url https://download.pytorch.org/whl/cu121 + + python -m pip install --upgrade build setuptools wheel ninja numpy gekko pandas + + - name: Check install + run: | + python -c "import torch; print('torch version:', torch.__version__)" + + - name: Build Wheel + run: | + $env:CUDA_PATH = $env:CONDA_PREFIX + $env:CUDA_HOME = $env:CONDA_PREFIX + + $env:TORCH_CUDA_ARCH_LIST = '6.0 6.1 7.0 7.5 8.0 8.6 8.9 9.0+PTX' + + $env:PYPI_RELEASE = "1" + + echo "CUDA_PATH:" + echo $env:CUDA_PATH + + echo "PYPI_RELEASE:" + echo $env:PYPI_RELEASE + + python setup.py sdist bdist_wheel + + - uses: actions/upload-artifact@v3 + with: + name: 'windows-cuda-wheels-pypi' + path: ./dist/*.whl diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_rocm.yml b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_rocm.yml new file mode 100644 index 0000000000000000000000000000000000000000..482fafb623755c9ddab1c7b62cb3e9bac1263311 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/build_wheels_rocm.yml @@ -0,0 +1,131 @@ +name: Build AutoGPTQ Wheels with ROCm + +on: workflow_dispatch + +jobs: + build_wheels: + if: ${{ github.repository_owner == 'AutoGPTQ' }} + + strategy: + matrix: + os: [ubuntu-20.04] + python: ["3.8", "3.9", "3.10", "3.11"] + rocm: ["5.7.3"] # we build only for ROCm 5.7 to match PyTorch 2.2.0 and PyTorch 2.2 nightly + + name: Build wheels for ${{ matrix.os }} and Python ${{ matrix.python }} and RoCm ${{ matrix.rocm }} + runs-on: ${{ matrix.os }} + + defaults: + run: + shell: bash + + steps: + - uses: actions/checkout@v3 + + - name: Free disk space + run: | + # Go from 19G to 54G free disk space in 3min + df -h + sudo apt-get update + sudo apt-get purge -y '^apache.*' + sudo apt-get purge -y '^imagemagick.*' + sudo apt-get purge -y '^dotnet.*' + sudo apt-get purge -y '^aspnetcore.*' + sudo apt-get purge -y 'php.*' + sudo apt-get purge -y '^temurin.*' + sudo apt-get purge -y '^mysql.*' + sudo apt-get purge -y '^java.*' + sudo apt-get purge -y '^openjdk.*' + sudo apt-get purge -y microsoft-edge-stable google-cloud-cli azure-cli google-chrome-stable firefox powershell mono-devel + df -h + sudo apt-get autoremove -y >/dev/null 2>&1 + sudo apt-get clean + df -h + echo "https://github.com/actions/virtual-environments/issues/709" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + df -h + echo "remove big /usr/local" + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf /usr/local/lib/android >/dev/null 2>&1 + df -h + echo "remove /usr/share leftovers" + sudo rm -rf /usr/share/dotnet/sdk > /dev/null 2>&1 + sudo rm -rf /usr/share/dotnet/shared > /dev/null 2>&1 + sudo rm -rf /usr/share/swift > /dev/null 2>&1 + df -h + echo "remove other leftovers" + sudo rm -rf /var/lib/mysql > /dev/null 2>&1 + sudo rm -rf /home/runner/.dotnet > /dev/null 2>&1 + sudo rm -rf /home/runneradmin/.dotnet > /dev/null 2>&1 + sudo rm -rf /etc/skel/.dotnet > /dev/null 2>&1 + sudo rm -rf /usr/local/.ghcup > /dev/null 2>&1 + sudo rm -rf /usr/local/aws-cli > /dev/null 2>&1 + sudo rm -rf /usr/local/lib/node_modules > /dev/null 2>&1 + sudo rm -rf /usr/lib/heroku > /dev/null 2>&1 + sudo rm -rf /usr/local/share/chromium > /dev/null 2>&1 + df -h + + - uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python }} + + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2.2.0 + with: + activate-environment: "build" + python-version: ${{ matrix.python }} + mamba-version: "*" + use-mamba: false + channels: conda-forge,defaults + channel-priority: true + add-pip-as-python-dependency: true + auto-activate-base: false + + - name: Set up environment + run: | + echo "Using python:" + python --version + which python + + if [[ "${{ matrix.rocm }}" == "5.4.2" ]]; then + export ROCM_DL_FILE=amdgpu-install_5.4.50402-1_all.deb + elif [[ "${{ matrix.rocm }}" == "5.6.1" ]]; then + export ROCM_DL_FILE=amdgpu-install_5.6.50601-1_all.deb + elif [[ "${{ matrix.rocm }}" == "5.7.3" ]]; then + export ROCM_DL_FILE=amdgpu-install_5.7.50703-1_all.deb + else + echo Unknown rocm version + exit 1 + fi + + curl -O https://repo.radeon.com/amdgpu-install/${{ matrix.rocm }}/ubuntu/focal/$ROCM_DL_FILE + sudo dpkg -i $ROCM_DL_FILE + sudo DEBIAN_FRONTEND=noninteractive amdgpu-install --usecase=rocm --no-dkms --no-32 -y + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends rocsparse-dev rocthrust-dev rocblas-dev hipblas-dev hipsparse-dev + + python -m pip install --upgrade build setuptools wheel ninja numpy gekko pandas + + if [[ "${{ matrix.rocm }}" == "5.7.3" ]]; then + echo "Using PyTorch stable" + python -m pip install torch --index-url https://download.pytorch.org/whl/rocm5.7 + else + echo Unknown rocm version for python install + exit 1 + fi + + - name: Build wheels + run: | + echo "Using python for build:" + python --version + which python + + ROCM_VERSION=${{ matrix.rocm }} python setup.py sdist bdist_wheel + + - uses: actions/upload-artifact@v3 + with: + name: 'linux-rocm-wheels' + path: ./dist/*.whl diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/test_quality.yml b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/test_quality.yml new file mode 100644 index 0000000000000000000000000000000000000000..4e7d59802ee6f12262bd09e2916188c12c824093 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.github/workflows/test_quality.yml @@ -0,0 +1,124 @@ +name: check_code_quality + +on: + push: + branches: [ main ] + paths: + - "auto_gptq/**.py" + - "tests/**.py" + - "examples/**.py" + - "setup.py" + + pull_request: + branches: [ main ] + paths: + - "auto_gptq/**.py" + - "tests/**.py" + - "examples/**.py" + - "setup.py" + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + build: + strategy: + fail-fast: false + matrix: + python-version: [3.9] + os: [ubuntu-22.04] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v3 + + - name: Free disk space + run: | + # Go from 19G to 54G free disk space in 3min + df -h + sudo apt-get update + sudo apt-get purge -y '^apache.*' + sudo apt-get purge -y '^imagemagick.*' + sudo apt-get purge -y '^dotnet.*' + sudo apt-get purge -y '^aspnetcore.*' + sudo apt-get purge -y 'php.*' + sudo apt-get purge -y '^temurin.*' + sudo apt-get purge -y '^mysql.*' + sudo apt-get purge -y '^java.*' + sudo apt-get purge -y '^openjdk.*' + sudo apt-get purge -y microsoft-edge-stable google-cloud-cli azure-cli google-chrome-stable firefox powershell mono-devel + df -h + sudo apt-get autoremove -y >/dev/null 2>&1 + sudo apt-get clean + df -h + echo "https://github.com/actions/virtual-environments/issues/709" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + df -h + echo "remove big /usr/local" + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf /usr/local/lib/android >/dev/null 2>&1 + df -h + echo "remove /usr/share leftovers" + sudo rm -rf /usr/share/dotnet/sdk > /dev/null 2>&1 + sudo rm -rf /usr/share/dotnet/shared > /dev/null 2>&1 + sudo rm -rf /usr/share/swift > /dev/null 2>&1 + df -h + echo "remove other leftovers" + sudo rm -rf /var/lib/mysql > /dev/null 2>&1 + sudo rm -rf /home/runner/.dotnet > /dev/null 2>&1 + sudo rm -rf /home/runneradmin/.dotnet > /dev/null 2>&1 + sudo rm -rf /etc/skel/.dotnet > /dev/null 2>&1 + sudo rm -rf /usr/local/.ghcup > /dev/null 2>&1 + sudo rm -rf /usr/local/aws-cli > /dev/null 2>&1 + sudo rm -rf /usr/local/lib/node_modules > /dev/null 2>&1 + sudo rm -rf /usr/lib/heroku > /dev/null 2>&1 + sudo rm -rf /usr/local/share/chromium > /dev/null 2>&1 + df -h + + - uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2.2.0 + with: + activate-environment: "build" + python-version: ${{ matrix.python-version }} + mamba-version: "*" + use-mamba: false + channels: conda-forge,defaults + channel-priority: true + add-pip-as-python-dependency: true + auto-activate-base: false + + - name: Install dependencies + run: | + conda install cuda-toolkit -c "nvidia/label/cuda-12.1.0" + + # Refer to https://pytorch.org/get-started/locally/ + python -m pip install torch + + python -m pip install --upgrade build setuptools wheel numpy + + - name: Check install + run: | + python -c "import torch; print('torch version:', torch.__version__)" + + - name: Install AutoGPTQ + run: | + # For some reason $CONDA_PREFIX is empty. + export CUDA_HOME=/usr/share/miniconda + export CUDA_PATH=/usr/share/miniconda + + echo "CUDA_HOME:" + echo $CUDA_HOME + + echo "CUDA_PATH:" + echo $CUDA_PATH + + pip install -vvv .[quality] + + - name: Check style with ruff + run: | + ruff auto_gptq examples tests setup.py diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/.gitignore b/lm-quant-toolkit/.deps/AutoGPTQ/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..68bc17f9ff2104a9d7b6777058bb4c343ca72609 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/Dockerfile b/lm-quant-toolkit/.deps/AutoGPTQ/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..25008519b8b9d8b946037ee8ed3a4d23df78a1df --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/Dockerfile @@ -0,0 +1,28 @@ +# Build with: `docker build -f Dockerfile -t autogptq .` +# Run with: `docker run --gpus all --rm -it autogptq:latest /bin/bash` + +FROM nvcr.io/nvidia/cuda:12.1.0-runtime-ubuntu22.04 + +RUN apt update && \ + apt install -y wget git && \ + apt clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +ENV PATH="/root/miniconda3/bin:${PATH}" +ARG PATH="/root/miniconda3/bin:${PATH}" + +RUN wget \ + https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ + && mkdir .conda \ + && bash Miniconda3-latest-Linux-x86_64.sh -b \ + && rm -f Miniconda3-latest-Linux-x86_64.sh + +RUN conda init bash + +RUN pip install --upgrade pip +RUN pip install --upgrade numpy torch setuptools wheel + +RUN git clone https://github.com/AutoGPTQ/AutoGPTQ.git +WORKDIR /AutoGPTQ + +RUN pip install -vvv . \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/Dockerfile_amd b/lm-quant-toolkit/.deps/AutoGPTQ/Dockerfile_amd new file mode 100644 index 0000000000000000000000000000000000000000..116b6fa7a4bda65bba9fea17b65fd38a0ff4ac5b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/Dockerfile_amd @@ -0,0 +1,35 @@ +# Build with: `docker build -f Dockerfile_amd -t autogptq-rocm .` +# Run with: `docker run --rm -it --shm-size=150G --device /dev/kfd --device /dev/dri --net host --group-add=video --ipc=host --cap-add=SYS_PTRACE --security-opt seccomp=unconfined autogptq-rocm:latest /bin/bash` + +FROM rocm/dev-ubuntu-22.04:5.7 + +RUN apt update && \ + apt install -y wget \ + git \ + rocsparse-dev \ + hipsparse-dev \ + rocthrust-dev \ + rocblas-dev \ + hipblas-dev && \ + apt clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +ENV PATH="/root/miniconda3/bin:${PATH}" +ARG PATH="/root/miniconda3/bin:${PATH}" + +RUN wget \ + https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ + && mkdir .conda \ + && bash Miniconda3-latest-Linux-x86_64.sh -b \ + && rm -f Miniconda3-latest-Linux-x86_64.sh + +RUN conda init bash + +RUN pip install --upgrade pip +RUN pip install --upgrade numpy setuptools wheel ninja packaging +RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.7 + +RUN git clone https://github.com/AutoGPTQ/AutoGPTQ.git +WORKDIR /AutoGPTQ + +RUN ROCM_VERSION="5.7" pip install -vvv . \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/LICENSE b/lm-quant-toolkit/.deps/AutoGPTQ/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..a3beacee8f8a2cf3380fb359f8367e3eb3f644c8 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 潘其威(William) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/MANIFEST.in b/lm-quant-toolkit/.deps/AutoGPTQ/MANIFEST.in new file mode 100644 index 0000000000000000000000000000000000000000..3e2c6d1fa2ebb66a6219da059e3f6125a568bc8f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/MANIFEST.in @@ -0,0 +1,5 @@ +global-include autogptq_extension/**/*.cuh +global-include autogptq_extension/**/*.h +global-include autogptq_extension/**/*.cpp +global-include autogptq_extension/**/*.cu +global-include autogptq_extension/**/*.py diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/Makefile b/lm-quant-toolkit/.deps/AutoGPTQ/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..679730a7f4e41cda1602f87daf5779811950c487 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/Makefile @@ -0,0 +1,2 @@ +style: + ruff auto_gptq examples tests setup.py --fix diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/README.md b/lm-quant-toolkit/.deps/AutoGPTQ/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d184848ac2092f43cf7934567391e90b47181683 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/README.md @@ -0,0 +1,331 @@ +

AutoGPTQ

+

An easy-to-use LLM quantization package with user-friendly APIs, based on GPTQ algorithm (weight-only quantization).

+

+ + GitHub release + + + PyPI - Downloads + +

+

+

+ English | + 中文 +

+

+ +## News or Update + +- 2024-02-15 - (News) - AutoGPTQ 0.7.0 is released, with [Marlin](https://github.com/IST-DASLab/marlin) int4*fp16 matrix multiplication kernel support, with the argument `use_marlin=True` when loading models. +- 2023-08-23 - (News) - 🤗 Transformers, optimum and peft have integrated `auto-gptq`, so now running and training GPTQ models can be more available to everyone! See [this blog](https://huggingface.co/blog/gptq-integration) and it's resources for more details! + +*For more histories please turn to [here](docs/NEWS_OR_UPDATE.md)* + +## Performance Comparison + +### Inference Speed +> The result is generated using [this script](examples/benchmark/generation_speed.py), batch size of input is 1, decode strategy is beam search and enforce the model to generate 512 tokens, speed metric is tokens/s (the larger, the better). +> +> The quantized model is loaded using the setup that can gain the fastest inference speed. + +| model | GPU | num_beams | fp16 | gptq-int4 | +|---------------|---------------|-----------|-------|-----------| +| llama-7b | 1xA100-40G | 1 | 18.87 | 25.53 | +| llama-7b | 1xA100-40G | 4 | 68.79 | 91.30 | +| moss-moon 16b | 1xA100-40G | 1 | 12.48 | 15.25 | +| moss-moon 16b | 1xA100-40G | 4 | OOM | 42.67 | +| moss-moon 16b | 2xA100-40G | 1 | 06.83 | 06.78 | +| moss-moon 16b | 2xA100-40G | 4 | 13.10 | 10.80 | +| gpt-j 6b | 1xRTX3060-12G | 1 | OOM | 29.55 | +| gpt-j 6b | 1xRTX3060-12G | 4 | OOM | 47.36 | + + +### Perplexity +For perplexity comparison, you can turn to [here](https://github.com/qwopqwop200/GPTQ-for-LLaMa#result) and [here](https://github.com/qwopqwop200/GPTQ-for-LLaMa#gptq-vs-bitsandbytes) + +## Installation + +AutoGPTQ is available on Linux and Windows only. You can install the latest stable release of AutoGPTQ from pip with pre-built wheels: + +| CUDA/ROCm version | Installation | Built against PyTorch | +|-------------------|---------------------------------------------------------------------------------------------------|-----------------------| +| CUDA 11.8 | `pip install auto-gptq --no-build-isolation --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/` | 2.2.1+cu118 | +| CUDA 12.1 | `pip install auto-gptq --no-build-isolation` | 2.2.1+cu121 | +| ROCm 5.7 | `pip install auto-gptq --no-build-isolation --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm573/` | 2.2.1+rocm5.7 | + +AutoGPTQ can be installed with the Triton dependency with `pip install auto-gptq[triton] --no-build-isolation` in order to be able to use the Triton backend (currently only supports linux, no 3-bits quantization). + +For older AutoGPTQ, please refer to [the previous releases installation table](docs/INSTALLATION.md). + +On NVIDIA systems, AutoGPTQ does not support [Maxwell or lower](https://qiita.com/uyuni/items/733a93b975b524f89f46) GPUs. + +### Install from source + +Clone the source code: +```bash +git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ +``` + +A few packages are required in order to build from source: `pip install numpy gekko pandas`. + +Then, install locally from source: +```bash +pip install -vvv --no-build-isolation -e . +``` +You can set `BUILD_CUDA_EXT=0` to disable pytorch extension building, but this is **strongly discouraged** as AutoGPTQ then falls back on a slow python implementation. + +As a last resort, if the above command fails, you can try `python setup.py install`. + +#### On ROCm systems + +To install from source for AMD GPUs supporting ROCm, please specify the `ROCM_VERSION` environment variable. Example: + +```bash +ROCM_VERSION=5.6 pip install -vvv --no-build-isolation -e . +``` + +The compilation can be speeded up by specifying the `PYTORCH_ROCM_ARCH` variable ([reference](https://github.com/pytorch/pytorch/blob/7b73b1e8a73a1777ebe8d2cd4487eb13da55b3ba/setup.py#L132)) in order to build for a single target device, for example `gfx90a` for MI200 series devices. + +For ROCm systems, the packages `rocsparse-dev`, `hipsparse-dev`, `rocthrust-dev`, `rocblas-dev` and `hipblas-dev` are required to build. + +## Quick Tour + +### Quantization and Inference +> warning: this is just a showcase of the usage of basic apis in AutoGPTQ, which uses only one sample to quantize a much small model, quality of quantized model using such little samples may not good. + +Below is an example for the simplest use of `auto_gptq` to quantize a model and inference after quantization: +```python +from transformers import AutoTokenizer, TextGenerationPipeline +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +import logging + +logging.basicConfig( + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", level=logging.INFO, datefmt="%Y-%m-%d %H:%M:%S" +) + +pretrained_model_dir = "facebook/opt-125m" +quantized_model_dir = "opt-125m-4bit" + +tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=True) +examples = [ + tokenizer( + "auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm." + ) +] + +quantize_config = BaseQuantizeConfig( + bits=4, # quantize model to 4-bit + group_size=128, # it is recommended to set the value to 128 + desc_act=False, # set to False can significantly speed up inference but the perplexity may slightly bad +) + +# load un-quantized model, by default, the model will always be loaded into CPU memory +model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config) + +# quantize model, the examples should be list of dict whose keys can only be "input_ids" and "attention_mask" +model.quantize(examples) + +# save quantized model +model.save_quantized(quantized_model_dir) + +# save quantized model using safetensors +model.save_quantized(quantized_model_dir, use_safetensors=True) + +# push quantized model to Hugging Face Hub. +# to use use_auth_token=True, Login first via huggingface-cli login. +# or pass explcit token with: use_auth_token="hf_xxxxxxx" +# (uncomment the following three lines to enable this feature) +# repo_id = f"YourUserName/{quantized_model_dir}" +# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}" +# model.push_to_hub(repo_id, commit_message=commit_message, use_auth_token=True) + +# alternatively you can save and push at the same time +# (uncomment the following three lines to enable this feature) +# repo_id = f"YourUserName/{quantized_model_dir}" +# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}" +# model.push_to_hub(repo_id, save_dir=quantized_model_dir, use_safetensors=True, commit_message=commit_message, use_auth_token=True) + +# load quantized model to the first GPU +model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0") + +# download quantized model from Hugging Face Hub and load to the first GPU +# model = AutoGPTQForCausalLM.from_quantized(repo_id, device="cuda:0", use_safetensors=True, use_triton=False) + +# inference with model.generate +print(tokenizer.decode(model.generate(**tokenizer("auto_gptq is", return_tensors="pt").to(model.device))[0])) + +# or you can also use pipeline +pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer) +print(pipeline("auto-gptq is")[0]["generated_text"]) +``` + +For more advanced features of model quantization, please reference to [this script](examples/quantization/quant_with_alpaca.py) + +### Customize Model +
+ +Below is an example to extend `auto_gptq` to support `OPT` model, as you will see, it's very easy: + +```python +from auto_gptq.modeling import BaseGPTQForCausalLM + + +class OPTGPTQForCausalLM(BaseGPTQForCausalLM): + # chained attribute name of transformer layer block + layers_block_name = "model.decoder.layers" + # chained attribute names of other nn modules that in the same level as the transformer layer block + outside_layer_modules = [ + "model.decoder.embed_tokens", "model.decoder.embed_positions", "model.decoder.project_out", + "model.decoder.project_in", "model.decoder.final_layer_norm" + ] + # chained attribute names of linear layers in transformer layer module + # normally, there are four sub lists, for each one the modules in it can be seen as one operation, + # and the order should be the order when they are truly executed, in this case (and usually in most cases), + # they are: attention q_k_v projection, attention output projection, MLP project input, MLP project output + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.out_proj"], + ["fc1"], + ["fc2"] + ] +``` +After this, you can use `OPTGPTQForCausalLM.from_pretrained` and other methods as shown in Basic. + +
+ +### Evaluation on Downstream Tasks +You can use tasks defined in `auto_gptq.eval_tasks` to evaluate model's performance on specific down-stream task before and after quantization. + +The predefined tasks support all causal-language-models implemented in [🤗 transformers](https://github.com/huggingface/transformers) and in this project. + +
+ +Below is an example to evaluate `EleutherAI/gpt-j-6b` on sequence-classification task using `cardiffnlp/tweet_sentiment_multilingual` dataset: + +```python +from functools import partial + +import datasets +from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +from auto_gptq.eval_tasks import SequenceClassificationTask + + +MODEL = "EleutherAI/gpt-j-6b" +DATASET = "cardiffnlp/tweet_sentiment_multilingual" +TEMPLATE = "Question:What's the sentiment of the given text? Choices are {labels}.\nText: {text}\nAnswer:" +ID2LABEL = { + 0: "negative", + 1: "neutral", + 2: "positive" +} +LABELS = list(ID2LABEL.values()) + + +def ds_refactor_fn(samples): + text_data = samples["text"] + label_data = samples["label"] + + new_samples = {"prompt": [], "label": []} + for text, label in zip(text_data, label_data): + prompt = TEMPLATE.format(labels=LABELS, text=text) + new_samples["prompt"].append(prompt) + new_samples["label"].append(ID2LABEL[label]) + + return new_samples + + +# model = AutoModelForCausalLM.from_pretrained(MODEL).eval().half().to("cuda:0") +model = AutoGPTQForCausalLM.from_pretrained(MODEL, BaseQuantizeConfig()) +tokenizer = AutoTokenizer.from_pretrained(MODEL) + +task = SequenceClassificationTask( + model=model, + tokenizer=tokenizer, + classes=LABELS, + data_name_or_path=DATASET, + prompt_col_name="prompt", + label_col_name="label", + **{ + "num_samples": 1000, # how many samples will be sampled to evaluation + "sample_max_len": 1024, # max tokens for each sample + "block_max_len": 2048, # max tokens for each data block + # function to load dataset, one must only accept data_name_or_path as input + # and return datasets.Dataset + "load_fn": partial(datasets.load_dataset, name="english"), + # function to preprocess dataset, which is used for datasets.Dataset.map, + # must return Dict[str, list] with only two keys: [prompt_col_name, label_col_name] + "preprocess_fn": ds_refactor_fn, + # truncate label when sample's length exceed sample_max_len + "truncate_prompt": False + } + ) + +# note that max_new_tokens will be automatically specified internally based on given classes +print(task.run()) + +# self-consistency +print( + task.run( + generation_config=GenerationConfig( + num_beams=3, + num_return_sequences=3, + do_sample=True + ) + ) +) +``` + +
+ +## Learn More +[tutorials](docs/tutorial) provide step-by-step guidance to integrate `auto_gptq` with your own project and some best practice principles. + +[examples](examples/README.md) provide plenty of example scripts to use `auto_gptq` in different ways. + +## Supported Models + +> you can use `model.config.model_type` to compare with the table below to check whether the model you use is supported by `auto_gptq`. +> +> for example, model_type of `WizardLM`, `vicuna` and `gpt4all` are all `llama`, hence they are all supported by `auto_gptq`. + +| model type | quantization | inference | peft-lora | peft-ada-lora | peft-adaption_prompt | +|------------------------------------|--------------|-----------|-----------|---------------|-------------------------------------------------------------------------------------------------| +| bloom | ✅ | ✅ | ✅ | ✅ | | +| gpt2 | ✅ | ✅ | ✅ | ✅ | | +| gpt_neox | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| gptj | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| llama | ✅ | ✅ | ✅ | ✅ | ✅ | +| moss | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| opt | ✅ | ✅ | ✅ | ✅ | | +| gpt_bigcode | ✅ | ✅ | ✅ | ✅ | | +| codegen | ✅ | ✅ | ✅ | ✅ | | +| falcon(RefinedWebModel/RefinedWeb) | ✅ | ✅ | ✅ | ✅ | | + +## Supported Evaluation Tasks +Currently, `auto_gptq` supports: `LanguageModelingTask`, `SequenceClassificationTask` and `TextSummarizationTask`; more Tasks will come soon! + +## Running tests + +Tests can be run with: + +``` +pytest tests/ -s +``` + +## FAQ + +### Which kernel is used by default? + +AutoGPTQ defaults to using exllamav2 int4*fp16 kernel for matrix multiplication. + +### How to use Marlin kernel? + +Marlin is an optimized int4 * fp16 kernel was recently proposed at https://github.com/IST-DASLab/marlin. This is integrated in AutoGPTQ when loading a model with `use_marlin=True`. This kernel is available only on devices with compute capability 8.0 or 8.6 (Ampere GPUs). + +## Acknowledgement +- Special thanks **Elias Frantar**, **Saleh Ashkboos**, **Torsten Hoefler** and **Dan Alistarh** for proposing **GPTQ** algorithm and open source the [code](https://github.com/IST-DASLab/gptq), and for releasing [Marlin kernel](https://github.com/IST-DASLab/marlin) for mixed precision computation. +- Special thanks **qwopqwop200**, for code in this project that relevant to quantization are mainly referenced from [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa/tree/cuda). +- Special thanks to **turboderp**, for releasing [Exllama](https://github.com/turboderp/exllama) and [Exllama v2](https://github.com/turboderp/exllamav2) libraries with efficient mixed precision kernels. diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/README_zh.md b/lm-quant-toolkit/.deps/AutoGPTQ/README_zh.md new file mode 100644 index 0000000000000000000000000000000000000000..31032d1fdb9ace6349a3f35c044b3477ee4d82ed --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/README_zh.md @@ -0,0 +1,336 @@ +

AutoGPTQ

+

一个基于 GPTQ 算法,简单易用且拥有用户友好型接口的大语言模型量化工具包。

+

+ + GitHub release + + + PyPI - Downloads + +

+

+

+ English | + 中文 +

+

+ +Note: The English README is likely to be more up to date. + +## 通向 v1.0.0 之路 + +嗨,社区的伙伴们,好久不见!很抱歉这段时间由于个人原因,我没能以较高的频率来更新这个项目。过去几周对我的职业生涯规划而言意义重大。在不久前,我正式告别了毕业后便加入两年之久的创业团队,非常感谢团队的领导和同事们给予我的信任与指导,让我能够在两年时间里飞速地成长;同时也十分感激团队允许我自 AutoGPTQ 项目创立以来一直无偿使用内部的 A100 GPU 服务器集群以完成各项实验与性能测评。(当然今后是无法继续使用了,因此**若有新的硬件赞助我将感激不尽**!)过去的两年里,我在这个团队中担任算法工程师的角色,负责基于大语言模型的对话系统架构设计与开发,我们曾成功推出一款名为 gemsouls 的产品,但不幸的是它已经停止运营。而现在,这个团队即将推出一款名为 [modelize](https://www.beta.modelize.ai/) 的新产品,**这是一个大模型原生的 AI 智能体平台,用户可以使用多个 AI 智能体搭建一个高度自动化的团队,让它们在工作流中相互合作,高效完成复杂的项目。** + +话归正题,我非常兴奋地看到,在过去几个月的时间里,针对大语言模型推理性能优化的研究取得了巨大的进展,如今我们不仅能够在高端显卡上完成大语言模型的推理,甚至在 CPU 和边缘设备上都可以轻松运行大语言模型。一系列的技术进步,让我同样迫不及待地在开源社区上做出更多的贡献,因此,首先,我将用约四周的时间将 AutoGPTQ 迭代至 v1.0.0 正式版本,在此期间,也会有 2~3 个小版本发布以让用户能够及时体验性能优化和新特性。在我的愿景里,**到 v1.0.0 版本正式发布时,AutoGPTQ 将能够作为一个灵活可拓展的、支持所有 GPTQ-like 方法的量化后端,自动地完成各种基于 Pytorch 编写的大语言模型的量化工作**。我在[这里](https://github.com/PanQiWei/AutoGPTQ/issues/348)详细介绍了开发计划,欢迎移步至此进行讨论并给出你们的建议! + +## 新闻或更新 + +- 2023-08-23 - (新闻) - 🤗 Transformers、optimum 和 peft 完成了对 `auto-gptq` 的集成,现在使用 GPTQ 模型进行推理和训练将变得更容易!阅读 [这篇博客](https://huggingface.co/blog/gptq-integration) 和相关资源以了解更多细节! +- 2023-08-21 - (新闻) - 通义千问团队发布了基于 `auto-gptq` 的 Qwen-7B 4bit 量化版本模型,并提供了[详尽的测评结果](https://huggingface.co/Qwen/Qwen-7B-Chat-Int4#%E9%87%8F%E5%8C%96-quantization) +- 2023-08-06 - (更新) - 支持 exllama 的 q4 CUDA 算子使得 int4 量化模型能够获得至少1.3倍的推理速度提升. +- 2023-08-04 - (更新) - 支持 RoCm 使得 AMD GPU 的用户能够使用 auto-gptq 的 CUDA 拓展. +- 2023-07-26 - (更新) - 一个优雅的 [PPL 测评脚本](examples/benchmark/perplexity.py)以获得可以与诸如 `llama.cpp` 等代码库进行公平比较的结果。 +- 2023-06-05 - (更新) - 集成 🤗 peft 来使用 gptq 量化过的模型训练适应层,支持 LoRA,AdaLoRA,AdaptionPrompt 等。 +- 2023-05-30 - (更新) - 支持从 🤗 Hub 下载量化好的模型或上次量化好的模型到 🤗 Hub。 + +*获取更多的历史信息,请转至[这里](docs/NEWS_OR_UPDATE.md)* + +## 性能对比 + +### 推理速度 +> 以下结果通过[这个脚本](examples/benchmark/generation_speed.py)生成,文本输入的 batch size 为1,解码策略为 beam search 并且强制模型生成512个 token,速度的计量单位为 tokens/s(越大越好)。 +> +> 量化模型通过能够最大化推理速度的方式加载。 + +| model | GPU | num_beams | fp16 | gptq-int4 | +|---------------|---------------|-----------|-------|-----------| +| llama-7b | 1xA100-40G | 1 | 18.87 | 25.53 | +| llama-7b | 1xA100-40G | 4 | 68.79 | 91.30 | +| moss-moon 16b | 1xA100-40G | 1 | 12.48 | 15.25 | +| moss-moon 16b | 1xA100-40G | 4 | OOM | 42.67 | +| moss-moon 16b | 2xA100-40G | 1 | 06.83 | 06.78 | +| moss-moon 16b | 2xA100-40G | 4 | 13.10 | 10.80 | +| gpt-j 6b | 1xRTX3060-12G | 1 | OOM | 29.55 | +| gpt-j 6b | 1xRTX3060-12G | 4 | OOM | 47.36 | + + +### 困惑度(PPL) +对于困惑度的对比, 你可以参考 [这里](https://github.com/qwopqwop200/GPTQ-for-LLaMa#result) 和 [这里](https://github.com/qwopqwop200/GPTQ-for-LLaMa#gptq-vs-bitsandbytes) + +## 安装 + +### 快速安装 +你可以通过 pip 来安装与 PyTorch 2.0.1 相兼容的最新稳定版本的 AutoGPTQ 的预构建轮子文件: + +* 对于 CUDA 11.7: `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu117/` +* 对于 CUDA 11.8: `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/` +* 对于 RoCm 5.4.2: `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm542/` + +**警告:** 预构建的轮子文件不一定在 PyTorch 的 nightly 版本上有效。如果要使用 PyTorch 的 nightly 版本,请从源码安装 AutoGPTQ。 + +#### 取消 cuda 拓展的安装 +默认情况下,在 `torch` 和 `cuda` 已经于你的机器上被安装时,cuda 拓展将被自动安装,如果你不想要这些拓展的话,采用以下安装命令: +```shell +BUILD_CUDA_EXT=0 pip install auto-gptq +``` +同时为确保该拓展——`autogptq_cuda` 不再存在于你的虚拟环境,执行以下命令: +```shell +pip uninstall autogptq_cuda -y +``` + +#### 支持使用 triton 加速 +若想使用 `triton` 加速模型推理,使用以下命令: +> 警告:目前 triton 仅支持 linux 操作系统;当使用 triton 时 3-bit 数值类型的量化将不被支持 + +```shell +pip install auto-gptq[triton] +``` + +### 从源码安装 +
+点击以查看详情 + +克隆源码: +```shell +git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ +``` +然后,从项目目录安装: +```shell +pip install . +``` +正如在快速安装一节,你可以使用 `BUILD_CUDA_EXT=0` 来取消构建 cuda 拓展。 + +如果你想要使用 triton 加速且其能够被你的操作系统所支持,请使用 `.[triton]`。 + +对应 AMD GPUs,为了从源码安装以支持 RoCm,请设置 `ROCM_VERSION` 环境变量。同时通过设置 `PYTORCH_ROCM_ARCH` ([reference](https://github.com/pytorch/pytorch/blob/7b73b1e8a73a1777ebe8d2cd4487eb13da55b3ba/setup.py#L132)) 可提升编译速度,例如:对于 MI200 系列设备,该变量可设为 `gfx90a`。例子: + +``` +ROCM_VERSION=5.6 pip install . +``` + +对于 RoCm 系统,在从源码安装时额外需要提前安装以下包:`rocsparse-dev`, `hipsparse-dev`, `rocthrust-dev`, `rocblas-dev` and `hipblas-dev`。 + +
+ +## 快速开始 + +### 量化和推理 +> 警告:这里仅是对 AutoGPTQ 中基本接口的用法展示,只使用了一条文本来量化一个特别小的模型,因此其结果的表现可能不如在大模型上执行量化后预期的那样好。 + +以下展示了使用 `auto_gptq` 进行量化和推理的最简单用法: +```python +from transformers import AutoTokenizer, TextGenerationPipeline +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig + + +pretrained_model_dir = "facebook/opt-125m" +quantized_model_dir = "opt-125m-4bit" + + +tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=True) +examples = [ + tokenizer( + "auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm." + ) +] + +quantize_config = BaseQuantizeConfig( + bits=4, # 将模型量化为 4-bit 数值类型 + group_size=128, # 一般推荐将此参数的值设置为 128 + desc_act=False, # 设为 False 可以显著提升推理速度,但是 ppl 可能会轻微地变差 +) + +# 加载未量化的模型,默认情况下,模型总是会被加载到 CPU 内存中 +model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config) + +# 量化模型, 样本的数据类型应该为 List[Dict],其中字典的键有且仅有 input_ids 和 attention_mask +model.quantize(examples) + +# 保存量化好的模型 +model.save_quantized(quantized_model_dir) + +# 使用 safetensors 保存量化好的模型 +model.save_quantized(quantized_model_dir, use_safetensors=True) + +# 将量化好的模型直接上传至 Hugging Face Hub +# 当使用 use_auth_token=True 时, 确保你已经首先使用 huggingface-cli login 进行了登录 +# 或者可以使用 use_auth_token="hf_xxxxxxx" 来显式地添加账户认证 token +# (取消下面三行代码的注释来使用该功能) +# repo_id = f"YourUserName/{quantized_model_dir}" +# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}" +# model.push_to_hub(repo_id, commit_message=commit_message, use_auth_token=True) + +# 或者你也可以同时将量化好的模型保存到本地并上传至 Hugging Face Hub +# (取消下面三行代码的注释来使用该功能) +# repo_id = f"YourUserName/{quantized_model_dir}" +# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}" +# model.push_to_hub(repo_id, save_dir=quantized_model_dir, use_safetensors=True, commit_message=commit_message, use_auth_token=True) + +# 加载量化好的模型到能被识别到的第一块显卡中 +model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0") + +# 从 Hugging Face Hub 下载量化好的模型并加载到能被识别到的第一块显卡中 +# model = AutoGPTQForCausalLM.from_quantized(repo_id, device="cuda:0", use_safetensors=True, use_triton=False) + +# 使用 model.generate 执行推理 +print(tokenizer.decode(model.generate(**tokenizer("auto_gptq is", return_tensors="pt").to(model.device))[0])) + +# 或者使用 TextGenerationPipeline +pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer) +print(pipeline("auto-gptq is")[0]["generated_text"]) +``` + +参考 [此样例脚本](examples/quantization/quant_with_alpaca.py) 以了解进阶的用法。 + +### 自定义模型 + +
+ +以下展示了如何拓展 `auto_gptq` 以支持 `OPT` 模型,如你所见,这非常简单: + +```python +from auto_gptq.modeling import BaseGPTQForCausalLM + + +class OPTGPTQForCausalLM(BaseGPTQForCausalLM): + # chained attribute name of transformer layer block + layers_block_name = "model.decoder.layers" + # chained attribute names of other nn modules that in the same level as the transformer layer block + outside_layer_modules = [ + "model.decoder.embed_tokens", "model.decoder.embed_positions", "model.decoder.project_out", + "model.decoder.project_in", "model.decoder.final_layer_norm" + ] + # chained attribute names of linear layers in transformer layer module + # normally, there are four sub lists, for each one the modules in it can be seen as one operation, + # and the order should be the order when they are truly executed, in this case (and usually in most cases), + # they are: attention q_k_v projection, attention output projection, MLP project input, MLP project output + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.out_proj"], + ["fc1"], + ["fc2"] + ] +``` +然后, 你就可以像在基本用法一节中展示的那样使用 `OPTGPTQForCausalLM.from_pretrained` 和其他方法。 + +
+ + +### 在下游任务上执行评估 +你可以使用在 `auto_gptq.eval_tasks` 中定义的任务来评估量化前后的模型在某个特定下游任务上的表现。 + +这些预定义的模型支持所有在 [🤗 transformers](https://github.com/huggingface/transformers)和本项目中被实现了的 causal-language-models。 + +
+ +以下是使用 `cardiffnlp/tweet_sentiment_multilingual` 数据集在序列分类(文本分类)任务上评估 `EleutherAI/gpt-j-6b` 模型的示例: + +```python +from functools import partial + +import datasets +from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +from auto_gptq.eval_tasks import SequenceClassificationTask + + +MODEL = "EleutherAI/gpt-j-6b" +DATASET = "cardiffnlp/tweet_sentiment_multilingual" +TEMPLATE = "Question:What's the sentiment of the given text? Choices are {labels}.\nText: {text}\nAnswer:" +ID2LABEL = { + 0: "negative", + 1: "neutral", + 2: "positive" +} +LABELS = list(ID2LABEL.values()) + + +def ds_refactor_fn(samples): + text_data = samples["text"] + label_data = samples["label"] + + new_samples = {"prompt": [], "label": []} + for text, label in zip(text_data, label_data): + prompt = TEMPLATE.format(labels=LABELS, text=text) + new_samples["prompt"].append(prompt) + new_samples["label"].append(ID2LABEL[label]) + + return new_samples + + +# model = AutoModelForCausalLM.from_pretrained(MODEL).eval().half().to("cuda:0") +model = AutoGPTQForCausalLM.from_pretrained(MODEL, BaseQuantizeConfig()) +tokenizer = AutoTokenizer.from_pretrained(MODEL) + +task = SequenceClassificationTask( + model=model, + tokenizer=tokenizer, + classes=LABELS, + data_name_or_path=DATASET, + prompt_col_name="prompt", + label_col_name="label", + **{ + "num_samples": 1000, # how many samples will be sampled to evaluation + "sample_max_len": 1024, # max tokens for each sample + "block_max_len": 2048, # max tokens for each data block + # function to load dataset, one must only accept data_name_or_path as input + # and return datasets.Dataset + "load_fn": partial(datasets.load_dataset, name="english"), + # function to preprocess dataset, which is used for datasets.Dataset.map, + # must return Dict[str, list] with only two keys: [prompt_col_name, label_col_name] + "preprocess_fn": ds_refactor_fn, + # truncate label when sample's length exceed sample_max_len + "truncate_prompt": False + } + ) + +# note that max_new_tokens will be automatically specified internally based on given classes +print(task.run()) + +# self-consistency +print( + task.run( + generation_config=GenerationConfig( + num_beams=3, + num_return_sequences=3, + do_sample=True + ) + ) +) +``` + +
+ +## 了解更多 +[教程](docs/tutorial) 提供了将 `auto_gptq` 集成到你的项目中的手把手指导和最佳实践准则。 + +[示例](examples/README.md) 提供了大量示例脚本以将 `auto_gptq` 用于不同领域。 + +## 支持的模型 + +> 你可以使用 `model.config.model_type` 来对照下表以检查你正在使用的一个模型是否被 `auto_gptq` 所支持。 +> +> 比如, `WizardLM`,`vicuna` 和 `gpt4all` 模型的 `model_type` 皆为 `llama`, 因此这些模型皆被 `auto_gptq` 所支持。 + +| model type | quantization | inference | peft-lora | peft-ada-lora | peft-adaption_prompt | +|------------------------------------|--------------|-----------|-----------|---------------|-----------------------------------------------------------------------------------| +| bloom | ✅ | ✅ | ✅ | ✅ | | +| gpt2 | ✅ | ✅ | ✅ | ✅ | | +| gpt_neox | ✅ | ✅ | ✅ | ✅ | ✅[要求该分支的 peft](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| gptj | ✅ | ✅ | ✅ | ✅ | ✅[要求该分支的 peft](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| llama | ✅ | ✅ | ✅ | ✅ | ✅ | +| moss | ✅ | ✅ | ✅ | ✅ | ✅[要求该分支的 peft](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| opt | ✅ | ✅ | ✅ | ✅ | | +| gpt_bigcode | ✅ | ✅ | ✅ | ✅ | | +| codegen | ✅ | ✅ | ✅ | ✅ | | +| falcon(RefinedWebModel/RefinedWeb) | ✅ | ✅ | ✅ | ✅ | | + +## 支持的评估任务 +目前, `auto_gptq` 支持以下评估任务: `LanguageModelingTask`, `SequenceClassificationTask` 和 `TextSummarizationTask`;更多的评估任务即将到来! + +## 致谢 +- 特别感谢 **Elias Frantar**, **Saleh Ashkboos**, **Torsten Hoefler** 和 **Dan Alistarh** 提出 **GPTQ** 算法并开源[代码](https://github.com/IST-DASLab/gptq)。 +- 特别感谢 **qwopqwop200**, 本项目中涉及到模型量化的代码主要参考自 [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa/tree/cuda)。 + +[![Star History Chart](https://api.star-history.com/svg?repos=PanQiwei/AutoGPTQ&type=Date)](https://star-history.com/#PanQiWei/AutoGPTQ&Date) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/PKG-INFO b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/PKG-INFO new file mode 100644 index 0000000000000000000000000000000000000000..11026e4c1a064a4b1bbc71f5d2314249586674ab --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/PKG-INFO @@ -0,0 +1,358 @@ +Metadata-Version: 2.1 +Name: auto-gptq +Version: 0.8.0.dev0+cu124 +Summary: An easy-to-use LLMs quantization package with user-friendly apis, based on GPTQ algorithm. +Home-page: https://github.com/PanQiWei/AutoGPTQ +Author: PanQiWei +Keywords: gptq,quantization,large-language-models,transformers +Platform: windows +Platform: linux +Classifier: Environment :: GPU :: NVIDIA CUDA :: 11.7 +Classifier: Environment :: GPU :: NVIDIA CUDA :: 11.8 +Classifier: Environment :: GPU :: NVIDIA CUDA :: 12 +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: Chinese (Simplified) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: C++ +Requires-Python: >=3.8.0 +Description-Content-Type: text/markdown +Provides-Extra: triton +Provides-Extra: test +Provides-Extra: quality +License-File: LICENSE + +

AutoGPTQ

+

An easy-to-use LLM quantization package with user-friendly APIs, based on GPTQ algorithm (weight-only quantization).

+

+ + GitHub release + + + PyPI - Downloads + +

+

+

+ English | + 中文 +

+

+ +## News or Update + +- 2024-02-15 - (News) - AutoGPTQ 0.7.0 is released, with [Marlin](https://github.com/IST-DASLab/marlin) int4*fp16 matrix multiplication kernel support, with the argument `use_marlin=True` when loading models. +- 2023-08-23 - (News) - 🤗 Transformers, optimum and peft have integrated `auto-gptq`, so now running and training GPTQ models can be more available to everyone! See [this blog](https://huggingface.co/blog/gptq-integration) and it's resources for more details! + +*For more histories please turn to [here](docs/NEWS_OR_UPDATE.md)* + +## Performance Comparison + +### Inference Speed +> The result is generated using [this script](examples/benchmark/generation_speed.py), batch size of input is 1, decode strategy is beam search and enforce the model to generate 512 tokens, speed metric is tokens/s (the larger, the better). +> +> The quantized model is loaded using the setup that can gain the fastest inference speed. + +| model | GPU | num_beams | fp16 | gptq-int4 | +|---------------|---------------|-----------|-------|-----------| +| llama-7b | 1xA100-40G | 1 | 18.87 | 25.53 | +| llama-7b | 1xA100-40G | 4 | 68.79 | 91.30 | +| moss-moon 16b | 1xA100-40G | 1 | 12.48 | 15.25 | +| moss-moon 16b | 1xA100-40G | 4 | OOM | 42.67 | +| moss-moon 16b | 2xA100-40G | 1 | 06.83 | 06.78 | +| moss-moon 16b | 2xA100-40G | 4 | 13.10 | 10.80 | +| gpt-j 6b | 1xRTX3060-12G | 1 | OOM | 29.55 | +| gpt-j 6b | 1xRTX3060-12G | 4 | OOM | 47.36 | + + +### Perplexity +For perplexity comparison, you can turn to [here](https://github.com/qwopqwop200/GPTQ-for-LLaMa#result) and [here](https://github.com/qwopqwop200/GPTQ-for-LLaMa#gptq-vs-bitsandbytes) + +## Installation + +AutoGPTQ is available on Linux and Windows only. You can install the latest stable release of AutoGPTQ from pip with pre-built wheels: + +| CUDA/ROCm version | Installation | Built against PyTorch | +|-------------------|---------------------------------------------------------------------------------------------------|-----------------------| +| CUDA 11.8 | `pip install auto-gptq --no-build-isolation --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/` | 2.2.1+cu118 | +| CUDA 12.1 | `pip install auto-gptq --no-build-isolation` | 2.2.1+cu121 | +| ROCm 5.7 | `pip install auto-gptq --no-build-isolation --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm573/` | 2.2.1+rocm5.7 | + +AutoGPTQ can be installed with the Triton dependency with `pip install auto-gptq[triton] --no-build-isolation` in order to be able to use the Triton backend (currently only supports linux, no 3-bits quantization). + +For older AutoGPTQ, please refer to [the previous releases installation table](docs/INSTALLATION.md). + +On NVIDIA systems, AutoGPTQ does not support [Maxwell or lower](https://qiita.com/uyuni/items/733a93b975b524f89f46) GPUs. + +### Install from source + +Clone the source code: +```bash +git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ +``` + +A few packages are required in order to build from source: `pip install numpy gekko pandas`. + +Then, install locally from source: +```bash +pip install -vvv --no-build-isolation -e . +``` +You can set `BUILD_CUDA_EXT=0` to disable pytorch extension building, but this is **strongly discouraged** as AutoGPTQ then falls back on a slow python implementation. + +As a last resort, if the above command fails, you can try `python setup.py install`. + +#### On ROCm systems + +To install from source for AMD GPUs supporting ROCm, please specify the `ROCM_VERSION` environment variable. Example: + +```bash +ROCM_VERSION=5.6 pip install -vvv --no-build-isolation -e . +``` + +The compilation can be speeded up by specifying the `PYTORCH_ROCM_ARCH` variable ([reference](https://github.com/pytorch/pytorch/blob/7b73b1e8a73a1777ebe8d2cd4487eb13da55b3ba/setup.py#L132)) in order to build for a single target device, for example `gfx90a` for MI200 series devices. + +For ROCm systems, the packages `rocsparse-dev`, `hipsparse-dev`, `rocthrust-dev`, `rocblas-dev` and `hipblas-dev` are required to build. + +## Quick Tour + +### Quantization and Inference +> warning: this is just a showcase of the usage of basic apis in AutoGPTQ, which uses only one sample to quantize a much small model, quality of quantized model using such little samples may not good. + +Below is an example for the simplest use of `auto_gptq` to quantize a model and inference after quantization: +```python +from transformers import AutoTokenizer, TextGenerationPipeline +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +import logging + +logging.basicConfig( + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", level=logging.INFO, datefmt="%Y-%m-%d %H:%M:%S" +) + +pretrained_model_dir = "facebook/opt-125m" +quantized_model_dir = "opt-125m-4bit" + +tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=True) +examples = [ + tokenizer( + "auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm." + ) +] + +quantize_config = BaseQuantizeConfig( + bits=4, # quantize model to 4-bit + group_size=128, # it is recommended to set the value to 128 + desc_act=False, # set to False can significantly speed up inference but the perplexity may slightly bad +) + +# load un-quantized model, by default, the model will always be loaded into CPU memory +model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config) + +# quantize model, the examples should be list of dict whose keys can only be "input_ids" and "attention_mask" +model.quantize(examples) + +# save quantized model +model.save_quantized(quantized_model_dir) + +# save quantized model using safetensors +model.save_quantized(quantized_model_dir, use_safetensors=True) + +# push quantized model to Hugging Face Hub. +# to use use_auth_token=True, Login first via huggingface-cli login. +# or pass explcit token with: use_auth_token="hf_xxxxxxx" +# (uncomment the following three lines to enable this feature) +# repo_id = f"YourUserName/{quantized_model_dir}" +# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}" +# model.push_to_hub(repo_id, commit_message=commit_message, use_auth_token=True) + +# alternatively you can save and push at the same time +# (uncomment the following three lines to enable this feature) +# repo_id = f"YourUserName/{quantized_model_dir}" +# commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}" +# model.push_to_hub(repo_id, save_dir=quantized_model_dir, use_safetensors=True, commit_message=commit_message, use_auth_token=True) + +# load quantized model to the first GPU +model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0") + +# download quantized model from Hugging Face Hub and load to the first GPU +# model = AutoGPTQForCausalLM.from_quantized(repo_id, device="cuda:0", use_safetensors=True, use_triton=False) + +# inference with model.generate +print(tokenizer.decode(model.generate(**tokenizer("auto_gptq is", return_tensors="pt").to(model.device))[0])) + +# or you can also use pipeline +pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer) +print(pipeline("auto-gptq is")[0]["generated_text"]) +``` + +For more advanced features of model quantization, please reference to [this script](examples/quantization/quant_with_alpaca.py) + +### Customize Model +
+ +Below is an example to extend `auto_gptq` to support `OPT` model, as you will see, it's very easy: + +```python +from auto_gptq.modeling import BaseGPTQForCausalLM + + +class OPTGPTQForCausalLM(BaseGPTQForCausalLM): + # chained attribute name of transformer layer block + layers_block_name = "model.decoder.layers" + # chained attribute names of other nn modules that in the same level as the transformer layer block + outside_layer_modules = [ + "model.decoder.embed_tokens", "model.decoder.embed_positions", "model.decoder.project_out", + "model.decoder.project_in", "model.decoder.final_layer_norm" + ] + # chained attribute names of linear layers in transformer layer module + # normally, there are four sub lists, for each one the modules in it can be seen as one operation, + # and the order should be the order when they are truly executed, in this case (and usually in most cases), + # they are: attention q_k_v projection, attention output projection, MLP project input, MLP project output + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.out_proj"], + ["fc1"], + ["fc2"] + ] +``` +After this, you can use `OPTGPTQForCausalLM.from_pretrained` and other methods as shown in Basic. + +
+ +### Evaluation on Downstream Tasks +You can use tasks defined in `auto_gptq.eval_tasks` to evaluate model's performance on specific down-stream task before and after quantization. + +The predefined tasks support all causal-language-models implemented in [🤗 transformers](https://github.com/huggingface/transformers) and in this project. + +
+ +Below is an example to evaluate `EleutherAI/gpt-j-6b` on sequence-classification task using `cardiffnlp/tweet_sentiment_multilingual` dataset: + +```python +from functools import partial + +import datasets +from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +from auto_gptq.eval_tasks import SequenceClassificationTask + + +MODEL = "EleutherAI/gpt-j-6b" +DATASET = "cardiffnlp/tweet_sentiment_multilingual" +TEMPLATE = "Question:What's the sentiment of the given text? Choices are {labels}.\nText: {text}\nAnswer:" +ID2LABEL = { + 0: "negative", + 1: "neutral", + 2: "positive" +} +LABELS = list(ID2LABEL.values()) + + +def ds_refactor_fn(samples): + text_data = samples["text"] + label_data = samples["label"] + + new_samples = {"prompt": [], "label": []} + for text, label in zip(text_data, label_data): + prompt = TEMPLATE.format(labels=LABELS, text=text) + new_samples["prompt"].append(prompt) + new_samples["label"].append(ID2LABEL[label]) + + return new_samples + + +# model = AutoModelForCausalLM.from_pretrained(MODEL).eval().half().to("cuda:0") +model = AutoGPTQForCausalLM.from_pretrained(MODEL, BaseQuantizeConfig()) +tokenizer = AutoTokenizer.from_pretrained(MODEL) + +task = SequenceClassificationTask( + model=model, + tokenizer=tokenizer, + classes=LABELS, + data_name_or_path=DATASET, + prompt_col_name="prompt", + label_col_name="label", + **{ + "num_samples": 1000, # how many samples will be sampled to evaluation + "sample_max_len": 1024, # max tokens for each sample + "block_max_len": 2048, # max tokens for each data block + # function to load dataset, one must only accept data_name_or_path as input + # and return datasets.Dataset + "load_fn": partial(datasets.load_dataset, name="english"), + # function to preprocess dataset, which is used for datasets.Dataset.map, + # must return Dict[str, list] with only two keys: [prompt_col_name, label_col_name] + "preprocess_fn": ds_refactor_fn, + # truncate label when sample's length exceed sample_max_len + "truncate_prompt": False + } + ) + +# note that max_new_tokens will be automatically specified internally based on given classes +print(task.run()) + +# self-consistency +print( + task.run( + generation_config=GenerationConfig( + num_beams=3, + num_return_sequences=3, + do_sample=True + ) + ) +) +``` + +
+ +## Learn More +[tutorials](docs/tutorial) provide step-by-step guidance to integrate `auto_gptq` with your own project and some best practice principles. + +[examples](examples/README.md) provide plenty of example scripts to use `auto_gptq` in different ways. + +## Supported Models + +> you can use `model.config.model_type` to compare with the table below to check whether the model you use is supported by `auto_gptq`. +> +> for example, model_type of `WizardLM`, `vicuna` and `gpt4all` are all `llama`, hence they are all supported by `auto_gptq`. + +| model type | quantization | inference | peft-lora | peft-ada-lora | peft-adaption_prompt | +|------------------------------------|--------------|-----------|-----------|---------------|-------------------------------------------------------------------------------------------------| +| bloom | ✅ | ✅ | ✅ | ✅ | | +| gpt2 | ✅ | ✅ | ✅ | ✅ | | +| gpt_neox | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| gptj | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| llama | ✅ | ✅ | ✅ | ✅ | ✅ | +| moss | ✅ | ✅ | ✅ | ✅ | ✅[requires this peft branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt) | +| opt | ✅ | ✅ | ✅ | ✅ | | +| gpt_bigcode | ✅ | ✅ | ✅ | ✅ | | +| codegen | ✅ | ✅ | ✅ | ✅ | | +| falcon(RefinedWebModel/RefinedWeb) | ✅ | ✅ | ✅ | ✅ | | + +## Supported Evaluation Tasks +Currently, `auto_gptq` supports: `LanguageModelingTask`, `SequenceClassificationTask` and `TextSummarizationTask`; more Tasks will come soon! + +## Running tests + +Tests can be run with: + +``` +pytest tests/ -s +``` + +## FAQ + +### Which kernel is used by default? + +AutoGPTQ defaults to using exllamav2 int4*fp16 kernel for matrix multiplication. + +### How to use Marlin kernel? + +Marlin is an optimized int4 * fp16 kernel was recently proposed at https://github.com/IST-DASLab/marlin. This is integrated in AutoGPTQ when loading a model with `use_marlin=True`. This kernel is available only on devices with compute capability 8.0 or 8.6 (Ampere GPUs). + +## Acknowledgement +- Special thanks **Elias Frantar**, **Saleh Ashkboos**, **Torsten Hoefler** and **Dan Alistarh** for proposing **GPTQ** algorithm and open source the [code](https://github.com/IST-DASLab/gptq), and for releasing [Marlin kernel](https://github.com/IST-DASLab/marlin) for mixed precision computation. +- Special thanks **qwopqwop200**, for code in this project that relevant to quantization are mainly referenced from [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa/tree/cuda). +- Special thanks to **turboderp**, for releasing [Exllama](https://github.com/turboderp/exllama) and [Exllama v2](https://github.com/turboderp/exllamav2) libraries with efficient mixed precision kernels. diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/SOURCES.txt b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/SOURCES.txt new file mode 100644 index 0000000000000000000000000000000000000000..2e9baed8728a74e919a2469da8770c541b7aa154 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/SOURCES.txt @@ -0,0 +1,138 @@ +LICENSE +MANIFEST.in +README.md +setup.py +auto_gptq/__init__.py +auto_gptq.egg-info/PKG-INFO +auto_gptq.egg-info/SOURCES.txt +auto_gptq.egg-info/dependency_links.txt +auto_gptq.egg-info/requires.txt +auto_gptq.egg-info/top_level.txt +auto_gptq/eval_tasks/__init__.py +auto_gptq/eval_tasks/_base.py +auto_gptq/eval_tasks/language_modeling_task.py +auto_gptq/eval_tasks/sequence_classification_task.py +auto_gptq/eval_tasks/text_summarization_task.py +auto_gptq/eval_tasks/_utils/__init__.py +auto_gptq/eval_tasks/_utils/classification_utils.py +auto_gptq/eval_tasks/_utils/generation_utils.py +auto_gptq/modeling/__init__.py +auto_gptq/modeling/_base.py +auto_gptq/modeling/_const.py +auto_gptq/modeling/_utils.py +auto_gptq/modeling/auto.py +auto_gptq/modeling/baichuan.py +auto_gptq/modeling/bloom.py +auto_gptq/modeling/codegen.py +auto_gptq/modeling/cohere.py +auto_gptq/modeling/decilm.py +auto_gptq/modeling/gemma.py +auto_gptq/modeling/gpt2.py +auto_gptq/modeling/gpt_bigcode.py +auto_gptq/modeling/gpt_neox.py +auto_gptq/modeling/gptj.py +auto_gptq/modeling/internlm.py +auto_gptq/modeling/llama.py +auto_gptq/modeling/longllama.py +auto_gptq/modeling/mistral.py +auto_gptq/modeling/mixtral.py +auto_gptq/modeling/moss.py +auto_gptq/modeling/mpt.py +auto_gptq/modeling/opt.py +auto_gptq/modeling/phi.py +auto_gptq/modeling/qwen.py +auto_gptq/modeling/qwen2.py +auto_gptq/modeling/rw.py +auto_gptq/modeling/stablelmepoch.py +auto_gptq/modeling/starcoder2.py +auto_gptq/modeling/xverse.py +auto_gptq/modeling/yi.py +auto_gptq/nn_modules/__init__.py +auto_gptq/nn_modules/_fused_base.py +auto_gptq/nn_modules/fused_gptj_attn.py +auto_gptq/nn_modules/fused_llama_attn.py +auto_gptq/nn_modules/fused_llama_mlp.py +auto_gptq/nn_modules/qlinear/__init__.py +auto_gptq/nn_modules/qlinear/qlinear_cuda.py +auto_gptq/nn_modules/qlinear/qlinear_cuda_old.py +auto_gptq/nn_modules/qlinear/qlinear_exllama.py +auto_gptq/nn_modules/qlinear/qlinear_exllamav2.py +auto_gptq/nn_modules/qlinear/qlinear_marlin.py +auto_gptq/nn_modules/qlinear/qlinear_qigen.py +auto_gptq/nn_modules/qlinear/qlinear_triton.py +auto_gptq/nn_modules/qlinear/qlinear_tritonv2.py +auto_gptq/nn_modules/triton_utils/__init__.py +auto_gptq/nn_modules/triton_utils/custom_autotune.py +auto_gptq/nn_modules/triton_utils/dequant.py +auto_gptq/nn_modules/triton_utils/kernels.py +auto_gptq/nn_modules/triton_utils/mixin.py +auto_gptq/quantization/__init__.py +auto_gptq/quantization/config.py +auto_gptq/quantization/gptq.py +auto_gptq/quantization/quantizer.py +auto_gptq/utils/__init__.py +auto_gptq/utils/accelerate_utils.py +auto_gptq/utils/data_utils.py +auto_gptq/utils/exllama_utils.py +auto_gptq/utils/import_utils.py +auto_gptq/utils/marlin_utils.py +auto_gptq/utils/modeling_utils.py +auto_gptq/utils/peft_utils.py +auto_gptq/utils/perplexity_utils.py +autogptq_extension/cuda_256/autogptq_cuda_256.cpp +autogptq_extension/cuda_256/autogptq_cuda_kernel_256.cu +autogptq_extension/cuda_64/autogptq_cuda_64.cpp +autogptq_extension/cuda_64/autogptq_cuda_kernel_64.cu +autogptq_extension/exllama/cu_compat.cuh +autogptq_extension/exllama/cuda_buffers.cu +autogptq_extension/exllama/cuda_buffers.cuh +autogptq_extension/exllama/exllama_ext.cpp +autogptq_extension/exllama/hip_compat.cuh +autogptq_extension/exllama/matrix.cuh +autogptq_extension/exllama/tuning.h +autogptq_extension/exllama/util.cuh +autogptq_extension/exllama/cuda_func/column_remap.cu +autogptq_extension/exllama/cuda_func/column_remap.cuh +autogptq_extension/exllama/cuda_func/q4_matmul.cu +autogptq_extension/exllama/cuda_func/q4_matmul.cuh +autogptq_extension/exllama/cuda_func/q4_matrix.cu +autogptq_extension/exllama/cuda_func/q4_matrix.cuh +autogptq_extension/exllamav2/config.h +autogptq_extension/exllamav2/ext.cpp +autogptq_extension/exllamav2/cpp/util.h +autogptq_extension/exllamav2/cuda/compat.cuh +autogptq_extension/exllamav2/cuda/compat_gemm.cuh +autogptq_extension/exllamav2/cuda/matrix_view.cuh +autogptq_extension/exllamav2/cuda/q_gemm.cu +autogptq_extension/exllamav2/cuda/q_gemm.cuh +autogptq_extension/exllamav2/cuda/q_gemm_kernel.cuh +autogptq_extension/exllamav2/cuda/q_gemm_kernel_gptq.cuh +autogptq_extension/exllamav2/cuda/q_matrix.cu +autogptq_extension/exllamav2/cuda/q_matrix.cuh +autogptq_extension/exllamav2/cuda/util.cuh +autogptq_extension/exllamav2/cuda/quant/qdq_2.cuh +autogptq_extension/exllamav2/cuda/quant/qdq_3.cuh +autogptq_extension/exllamav2/cuda/quant/qdq_4.cuh +autogptq_extension/exllamav2/cuda/quant/qdq_5.cuh +autogptq_extension/exllamav2/cuda/quant/qdq_6.cuh +autogptq_extension/exllamav2/cuda/quant/qdq_8.cuh +autogptq_extension/exllamav2/cuda/quant/qdq_util.cuh +autogptq_extension/marlin/marlin_cuda.cpp +autogptq_extension/marlin/marlin_cuda_kernel.cu +autogptq_extension/marlin/marlin_cuda_kernel.cuh +autogptq_extension/marlin/marlin_repack.cu +autogptq_extension/marlin/marlin_repack.cuh +autogptq_extension/qigen/generate.py +autogptq_extension/qigen/intrin.py +autogptq_extension/qigen/mmm.cpp +autogptq_extension/qigen/template.py +tests/__init__.py +tests/bench_autoawq_autogptq.py +tests/test_awq_compatibility_generation.py +tests/test_peft_conversion.py +tests/test_q4.py +tests/test_quantization.py +tests/test_repacking.py +tests/test_serialization.py +tests/test_sharded_loading.py +tests/test_triton.py \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/dependency_links.txt b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/dependency_links.txt new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/requires.txt b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/requires.txt new file mode 100644 index 0000000000000000000000000000000000000000..12bc1b77abba3dff8dce794085d279e09401a35b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/requires.txt @@ -0,0 +1,21 @@ +accelerate>=0.26.0 +datasets +sentencepiece +numpy +rouge +gekko +torch>=1.13.0 +safetensors +transformers>=4.31.0 +peft>=0.5.0 +tqdm + +[quality] +ruff==0.1.5 + +[test] +pytest +parameterized + +[triton] +triton==2.0.0 diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/top_level.txt b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/top_level.txt new file mode 100644 index 0000000000000000000000000000000000000000..6316fbb4247980710e9fe2bacb8769ecef84ff41 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq.egg-info/top_level.txt @@ -0,0 +1,7 @@ +auto_gptq +autogptq_cuda_256 +autogptq_cuda_64 +autogptq_marlin_cuda +exllama_kernels +exllamav2_kernels +tests diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..cf1c2a9e838781b0bada877f87a6362f0b83d14a --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/__init__.py @@ -0,0 +1,6 @@ +from .modeling import AutoGPTQForCausalLM, BaseQuantizeConfig +from .utils.exllama_utils import exllama_set_max_input_length +from .utils.peft_utils import get_gptq_peft_model + + +__version__ = "0.8.0.dev0" diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ac0e178f11e52e46afa2b0ead26e8f9ed0ae4cdd --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/__init__.py @@ -0,0 +1,3 @@ +from .language_modeling_task import LanguageModelingTask +from .sequence_classification_task import SequenceClassificationTask, get_predictions +from .text_summarization_task import TextSummarizationTask diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_base.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_base.py new file mode 100644 index 0000000000000000000000000000000000000000..1bb3be2e430b680e02ce17cdff58626286b3bab2 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_base.py @@ -0,0 +1,65 @@ +from abc import abstractmethod +from typing import Any, Dict, List, Optional, Union + +import torch +from transformers import PreTrainedModel, PreTrainedTokenizer + +from ..modeling import BaseGPTQForCausalLM +from ..utils.data_utils import get_dataloader + + +class BaseTask: + def __init__( + self, + model: Union[BaseGPTQForCausalLM, PreTrainedModel], + tokenizer: PreTrainedTokenizer, + data_name_or_path: str, + prompt_col_name: str, + label_col_name: str, + device: Optional[str] = None, + **kwargs, + ): + self.model = model + self.tokenizer = tokenizer + if self.tokenizer.pad_token_id is None: + self.tokenizer.pad_token = self.tokenizer.eos_token + self.tokenizer.pad_token_id = self.tokenizer.eos_token_id + self.model.config.pad_token_id = self.tokenizer.eos_token_id + self.dl = get_dataloader( + data_name_or_path, + prompt_col_name=prompt_col_name, + label_col_name=label_col_name, + tokenizer=tokenizer, + **kwargs, + ) + + self.device = device + if not self.device: + self.device = self.model.device + if isinstance(self.device, str): + self.device = torch.device(self.device) + + @abstractmethod + def _predict(self, batch_data: Dict[str, Any], **kwargs) -> List[Any]: + pass + + @abstractmethod + def _parse_labels(self, label_ids: torch.LongTensor) -> List[Any]: + pass + + @abstractmethod + def _metric(self, pred: List[Any], label: List[Any]) -> Dict[str, float]: + pass + + def run(self, **predict_kwargs) -> Dict[str, float]: + with torch.inference_mode(), torch.amp.autocast(device_type=self.device.type): + predictions = [] + labels = [] + for batch_data in self.dl: + for k, v in batch_data.items(): + if isinstance(v, torch.Tensor): + batch_data[k] = v.to(self.device) + labels += self._parse_labels(batch_data["labels"]) + predictions += self._predict(batch_data, **predict_kwargs) + + return self._metric(predictions, labels) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_utils/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_utils/classification_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_utils/classification_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..9cf5e6af92250ed3426eecce72b53fc298361e7d --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_utils/classification_utils.py @@ -0,0 +1,44 @@ +import sys +from typing import List, Sequence + +import numpy as np + + +def levenshtein_distance(seq1: Sequence, seq2: Sequence): + if seq1 == seq2: + return 0 + num_rows = len(seq1) + 1 + num_cols = len(seq2) + 1 + dp_matrix = np.empty((num_rows, num_cols)) + dp_matrix[0, :] = range(num_cols) + dp_matrix[:, 0] = range(num_rows) + + for i in range(1, num_rows): + for j in range(1, num_cols): + if seq1[i - 1] == seq2[j - 1]: + dp_matrix[i, j] = dp_matrix[i - 1, j - 1] + else: + dp_matrix[i, j] = ( + min( + dp_matrix[i - 1, j - 1], + dp_matrix[i - 1, j], + dp_matrix[i, j - 1], + ) + + 1 + ) + + return dp_matrix[num_rows - 1, num_cols - 1] + + +def get_closest_label(pred: Sequence, classes: List[Sequence]) -> int: + min_id = sys.maxsize + min_edit_distance = sys.maxsize + for i, class_label in enumerate(classes): + edit_distance = levenshtein_distance(pred, class_label) + if edit_distance < min_edit_distance: + min_id = i + min_edit_distance = edit_distance + return min_id + + +__all__ = ["levenshtein_distance", "get_closest_label"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_utils/generation_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_utils/generation_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..0c5dd3c5020fefaf1f7a78c334a24a1e9d2d3e57 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/_utils/generation_utils.py @@ -0,0 +1,36 @@ +from typing import List, Optional, Union + +from torch import LongTensor +from transformers import PreTrainedTokenizer + + +def postprocess_generation_ids( + input_ids: LongTensor, + output_ids: LongTensor, + num_return_sequences: int, + tokenizer: Optional[PreTrainedTokenizer] = None, + pad_token_ids: Optional[int] = None, +) -> List[List[Union[str, List[int]]]]: + outputs = [] + for idx, start in enumerate(range(0, len(output_ids), num_return_sequences)): + sub_output_ids = output_ids[start : start + num_return_sequences] + sub_generated_ids = sub_output_ids[..., input_ids[idx].size(0) :] + if tokenizer: + decoded_bach = ( + generated_text + for generated_text in tokenizer.batch_decode(sub_generated_ids, clean_up_tokenization_spaces=True) + ) + decoded_bach = list(decoded_bach) + outputs.append(decoded_bach) + else: + sub_generated_ids = sub_output_ids.cpu().numpy().tolist() + for i, one_sub_generated_ids in enumerate(sub_generated_ids): + if pad_token_ids is not None and pad_token_ids in one_sub_generated_ids: + one_sub_generated_ids = one_sub_generated_ids[: one_sub_generated_ids.index(pad_token_ids)] + sub_generated_ids[i] = one_sub_generated_ids + outputs.append(sub_generated_ids) + + return outputs + + +__all__ = ["postprocess_generation_ids"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/language_modeling_task.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/language_modeling_task.py new file mode 100644 index 0000000000000000000000000000000000000000..98efae77c68e4da5593f6a2d10c8b40c018cf36e --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/language_modeling_task.py @@ -0,0 +1,47 @@ +import math +from typing import Any, Dict, List, Optional + +from torch import LongTensor + +from ._base import BaseTask + + +class LanguageModelingTask(BaseTask): + def __init__( + self, + model, + tokenizer, + data_name_or_path: str, + prompt_col_name: str, + label_col_name: str, + device: Optional[str] = None, + **kwargs, + ): + kwargs["merge_prompt_label"] = True + super().__init__( + model=model, + tokenizer=tokenizer, + data_name_or_path=data_name_or_path, + prompt_col_name=prompt_col_name, + label_col_name=label_col_name, + device=device, + **kwargs, + ) + + def _predict(self, batch_data: Dict[str, Any], *args, **kwargs) -> List[float]: + outputs = self.model(**batch_data) + loss = outputs.loss.cpu().item() + + return [loss] + + def _parse_labels(self, label_ids: LongTensor) -> List[Any]: + return [] + + def _metric(self, pred: List[Any], label: List[Any]) -> Dict[str, float]: + return {"ppl": math.exp(sum(pred) / len(pred))} + + def run(self) -> Dict[str, float]: + return super().run() + + +__all__ = ["LanguageModelingTask"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/sequence_classification_task.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/sequence_classification_task.py new file mode 100644 index 0000000000000000000000000000000000000000..9de3d9b273a7352b80e6bbf91f93c7c904c1b376 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/sequence_classification_task.py @@ -0,0 +1,103 @@ +from collections import Counter +from typing import Any, Dict, List, Optional + +import numpy as np +from torch import LongTensor +from transformers import GenerationConfig, PreTrainedTokenizer + +from ._base import BaseTask +from ._utils.classification_utils import get_closest_label +from ._utils.generation_utils import postprocess_generation_ids + + +def get_predictions( + input_ids: LongTensor, + output_ids: LongTensor, + num_return_sequences: int, + tokenizer: PreTrainedTokenizer, + classes: List[str], +) -> List[int]: + predictions = [] + generated_texts = postprocess_generation_ids( + input_ids=input_ids, + output_ids=output_ids, + num_return_sequences=num_return_sequences, + tokenizer=tokenizer, + ) + for sub_generated_texts in generated_texts: + sub_predictions = [] + for gen_text in sub_generated_texts: + sub_predictions.append(get_closest_label(gen_text.lower().strip(), classes)) + predictions.append(Counter(sub_predictions).most_common(1)[0][0]) + return predictions + + +class SequenceClassificationTask(BaseTask): + def __init__( + self, + model, + tokenizer: PreTrainedTokenizer, + classes: List[str], + data_name_or_path: str, + prompt_col_name: str, + label_col_name: str, + device: Optional[str] = None, + **kwargs, + ): + kwargs["merge_prompt_label"] = False + super().__init__( + model=model, + tokenizer=tokenizer, + data_name_or_path=data_name_or_path, + prompt_col_name=prompt_col_name, + label_col_name=label_col_name, + device=device, + **kwargs, + ) + self.classes = [each.lower().strip() for each in classes] + classes_ids = self.tokenizer(classes) + self.max_new_tokens = max([len(each) for each in classes_ids]) + + def _predict(self, batch_data: Dict[str, Any], *args, **kwargs) -> List[int]: + generation_config = kwargs["generation_config"] + output_ids = self.model.generate( + input_ids=batch_data["input_ids"], + attention_mask=batch_data["attention_mask"], + generation_config=generation_config, + ) + return get_predictions( + batch_data["input_ids"], + output_ids, + generation_config.num_return_sequences, + self.tokenizer, + self.classes, + ) + + def _parse_labels(self, label_ids: LongTensor) -> List[int]: + labels = [] + for one_label_ids in label_ids: + one_label_ids = one_label_ids[(one_label_ids == -100).sum() :] + label = self.tokenizer.decode(one_label_ids, clean_up_tokenization_spaces=True).lower().strip() + label = get_closest_label(label, self.classes) + labels.append(label) + + return labels + + def _metric(self, pred: List[int], label: List[int]) -> Dict[str, float]: + pred = np.array(pred) + label = np.array(label) + + acc = (pred == label).mean() + + return {"acc": acc} + + def run(self, generation_config: Optional[GenerationConfig] = None) -> Dict[str, float]: + if not generation_config: + generation_config = GenerationConfig(num_beams=1, do_sample=False, num_return_sequences=1) + generation_config.max_new_tokens = self.max_new_tokens + generation_config.eos_token_id = self.tokenizer.eos_token_id + generation_config.pad_token_id = self.tokenizer.pad_token_id + return super().run(generation_config=generation_config) + + +__all__ = ["SequenceClassificationTask"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/text_summarization_task.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/text_summarization_task.py new file mode 100644 index 0000000000000000000000000000000000000000..0e02b95421a005d493bcdb9c44e1e4ef43e0f588 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/eval_tasks/text_summarization_task.py @@ -0,0 +1,72 @@ +from typing import Any, Dict, List, Optional + +import rouge +from torch import LongTensor +from transformers import GenerationConfig + +from ._base import BaseTask +from ._utils.generation_utils import postprocess_generation_ids + + +class TextSummarizationTask(BaseTask): + def __init__( + self, + model, + tokenizer, + data_name_or_path: str, + prompt_col_name: str, + label_col_name: str, + device: Optional[str] = None, + **kwargs, + ): + kwargs["merge_prompt_label"] = False + super().__init__( + model=model, + tokenizer=tokenizer, + data_name_or_path=data_name_or_path, + prompt_col_name=prompt_col_name, + label_col_name=label_col_name, + device=device, + **kwargs, + ) + + def _predict(self, batch_data: Dict[str, Any], *args, **kwargs) -> List[str]: + generation_config = kwargs["generation_config"] + output_ids = self.model.generate( + input_ids=batch_data["input_ids"], + attention_mask=batch_data["attention_mask"], + generation_config=generation_config, + ) + return [ + each[0].lower().strip() + for each in postprocess_generation_ids( + input_ids=batch_data["input_ids"], + output_ids=output_ids, + num_return_sequences=generation_config.num_return_sequences, + tokenizer=self.tokenizer, + ) + ] + + def _parse_labels(self, label_ids: LongTensor) -> List[str]: + labels = [] + for one_label_ids in label_ids: + one_label_ids = one_label_ids[(one_label_ids == -100).sum() :] + label = self.tokenizer.decode(one_label_ids).lower().strip() + labels.append(label) + + return labels + + def _metric(self, pred: List[Any], label: List[Any]) -> Dict[str, Dict[str, float]]: + metric = rouge.Rouge() + return metric.get_scores(hyps=pred, refs=label, avg=True) + + def run(self, generation_config: Optional[GenerationConfig] = None) -> Dict[str, float]: + if not generation_config: + generation_config = GenerationConfig(num_beams=1, do_sample=False, max_new_tokens=128) + generation_config.num_return_sequences = 1 + generation_config.eos_token_id = self.tokenizer.eos_token_id + generation_config.pad_token_id = self.tokenizer.pad_token_id + return super().run(generation_config=generation_config) + + +__all__ = ["TextSummarizationTask"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ff0bcad3f512b68d02585c314e9da0b35b104279 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/__init__.py @@ -0,0 +1,28 @@ +from ._base import BaseGPTQForCausalLM, BaseQuantizeConfig +from .auto import GPTQ_CAUSAL_LM_MODEL_MAP, AutoGPTQForCausalLM +from .baichuan import BaiChuanGPTQForCausalLM +from .bloom import BloomGPTQForCausalLM +from .codegen import CodeGenGPTQForCausalLM +from .cohere import CohereGPTQForCausalLM +from .decilm import DeciLMGPTQForCausalLM +from .gemma import GemmaGPTQForCausalLM +from .gpt2 import GPT2GPTQForCausalLM +from .gpt_bigcode import GPTBigCodeGPTQForCausalLM +from .gpt_neox import GPTNeoXGPTQForCausalLM +from .gptj import GPTJGPTQForCausalLM +from .internlm import InternLMGPTQForCausalLM +from .llama import LlamaGPTQForCausalLM +from .longllama import LongLlamaGPTQForCausalLM +from .mistral import MistralGPTQForCausalLM +from .mixtral import MixtralGPTQForCausalLM +from .moss import MOSSGPTQForCausalLM +from .mpt import MPTGPTQForCausalLM +from .opt import OPTGPTQForCausalLM +from .phi import PhiGPTQForCausalLM +from .qwen import QwenGPTQForCausalLM +from .qwen2 import Qwen2GPTQForCausalLM +from .rw import RWGPTQForCausalLM +from .stablelmepoch import StableLMEpochGPTQForCausalLM +from .starcoder2 import Starcoder2GPTQForCausalLM +from .xverse import XverseGPTQForCausalLM +from .yi import YiGPTQForCausalLM diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_base.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_base.py new file mode 100644 index 0000000000000000000000000000000000000000..885eabfa33d111b6836ea6d4ea8f1433b8b0c7d0 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_base.py @@ -0,0 +1,1319 @@ +import copy +import logging +import os +from os.path import isdir, join +from typing import Dict, List, Optional, Union + +import accelerate +import torch +import torch.nn as nn +import transformers +from accelerate.hooks import remove_hook_from_module +from safetensors import safe_open +from safetensors.torch import load_file as safe_load +from safetensors.torch import save_file as safe_save +from tqdm import tqdm +from transformers import AutoConfig, AutoModelForCausalLM, PreTrainedModel +from transformers.modeling_utils import no_init_weights +from transformers.utils.generic import ContextManagers +from transformers.utils.hub import ( + CommitOperationAdd, + PushToHubMixin, + create_commit, + create_repo, +) + +from ..nn_modules._fused_base import FusedBaseAttentionModule, FusedBaseMLPModule +from ..nn_modules.qlinear import GeneralQuantLinear +from ..quantization import GPTQ, BaseQuantizeConfig +from ..quantization.config import ( + CHECKPOINT_FORMAT, + CHECKPOINT_FORMAT_FIELD, + QUANT_METHOD_FIELD, + QUANTIZE_BLACK_LIST, +) +from ..utils.accelerate_utils import load_checkpoint_in_model +from ..utils.data_utils import collate_data +from ..utils.import_utils import ( + AUTOGPTQ_CUDA_AVAILABLE, + EXLLAMA_KERNELS_AVAILABLE, + EXLLAMAV2_KERNELS_AVAILABLE, + MARLIN_AVAILABLE, + QIGEN_AVAILABLE, + TRITON_AVAILABLE, + dynamically_import_QuantLinear, +) +from ..utils.marlin_utils import ( + _validate_marlin_compatibility, + _validate_marlin_device_support, + prepare_model_for_marlin_load, +) +from ._const import CPU, CUDA_0, SUPPORTED_MODELS +from ._utils import ( + autogptq_post_init, + find_layers, + get_checkpoints, + get_device, + get_module_by_name_prefix, + get_module_by_name_suffix, + make_quant, + make_sure_no_tensor_in_meta_device, + move_to_device, + pack_from_tensors, + pack_model, + preprocess_checkpoint_qigen, + simple_dispatch_model, + unpack_awq, +) + + +logger = logging.getLogger(__name__) +handler = logging.StreamHandler() +formatter = logging.Formatter("%(levelname)s - %(message)s") +handler.setFormatter(formatter) +logger.propagate = False +logger.addHandler(handler) +logger.setLevel(logging.INFO) + + +def nested_move_to_device(v, device): + if isinstance(v, torch.Tensor): + return move_to_device(v, device) + elif isinstance(v, (list, tuple)): + return type(v)([nested_move_to_device(e, device) for e in v]) + else: + return v + + +class BaseGPTQForCausalLM(nn.Module, PushToHubMixin): + layer_type: str = None + layers_block_name: str = None + outside_layer_modules: List[str] = None + inside_layer_modules: List[List[str]] = None + lm_head_name: str = "lm_head" + + fused_attn_module_type: Optional[FusedBaseAttentionModule] = None + fused_mlp_module_type: Optional[FusedBaseMLPModule] = None + + def __init__( + self, + model: PreTrainedModel, + quantized: bool, + quantize_config: BaseQuantizeConfig, + is_triton_backend: bool = False, + injected_fused_attention: bool = False, + injected_fused_mlp: bool = False, + trainable: bool = False, + ): + super().__init__() + + self.model = model + self.model_type = self.model.config.model_type + self._quantized = quantized + self.quantize_config = quantize_config + self.config = self.model.config + + self.is_triton_backend = is_triton_backend + self.injected_fused_attention = injected_fused_attention + self.injected_fused_mlp = injected_fused_mlp + self.trainable = trainable + + @property + def quantized(self): + return self._quantized + + @property + def hf_device_map(self): + return getattr(self.model, "hf_device_map", None) + + def _prepare_examples_for_quantization( + self, + examples: List[Dict[str, Union[List[int], torch.LongTensor]]], + batch_size: int = 1, + ): + def _convert_tensor_to_list(tensor): + if isinstance(tensor, torch.Tensor): + if len(tensor.shape) == 1: + tensor = tensor.unsqueeze(0) + tensor = tensor.long() + return tensor.cpu().numpy().tolist() + return [tensor] + + new_examples = [] + for example in examples: + input_ids = _convert_tensor_to_list(example["input_ids"]) + attention_mask = _convert_tensor_to_list(example["attention_mask"]) + if "labels" in example: + labels = _convert_tensor_to_list(example["labels"]) + elif "label" in example: + labels = _convert_tensor_to_list(example["label"]) + elif "label_ids" in example: + labels = _convert_tensor_to_list(example["label_ids"]) + else: + labels = copy.deepcopy(input_ids) + new_examples.append( + { + "input_ids": input_ids, + "attention_mask": attention_mask, + "labels": labels, + } + ) + pad_token_id = self.config.pad_token_id + if not pad_token_id: + pad_token_id = self.config.eos_token_id + + new_examples = [ + collate_data(new_examples[start : start + batch_size], pad_token_id) + for start in range(0, len(new_examples), batch_size) + ] + for new_example in new_examples: + del new_example["labels"] + + return new_examples + + @torch.inference_mode() + def quantize( + self, + examples: List[Dict[str, Union[List[int], torch.LongTensor]]], + batch_size: int = 1, + use_triton: bool = False, + use_cuda_fp16: bool = True, + autotune_warmup_after_quantized: bool = False, + cache_examples_on_gpu: bool = True, + ): + if self.quantized: + raise EnvironmentError("can't execute quantize because the model is quantized.") + + if self.quantize_config.quant_method in QUANTIZE_BLACK_LIST: + raise ValueError(f"Unsupported quantization operation for quant method: {self.quantize_config.quant_method}") + + # alert users to limit threads so packing performance does not regress by up to ~100x + thread_warning = """If you have not already done so, please inject the following code at the very top of your +quantization script so the packing stage is optimized for speed. Using too many cores may reduce packing performance. +---- +import os +import math +max_threads = str(min(8, os.cpu_count())) +os.environ['OMP_NUM_THREADS'] = max_threads +os.environ['OPENBLAS_NUM_THREADS'] = max_threads +os.environ['MKL_NUM_THREADS'] = max_threads +os.environ['VECLIB_MAXIMUM_THREADS'] = max_threads +os.environ['NUMEXPR_NUM_THREADS'] = max_threads +os.environ['NUMEXPR_MAX_THREADS'] = max_threads +---- +""" + logger.warning(thread_warning) + + if use_triton and not TRITON_AVAILABLE: + logger.warning("triton is not installed, reset use_triton to False") + use_triton = False + + device_map = self.hf_device_map + if device_map: + for name, device in device_map.items(): + if device == "cpu": + logger.info(f"truly offloading {name} to cpu with hook.") + module = get_module_by_name_suffix(self.model, name) + remove_hook_from_module(module, recurse=True) + accelerate.cpu_offload_with_hook(module, CUDA_0) + + layer_inputs = [] + attention_masks = [] + position_ids = [] + layer_input_kwargs = [] + layer_outputs = [] + + examples = self._prepare_examples_for_quantization(examples, batch_size) + + forward_pass_use_cache = self.model.config.use_cache + self.model.config.use_cache = False + + num_batches = len(examples) + layers = get_module_by_name_prefix(self.model, self.layers_block_name) + + cur_layer_device = get_device(layers[0]) + data_device = cur_layer_device if cache_examples_on_gpu else CPU + def store_input_hook(_, args, kwargs): + # Positional arguments. + layer_input = [] + for inp in args: + layer_input.append(move_to_device(inp, data_device)) + layer_inputs.append(layer_input) + + # Keyword arguments. + if kwargs["attention_mask"] is not None: + attention_masks.append(kwargs["attention_mask"].to(data_device)) + else: + attention_masks.append(None) + + pos_ids = kwargs.get("position_ids", None) + if pos_ids is not None: + position_ids.append(move_to_device(pos_ids, data_device)) + one_kwargs = {} + for ( + k, + v, + ) in kwargs.items(): # make sure other arguments also be captured + if k not in ["hidden_states", "attention_mask", "position_ids"]: + one_kwargs[k] = nested_move_to_device(v, data_device) + layer_input_kwargs.append(one_kwargs) + raise ValueError + + force_layer_back_to_cpu = False + if get_device(layers[0]) == CPU: + layers[0] = layers[0].to(CUDA_0) + force_layer_back_to_cpu = True + + ori_outside_layer_module_devices = {} + for module_name in self.outside_layer_modules: + module = get_module_by_name_prefix(self.model, module_name) + + if module is None: + continue + + ori_outside_layer_module_devices[module_name] = get_device(module) + if module is not None: + move_to_device(module, cur_layer_device) + + # TODO: make this optional, backporting https://github.com/huggingface/optimum/blob/main/optimum/gptq/quantizer.py + handle = layers[0].register_forward_pre_hook(store_input_hook, with_kwargs=True) + for example in examples: + for k, v in example.items(): + if len(v.shape) == 1: + v = v.unsqueeze(0) + example[k] = move_to_device(v, cur_layer_device) + try: + self.model(**example) + except ValueError: + pass + handle.remove() + + move_to_device(layers[0], CPU if force_layer_back_to_cpu else cur_layer_device) + for module_name in self.outside_layer_modules: + module = get_module_by_name_prefix(self.model, module_name) + if module is not None: + move_to_device(module, ori_outside_layer_module_devices[module_name]) + + torch.cuda.empty_cache() + + inside_layer_modules = self.inside_layer_modules + if not self.quantize_config.true_sequential: + inside_layer_modules = [sum(inside_layer_modules, [])] + quantizers = {} + for i in range(len(layers)): + logger.info(f"Start quantizing layer {i + 1}/{len(layers)}") + layer = layers[i] + force_layer_back_to_cpu = False + if get_device(layer) == CPU: + move_to_device(layer, CUDA_0) + force_layer_back_to_cpu = True + cur_layer_device = get_device(layer) + + full = find_layers(layer) + for names in inside_layer_modules: + subset = {n: full[n] for n in names if n in full} + gptq = {} + for name in subset: + gptq[name] = GPTQ(subset[name]) + gptq[name].quantizer.configure( + self.quantize_config.bits, + perchannel=True, + sym=self.quantize_config.sym, + mse=False, + ) + + def add_batch(name): + def tmp(_, inp, out): + # gptq is mutable. + gptq[name].add_batch(inp[0].data, out.data) # noqa: F821 + + return tmp + + handles = [] + for name in subset: + handles.append(subset[name].register_forward_hook(add_batch(name))) + for j in range(num_batches): + layer_input = [] + for k, layer_inp in enumerate(layer_inputs[j]): + layer_input.append(move_to_device(layer_inp, cur_layer_device)) + + layer_attention_mask = move_to_device(attention_masks[j], cur_layer_device) + additional_layer_inputs = {"attention_mask": layer_attention_mask} + layer_position_ids = ( + None if not position_ids else move_to_device(position_ids[j], cur_layer_device) + ) + if layer_position_ids is not None: + additional_layer_inputs["position_ids"] = layer_position_ids + for k, v in layer_input_kwargs[j].items(): + additional_layer_inputs[k] = nested_move_to_device(v, cur_layer_device) + layer(*layer_input, **additional_layer_inputs) + for h in handles: + h.remove() + + for name in subset: + logger.info(f"Quantizing {name} in layer {i + 1}/{len(layers)}...") + scale, zero, g_idx = gptq[name].fasterquant( + percdamp=self.quantize_config.damp_percent, + group_size=self.quantize_config.group_size, + actorder=self.quantize_config.desc_act, + static_groups=self.quantize_config.static_groups, + ) + quantizers[f"{self.layers_block_name}.{i}.{name}"] = ( + gptq[name].quantizer.to(CPU if force_layer_back_to_cpu else cur_layer_device), + move_to_device(scale, CPU if force_layer_back_to_cpu else cur_layer_device), + move_to_device(zero, CPU if force_layer_back_to_cpu else cur_layer_device), + move_to_device(g_idx, CPU if force_layer_back_to_cpu else cur_layer_device), + ) + gptq[name].free() + + for j in range(num_batches): + layer_input = [] + for k, layer_inp in enumerate(layer_inputs[j]): + layer_input.append(move_to_device(layer_inp, cur_layer_device)) + + layer_attention_mask = move_to_device(attention_masks[j], cur_layer_device) + additional_layer_inputs = {"attention_mask": layer_attention_mask} + layer_position_ids = None if not position_ids else move_to_device(position_ids[j], cur_layer_device) + if layer_position_ids is not None: + additional_layer_inputs["position_ids"] = layer_position_ids + for k, v in layer_input_kwargs[j].items(): + additional_layer_inputs[k] = nested_move_to_device(v, cur_layer_device) + layer_output = move_to_device( + layer(*layer_input, **additional_layer_inputs)[0], + cur_layer_device if cache_examples_on_gpu else CPU, + ) + layer_outputs.append([layer_output]) + + layers[i] = move_to_device(layer, CPU if force_layer_back_to_cpu else cur_layer_device) + del layer + del gptq + del layer_inputs + layer_inputs, layer_outputs = layer_outputs, [] # TODO: is it really OK to cache only the first positional argument? + torch.cuda.empty_cache() + + pack_model( + model=self.model, + quantizers=quantizers, + bits=self.quantize_config.bits, + group_size=self.quantize_config.group_size, + use_triton=use_triton, + use_cuda_fp16=use_cuda_fp16, + desc_act=self.quantize_config.desc_act, + warmup_triton=autotune_warmup_after_quantized, + force_layer_back_to_cpu=force_layer_back_to_cpu, + use_marlin=self.quantize_config.checkpoint_format == CHECKPOINT_FORMAT.MARLIN, + ) + if device_map: + self.model = remove_hook_from_module(self.model, recurse=True) + self.model = simple_dispatch_model(self.model, device_map) + self.model.config.use_cache = forward_pass_use_cache + + self._quantized = True + + torch.cuda.empty_cache() + + @property + def device(self): + if not self.hf_device_map: + return self.model.device + else: + device = [d for d in self.hf_device_map.values() if d not in {"disk"}][0] + return torch.device(device) + + def to(self, device: Union[str, torch.device]): + self.model.to(device) + return self + + def forward(self, *args, **kwargs): + return self.model(*args, **kwargs) + + def generate(self, **kwargs): + """shortcut for model.generate""" + with torch.inference_mode(), torch.amp.autocast(device_type=self.device.type): + return self.model.generate(**kwargs) + + def prepare_inputs_for_generation(self, *args, **kwargs): + """shortcut for model.prepare_inputs_for_generation""" + return self.model.prepare_inputs_for_generation(*args, **kwargs) + + def push_to_hub( + self, + repo_id: str, + save_dir: Optional[str] = None, + use_safetensors: Optional[bool] = True, + safetensors_metadata: Optional[Dict[str, str]] = None, + commit_message: Optional[str] = "Upload of AutoGPTQ quantized model", + use_auth_token: Optional[Union[bool, str]] = None, + private: Optional[bool] = None, + token: Optional[Union[bool, str]] = None, + create_pr: Optional[bool] = False, + ) -> str: + """ + Upload the model to the Hugging Face Hub. + + Parameters: + repo_id (`str`): + The name of the repository you want to push your tool to. It should contain your organization name when + pushing to a given organization. + save_dir (`str`, *optional*): + The name of the local folder to save the model to. + If the model has already been saved, this parameter can be omitted. + use_safetensors (`bool`, *optional*): + Save the model using `safetensors`. + If the model has already been saved, this parameter can be omitted. + safetensors_metadata: (`dict`, *optional*, defaults to `None`): + Pass optional metadata dictionary to be saved in the `safetensors` model file(s). + Metadata is optional and is purely for informational purposes. It does not affect inference. + If `None`, no metadata will be saved. + commit_message (`str`, *optional*, defaults to `"Upload tool"`): + Message to commit while pushing. + use_auth_token (`bool` or `str`, *optional*): + The token to use as HTTP bearer authorization for remote files. If `True`, will use the token generated + when running `huggingface-cli login` (stored in `~/.huggingface`). Will default to `True` if `repo_url` + is not specified. + private (`bool`, *optional*): + Whether or not the repository created should be private. + token (`bool` or `str`, *optional*): + The token to use as HTTP bearer authorization for remote files. If unset, will use the token generated + when running `huggingface-cli login` (stored in `~/.huggingface`). + create_pr (`bool`, *optional*, defaults to `False`): + Whether or not to create a PR with the uploaded files or directly commit. + """ + if ( + self.quantize_config.model_name_or_path is None or not isdir(self.quantize_config.model_name_or_path) + ) and save_dir is None: + raise ValueError( + "Quantized model should be saved first, or you can provide save_dir to make sure model is saved to local disk before uploading." + ) + + if save_dir is not None: + logger.info(f"Saving model to {save_dir}") + self.save_quantized(save_dir, use_safetensors, safetensors_metadata) + + repo_url = create_repo( + repo_id=repo_id, + token=token, + private=private, + exist_ok=True, + repo_type="model", + ) + repo_id = repo_url.repo_id + + if self.quantize_config.model_name_or_path is not None: + work_dir = self.quantize_config.model_name_or_path + operations = [ + CommitOperationAdd(path_or_fileobj=join(work_dir, f), path_in_repo=f) for f in os.listdir(work_dir) + ] + logger.info(f"Uploading the following files to {repo_id}: {','.join(os.listdir(work_dir))}") + return create_commit( + repo_id=repo_id, + operations=operations, + commit_message=commit_message, + token=use_auth_token, + create_pr=create_pr, + repo_type="model", + ) + + def save_quantized( + self, + save_dir: str, + use_safetensors: bool = True, + safetensors_metadata: Optional[Dict[str, str]] = None, + ): + """save quantized model and configs to local disk""" + os.makedirs(save_dir, exist_ok=True) + + if not self.quantized: + raise EnvironmentError("can only save quantized model, please execute .quantize first.") + + self.model.to(CPU) + + model_base_name = ( + self.quantize_config.model_file_base_name + or f"gptq_model-{self.quantize_config.bits}bit-{self.quantize_config.group_size}g" + ) + if use_safetensors: + model_save_name = model_base_name + ".safetensors" + state_dict = self.model.state_dict() + state_dict = {k: v.clone().contiguous() for k, v in state_dict.items()} + if safetensors_metadata is None: + safetensors_metadata = {} + elif not isinstance(safetensors_metadata, dict): + raise TypeError("safetensors_metadata must be a dictionary.") + else: + logger.debug(f"Received safetensors_metadata: {safetensors_metadata}") + new_safetensors_metadata = {} + converted_keys = False + for key, value in safetensors_metadata.items(): + if not isinstance(key, str) or not isinstance(value, str): + converted_keys = True + try: + new_key = str(key) + new_value = str(value) + except Exception as e: + raise TypeError( + f"safetensors_metadata: both keys and values must be strings and an error occured when trying to convert them: {e}" + ) + if new_key in new_safetensors_metadata: + logger.warning( + f"After converting safetensors_metadata keys to strings, the key '{new_key}' is duplicated. Ensure that all your metadata keys are strings to avoid overwriting." + ) + new_safetensors_metadata[new_key] = new_value + safetensors_metadata = new_safetensors_metadata + if converted_keys: + logger.debug( + f"One or more safetensors_metadata keys or values had to be converted to str(). Final safetensors_metadata: {safetensors_metadata}" + ) + + # Format is required to enable Accelerate to load the metadata + # otherwise it raises an OSError + safetensors_metadata["format"] = "pt" + + # Store the quantization configuration as safetensors metadata + from auto_gptq import __version__ + + safetensors_metadata["auto_gptq_version"] = str(__version__) + safetensors_metadata["gptq_bits"] = str(self.quantize_config.bits) + safetensors_metadata["gptq_group_size"] = str(self.quantize_config.group_size) + safetensors_metadata["gptq_desc_act"] = str(self.quantize_config.desc_act) + safetensors_metadata["gptq_damp_percent"] = str(self.quantize_config.damp_percent) + safetensors_metadata["gptq_" + CHECKPOINT_FORMAT_FIELD] = self.quantize_config.checkpoint_format + safetensors_metadata["gptq_" + QUANT_METHOD_FIELD] = self.quantize_config.quant_method + + safe_save(state_dict, join(save_dir, model_save_name), safetensors_metadata) + else: + model_save_name = model_base_name + ".bin" + torch.save(self.model.state_dict(), join(save_dir, model_save_name)) + + self.model.config.quantization_config = self.quantize_config.to_dict() + self.model.config.save_pretrained(save_dir) + self.quantize_config.save_pretrained(save_dir) + self.quantize_config.model_name_or_path = save_dir + self.quantize_config.model_file_base_name = model_base_name + + def save_pretrained( + self, + save_dir: str, + use_safetensors: bool = True, + safetensors_metadata: Optional[Dict[str, str]] = None, + **kwargs, + ): + """alias of save_quantized""" + logger.warning("you are using save_pretrained, which will re-direct to save_quantized.") + self.save_quantized(save_dir, use_safetensors, safetensors_metadata) + + @classmethod + def from_pretrained( + cls, + pretrained_model_name_or_path: str, + quantize_config: BaseQuantizeConfig, + max_memory: Optional[dict] = None, + trust_remote_code: bool = False, + torch_dtype: torch.dtype = torch.float16, + **model_init_kwargs, + ): + """load un-quantized pretrained model to cpu""" + + if not torch.cuda.is_available(): + raise EnvironmentError("Load pretrained model to do quantization requires CUDA available.") + + def skip(*args, **kwargs): + pass + + torch.nn.init.kaiming_uniform_ = skip + torch.nn.init.uniform_ = skip + torch.nn.init.normal_ = skip + + # Parameters related to loading from Hugging Face Hub + cache_dir = model_init_kwargs.pop("cache_dir", None) + force_download = model_init_kwargs.pop("force_download", False) + resume_download = model_init_kwargs.pop("resume_download", False) + proxies = model_init_kwargs.pop("proxies", None) + local_files_only = model_init_kwargs.pop("local_files_only", False) + use_auth_token = model_init_kwargs.pop("use_auth_token", None) + revision = model_init_kwargs.pop("revision", None) + subfolder = model_init_kwargs.pop("subfolder", "") + commit_hash = model_init_kwargs.pop("_commit_hash", None) + + cached_file_kwargs = { + "cache_dir": cache_dir, + "force_download": force_download, + "proxies": proxies, + "resume_download": resume_download, + "local_files_only": local_files_only, + "use_auth_token": use_auth_token, + "revision": revision, + "subfolder": subfolder, + "_commit_hash": commit_hash, + } + + config = AutoConfig.from_pretrained( + pretrained_model_name_or_path, trust_remote_code=True, **cached_file_kwargs + ) + if config.model_type not in SUPPORTED_MODELS: + raise TypeError(f"{config.model_type} isn't supported yet.") + + # enforce some values despite user specified + model_init_kwargs["torch_dtype"] = torch_dtype + model_init_kwargs["trust_remote_code"] = trust_remote_code + if max_memory: + if "disk" in max_memory: + raise NotImplementedError("disk offload not support yet.") + with accelerate.init_empty_weights(): + model = AutoModelForCausalLM.from_config(config, trust_remote_code=True) + model.tie_weights() + + max_memory = accelerate.utils.get_balanced_memory( + model, + max_memory=max_memory, + no_split_module_classes=[cls.layer_type], + dtype=model_init_kwargs["torch_dtype"], + low_zero=False, + ) + model_init_kwargs["device_map"] = accelerate.infer_auto_device_map( + model, + max_memory=max_memory, + no_split_module_classes=[cls.layer_type], + dtype=model_init_kwargs["torch_dtype"], + ) + model_init_kwargs["low_cpu_mem_usage"] = True + + del model + else: + model_init_kwargs["device_map"] = None + model_init_kwargs["low_cpu_mem_usage"] = False + + torch.cuda.empty_cache() + + merged_kwargs = {**model_init_kwargs, **cached_file_kwargs} + model = AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_path, **merged_kwargs) + + model_config = model.config.to_dict() + seq_len_keys = ["max_position_embeddings", "seq_length", "n_positions"] + if any(k in model_config for k in seq_len_keys): + for key in seq_len_keys: + if key in model_config: + model.seqlen = model_config[key] + break + else: + logger.warning("can't get model's sequence length from model config, will set to 4096.") + model.seqlen = 4096 + model.eval() + + return cls(model, False, quantize_config) + + @classmethod + def from_quantized( + cls, + model_name_or_path: Optional[str], + device_map: Optional[Union[str, Dict[str, Union[int, str]]]] = None, + max_memory: Optional[dict] = None, + device: Optional[Union[str, int]] = None, + low_cpu_mem_usage: bool = False, + use_triton: bool = False, + use_qigen: bool = False, + use_marlin: bool = False, + torch_dtype: Optional[torch.dtype] = None, + inject_fused_attention: bool = False, + inject_fused_mlp: bool = False, + use_cuda_fp16: bool = True, + quantize_config: Optional[BaseQuantizeConfig] = None, + model_basename: Optional[str] = None, + use_safetensors: bool = True, + trust_remote_code: bool = False, + warmup_triton: bool = False, + trainable: bool = False, + disable_exllama: Optional[bool] = None, + disable_exllamav2: bool = False, + use_tritonv2: bool = False, + checkpoint_format: Optional[str] = None, + **kwargs, + ): + """load quantized model from local disk""" + # If disable_exllamav2 is True, we want to fall back on the exllama kernel and not the cuda/cuda_old ones. + if disable_exllama is None: + if disable_exllamav2: + disable_exllama = False + else: + disable_exllama = True + + # Parameters related to loading from Hugging Face Hub + cache_dir = kwargs.pop("cache_dir", None) + force_download = kwargs.pop("force_download", False) + resume_download = kwargs.pop("resume_download", False) + proxies = kwargs.pop("proxies", None) + local_files_only = kwargs.pop("local_files_only", False) + use_auth_token = kwargs.pop("use_auth_token", None) + revision = kwargs.pop("revision", None) + subfolder = kwargs.pop("subfolder", "") + commit_hash = kwargs.pop("_commit_hash", None) + + cached_file_kwargs = { + "cache_dir": cache_dir, + "force_download": force_download, + "proxies": proxies, + "resume_download": resume_download, + "local_files_only": local_files_only, + "use_auth_token": use_auth_token, + "revision": revision, + "subfolder": subfolder, + "_raise_exceptions_for_missing_entries": False, + "_commit_hash": commit_hash, + } + if use_qigen and not QIGEN_AVAILABLE: + logger.warning("Qigen is not installed, reset use_qigen to False.") + use_qigen = False + if use_triton and use_tritonv2: + logging.warn( + "Both use_triton and use_tritonv2 are set to True. Defaulting to use_triton" + ) + use_tritonv2 = False + if (use_triton or use_tritonv2) and not TRITON_AVAILABLE: + logger.warning("Triton is not installed, reset use_triton to False.") + use_triton = False + use_tritonv2 = False + if not disable_exllama and not EXLLAMA_KERNELS_AVAILABLE: + logger.warning( + "Exllama kernel is not installed, reset disable_exllama to True. " + "This may because you installed auto_gptq using a pre-build wheel " + "on Windows, in which exllama_kernels are not compiled. To use " + "exllama_kernels to further speedup inference, you can re-install " + "auto_gptq from source." + ) + disable_exllama = True + if not disable_exllamav2 and not EXLLAMAV2_KERNELS_AVAILABLE: + logger.warning( + "Exllamav2 kernel is not installed, reset disable_exllamav2 to True. " + "This may because you installed auto_gptq using a pre-build wheel " + "on Windows, in which exllama_kernels are not compiled. To use " + "exllama_kernels to further speedup inference, you can re-install " + "auto_gptq from source." + ) + disable_exllamav2 = True + if not AUTOGPTQ_CUDA_AVAILABLE: + logger.warning( + "CUDA kernels for auto_gptq are not installed, this will result in " + "very slow inference speed. This may because:\n" + "1. You disabled CUDA extensions compilation by setting BUILD_CUDA_EXT=0 when install auto_gptq from source.\n" + "2. You are using pytorch without CUDA support.\n" + "3. CUDA and nvcc are not installed in your device." + ) + + if use_qigen and QIGEN_AVAILABLE: + logger.warning("QIgen is active. Ignores all settings related to cuda.") + inject_fused_attention = False + inject_fused_mlp = False + use_triton = False + disable_exllama = True + disable_exllamav2 = True + + if not disable_exllamav2 and not disable_exllama: + logger.warning( + "You have activated both exllama and exllamav2 kernel. Setting disable_exllama to True and keeping disable_exllamav2 to False" + ) + disable_exllama = True + + # == step1: prepare configs and file names == # + config = AutoConfig.from_pretrained( + model_name_or_path, + trust_remote_code=trust_remote_code, + **cached_file_kwargs, + ) + + if config.model_type not in SUPPORTED_MODELS: + raise TypeError(f"{config.model_type} isn't supported yet.") + + if quantize_config is None: + quantize_config = BaseQuantizeConfig.from_pretrained(model_name_or_path, checkpoint_format=checkpoint_format, **cached_file_kwargs, **kwargs) + else: + if not isinstance(quantize_config, BaseQuantizeConfig): + quantize_config = BaseQuantizeConfig.from_quant_config(quantize_config, checkpoint_format) + + if quantize_config.checkpoint_format == CHECKPOINT_FORMAT.MARLIN: + # format marlin requires marlin kernel + use_marlin = True + + marlin_compatible, marlin_optimized = _validate_marlin_device_support() + if use_marlin and (not MARLIN_AVAILABLE or not marlin_compatible): + raise TypeError("use_marlin is true but Marlin is not availble due to cuda/device support.") + elif use_marlin and not marlin_optimized: + logger.info( + "use_marlin is true and your gpu device is supported but not optimized for Marlin." + ) + + if not use_marlin and MARLIN_AVAILABLE: + unsupported_reason = _validate_marlin_compatibility(quantize_config) + if unsupported_reason is None and marlin_compatible: + logger.info( + "You passed a model that is compatible with the Marlin int4*fp16 GPTQ kernel but use_marlin is False. We recommend using `use_marlin=True` to use the optimized Marlin kernels for inference. Example: `model = AutoGPTQForCausalLM.from_quantized(..., use_marlin=True)`." + ) + + if model_basename is None: + if quantize_config.model_file_base_name: + possible_model_basenames = [quantize_config.model_file_base_name] + else: + possible_model_basenames = [ + f"gptq_model-{quantize_config.bits}bit-{quantize_config.group_size}g", + "model", + ] + else: + possible_model_basenames = [model_basename] + + quantize_config.model_name_or_path = model_name_or_path + + extensions = [] + if use_safetensors: + extensions.append(".safetensors") + else: + extensions += [".bin", ".pt"] + + model_name_or_path = str(model_name_or_path) + + # Retrieve (and if necessary download) the quantized checkpoint(s). + is_sharded, resolved_archive_file, true_model_basename = get_checkpoints(model_name_or_path=model_name_or_path, extensions=extensions, possible_model_basenames=possible_model_basenames, **cached_file_kwargs) + + quantize_config.model_file_base_name = true_model_basename + + model_save_name = resolved_archive_file # In case a model is sharded, this would be `model.safetensors.index.json` which may later break. + + if (not disable_exllama or not disable_exllamav2) and trainable: + logger.warning( + "QuantLinear with the exllama backend not does support the trainable mode yet, switching to cuda/cuda_old/triton backend." + ) + disable_exllama = True + disable_exllamav2 = True + + elif not (use_triton or use_tritonv2) and trainable: + logger.warning( + "QuantLinear with cuda backend not support trainable mode yet, Switch to the pytorch backend." + ) + + # == step2: convert model to gptq-model (replace Linear with QuantLinear) == # + def skip(*args, **kwargs): + pass + + if torch_dtype is None: + if not use_qigen: + torch_dtype = torch.float16 + else: + torch_dtype = torch.float32 + + if torch_dtype != torch.float16: + logger.warning("Overriding use_cuda_fp16 to False since torch_dtype is not torch.float16.") + use_cuda_fp16 = False + + if not use_qigen: + torch.nn.init.kaiming_uniform_ = skip + torch.nn.init.uniform_ = skip + torch.nn.init.normal_ = skip + + transformers.modeling_utils._init_weights = False + + init_contexts = [no_init_weights()] + if low_cpu_mem_usage: + init_contexts.append(accelerate.init_empty_weights(include_buffers=False)) + + with ContextManagers(init_contexts): + model = AutoModelForCausalLM.from_config( + config, trust_remote_code=trust_remote_code, torch_dtype=torch_dtype + ) + + layers = find_layers(model) + ignore_layers = [cls.lm_head_name] + cls.outside_layer_modules + for name in list(layers.keys()): + if any(name.startswith(ignore_layer) for ignore_layer in ignore_layers) or all( + not name.endswith(ignore_layer) + for sublist in cls.inside_layer_modules + for ignore_layer in sublist + ): + logger.info(f"The layer {name} is not quantized.") + del layers[name] + + make_quant( + model, + layers, + quantize_config.bits, + quantize_config.group_size, + use_triton=use_triton, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + use_cuda_fp16=use_cuda_fp16, + desc_act=quantize_config.desc_act, + trainable=trainable, + use_tritonv2=use_tritonv2, + ) + model.tie_weights() + + # == step3: load checkpoint and dispatch == # + if isinstance(device_map, str) and device_map not in [ + "auto", + "balanced", + "balanced_low_0", + "sequential", + ]: + raise ValueError( + "If passing a string for `device_map`, please choose 'auto', 'balanced', 'balanced_low_0' or " + "'sequential'." + ) + if isinstance(device_map, dict): + max_memory = None + else: + if device is None and not device_map and not max_memory: + device_map = "auto" + if device is not None: + device = torch.device(device) + if not max_memory and not device_map: + device_map = {"": device.index if device.type == "cuda" else device.type} + if not isinstance(device_map, dict) and device_map != "sequential": + max_memory = accelerate.utils.get_balanced_memory( + model=model, + max_memory=max_memory, + no_split_module_classes=[cls.layer_type], + low_zero=(device_map == "balanced_low_0"), + ) + if not isinstance(device_map, dict): + device_map = accelerate.infer_auto_device_map( + model, + max_memory=max_memory, + no_split_module_classes=[cls.layer_type], + ) + + if low_cpu_mem_usage: + make_sure_no_tensor_in_meta_device( + model, + use_triton, + quantize_config.desc_act, + quantize_config.group_size, + bits=quantize_config.bits, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + use_tritonv2=use_tritonv2, + ) + + # TODO: move this logic in an awq_utils.py file. + if quantize_config.checkpoint_format == CHECKPOINT_FORMAT.AWQ_GEMM: + if is_sharded: + raise ValueError("The loading of sharded checkpoints with AWQ checkpoints is currently not supported. Please raise an issue in AutoGPTQ repository.") + + if use_marlin: + raise ValueError( + "Tried to load an AWQ model with use_marlin=True. This is currently not supported. Please open an issue in AutoGPTQ repository." + ) + + model_cache_name, is_cached = quantize_config.get_cache_file_path() + + if is_cached: + model_save_name = model_cache_name + logger.info(f"Loading an AWQ model, detected a cached repacked weight at {model_save_name}.") + else: + logger.info( + "Loading an AWQ model. This requires repacking the weights, and no cached repacked checkpoint was found. Grab a coffee!" + ) + + if "safetensors" not in model_save_name: + raise NotImplementedError( + f"Conversion from AWQ checkpoints is implemented only for safetensors checkpoints, found {model_save_name}" + ) + if quantize_config.bits != 4: + raise NotImplementedError( + f"Conversion from AWQ checkpoints is supported only for 4 bits models. Found {quantize_config.bits} bits." + ) + gptq_layers = set() + non_gptq_params = set() + with safe_open(model_save_name, framework="pt") as f: + for state_dict_key in f.keys(): + if ( + "qweight" not in state_dict_key + and "qzeros" not in state_dict_key + and "scales" not in state_dict_key + ): + non_gptq_params.add(state_dict_key) + continue + + # e.g. prefix "model.layers.3.self_attn.k_proj" + prefix, _ = state_dict_key.rsplit(".", 1) + gptq_layers.add(prefix) + + new_state_dict = {} + + for state_dict_key in non_gptq_params: + new_state_dict[state_dict_key] = f.get_tensor(state_dict_key) + + gptq_layers = sorted(gptq_layers) + max_layer_name_length = len(max(gptq_layers, key=len)) + pbar = tqdm(gptq_layers) + i = 0 + for gptq_layer_name in pbar: + i += 1 + desc = f"Unpacking {gptq_layer_name} + '...'" + desc = desc + " " * (max_layer_name_length - len(desc)) + + awq_qweight = f.get_tensor(gptq_layer_name + ".qweight") + awq_qzeros = f.get_tensor(gptq_layer_name + ".qzeros") + awq_scales = f.get_tensor(gptq_layer_name + ".scales") + + # TODO: add FAST unpacking. + unpacked_qweight, unpacked_qzeros = unpack_awq( + awq_qweight, + awq_qzeros, + awq_scales, + bits=quantize_config.bits, + group_size=quantize_config.group_size, + ) + + # TODO: add FAST repacking, this is too slow. + desc = f"Repacking {gptq_layer_name}..." + desc = desc + " " * (max_layer_name_length + 12 - len(desc)) + pbar.set_description(desc) + gptq_qweight, gptq_qzeros = pack_from_tensors( + unpacked_qweight, + unpacked_qzeros, + awq_scales, + bits=quantize_config.bits, + group_size=quantize_config.group_size, + ) + + new_state_dict[gptq_layer_name + ".qweight"] = gptq_qweight + new_state_dict[gptq_layer_name + ".qzeros"] = gptq_qzeros + new_state_dict[gptq_layer_name + ".scales"] = awq_scales + + safe_save(new_state_dict, model_cache_name) + model_save_name = model_cache_name + + if use_marlin: + if is_sharded: + raise ValueError("The loading of sharded checkpoints with Marlin is currently not supported. Please raise an issue in AutoGPTQ repository.") + if torch.version.hip: + raise ValueError("Can not use Marlin int4*fp16 kernel with AMD ROCm version of PyTorch as the kernel is not compatible. Please do not use `use_marlin=True` when using ROCm devices.") + if not _validate_marlin_device_support(): + raise ValueError(f'Can not use Marlin int4*fp16 kernel with a device of compute capability {torch.cuda.get_device_capability()}, the minimum compute capability is 8.0 for Marlin kernel. Please do not use `use_marlin=True`, or please upgrade your GPU ("The more you buy, the more you save." - Taiwanese proverb).') + + # Validate the model can run in Marlin. + if torch_dtype != torch.float16: + raise ValueError("Marlin kernel requires torch_dtype=torch.float16.") + unsupported_reason = _validate_marlin_compatibility(quantize_config) + if unsupported_reason is not None: + raise ValueError( + f"The model {model_name_or_path} can not be converted to use the Marlin kernel for the following reason: {unsupported_reason}, which is not supported by Marlin kernel." + ) + + # Load the quant linear type we need. + # TODO: load directy marlin with the right quantlinear class. + quant_linear_class = dynamically_import_QuantLinear( + use_triton=use_triton, + desc_act=quantize_config.desc_act, + group_size=quantize_config.group_size, + bits=quantize_config.bits, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + use_marlin=False, + use_tritonv2=use_tritonv2, # Get the "original" QuantLienar class + ) + + # Prepare model for marlin load. + # If stub is marlin serialzed --> load from directly + # If stub has cached marlin version --> load from the cached versin + # Otherwise --> convert to marlin, cache, load from cache + model, model_save_name = prepare_model_for_marlin_load( + model=model, + quantize_config=quantize_config, + quant_linear_class=quant_linear_class, + torch_dtype=torch_dtype, + current_model_save_name=model_save_name, + device_map=device_map, + ) + + # Disable incompatible optimizations. + if inject_fused_attention or inject_fused_mlp: + # TODO: Validate whether that can be used. + logger.info("Disabling fused attention and mlp injection because Marlin kernel is used.") + inject_fused_attention = False + inject_fused_mlp = False + + load_checkpoint_in_model( + model, + dtype=torch_dtype, # This is very hacky but works due to https://github.com/huggingface/accelerate/blob/bd72a5f1a80d5146554458823f8aeda0a9db5297/src/accelerate/utils/modeling.py#L292 + checkpoint=model_save_name, + device_map=device_map, + offload_state_dict=True, + offload_buffers=True, + ) + + # TODO: Why are we using this custom function and not dispatch_model? + model = simple_dispatch_model(model, device_map) + else: + # Using QiGen. + + if is_sharded: + raise ValueError("The loading of sharded checkpoints with QiGen is currently not supported. Please raise an issue in AutoGPTQ repository.") + + if quantize_config.desc_act: + NotImplementedError("desc_act=True is not yet supported with QiGen.") + model = AutoModelForCausalLM.from_config( + config, trust_remote_code=trust_remote_code, torch_dtype=torch_dtype + ) + + layers = find_layers(model) + ignore_layers = [cls.lm_head_name] + cls.outside_layer_modules + for name in list(layers.keys()): + if any(name.startswith(ignore_layer) for ignore_layer in ignore_layers): + logger.info(f"{name} not been quantized, will be ignored when make_quant.") + del layers[name] + + if model_save_name.endswith(".safetensors"): + checkpoint = safe_load(model_save_name) + else: + checkpoint = torch.load(model_save_name) + make_quant( + model, + layers, + quantize_config.bits, + quantize_config.group_size, + use_triton=use_triton, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + use_cuda_fp16=use_cuda_fp16, + desc_act=quantize_config.desc_act, + trainable=trainable, + use_qigen=True, + use_tritonv2=use_tritonv2, + use_marlin=quantize_config.checkpoint_format == CHECKPOINT_FORMAT.MARLIN, + ) + preprocess_checkpoint_qigen( + model, + layers, + quantize_config.bits, + quantize_config.group_size, + checkpoint, + ) + model.load_state_dict(checkpoint) + + # == step4: set seqlen == # + model_config = model.config.to_dict() + seq_len_keys = ["max_position_embeddings", "seq_length", "n_positions"] + if any(k in model_config for k in seq_len_keys): + for key in seq_len_keys: + if key in model_config: + model.seqlen = model_config[key] + break + else: + logger.warning("can't get model's sequence length from model config, will set to 4096.") + model.seqlen = 4096 + + # == step5: (optional) inject optimized module == # + if inject_fused_attention: + if cls.fused_attn_module_type is None: + inject_fused_attention = False + logger.warning(f"{cls.__name__} hasn't fused attention module yet, will skip inject fused attention.") + else: + cls.fused_attn_module_type.inject_to_model( + model, + use_triton=use_triton, + group_size=quantize_config.group_size, + use_cuda_fp16=use_cuda_fp16, + desc_act=quantize_config.desc_act, + trainable=trainable, + bits=quantize_config.bits, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + use_tritonv2=use_tritonv2, + ) + if inject_fused_mlp: + if cls.fused_mlp_module_type is None: + inject_fused_mlp = False + logger.warning(f"{cls.__name__} hasn't fused mlp module yet, will skip inject fused mlp.") + else: + cls.fused_mlp_module_type.inject_to_model(model, use_triton=use_triton) + + # Any post-initialization that require device information, for example buffers initialization on device. + model = autogptq_post_init(model, use_act_order=quantize_config.desc_act) + + model.eval() + + # == step6: (optional) warmup triton == # + if (use_triton or use_tritonv2) and warmup_triton: + if use_tritonv2: + from ..nn_modules.qlinear.qlinear_tritonv2 import QuantLinear + else: + from ..nn_modules.qlinear.qlinear_triton import QuantLinear + + QuantLinear.warmup(model, seqlen=model.seqlen) + + if inject_fused_mlp and cls.fused_mlp_module_type is not None: + cls.fused_mlp_module_type.warmup(model, seqlen=model.seqlen) + + # == step7: make model compatible with peft + # cls.make_sure_compatible_with_peft( + # model, + # use_triton, + # quantize_config.desc_act, + # quantize_config.group_size, + # bits=quantize_config.bits, + # disable_exllama=disable_exllama, + # disable_exllamav2=disable_exllamav2, + # use_marlin=use_marlin, + # use_qigen=use_qigen, + # ) + + return cls( + model, + True, + quantize_config, + is_triton_backend=use_triton or use_tritonv2, + injected_fused_attention=inject_fused_attention, + injected_fused_mlp=inject_fused_mlp and (use_triton or use_tritonv2), + trainable=trainable, + ) + + def warmup_triton(self, enabled: bool = True): + if not enabled: + return + if not TRITON_AVAILABLE: + logger.warning("triton is not available, skip warmup stage directly.") + return + + from ..nn_modules.qlinear.qlinear_triton import QuantLinear + + QuantLinear.warmup(self.model, seqlen=self.model.seqlen) + + if self.fused_mlp_module_type is not None: + self.fused_mlp_module_type.warmup(self.model, seqlen=self.model.seqlen) + + def enable_trainable_mode(self, enabled: bool = True): + if not self.is_triton_backend and enabled: + raise NotImplementedError("For now, trainable mode only supports triton backend.") + for n, m in self.model.named_modules(): + if hasattr(m, "trainable"): + setattr(m, "trainable", enabled) + + def disable_trainable_mode(self): + self.enable_trainable_mode(enabled=False) + + @staticmethod + def make_sure_compatible_with_peft( + model: PreTrainedModel, + use_triton: bool, + desc_act: bool, + group_size: int, + bits: int, + disable_exllama: bool = True, + disable_exllamav2: bool = False, + use_marlin: bool = False, + use_qigen: bool = False, + use_tritonv2: bool = False, + ): + GeneralQuantLinear.inject_to_model( + model, + dynamically_import_QuantLinear(use_triton, desc_act, group_size, bits=bits, disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + use_marlin=use_marlin, use_qigen=use_qigen), + ) + + def __getattr__(self, item): + try: + return super().__getattr__(item) + except Exception: + return getattr(self.model, item) + + +__all__ = ["BaseGPTQForCausalLM", "BaseQuantizeConfig"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_const.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_const.py new file mode 100644 index 0000000000000000000000000000000000000000..4461ce819f107c6474cc5a401849ba07e4cd512f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_const.py @@ -0,0 +1,50 @@ +from torch import device + +from ..utils.import_utils import compare_transformers_version + + +CPU = device("cpu") +CUDA_0 = device("cuda:0") + +SUPPORTED_MODELS = [ + "bloom", + "gptj", + "gpt2", + "gpt_neox", + "opt", + "moss", + "gpt_bigcode", + "codegen", + "RefinedWebModel", + "RefinedWeb", + "baichuan", + "internlm", + "qwen", + "xverse", + "deci", + "stablelm_epoch", + "mpt", + "cohere", +] +if compare_transformers_version("v4.28.0", op="ge"): + SUPPORTED_MODELS.append("llama") +if compare_transformers_version("v4.30.0", op="ge"): + SUPPORTED_MODELS.append("longllama") +if compare_transformers_version("v4.33.0", op="ge"): + SUPPORTED_MODELS.append("falcon") +if compare_transformers_version("v4.34.0", op="ge"): + SUPPORTED_MODELS.append("mistral") + SUPPORTED_MODELS.append("Yi") +if compare_transformers_version("v4.36.0", op="ge"): + SUPPORTED_MODELS.append("mixtral") +if compare_transformers_version("v4.37.0", op="ge"): + SUPPORTED_MODELS.append("qwen2") + SUPPORTED_MODELS.append("phi") +if compare_transformers_version("v4.38.0", op="ge"): + SUPPORTED_MODELS.append("gemma") +if compare_transformers_version("v4.39.0.dev0", op="ge"): + SUPPORTED_MODELS.append("starcoder2") + +EXLLAMA_DEFAULT_MAX_INPUT_LENGTH = 2048 + +__all__ = ["CPU", "CUDA_0", "SUPPORTED_MODELS", "EXLLAMA_DEFAULT_MAX_INPUT_LENGTH"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..2318dd6b9ae5c63a6d49dd64d3bce92775d72104 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/_utils.py @@ -0,0 +1,778 @@ +import json +import logging +import os +from logging import getLogger +from typing import List, Optional, Union + +import accelerate +import numpy as np +import torch +import torch.nn as nn +import transformers +from tqdm import tqdm +from transformers import AutoConfig +from transformers.utils.hub import cached_file + +from ..utils.import_utils import dynamically_import_QuantLinear +from ..utils.modeling_utils import recurse_setattr +from ._const import CPU, CUDA_0, EXLLAMA_DEFAULT_MAX_INPUT_LENGTH, SUPPORTED_MODELS + + +logger = getLogger(__name__) +handler = logging.StreamHandler() +formatter = logging.Formatter("%(levelname)s - %(message)s") +handler.setFormatter(formatter) +logger.addHandler(handler) +logger.setLevel(logging.INFO) + + +def get_device(obj: Union[torch.Tensor, nn.Module]): + if isinstance(obj, torch.Tensor): + return obj.device + return next(obj.parameters()).device + + +def move_to_device(obj: Optional[Union[torch.Tensor, nn.Module]], device: torch.device): + if obj is None: + return obj + else: + if get_device(obj) != device: + obj = obj.to(device) + return obj + + +def find_layers(module, layers=None, name=""): + if not layers: + layers = [transformers.pytorch_utils.Conv1D, nn.Conv2d, nn.Linear] + for layer in layers: + if isinstance(module, layer): + return {name: module} + res = {} + for name1, child in module.named_children(): + res.update(find_layers(child, layers=layers, name=name + "." + name1 if name != "" else name1)) + return res + + +def get_module_by_name_prefix(model, module_name: str): + for name, module in model.named_modules(): + if name.startswith(module_name): + return module + + +def get_module_by_name_suffix(model, module_name: str): + for name, module in model.named_modules(): + if name.endswith(module_name): + return module + + +def make_quant( + module, + names, + bits, + group_size, + name="", + use_triton: bool = False, + use_marlin: bool = False, + disable_exllama: Optional[bool] = None, + disable_exllamav2: bool = False, + use_qigen: bool = False, + use_cuda_fp16: bool = True, + desc_act: bool = False, + trainable: bool = False, + use_tritonv2: bool = False, +): + # If disable_exllamav2 is True, we want to fall back on the exllama kernel and not the cuda/cuda_old ones. + if disable_exllama is None: + if disable_exllamav2: + disable_exllama = False + else: + disable_exllama = True + + QuantLinear = dynamically_import_QuantLinear( + use_triton=use_triton, + desc_act=desc_act, + group_size=group_size, + bits=bits, + use_marlin=use_marlin, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + use_qigen=use_qigen, + use_tritonv2=use_tritonv2, + ) + + if isinstance(module, QuantLinear): + return + + for name, submodule in module.named_modules(): + if name in names: + ori_layer_device = next(submodule.parameters()).device + + if isinstance(submodule, nn.Linear): + in_features = submodule.in_features + out_features = submodule.out_features + elif isinstance(submodule, nn.Conv2d): + in_features = submodule.in_channels + out_features = submodule.out_channels + elif isinstance(submodule, transformers.pytorch_utils.Conv1D): + in_features = submodule.weight.shape[0] + out_features = submodule.weight.shape[1] + bias = submodule.bias is not None + if ( + (not (desc_act) or group_size == -1) + and not use_triton + and not use_qigen + and not use_tritonv2 + ): + new_layer = QuantLinear( + bits, + group_size, + in_features, + out_features, + bias, + use_cuda_fp16=use_cuda_fp16, + trainable=trainable, + weight_dtype=submodule.weight.dtype, + ) + else: + new_layer = QuantLinear( + bits, + group_size, + in_features, + out_features, + bias, + trainable=trainable, + weight_dtype=submodule.weight.dtype, + ) + new_layer.device = ori_layer_device + recurse_setattr(module, name, new_layer.to(ori_layer_device)) + + +def preprocess_checkpoint_qigen( + module, + names, + bits, + group_size, + checkpoint, + name="", +): + try: + import cQIGen as qinfer + except ImportError: + logger.error("cQIGen not installed.") + raise + + QuantLinear = dynamically_import_QuantLinear( + use_triton=False, + desc_act=False, + group_size=group_size, + bits=bits, + disable_exllama=False, + use_qigen=True, + ) + if isinstance(module, QuantLinear): + in_features = module.infeatures + out_features = module.outfeatures + + zeros = checkpoint[name + ".qzeros"] + scales = checkpoint[name + ".scales"].float() + + if zeros.dtype != torch.float32: + new_zeros = torch.zeros_like(scales).float().contiguous() + if bits == 4: + qinfer.unpack_zeros4(zeros, new_zeros, new_zeros.shape[0], new_zeros.shape[1]) + elif bits == 2: + qinfer.unpack_zeros2(zeros, new_zeros, new_zeros.shape[0], new_zeros.shape[1]) + elif bits == 3: + logger.info("Unpacking zeros for 3 bits") + new_scales = scales.contiguous() + else: + if scales.shape[1] != out_features: + new_scales = scales.transpose(0, 1).contiguous() + else: + new_scales = scales.contiguous() + if zeros.shape[1] != out_features: + new_zeros = zeros.transpose(0, 1).contiguous() + else: + new_zeros = zeros.contiguous() + + checkpoint[name + ".zeros"], checkpoint[name + ".scales"] = ( + new_zeros, + new_scales, + ) + del checkpoint[name + ".qzeros"] + del checkpoint[name + ".g_idx"] + if name + ".bias" in checkpoint: + checkpoint[name + ".bias"] = checkpoint[name + ".bias"].float() + else: + checkpoint[name + ".bias"] = torch.zeros(out_features) + checkpoint_qweight = checkpoint[name + ".qweight"].int().contiguous() + if bits == 4: + qweight = torch.zeros(int(in_features // 8 * out_features)).int().contiguous() + qinfer.pack4( + checkpoint_qweight, + qweight, + in_features // 8, + out_features, + module.mb, + module.tb, + module.cutoff, + ) # * (module.tt//tb)) + elif bits == 3: + qweight = torch.zeros(int(in_features // 32 * 3 * out_features)).int().contiguous() + qinfer.pack3( + checkpoint_qweight, + qweight, + in_features // 32 * 3, + out_features, + module.mb // 32 * 3, + module.tb, + module.cutoff, + ) + elif bits == 2: + qweight = torch.zeros(int(in_features // 16 * out_features)).int().contiguous() + qinfer.pack2( + checkpoint_qweight, + qweight, + in_features // 16, + out_features, + module.mb, + module.tb, + module.cutoff, + ) # * (module.tt//tb)) + checkpoint[name + ".qweight"] = qweight + return + + for name1, child in module.named_children(): + preprocess_checkpoint_qigen( + child, + names, + bits, + group_size, + checkpoint, + name + "." + name1 if name != "" else name1, + ) + + +def pack_model( + model, + quantizers, + bits, + group_size, + use_triton=False, + use_cuda_fp16=True, + desc_act=False, + warmup_triton: bool = False, + force_layer_back_to_cpu: bool = False, + use_marlin: bool = False, + use_tritonv2: bool = False, +): + QuantLinear = dynamically_import_QuantLinear( + use_triton=use_triton, + desc_act=desc_act, + group_size=group_size, + bits=bits, + disable_exllama=False, + disable_exllamav2=True, + use_marlin=use_marlin, + use_tritonv2=use_tritonv2, + ) + + if force_layer_back_to_cpu: + model.to(CPU) + + logger.info("Packing model...") + layers = find_layers(model) + layers = {n: layers[n] for n in quantizers} + make_quant( + model, + quantizers, + bits, + group_size, + use_triton=use_triton, + use_cuda_fp16=use_cuda_fp16, + desc_act=desc_act, + disable_exllama=False, + disable_exllamav2=True, + use_marlin=use_marlin, + ) + qlayers = find_layers(model, [QuantLinear]) + + pbar = tqdm(qlayers.keys(), leave=True) + for name in pbar: + pbar.set_description(f"Packing {name}...", refresh=True) + + quantizers[name], scale, zero, g_idx = quantizers[name] + # so far can only pack layer on CPU + layer_device = qlayers[name].device + qlayers[name].to(CPU) + layers[name], scale, zero, g_idx = ( + layers[name].to(CPU), + scale.to(CPU), + zero.to(CPU), + g_idx.to(CPU), + ) + if QuantLinear.QUANT_TYPE == "marlin": + qlayers[name].pack(layers[name], scale) + else: + qlayers[name].pack(layers[name], scale, zero, g_idx) + qlayers[name].to(layer_device) + logger.info("Model packed.") + + if use_triton and warmup_triton: + logger.warning( + "using autotune_warmup will move model to GPU, make sure you have enough VRAM to load the whole model." + ) + QuantLinear.warmup(model.to(CUDA_0), seqlen=model.seqlen) + + +def check_and_get_model_type(model_dir, trust_remote_code=False): + config = AutoConfig.from_pretrained(model_dir, trust_remote_code=trust_remote_code) + if config.model_type not in SUPPORTED_MODELS: + raise TypeError(f"{config.model_type} isn't supported yet.") + model_type = config.model_type + return model_type + + +def simple_dispatch_model(model, device_map): + from accelerate.hooks import AlignDevicesHook, add_hook_to_module + + if "" in device_map: + d = device_map[""] + model = model.to(torch.device(d)) + model.hf_device_map = device_map + return model + + tied_params = accelerate.utils.modeling.find_tied_parameters(model) + if set(device_map.values()) == {"cpu"} or set(device_map.values()) == { + "cpu", + "disk", + }: + main_device = "cpu" + else: + main_device = [d for d in device_map.values() if d not in ["cpu", "disk"]][0] + + cpu_offload_group = [(n, d) for n, d in device_map.items() if d == "cpu"] + prev_hook = None + for idx, (n, d) in enumerate(cpu_offload_group): + m = get_module_by_name_suffix(model, n) + _, prev_hook = accelerate.cpu_offload_with_hook(m, execution_device=main_device, prev_module_hook=prev_hook) + # set first cpu offload module's prev_module_hook to the last cpu offload module's hook + if len(cpu_offload_group) > 1: + get_module_by_name_suffix(model, cpu_offload_group[0][0])._hf_hook.prev_module_hook = prev_hook + + for n, d in device_map.items(): + m = get_module_by_name_suffix(model, n) + if d != "cpu": + d = torch.device(d) + hook = AlignDevicesHook(d, io_same_device=True, place_submodules=True) + add_hook_to_module(m, hook) + accelerate.utils.modeling.retie_parameters(model, tied_params) + model.hf_device_map = device_map + + return model + + +def autogptq_post_init(model, use_act_order: bool, max_input_length: Optional[int] = None): + """ + The max_input_length argument is specific to the exllama backend, that requires to initialize a buffer temp_state. + """ + device_to_buffers_size = {} + + model_uses_exllama = False + for name, submodule in model.named_modules(): + if hasattr(submodule, "QUANT_TYPE") and submodule.QUANT_TYPE == "exllama": + model_uses_exllama = True + device = submodule.qweight.device + if device not in device_to_buffers_size: + device_to_buffers_size[device] = { + "max_dq_buffer_size": 1, + "max_inner_outer_dim": 1, + } + + if not use_act_order: + submodule._use_act_order = False + else: + submodule._use_act_order = True + + # Disable this heuristic for detecting act_order, but it could be used instead of the config. + """ + if submodule.g_idx is None: + submodule.act_order = False + elif submodule.g_idx is not None and ((submodule.g_idx == 0).all() or torch.equal(submodule.g_idx.cpu(), torch.tensor([i // submodule.group_size for i in range(submodule.g_idx.shape[0])], dtype=torch.int32))): + submodule.g_idx = None + submodule.act_order = False + else: + submodule.act_order = True + """ + + device_to_buffers_size[device]["max_dq_buffer_size"] = max( + device_to_buffers_size[device]["max_dq_buffer_size"], + submodule.qweight.numel() * 8, + ) + + if use_act_order: + device_to_buffers_size[device]["max_inner_outer_dim"] = max( + device_to_buffers_size[device]["max_inner_outer_dim"], + submodule.infeatures, + submodule.outfeatures, + ) + + if model_uses_exllama: + # To be honest this is quite ugly, not proud of this. + try: + from exllama_kernels import prepare_buffers, set_tuning_params + except ImportError as e: + raise ImportError( + f"Could not import exllama backend dependencies prepare_buffers, set_tuning_params with the following error: {e}" + ) + + device_to_buffers = {} + + if use_act_order: + if max_input_length is None: + max_input_len = EXLLAMA_DEFAULT_MAX_INPUT_LENGTH + else: + max_input_len = max_input_length + else: + if max_input_length is not None: + logger.info( + "Using exllama backend without act-order, the parameter max_input_length was set although not needed, it will be ignored." + ) + max_input_len = 1 + + for device, buffers_size in device_to_buffers_size.items(): + # The temp_state buffer is required to reorder X in the act-order case. + # The temp_dq buffer is required to dequantize weights when using cuBLAS, typically for the prefill. + device_to_buffers[device] = { + "temp_state": torch.zeros( + (max_input_len, buffers_size["max_inner_outer_dim"]), + dtype=torch.float16, + device=device, + ), + "temp_dq": torch.zeros( + (1, buffers_size["max_dq_buffer_size"]), + dtype=torch.float16, + device=device, + ), + "max_dq_buffer_size": buffers_size["max_dq_buffer_size"], + "max_inner_outer_dim": buffers_size["max_inner_outer_dim"], + } + + # Buffers need to be persistent to avoid any bug. + model.device_to_buffers = device_to_buffers + + for device, buffers in model.device_to_buffers.items(): + prepare_buffers(device, buffers["temp_state"], buffers["temp_dq"]) + + # Using the default from exllama repo here. + matmul_recons_thd = 8 + matmul_fused_remap = False + matmul_no_half2 = False + set_tuning_params(matmul_recons_thd, matmul_fused_remap, matmul_no_half2) + + # The buffers need to have been initialized first before calling make_q4. + for name, submodule in model.named_modules(): + if hasattr(submodule, "QUANT_TYPE") and submodule.QUANT_TYPE == "exllama": + submodule.post_init() + + ## exllamav2 + fixed_bytes = {} + model_uses_exllamav2 = False + + for _, submodule in model.named_modules(): + if hasattr(submodule, "QUANT_TYPE") and submodule.QUANT_TYPE == "exllamav2": + model_uses_exllamav2 = True + device = submodule.qweight.device + scratch_fixed = submodule.scratch_space_fixed() + fixed_bytes[device] = max(scratch_fixed, fixed_bytes.get(device, 0)) + + if model_uses_exllamav2: + from ..nn_modules.qlinear.qlinear_exllamav2 import ExLlamaV2DeviceTensors + + device_tensors = {} + for device, scratch_bytes in fixed_bytes.items(): + device_tensors[device] = ExLlamaV2DeviceTensors(device.index, scratch_bytes) + + # have persistent buffers, otherwise we will get OOM + model.device_tensors = device_tensors + + for _, submodule in model.named_modules(): + if hasattr(submodule, "QUANT_TYPE") and submodule.QUANT_TYPE == "exllamav2": + device = submodule.qweight.device + submodule.post_init(temp_dq=model.device_tensors[device]) + torch.cuda.empty_cache() + + return model + + +def make_sure_no_tensor_in_meta_device( + model, use_triton: bool, desc_act: bool, group_size: int, bits: int, disable_exllama: bool, disable_exllamav2: bool, use_marlin: bool = False, use_tritonv2: bool = False, +): + QuantLinear = dynamically_import_QuantLinear(use_triton, desc_act, group_size, bits=bits, disable_exllama=disable_exllama, disable_exllamav2=disable_exllamav2, use_marlin=use_marlin, use_tritonv2=use_tritonv2) + for n, m in model.named_modules(): + if isinstance(m, QuantLinear) and m.bias.device == torch.device("meta"): + m.register_buffer("bias", torch.zeros((m.outfeatures), dtype=torch.float16, device="cpu")) + + +def awq_reverse_reorder_int_tensor(int_tensor, bits: int): + assert bits == 4 + + int_tensor = int_tensor.T.contiguous() + compress_ratio = 32 // bits + assert int_tensor.shape[-1] % compress_ratio == 0 + + order_map = [0, 2, 4, 6, 1, 3, 5, 7] + order_tensor = torch.tensor(order_map, dtype=torch.int32, device=int_tensor.device).reshape(1, -1) + order_tensor = order_tensor.repeat(int_tensor.shape[1] // compress_ratio, 1) + order_tensor = order_tensor + torch.arange( + 0, + int_tensor.shape[1], + compress_ratio, + dtype=torch.int32, + device=int_tensor.device, + ).reshape(-1, 1) + order_tensor = order_tensor.reshape(-1) + + reverse_order_tensor = torch.arange(order_tensor.shape[0]).cuda()[order_tensor] + reverse_order_tensor = reverse_order_tensor[order_tensor] + int_tensor = int_tensor[:, reverse_order_tensor] + return int_tensor + + +def unpack_awq( + awq_qweight: torch.Tensor, + awq_qzeros: torch.Tensor, + awq_scales: torch.Tensor, + bits: int, + group_size: int, +): + """ + Args: + awq_qweight (`torch.LongTensor`): + Expected shape: (in_features, out_features // (32 // bits)) + awq_qzeros (`torch.LongTensor`): + Expected shape: (in_features // group_size, out_features // (32 // bits)) + awq_scales (`torch.LongTensor`): + Expected shape: (in_features // group_size, out_features) + + Returns: + fp16_weight (`torch.LongTensor`): + With shape (in_features, out_features). + zeros (`torch.LongTensor`): + With shape (in_features // group_size, out_features). + """ + assert bits == 4 + + qzeros = awq_qzeros.cuda() + qweight = awq_qweight.cuda() + qweight = qweight.T.contiguous() + + infeatures = awq_qweight.shape[0] + + wf = torch.tensor(list(range(0, 32, bits)), dtype=torch.int32, device=qzeros.device).unsqueeze(0) + zeros = torch.bitwise_right_shift(torch.unsqueeze(qzeros, 2), wf.unsqueeze(0)).to( + torch.int16 if bits == 8 else torch.int8 + ) + + # zeros = zeros + 1 + + torch.bitwise_and(zeros, (2**bits) - 1, out=zeros) + + zeros = zeros.reshape(-1, 1, zeros.shape[1] * zeros.shape[2]) + + weight = torch.bitwise_right_shift(torch.unsqueeze(qweight, 1), wf.unsqueeze(-1)).to( + torch.int16 if bits == 8 else torch.int8 + ) + torch.bitwise_and(weight, (2**bits) - 1, out=weight) + weight = weight.reshape(-1, group_size, weight.shape[2]) + + weight = weight.view(-1, weight.shape[-1]) + zeros = zeros.view(-1, zeros.shape[-1]) + + zeros = zeros.T.contiguous() + zeros = awq_reverse_reorder_int_tensor(zeros, bits) + weight = awq_reverse_reorder_int_tensor(weight, bits) + + # Dequantize weights. + scales = awq_scales.cuda() + zeros = zeros.contiguous() + scale_zeros = zeros * scales + + g_idx = torch.tensor([i // group_size for i in range(infeatures)], dtype=torch.int32) + scale_mat = scales[g_idx] + scale_zeros_mat = scale_zeros[g_idx].half() + + qdq_weight_T = weight * scale_mat - scale_zeros_mat.half() + + fp16_weight = qdq_weight_T.T.cuda() + + return fp16_weight, zeros + + +def pack_from_tensors( + unpacked_qweight: torch.Tensor, + unpacked_qzeros: torch.Tensor, + awq_scales: torch.Tensor, + bits: int, + group_size: int, +): + """ + Args: + unpacked_qweight (`torch.LongTensor`): + Expected shape: (in_features, out_features) + unpacked_qzeros (`torch.LongTensor`): + Expected shape: (in_features // group_size, out_features) + awq_scales (`torch.LongTensor`): + Expected shape: (in_features // group_size, out_features) + + Returns: + qweight (`torch.LongTensor`): + With shape (in_features // (32 // bits), out_features) + qzeros (`torch.LongTensor`): + With shape (in_features // group_size, out_features // (32 // bits)) + """ + assert bits == 4 + W = unpacked_qweight.clone().cpu() + + # TODO: This should be checked somehow. + # if isinstance(linear, nn.Conv2d): + # W = W.flatten(1) + # if isinstance(linear, transformers.pytorch_utils.Conv1D): + # W = W.t() + + awq_scales = awq_scales.t().contiguous() + unpacked_qzeros = unpacked_qzeros.contiguous() + unpacked_qzeros = unpacked_qzeros.cpu() + + awq_scales = awq_scales.cpu() + scale_zeros = unpacked_qzeros.t() * awq_scales + scales = awq_scales.clone() + + infeatures = unpacked_qweight.shape[1] + + intweight = [] + for idx in range(infeatures): + g_idx = idx // group_size + + intweight.append(torch.round((W[:, idx] + scale_zeros[:, g_idx]) / scales[:, g_idx]).to(torch.int)[:, None]) + intweight = torch.cat(intweight, dim=1) + intweight = intweight.t().contiguous() + intweight = intweight.numpy().astype(np.uint32) + + i = 0 + row = 0 + qweight = np.zeros((intweight.shape[0] // 32 * bits, intweight.shape[1]), dtype=np.uint32) + while row < qweight.shape[0]: + for j in range(i, i + (32 // bits)): + qweight[row] |= intweight[j] << (bits * (j - i)) + i += 32 // bits + row += 1 + + qweight = qweight.astype(np.int32) + qweight = torch.from_numpy(qweight) + + unpacked_qzeros = unpacked_qzeros - 1 + torch.bitwise_and(unpacked_qzeros, (2**bits) - 1, out=unpacked_qzeros) + + unpacked_qzeros = unpacked_qzeros.numpy().astype(np.uint32) + qzeros = np.zeros( + (unpacked_qzeros.shape[0], unpacked_qzeros.shape[1] // 32 * bits), + dtype=np.uint32, + ) + i = 0 + col = 0 + while col < qzeros.shape[1]: + for j in range(i, i + (32 // bits)): + qzeros[:, col] |= unpacked_qzeros[:, j] << (bits * (j - i)) + i += 32 // bits + col += 1 + + qzeros = qzeros.astype(np.int32) + qzeros = torch.from_numpy(qzeros) + + return qweight, qzeros + + +def get_checkpoints(model_name_or_path: str, extensions: List[str], possible_model_basenames: List[str], **cached_file_kwargs): + """ + Retrives (and if necessary downloads from Hugging Face Hub) the model checkpoint. Sharding is supported. All the `possible_model_basenames` (e.g. `["model", "model-4bit-gptq"]`) will be explored over all `extensions` (e.g. `[".bin", ".safetensors"]`). + """ + searched_files = [] + resolved_archive_file = None + true_model_basename = None + + if os.path.isdir(model_name_or_path): + for ext in extensions: + for possible_model_basename in possible_model_basenames: + shard_index_name = possible_model_basename + ext + ".index.json" + searched_files.append(shard_index_name) + possible_index_file = os.path.join(model_name_or_path, shard_index_name) + if os.path.isfile(possible_index_file): + # The model is sharded over several checkpoints. + possible_model_basename = possible_index_file.replace(ext + ".index.json", "") + return True, possible_index_file, possible_model_basename + else: + model_save_name = os.path.join(model_name_or_path, possible_model_basename) + searched_files.append(possible_model_basename + ext) + if os.path.isfile(model_save_name + ext): + resolved_archive_file = model_save_name + ext + return False, resolved_archive_file, possible_model_basename + else: + temp = None + for ext in extensions: + for possible_model_basename in possible_model_basenames: + shard_index_name = possible_model_basename + ext + ".index.json" + shard_index = cached_file( + model_name_or_path, + shard_index_name, + **cached_file_kwargs, + ) + searched_files.append(shard_index_name) + if shard_index is not None: + # The model is sharded over several checkpoints. + with open(str(shard_index)) as f: + index_json = json.load(f) + # Download the shards from the index.json. + shards = list(set(index_json["weight_map"].values())) + for shard in shards: + resolved_archive_file = cached_file( + model_name_or_path, + shard, + **cached_file_kwargs, + ) + return True, shard_index, possible_model_basename + else: + resolved_archive_file = cached_file( + model_name_or_path, + possible_model_basename + ext, + **cached_file_kwargs, + ) + if resolved_archive_file is None: + resolved_archive_file = temp + searched_files.append(possible_model_basename + ext) + if resolved_archive_file is not None: + temp = resolved_archive_file + return False, resolved_archive_file, possible_model_basename + + if resolved_archive_file is None: + raise FileNotFoundError( + f"Could not find a model in {model_name_or_path} with a name in {', '.join(searched_files)}. Please specify the argument model_basename to use a custom file name." + ) + + return False, resolved_archive_file, true_model_basename + + +__all__ = [ + "get_device", + "move_to_device", + "find_layers", + "get_module_by_name_prefix", + "get_module_by_name_suffix", + "make_quant", + "preprocess_checkpoint_qigen", + "pack_model", + "autogptq_post_init", + "check_and_get_model_type", + "simple_dispatch_model", + "make_sure_no_tensor_in_meta_device", +] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/auto.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/auto.py new file mode 100644 index 0000000000000000000000000000000000000000..81b98d80b35bbd09fdb60fe447f9c5429ba70ba0 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/auto.py @@ -0,0 +1,168 @@ +from inspect import signature +from typing import Dict, Optional, Union + +from ._base import BaseGPTQForCausalLM, BaseQuantizeConfig +from ._utils import check_and_get_model_type +from .baichuan import BaiChuanGPTQForCausalLM +from .bloom import BloomGPTQForCausalLM +from .codegen import CodeGenGPTQForCausalLM +from .cohere import CohereGPTQForCausalLM +from .decilm import DeciLMGPTQForCausalLM +from .gemma import GemmaGPTQForCausalLM +from .gpt2 import GPT2GPTQForCausalLM +from .gpt_bigcode import GPTBigCodeGPTQForCausalLM +from .gpt_neox import GPTNeoXGPTQForCausalLM +from .gptj import GPTJGPTQForCausalLM +from .internlm import InternLMGPTQForCausalLM +from .llama import LlamaGPTQForCausalLM +from .longllama import LongLlamaGPTQForCausalLM +from .mistral import MistralGPTQForCausalLM +from .mixtral import MixtralGPTQForCausalLM +from .moss import MOSSGPTQForCausalLM +from .mpt import MPTGPTQForCausalLM +from .opt import OPTGPTQForCausalLM +from .phi import PhiGPTQForCausalLM +from .qwen import QwenGPTQForCausalLM +from .qwen2 import Qwen2GPTQForCausalLM +from .rw import RWGPTQForCausalLM +from .stablelmepoch import StableLMEpochGPTQForCausalLM +from .starcoder2 import Starcoder2GPTQForCausalLM +from .xverse import XverseGPTQForCausalLM +from .yi import YiGPTQForCausalLM + + +GPTQ_CAUSAL_LM_MODEL_MAP = { + "bloom": BloomGPTQForCausalLM, + "gpt_neox": GPTNeoXGPTQForCausalLM, + "gptj": GPTJGPTQForCausalLM, + "gpt2": GPT2GPTQForCausalLM, + "llama": LlamaGPTQForCausalLM, + "opt": OPTGPTQForCausalLM, + "moss": MOSSGPTQForCausalLM, + "gpt_bigcode": GPTBigCodeGPTQForCausalLM, + "codegen": CodeGenGPTQForCausalLM, + "cohere": CohereGPTQForCausalLM, + "RefinedWebModel": RWGPTQForCausalLM, + "RefinedWeb": RWGPTQForCausalLM, + "falcon": RWGPTQForCausalLM, + "baichuan": BaiChuanGPTQForCausalLM, + "internlm": InternLMGPTQForCausalLM, + "qwen": QwenGPTQForCausalLM, + "mistral": MistralGPTQForCausalLM, + "Yi": YiGPTQForCausalLM, + "xverse": XverseGPTQForCausalLM, + "deci": DeciLMGPTQForCausalLM, + "stablelm_epoch": StableLMEpochGPTQForCausalLM, + "starcoder2": Starcoder2GPTQForCausalLM, + "mixtral": MixtralGPTQForCausalLM, + "qwen2": Qwen2GPTQForCausalLM, + "longllama": LongLlamaGPTQForCausalLM, + "gemma": GemmaGPTQForCausalLM, + "phi": PhiGPTQForCausalLM, + "mpt": MPTGPTQForCausalLM, +} + + +class AutoGPTQForCausalLM: + def __init__(self): + raise EnvironmentError( + "AutoGPTQModelForCausalLM is designed to be instantiated\n" + "using `AutoGPTQModelForCausalLM.from_pretrained` if want to quantize a pretrained model.\n" + "using `AutoGPTQModelForCausalLM.from_quantized` if want to inference with quantized model." + ) + + @classmethod + def from_pretrained( + cls, + pretrained_model_name_or_path: str, + quantize_config: BaseQuantizeConfig, + max_memory: Optional[dict] = None, + trust_remote_code: bool = False, + **model_init_kwargs, + ) -> BaseGPTQForCausalLM: + model_type = check_and_get_model_type(pretrained_model_name_or_path, trust_remote_code) + return GPTQ_CAUSAL_LM_MODEL_MAP[model_type].from_pretrained( + pretrained_model_name_or_path=pretrained_model_name_or_path, + quantize_config=quantize_config, + max_memory=max_memory, + trust_remote_code=trust_remote_code, + **model_init_kwargs, + ) + + @classmethod + def from_quantized( + cls, + model_name_or_path: Optional[str], + device_map: Optional[Union[str, Dict[str, Union[str, int]]]] = None, + max_memory: Optional[dict] = None, + device: Optional[Union[str, int]] = None, + low_cpu_mem_usage: bool = False, + use_triton: bool = False, + inject_fused_attention: bool = False, + inject_fused_mlp: bool = False, + use_cuda_fp16: bool = True, + quantize_config: Optional[BaseQuantizeConfig] = None, + model_basename: Optional[str] = None, + use_safetensors: bool = True, + trust_remote_code: bool = False, + warmup_triton: bool = False, + trainable: bool = False, + disable_exllama: Optional[bool] = None, + disable_exllamav2: bool = False, + use_marlin: bool = False, + use_tritonv2: bool = False, + **kwargs, + ) -> BaseGPTQForCausalLM: + # If disable_exllamav2 is True, we want to fall back on the exllama kernel and not the cuda/cuda_old ones. + if disable_exllama is None: + if disable_exllamav2: + disable_exllama = False + else: + disable_exllama = True + + model_type = check_and_get_model_type(model_name_or_path, trust_remote_code) + quant_func = GPTQ_CAUSAL_LM_MODEL_MAP[model_type].from_quantized + # A static list of kwargs needed for huggingface_hub + huggingface_kwargs = [ + "cache_dir", + "force_download", + "proxies", + "resume_download", + "local_files_only", + "use_auth_token", + "revision", + "subfolder", + "_raise_exceptions_for_missing_entries", + "_commit_hash", + ] + # TODO: do we need this filtering of kwargs? @PanQiWei is there a reason we can't just pass all kwargs? + keywords = { + key: kwargs[key] + for key in list(signature(quant_func).parameters.keys()) + huggingface_kwargs + if key in kwargs + } + return quant_func( + model_name_or_path=model_name_or_path, + device_map=device_map, + max_memory=max_memory, + device=device, + low_cpu_mem_usage=low_cpu_mem_usage, + use_triton=use_triton, + inject_fused_attention=inject_fused_attention, + inject_fused_mlp=inject_fused_mlp, + use_cuda_fp16=use_cuda_fp16, + quantize_config=quantize_config, + model_basename=model_basename, + use_safetensors=use_safetensors, + trust_remote_code=trust_remote_code, + warmup_triton=warmup_triton, + trainable=trainable, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + use_marlin=use_marlin, + use_tritonv2=use_tritonv2, + **keywords, + ) + + +__all__ = ["AutoGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/baichuan.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/baichuan.py new file mode 100644 index 0000000000000000000000000000000000000000..96b83024194be5b9d2be963a278a736680d49dc4 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/baichuan.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class BaiChuanGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "DecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.W_pack"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + +__all__ = ["BaiChuanGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/bloom.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/bloom.py new file mode 100644 index 0000000000000000000000000000000000000000..f7471a9685c26fc26a1c6845fb0d714546a22e73 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/bloom.py @@ -0,0 +1,20 @@ +from ._base import BaseGPTQForCausalLM + + +class BloomGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "BloomBlock" + layers_block_name = "transformer.h" + outside_layer_modules = [ + "transformer.word_embeddings", + "transformer.word_embeddings_layernorm", + "transformer.ln_f", + ] + inside_layer_modules = [ + ["self_attention.query_key_value"], + ["self_attention.dense"], + ["mlp.dense_h_to_4h"], + ["mlp.dense_4h_to_h"], + ] + + +__all__ = ["BloomGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/codegen.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/codegen.py new file mode 100644 index 0000000000000000000000000000000000000000..2e656ab932d9e6708f26d6a4a8d05b0ad39541a4 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/codegen.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class CodeGenGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "CodeGenBlock" + layers_block_name = "transformer.h" + outside_layer_modules = ["transformer.wte", "transformer.ln_f"] + inside_layer_modules = [ + ["attn.qkv_proj"], + ["attn.out_proj"], + ["mlp.fc_in"], + ["mlp.fc_out"], + ] + + +__all__ = ["CodeGenGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/cohere.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/cohere.py new file mode 100644 index 0000000000000000000000000000000000000000..5271d8d3c24e60a5e14b7851793f0f98b3687889 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/cohere.py @@ -0,0 +1,20 @@ +from logging import getLogger + +from ._base import BaseGPTQForCausalLM + + +logger = getLogger(__name__) + +class CohereGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "CohereDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + +__all__ = ["CohereGPTQForCausalLM"] + \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/decilm.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/decilm.py new file mode 100644 index 0000000000000000000000000000000000000000..67f2dc91511b2672cbc7653c72cc6b8211681051 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/decilm.py @@ -0,0 +1,32 @@ +from logging import getLogger + +from ..utils.import_utils import compare_transformers_version +from ._base import BaseGPTQForCausalLM + + +if compare_transformers_version("v4.28.0", op="ge"): + from ..nn_modules.fused_llama_attn import FusedLlamaAttentionForQuantizedModel + from ..nn_modules.fused_llama_mlp import FusedLlamaMLPForQuantizedModel +else: + FusedLlamaAttentionForQuantizedModel = None + FusedLlamaMLPForQuantizedModel = None + +logger = getLogger(__name__) + + +class DeciLMGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "DeciLMDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + fused_attn_module_type = FusedLlamaAttentionForQuantizedModel + fused_mlp_module_type = FusedLlamaMLPForQuantizedModel + + +__all__ = ["DeciLMGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gemma.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gemma.py new file mode 100644 index 0000000000000000000000000000000000000000..581732cff6561d31fdf4b5b7abfc1a8c2ec7653f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gemma.py @@ -0,0 +1,21 @@ +from logging import getLogger + +from ._base import BaseGPTQForCausalLM + + +logger = getLogger(__name__) + + +class GemmaGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "GemmaDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + +__all__ = ["GemmaGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt2.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt2.py new file mode 100644 index 0000000000000000000000000000000000000000..f8654a74e6c2ee3d29c994ecbfef7fc8e3cf2bac --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt2.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class GPT2GPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "GPT2Block" + layers_block_name = "transformer.h" + outside_layer_modules = ["transformer.wte", "transformer.wpe", "transformer.ln_f"] + inside_layer_modules = [ + ["attn.c_attn"], + ["attn.c_proj"], + ["mlp.c_fc"], + ["mlp.c_proj"], + ] + + +__all__ = ["GPT2GPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt_bigcode.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt_bigcode.py new file mode 100644 index 0000000000000000000000000000000000000000..5943b0f1db14c4b9e3347ca7029fdc2e4424915c --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt_bigcode.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class GPTBigCodeGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "GPTBigCodeBlock" + layers_block_name = "transformer.h" + outside_layer_modules = ["transformer.wpe", "transformer.wte", "transformer.ln_f"] + inside_layer_modules = [ + ["attn.c_attn"], + ["attn.c_proj"], + ["mlp.c_fc"], + ["mlp.c_proj"], + ] + + +__all__ = ["GPTBigCodeGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt_neox.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt_neox.py new file mode 100644 index 0000000000000000000000000000000000000000..52f4a0b73816f6b8d811cfda7ab49464629bc568 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gpt_neox.py @@ -0,0 +1,17 @@ +from ._base import BaseGPTQForCausalLM + + +class GPTNeoXGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "GPTNeoXLayer" + layers_block_name = "gpt_neox.layers" + outside_layer_modules = ["gpt_neox.embed_in", "gpt_neox.final_layer_norm"] + inside_layer_modules = [ + ["attention.query_key_value"], + ["attention.dense"], + ["mlp.dense_h_to_4h"], + ["mlp.dense_4h_to_h"], + ] + lm_head_name = "embed_out" + + +__all__ = ["GPTNeoXGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gptj.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gptj.py new file mode 100644 index 0000000000000000000000000000000000000000..5309f081b9472fc2b388f003b75d016db2b4425c --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/gptj.py @@ -0,0 +1,19 @@ +from ..nn_modules.fused_gptj_attn import FusedGPTJAttentionForQuantizedModel +from ._base import BaseGPTQForCausalLM + + +class GPTJGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "GPTJBlock" + layers_block_name = "transformer.h" + outside_layer_modules = ["transformer.wte", "transformer.ln_f"] + inside_layer_modules = [ + ["attn.k_proj", "attn.v_proj", "attn.q_proj"], + ["attn.out_proj"], + ["mlp.fc_in"], + ["mlp.fc_out"], + ] + + fused_attn_module_type = FusedGPTJAttentionForQuantizedModel + + +__all__ = ["GPTJGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/internlm.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/internlm.py new file mode 100644 index 0000000000000000000000000000000000000000..40c55e1a81e29e1c23d27ef0f1271e50c7aada19 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/internlm.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class InternLMGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "InternLMDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + +__all__ = ["InternLMGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/llama.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/llama.py new file mode 100644 index 0000000000000000000000000000000000000000..0841551f1c1bedd71e025e8a0fc4ceaf7c0264e5 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/llama.py @@ -0,0 +1,32 @@ +from logging import getLogger + +from ..utils.import_utils import compare_transformers_version +from ._base import BaseGPTQForCausalLM + + +if compare_transformers_version("v4.28.0", op="ge"): + from ..nn_modules.fused_llama_attn import FusedLlamaAttentionForQuantizedModel + from ..nn_modules.fused_llama_mlp import FusedLlamaMLPForQuantizedModel +else: + FusedLlamaAttentionForQuantizedModel = None + FusedLlamaMLPForQuantizedModel = None + +logger = getLogger(__name__) + + +class LlamaGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "LlamaDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + fused_attn_module_type = FusedLlamaAttentionForQuantizedModel + fused_mlp_module_type = FusedLlamaMLPForQuantizedModel + + +__all__ = ["LlamaGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/longllama.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/longllama.py new file mode 100644 index 0000000000000000000000000000000000000000..8cc737d3006dcb35a6d7c4e498a26cd365c0e370 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/longllama.py @@ -0,0 +1,32 @@ +from logging import getLogger + +from ..utils.import_utils import compare_transformers_version +from ._base import BaseGPTQForCausalLM + + +if compare_transformers_version("v4.28.0", op="ge"): + from ..nn_modules.fused_llama_attn import FusedLlamaAttentionForQuantizedModel + from ..nn_modules.fused_llama_mlp import FusedLlamaMLPForQuantizedModel +else: + FusedLlamaAttentionForQuantizedModel = None + FusedLlamaMLPForQuantizedModel = None + +logger = getLogger(__name__) + + +class LongLlamaGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "LongLlamaDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + fused_attn_module_type = FusedLlamaAttentionForQuantizedModel + fused_mlp_module_type = FusedLlamaMLPForQuantizedModel + + +__all__ = ["LongLlamaGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mistral.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mistral.py new file mode 100644 index 0000000000000000000000000000000000000000..847a78bfccfa54c6d9d54f816af590b44c3c6e27 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mistral.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class MistralGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "MistralDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + +__all__ = ["MistralGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mixtral.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mixtral.py new file mode 100644 index 0000000000000000000000000000000000000000..74c621e65dadf29f87542e70e7a3565065ca34f4 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mixtral.py @@ -0,0 +1,42 @@ +from ._base import BaseGPTQForCausalLM + + +class MixtralGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "MixtralDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + [ + "block_sparse_moe.experts.0.w1", + "block_sparse_moe.experts.1.w1", + "block_sparse_moe.experts.2.w1", + "block_sparse_moe.experts.3.w1", + "block_sparse_moe.experts.4.w1", + "block_sparse_moe.experts.5.w1", + "block_sparse_moe.experts.6.w1", + "block_sparse_moe.experts.7.w1", + "block_sparse_moe.experts.0.w3", + "block_sparse_moe.experts.1.w3", + "block_sparse_moe.experts.2.w3", + "block_sparse_moe.experts.3.w3", + "block_sparse_moe.experts.4.w3", + "block_sparse_moe.experts.5.w3", + "block_sparse_moe.experts.6.w3", + "block_sparse_moe.experts.7.w3", + ], + [ + "block_sparse_moe.experts.0.w2", + "block_sparse_moe.experts.1.w2", + "block_sparse_moe.experts.2.w2", + "block_sparse_moe.experts.3.w2", + "block_sparse_moe.experts.4.w2", + "block_sparse_moe.experts.5.w2", + "block_sparse_moe.experts.6.w2", + "block_sparse_moe.experts.7.w2", + ], + ] + + +__all__ = ["MixtralGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/moss.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/moss.py new file mode 100644 index 0000000000000000000000000000000000000000..6ed30fb619736123a1f779e58c8ef8a5f604c2d2 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/moss.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class MOSSGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "MossBlock" + layers_block_name = "transformer.h" + outside_layer_modules = ["transformer.wte", "transformer.ln_f"] + inside_layer_modules = [ + ["attn.qkv_proj"], + ["attn.out_proj"], + ["mlp.fc_in"], + ["mlp.fc_out"], + ] + + +__all__ = ["MOSSGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mpt.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mpt.py new file mode 100644 index 0000000000000000000000000000000000000000..5da1eb654b9f363d28a6cba8cda2cf4f5bd9960c --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/mpt.py @@ -0,0 +1,19 @@ +from auto_gptq.modeling import BaseGPTQForCausalLM + + +class MPTGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "MPTBlock" + layers_block_name = "transformer.blocks" + outside_layer_modules = [ + "transformer.wte", "transformer.norm_f" + ] + + inside_layer_modules = [ + ["attn.Wqkv"], + ["attn.out_proj"], + ["ffn.up_proj"], + ["ffn.down_proj"] + ] + + +__all__ = ["MPTGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/opt.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/opt.py new file mode 100644 index 0000000000000000000000000000000000000000..6279569644e0b66987c77c9aa2d8a1bf6118c3be --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/opt.py @@ -0,0 +1,22 @@ +from ._base import BaseGPTQForCausalLM + + +class OPTGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "OPTDecoderLayer" + layers_block_name = "model.decoder.layers" + outside_layer_modules = [ + "model.decoder.embed_tokens", + "model.decoder.embed_positions", + "model.decoder.project_out", + "model.decoder.project_in", + "model.decoder.final_layer_norm", + ] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.out_proj"], + ["fc1"], + ["fc2"], + ] + + +__all__ = ["OPTGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/phi.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/phi.py new file mode 100644 index 0000000000000000000000000000000000000000..240d32d90f2679e9ab3126e3d22d89263cb9f911 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/phi.py @@ -0,0 +1,18 @@ +from ._base import BaseGPTQForCausalLM + + +class PhiGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "PhiDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.final_layernorm"] + inside_layer_modules = [ + ["self_attn.q_proj"], + ["self_attn.k_proj"], + ["self_attn.v_proj"], + ["self_attn.dense"], + ["mlp.fc1"], + ["mlp.fc2"], + ] + + +__all__ = ["PhiGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/qwen.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/qwen.py new file mode 100644 index 0000000000000000000000000000000000000000..4354db6e5e2036c1c87b5c4541f010db622b34ea --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/qwen.py @@ -0,0 +1,21 @@ +from ._base import BaseGPTQForCausalLM + + +class QwenGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "QWenBlock" + layers_block_name = "transformer.h" + outside_layer_modules = [ + "transformer.wte", + "transformer.wpe", + "transformer.ln_f", + "transformer.visual", + ] + inside_layer_modules = [ + ["attn.c_attn"], + ["attn.c_proj"], + ["mlp.w1", "mlp.w2"], + ["mlp.c_proj"], + ] + + +__all__ = ["QwenGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/qwen2.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/qwen2.py new file mode 100644 index 0000000000000000000000000000000000000000..03755676a04761c49c7ec3f6702ccf5f7636c9c7 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/qwen2.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class Qwen2GPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "Qwen2DecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + +__all__ = ["Qwen2GPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/rw.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/rw.py new file mode 100644 index 0000000000000000000000000000000000000000..5d95fc65df3308c4324a4f7ae86f40f7d792e86b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/rw.py @@ -0,0 +1,16 @@ +from ._base import BaseGPTQForCausalLM + + +class RWGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "DecoderLayer" + layers_block_name = "transformer.h" + outside_layer_modules = ["transformer.word_embeddings", "transformer.ln_f"] + inside_layer_modules = [ + ["self_attention.query_key_value"], + ["self_attention.dense"], + ["mlp.dense_h_to_4h"], + ["mlp.dense_4h_to_h"], + ] + + +__all__ = ["RWGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/stablelmepoch.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/stablelmepoch.py new file mode 100644 index 0000000000000000000000000000000000000000..9d2b404396775727d78b9160989b18ec21db8642 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/stablelmepoch.py @@ -0,0 +1,32 @@ +from logging import getLogger + +from ..utils.import_utils import compare_transformers_version +from ._base import BaseGPTQForCausalLM + + +if compare_transformers_version("v4.28.0", op="ge"): + from ..nn_modules.fused_llama_attn import FusedLlamaAttentionForQuantizedModel + from ..nn_modules.fused_llama_mlp import FusedLlamaMLPForQuantizedModel +else: + FusedLlamaAttentionForQuantizedModel = None + FusedLlamaMLPForQuantizedModel = None + +logger = getLogger(__name__) + + +class StableLMEpochGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "DecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + fused_attn_module_type = FusedLlamaAttentionForQuantizedModel + fused_mlp_module_type = FusedLlamaMLPForQuantizedModel + + +__all__ = ["StableLMEpochGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/starcoder2.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/starcoder2.py new file mode 100644 index 0000000000000000000000000000000000000000..cb77ac1a6349e84e29066b1bd823c051f8a87f11 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/starcoder2.py @@ -0,0 +1,21 @@ +from logging import getLogger + +from ._base import BaseGPTQForCausalLM + + +logger = getLogger(__name__) + + +class Starcoder2GPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "Starcoder2DecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.c_fc"], + ["mlp.c_proj"], + ] + + +__all__ = ["Starcoder2GPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/xverse.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/xverse.py new file mode 100644 index 0000000000000000000000000000000000000000..63db8d436181c6a7f83a0369b617f62bff38ca13 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/xverse.py @@ -0,0 +1,32 @@ +from logging import getLogger + +from ..utils.import_utils import compare_transformers_version +from ._base import BaseGPTQForCausalLM + + +if compare_transformers_version("v4.28.0", op="ge"): + from ..nn_modules.fused_llama_attn import FusedLlamaAttentionForQuantizedModel + from ..nn_modules.fused_llama_mlp import FusedLlamaMLPForQuantizedModel +else: + FusedLlamaAttentionForQuantizedModel = None + FusedLlamaMLPForQuantizedModel = None + +logger = getLogger(__name__) + + +class XverseGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "XverseDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + fused_attn_module_type = FusedLlamaAttentionForQuantizedModel + fused_mlp_module_type = FusedLlamaMLPForQuantizedModel + + +__all__ = ["XverseGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/yi.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/yi.py new file mode 100644 index 0000000000000000000000000000000000000000..0bb97c98a1a0dcc3af7201beb3aad0a78c68d029 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/modeling/yi.py @@ -0,0 +1,32 @@ +from logging import getLogger + +from ..utils.import_utils import compare_transformers_version +from ._base import BaseGPTQForCausalLM + + +if compare_transformers_version("v4.28.0", op="ge"): + from ..nn_modules.fused_llama_attn import FusedLlamaAttentionForQuantizedModel + from ..nn_modules.fused_llama_mlp import FusedLlamaMLPForQuantizedModel +else: + FusedLlamaAttentionForQuantizedModel = None + FusedLlamaMLPForQuantizedModel = None + +logger = getLogger(__name__) + + +class YiGPTQForCausalLM(BaseGPTQForCausalLM): + layer_type = "YiDecoderLayer" + layers_block_name = "model.layers" + outside_layer_modules = ["model.embed_tokens", "model.norm"] + inside_layer_modules = [ + ["self_attn.k_proj", "self_attn.v_proj", "self_attn.q_proj"], + ["self_attn.o_proj"], + ["mlp.up_proj", "mlp.gate_proj"], + ["mlp.down_proj"], + ] + + fused_attn_module_type = FusedLlamaAttentionForQuantizedModel + fused_mlp_module_type = FusedLlamaMLPForQuantizedModel + + +__all__ = ["YiGPTQForCausalLM"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/_fused_base.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/_fused_base.py new file mode 100644 index 0000000000000000000000000000000000000000..7d899625cc8a36e2828b71bf54cb9d42fc155a00 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/_fused_base.py @@ -0,0 +1,36 @@ +from abc import abstractmethod +from logging import getLogger + +import torch.nn as nn + +from .triton_utils.mixin import TritonModuleMixin + + +logger = getLogger(__name__) + + +class FusedBaseModule(nn.Module, TritonModuleMixin): + @classmethod + @abstractmethod + def inject_to_model(cls, *args, **kwargs): + raise NotImplementedError() + + +class FusedBaseAttentionModule(FusedBaseModule): + @classmethod + @abstractmethod + def inject_to_model( + cls, model, use_triton=False, group_size=-1, use_cuda_fp16=True, desc_act=False, trainable=False, **kwargs + ): + raise NotImplementedError() + + @classmethod + def warmup(cls, model, transpose=False, seqlen=2048): + pass + + +class FusedBaseMLPModule(FusedBaseModule): + @classmethod + @abstractmethod + def inject_to_model(cls, model, use_triton=False, **kwargs): + raise NotImplementedError() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_gptj_attn.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_gptj_attn.py new file mode 100644 index 0000000000000000000000000000000000000000..85f6c349f84febfd09dec492bee8e3781978bfe1 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_gptj_attn.py @@ -0,0 +1,314 @@ +from typing import Optional, Tuple, Union + +import torch +import torch.nn as nn +from torch.nn import functional as F +from transformers.models.gptj.modeling_gptj import GPTJAttention + +from ..utils.import_utils import compare_pytorch_version, dynamically_import_QuantLinear +from ._fused_base import FusedBaseAttentionModule + + +def fixed_pos_embedding(x, seq_dim=1, seq_len=None): + dim = x.shape[-1] + if seq_len is None: + seq_len = x.shape[seq_dim] + inv_freq = 1.0 / (10000 ** (torch.arange(0, dim, 2) / dim)) + sinusoid_inp = ( + torch.einsum("i , j -> i j", torch.arange(seq_len, dtype=torch.float), inv_freq).to(x.device).float() + ) + return torch.sin(sinusoid_inp), torch.cos(sinusoid_inp) + + +def rotate_every_two(x): + x1 = x[:, :, :, ::2] + x2 = x[:, :, :, 1::2] + x = torch.stack((-x2, x1), dim=-1) + return x.flatten(-2) # in einsum notation: rearrange(x, '... d j -> ... (d j)') + + +def duplicate_interleave(m): + """ + A simple version of `torch.repeat_interleave` for duplicating a matrix while interleaving the copy. + """ + dim0 = m.shape[0] + m = m.view(-1, 1) # flatten the matrix + m = m.repeat(1, 2) # repeat all elements into the 2nd dimension + m = m.view(dim0, -1) # reshape into a matrix, interleaving the copy + return m + + +def apply_rotary_pos_emb(x, sincos, offset=0): + sin, cos = (duplicate_interleave(t)[None, offset : x.shape[1] + offset, None, :] for t in sincos) + # einsum notation for lambda t: repeat(t[offset:x.shape[1]+offset,:], "n d -> () n () (d j)", j=2) + return (x * cos) + (rotate_every_two(x) * sin) + + +class FusedGPTJAttentionForQuantizedModel(FusedBaseAttentionModule): + def __init__(self, config): + super().__init__() + + max_positions = config.max_position_embeddings + self.register_buffer( + "bias", + torch.tril(torch.ones((max_positions, max_positions), dtype=torch.bool)).view( + 1, 1, max_positions, max_positions + ), + ) + self.register_buffer("masked_bias", torch.tensor(-1e9)) + + self.attn_dropout = nn.Dropout(config.attn_pdrop) + self.attn_dropout_p = config.attn_pdrop + self.resid_dropout = nn.Dropout(config.resid_pdrop) + + self.embed_dim = config.hidden_size + self.num_attention_heads = config.num_attention_heads + self.head_dim = self.embed_dim // self.num_attention_heads + if self.head_dim * self.num_attention_heads != self.embed_dim: + raise ValueError( + f"embed_dim must be divisible by num_attention_heads (got `embed_dim`: {self.embed_dim} and" + f" `num_attention_heads`: {self.num_attention_heads})." + ) + self.scale_attn = torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32)).to(torch.get_default_dtype()) + + self.qkv_proj = nn.Linear(self.embed_dim, self.embed_dim * 3, bias=False) + self.out_proj = nn.Linear(self.embed_dim, self.embed_dim, bias=False) + self.rotary_dim = config.rotary_dim + + def _split_heads(self, qkv): + """ + Splits hidden dim into attn_head_size and num_attention_heads + """ + new_shape = qkv.size()[:-1] + (3, self.num_attention_heads, self.head_dim) + qkv = qkv.view(new_shape) # (batch, seq_length, 3, head, head_features) + query = qkv[:, :, 0] + key = qkv[:, :, 1] + value = qkv[:, :, 2] + + return query, key, value + + def _merge_heads(self, tensor, num_attention_heads, attn_head_size): + """ + Merges attn_head_size dim and num_attn_heads dim into hidden dim + """ + if len(tensor.shape) == 5: + tensor = tensor.permute(0, 1, 3, 2, 4).contiguous() + elif len(tensor.shape) == 4: + tensor = tensor.permute(0, 2, 1, 3).contiguous() + else: + raise ValueError(f"Input tensor rank should be one of [4, 5], but is: {len(tensor.shape)}") + new_shape = tensor.size()[:-2] + (num_attention_heads * attn_head_size,) + return tensor.view(new_shape) + + def _attn( + self, + query, + key, + value, + attention_mask=None, + head_mask=None, + ): + # compute causal mask from causal mask buffer + query_length, key_length = query.size(-2), key.size(-2) + causal_mask = self.bias[:, :, key_length - query_length : key_length, :key_length] + + # Keep the attention weights computation in fp32 to avoid overflow issues + query = query.to(torch.float32) + key = key.to(torch.float32) + + attn_weights = torch.matmul(query, key.transpose(-1, -2)) + + mask_value = torch.finfo(attn_weights.dtype).min + # Need to be a tensor, otherwise we get error: `RuntimeError: expected scalar type float but found double`. + # Need to be on the same device, otherwise `RuntimeError: ..., x and y to be on the same device` + mask_value = torch.tensor(mask_value, dtype=attn_weights.dtype).to(attn_weights.device) + attn_weights = torch.where(causal_mask, attn_weights, mask_value) + + attn_weights = attn_weights / self.scale_attn + + if attention_mask is not None: + # Apply the attention mask + attn_weights = attn_weights + attention_mask + + attn_weights = nn.functional.softmax(attn_weights, dim=-1) + attn_weights = attn_weights.to(value.dtype) + attn_weights = self.attn_dropout(attn_weights) + + # Mask heads if we want to + if head_mask is not None: + attn_weights = attn_weights * head_mask + + attn_output = torch.matmul(attn_weights, value) + + return attn_output, attn_weights + + def forward( + self, + hidden_states: torch.FloatTensor, + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = False, + output_attentions: Optional[bool] = False, + ) -> Union[ + Tuple[torch.Tensor, Tuple[torch.Tensor]], + Optional[Tuple[torch.Tensor, Tuple[torch.Tensor], Tuple[torch.Tensor, ...]]], + ]: + query, key, value = self._split_heads(self.qkv_proj(hidden_states)) + + seq_len = key.shape[1] + offset = 0 + + if layer_past is not None: + offset = layer_past[0].shape[-2] + seq_len += offset + + if self.rotary_dim is not None: + k_rot = key[:, :, :, : self.rotary_dim] + k_pass = key[:, :, :, self.rotary_dim :] + + q_rot = query[:, :, :, : self.rotary_dim] + q_pass = query[:, :, :, self.rotary_dim :] + + sincos = fixed_pos_embedding(k_rot, 1, seq_len=seq_len) + k_rot = apply_rotary_pos_emb(k_rot, sincos, offset=offset) + q_rot = apply_rotary_pos_emb(q_rot, sincos, offset=offset) + + key = torch.cat([k_rot, k_pass], dim=-1) + query = torch.cat([q_rot, q_pass], dim=-1) + else: + sincos = fixed_pos_embedding(key, 1, seq_len=seq_len) + key = apply_rotary_pos_emb(key, sincos, offset=offset) + query = apply_rotary_pos_emb(query, sincos, offset=offset) + + key = key.permute(0, 2, 1, 3) + query = query.permute(0, 2, 1, 3) + value = value.permute(0, 2, 1, 3) + + is_causal = layer_past is None + if layer_past is not None: + past_key = layer_past[0] + past_value = layer_past[1] + key = torch.cat((past_key, key), dim=-2) + value = torch.cat((past_value, value), dim=-2) + + if use_cache is True: + query = query.contiguous() + key = key.contiguous() + value = value.contiguous() + present = (key, value) + else: + present = None + + # compute self-attention: V x Softmax(QK^T) + if compare_pytorch_version("v2.0.0", op="ge"): + attn_output = F.scaled_dot_product_attention( + query, + key, + value, + attn_mask=None if is_causal else attention_mask, + dropout_p=self.attn_dropout_p, + is_causal=is_causal, + ) + attn_weights = None + else: + attn_output, attn_weights = self._attn(query, key, value, attention_mask, head_mask) + + attn_output = self._merge_heads(attn_output, self.num_attention_heads, self.head_dim) + attn_output = self.out_proj(attn_output) + attn_output = self.resid_dropout(attn_output) + + outputs = (attn_output, present) + if output_attentions: + outputs += (attn_weights,) + + return outputs # a, present, (attentions) + + @classmethod + def inject_to_model( + cls, + model, + use_triton=False, + group_size=-1, + use_cuda_fp16=True, + desc_act=False, + trainable=False, + bits: int = 4, + disable_exllama=True, + disable_exllamav2=False, + **kwargs, + ): + config = model.config + QuantLinear = dynamically_import_QuantLinear( + use_triton=use_triton, + desc_act=desc_act, + group_size=group_size, + bits=bits, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + ) + + for name, m in model.named_modules(): + if not isinstance(m, GPTJAttention): + continue + + attn = cls(config).to(device=next(m.buffers()).device) + + q_proj = m.q_proj + k_proj = m.k_proj + v_proj = m.v_proj + + qweights = torch.cat([q_proj.qweight, k_proj.qweight, v_proj.qweight], dim=1) + qzeros = torch.cat([q_proj.qzeros, k_proj.qzeros, v_proj.qzeros], dim=1) + scales = torch.cat([q_proj.scales, k_proj.scales, v_proj.scales], dim=1) + + if QuantLinear.QUANT_TYPE == "exllama": + if desc_act: + # See fused_llama_attn.py comment + raise ValueError( + "Exllama kernel does not support query/key/value fusion with act-order. Please either use inject_fused_attention=False or disable_exllama=True." + ) + else: + g_idx = None + else: + g_idx = torch.cat([q_proj.g_idx, k_proj.g_idx, v_proj.g_idx], dim=0) + + bias = torch.cat([q_proj.bias, k_proj.bias, v_proj.bias], dim=0) if q_proj.bias is not None else None + + qlinear_args = ( + q_proj.bits, + q_proj.group_size, + q_proj.infeatures, + q_proj.outfeatures + k_proj.outfeatures + v_proj.outfeatures, + True if q_proj.bias is not None else False, + ) + qlinear_kwargs = {"trainable": trainable} + if (not desc_act or group_size == -1) and not use_triton: + qlinear_kwargs["use_cuda_fp16"] = use_cuda_fp16 + qlinear_kwargs["weight_dtype"] = q_proj.scales.dtype + + qkv_proj = QuantLinear(*qlinear_args, **qlinear_kwargs) + qkv_proj.qweight = qweights + qkv_proj.qzeros = qzeros + qkv_proj.scales = scales + qkv_proj.g_idx = g_idx + qkv_proj.bias = bias + + if "." in name: + parent_name = name.rsplit(".", 1)[0] + child_name = name[len(parent_name) + 1 :] + parent = model.get_submodule(parent_name) + else: + parent_name = "" + parent = model + child_name = name + + attn.qkv_proj = qkv_proj + attn.out_proj = m.out_proj + + setattr(parent, child_name, attn) + del m + + +__all__ = ["FusedGPTJAttentionForQuantizedModel"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_llama_attn.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_llama_attn.py new file mode 100644 index 0000000000000000000000000000000000000000..a2cde1b65f48456964b7166bcad1345fb65aa917 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_llama_attn.py @@ -0,0 +1,234 @@ +import math + +import torch +import torch.nn as nn +from torch.nn import functional as F +from transformers.models.llama.modeling_llama import ( + LlamaAttention, + apply_rotary_pos_emb, +) + +from ..utils.import_utils import compare_pytorch_version, dynamically_import_QuantLinear +from ._fused_base import FusedBaseAttentionModule + + +class FusedLlamaAttentionForQuantizedModel(FusedBaseAttentionModule): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__( + self, + hidden_size, + num_heads, + qkv_proj, + o_proj, + rotary_emb, + layer_idx, + ): + super().__init__() + self.hidden_size = hidden_size + self.num_heads = num_heads + self.head_dim = hidden_size // num_heads + self.layer_idx = layer_idx + + if self.head_dim * num_heads != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {num_heads})." + ) + self.qkv_proj = qkv_proj + self.o_proj = o_proj + self.rotary_emb = rotary_emb + + def _shape(self, tensor, seq_len, bsz): + return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous() + + def forward( + self, + hidden_states, + past_key_value=None, + attention_mask=None, + position_ids=None, + output_attentions=False, + use_cache=False, + **kwargs, + ): + """Input shape: Batch x Time x Channel""" + + bsz, q_len, _ = hidden_states.size() + + qkv_states = self.qkv_proj(hidden_states) + query_states, key_states, value_states = torch.split(qkv_states, self.hidden_size, dim=2) + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index. Please open an issue in AutoGPTQ if you hit this." + ) + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + + cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + # [bsz, nh, t, hd] + + if past_key_value is not None: + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + if use_cache: + # Since qkv_proj is fused, query_states etc will hold a reference to the original qkv_states tensor + # which can cause excessive memory usage by the cache. `contiguous` is a convenient way to workaround this. + query_states = query_states.contiguous() + key_states = key_states.contiguous() + value_states = value_states.contiguous() + + if compare_pytorch_version("v2.0.0", op="ge"): + attn_output = F.scaled_dot_product_attention( + query_states, + key_states, + value_states, + attn_mask=attention_mask, + is_causal=attention_mask is None and q_len > 1, + ) + attn_weights = None + else: + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz * self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + attn_weights = torch.max(attn_weights, torch.tensor(torch.finfo(attn_weights.dtype).min)) + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2) + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + @classmethod + def inject_to_model( + cls, + model, + use_triton=False, + group_size=-1, + use_cuda_fp16=True, + desc_act=False, + trainable=False, + bits: int = 4, + disable_exllama=True, + disable_exllamav2=False, + **kwargs, + ): + """ + Replace all LlamaAttention modules with QuantLlamaAttention modules, fusing the q, k, v projections. + """ + QuantLinear = dynamically_import_QuantLinear( + use_triton=use_triton, + desc_act=desc_act, + group_size=group_size, + bits=bits, + disable_exllama=disable_exllama, + disable_exllamav2=disable_exllamav2, + ) + + for name, m in model.named_modules(): + if not isinstance(m, LlamaAttention): + continue + + q_proj = m.q_proj + k_proj = m.k_proj + v_proj = m.v_proj + + qweights = torch.cat([q_proj.qweight, k_proj.qweight, v_proj.qweight], dim=1) + qzeros = torch.cat([q_proj.qzeros, k_proj.qzeros, v_proj.qzeros], dim=1) + scales = torch.cat([q_proj.scales, k_proj.scales, v_proj.scales], dim=1) + + if QuantLinear.QUANT_TYPE == "exllama": + if desc_act: + # TODO: support it. The issue lies maybe in the line: + # int groups = qzeros.size(0); + # in exllama_ext.cpp + raise ValueError( + "Exllama kernel does not support query/key/value fusion with act-order. Please either use inject_fused_attention=False or disable_exllama=True." + ) + else: + g_idx = None + else: + g_idx = torch.cat([q_proj.g_idx, k_proj.g_idx, v_proj.g_idx], dim=0) + + bias = torch.cat([q_proj.bias, k_proj.bias, v_proj.bias], dim=0) if q_proj.bias is not None else None + + qlinear_args = ( + q_proj.bits, + q_proj.group_size, + q_proj.infeatures, + q_proj.outfeatures + k_proj.outfeatures + v_proj.outfeatures, + True if q_proj.bias is not None else False, + ) + qlinear_kwargs = {"trainable": trainable} + if (not desc_act or group_size == -1) and not use_triton: + qlinear_kwargs["use_cuda_fp16"] = use_cuda_fp16 + qlinear_kwargs["weight_dtype"] = q_proj.scales.dtype + + qkv_layer = QuantLinear(*qlinear_args, **qlinear_kwargs) + qkv_layer.qweight = qweights + qkv_layer.qzeros = qzeros + qkv_layer.scales = scales + qkv_layer.g_idx = g_idx + qkv_layer.bias = bias + + # Introduced in Transformers 4.36 + layer_idx = None + if hasattr(m, "layer_idx"): + layer_idx = m.layer_idx + attn = cls( + m.hidden_size, + m.num_heads, + qkv_layer, + m.o_proj, + m.rotary_emb, + layer_idx=layer_idx, + ) + + if "." in name: + parent_name = name.rsplit(".", 1)[0] + child_name = name[len(parent_name) + 1 :] + parent = model.get_submodule(parent_name) + else: + parent_name = "" + parent = model + child_name = name + + setattr(parent, child_name, attn) + + +__all__ = ["FusedLlamaAttentionForQuantizedModel"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_llama_mlp.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_llama_mlp.py new file mode 100644 index 0000000000000000000000000000000000000000..f20df0d0226678565d2a24e319785ea74bc03d82 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/fused_llama_mlp.py @@ -0,0 +1,365 @@ +import math +from logging import getLogger + +import torch +from transformers.models.llama.modeling_llama import LlamaMLP + +from ..utils.import_utils import TRITON_AVAILABLE +from ._fused_base import FusedBaseMLPModule + + +logger = getLogger(__name__) + +if TRITON_AVAILABLE: + import triton + import triton.language as tl + + from .triton_utils import custom_autotune + from .triton_utils.kernels import silu + + @custom_autotune.autotune( + configs=[ + triton.Config( + { + "BLOCK_SIZE_M": 256, + "BLOCK_SIZE_N": 64, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 256, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 128, + "BLOCK_SIZE_N": 128, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 128, + "BLOCK_SIZE_N": 64, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 128, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 128, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), # 3090 + triton.Config( + { + "BLOCK_SIZE_M": 128, + "BLOCK_SIZE_N": 16, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), # 3090 + triton.Config( + { + "BLOCK_SIZE_M": 32, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 128, + "GROUP_SIZE_M": 8, + }, + num_stages=2, + num_warps=4, + ), # 3090 + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 16, + "BLOCK_SIZE_K": 64, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), # 3090 + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 64, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), # 3090 + ], + key=["M", "N", "K"], + nearest_power_of_two=True, + prune_configs_by={ + "early_config_prune": custom_autotune.matmul248_kernel_config_pruner, + "perf_model": None, + "top_k": None, + }, + ) + @triton.jit + def quant_fused_matmul_248_kernel( + a_ptr, + c_ptr, + b1_ptr, + scales1_ptr, + zeros1_ptr, + g1_ptr, + b2_ptr, + scales2_ptr, + zeros2_ptr, + g2_ptr, + M, + N, + K, + bits, + maxq, + stride_am, + stride_ak, + stride_bk, + stride_bn, + stride_cm, + stride_cn, + stride_scales, + stride_zeros, + BLOCK_SIZE_M: tl.constexpr, + BLOCK_SIZE_N: tl.constexpr, + BLOCK_SIZE_K: tl.constexpr, + GROUP_SIZE_M: tl.constexpr, + ): + """ + Computes: C = silu(A * B1) * (A * B2) + A is of shape (M, K) float16 + B is of shape (K//8, N) int32 + C is of shape (M, N) float16 + scales is of shape (1, N) float16 + zeros is of shape (1, N//8) int32 + """ + infearure_per_bits = 32 // bits + + pid = tl.program_id(axis=0) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_k = tl.cdiv(K, BLOCK_SIZE_K) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + (pid % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + + offs_am = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) + offs_bn = pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N) + offs_k = tl.arange(0, BLOCK_SIZE_K) + a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) # (BLOCK_SIZE_M, BLOCK_SIZE_K) + a_mask = offs_am[:, None] < M + # b_ptrs is set up such that it repeats elements along the K axis 8 times + b1_ptrs = b1_ptr + ((offs_k[:, None] // infearure_per_bits) * stride_bk + offs_bn[None, :] * stride_bn) + b2_ptrs = b2_ptr + ((offs_k[:, None] // infearure_per_bits) * stride_bk + offs_bn[None, :] * stride_bn) + g1_ptrs = g1_ptr + offs_k + g2_ptrs = g2_ptr + offs_k + # shifter is used to extract the N bits of each element in the 32-bit word from B + scales1_ptrs = scales1_ptr + offs_bn[None, :] + scales2_ptrs = scales2_ptr + offs_bn[None, :] + zeros1_ptrs = zeros1_ptr + (offs_bn[None, :] // infearure_per_bits) + zeros2_ptrs = zeros2_ptr + (offs_bn[None, :] // infearure_per_bits) + + shifter = (offs_k % infearure_per_bits) * bits + zeros_shifter = (offs_bn % infearure_per_bits) * bits + accumulator1 = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) + accumulator2 = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) + for k in range(0, num_pid_k): + g1_idx = tl.load(g1_ptrs) + g2_idx = tl.load(g2_ptrs) + + # Fetch scales and zeros; these are per-outfeature and thus reused in the inner loop + scales1 = tl.load(scales1_ptrs + g1_idx[:, None] * stride_scales) # (BLOCK_SIZE_K, BLOCK_SIZE_N,) + scales2 = tl.load(scales2_ptrs + g2_idx[:, None] * stride_scales) + + zeros1 = tl.load(zeros1_ptrs + g1_idx[:, None] * stride_zeros) # (BLOCK_SIZE_K, BLOCK_SIZE_N,) + zeros1 = (zeros1 >> zeros_shifter[None, :]) & maxq + zeros1 = zeros1 + 1 + + zeros2 = tl.load(zeros2_ptrs + g2_idx[:, None] * stride_zeros) # (BLOCK_SIZE_K, BLOCK_SIZE_N,) + zeros2 = (zeros2 >> zeros_shifter[None, :]) & maxq + zeros2 = zeros2 + 1 + + a = tl.load(a_ptrs, mask=a_mask, other=0.0) # (BLOCK_SIZE_M, BLOCK_SIZE_K) + b1 = tl.load(b1_ptrs) # (BLOCK_SIZE_K, BLOCK_SIZE_N), but repeated + b2 = tl.load(b2_ptrs) + + # Now we need to unpack b (which is N-bit values) into 32-bit values + b1 = (b1 >> shifter[:, None]) & maxq # Extract the N-bit values + b1 = (b1 - zeros1) * scales1 # Scale and shift + accumulator1 += tl.dot(a, b1) + + b2 = (b2 >> shifter[:, None]) & maxq + b2 = (b2 - zeros2) * scales2 + accumulator2 += tl.dot(a, b2) + + a_ptrs += BLOCK_SIZE_K + b1_ptrs += (BLOCK_SIZE_K // infearure_per_bits) * stride_bk + b2_ptrs += (BLOCK_SIZE_K // infearure_per_bits) * stride_bk + g1_ptrs += BLOCK_SIZE_K + g2_ptrs += BLOCK_SIZE_K + + accumulator1 = silu(accumulator1) + c = accumulator1 * accumulator2 + c = c.to(tl.float16) + c_ptrs = c_ptr + stride_cm * offs_am[:, None] + stride_cn * offs_bn[None, :] + c_mask = (offs_am[:, None] < M) & (offs_bn[None, :] < N) + tl.store(c_ptrs, c, mask=c_mask) + +else: + quant_fused_matmul_248_kernel = None + + +class FusedLlamaMLPForQuantizedModel(FusedBaseMLPModule): + def __init__( + self, + gate_proj, + down_proj, + up_proj, + ): + super().__init__() + + self.infeatures = gate_proj.infeatures + self.intermediate_size = gate_proj.outfeatures + self.outfeatures = down_proj.outfeatures + self.bits = gate_proj.bits + self.maxq = gate_proj.maxq + + self.gate_proj = gate_proj + self.up_proj = up_proj + self.down_proj = down_proj + + def forward(self, x): + return self.down_proj(self.triton_llama_mlp(x)) + + def triton_llama_mlp(self, x): + with torch.cuda.device(x.device): + out_shape = x.shape[:-1] + (self.intermediate_size,) + x = x.reshape(-1, x.shape[-1]) + M, K = x.shape + N = self.intermediate_size + c = torch.empty((M, N), device=x.device, dtype=torch.float16) + grid = lambda META: ( # noqa: E731 + triton.cdiv(M, META["BLOCK_SIZE_M"]) * triton.cdiv(N, META["BLOCK_SIZE_N"]), + ) + quant_fused_matmul_248_kernel[grid]( + x, + c, + self.gate_proj.qweight, + self.gate_proj.scales, + self.gate_proj.qzeros, + self.gate_proj.g_idx, + self.up_proj.qweight, + self.up_proj.scales, + self.up_proj.qzeros, + self.up_proj.g_idx, + M, + N, + K, + self.bits, + self.maxq, + x.stride(0), + x.stride(1), + self.gate_proj.qweight.stride(0), + self.gate_proj.qweight.stride(1), + c.stride(0), + c.stride(1), + self.gate_proj.scales.stride(0), + self.gate_proj.qzeros.stride(0), + ) + c = c.reshape(out_shape) + return c + + @classmethod + def inject_to_model(cls, model, use_triton=False, **kwargs): + if not use_triton: + logger.warning( + f"Skipping module injection for {cls.__name__} as currently not supported with use_triton=False." + ) + return + elif not TRITON_AVAILABLE: + logger.warning( + f"Skipping module injection for {cls.__name__} as Triton is not available. Please check your installation." + ) + return + + for name, m in model.named_modules(): + if not isinstance(m, LlamaMLP): + continue + + mlp = cls(m.gate_proj, m.down_proj, m.up_proj) + + if "." in name: + parent_name = name.rsplit(".", 1)[0] + child_name = name[len(parent_name) + 1 :] + parent = model.get_submodule(parent_name) + else: + parent_name = "" + parent = model + child_name = name + + setattr(parent, child_name, mlp) + + @classmethod + def warmup(cls, model, transpose=False, seqlen=2048): + from tqdm import tqdm + + kn_values = {} + + for _, m in model.named_modules(): + if not isinstance(m, cls): + continue + + k = m.infeatures + n = m.intermediate_size + + if (k, n) not in kn_values: + kn_values[(k, n)] = m + + logger.info(f"Found {len(kn_values)} unique fused mlp KN values.") + logger.info("Warming up autotune cache ...") + with torch.no_grad(): + for m in tqdm(range(0, math.ceil(math.log2(seqlen)) + 1)): + m = 2**m + for (k, n), (modules) in kn_values.items(): + a = torch.randn(m, k, dtype=torch.float16, device=model.device) + modules.triton_llama_mlp(a) + del kn_values + + +__all__ = ["FusedLlamaMLPForQuantizedModel"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0e0737a04ee820d98ca9cd6f126b9a8adc99f0c3 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/__init__.py @@ -0,0 +1,56 @@ +import torch.nn as nn + + +class GeneralQuantLinear(nn.Linear): + def __init__(self, quant_linear_module): + super().__init__( + in_features=quant_linear_module.infeatures, + out_features=quant_linear_module.outfeatures, + bias=True, + ) + self.infeatures = quant_linear_module.infeatures + self.outfeatures = quant_linear_module.outfeatures + self.bits = quant_linear_module.bits + self.group_size = quant_linear_module.group_size + self.maxq = quant_linear_module.maxq + + self.weight.requires_grad = False + + self.weight.data = quant_linear_module.qweight + self.register_buffer("qweight", quant_linear_module.qweight) + self.bias.data = quant_linear_module.bias + + self.qweight.requires_grad = False + self.bias.requires_grad = False + + self.register_buffer("qzeros", quant_linear_module.qzeros) + self.register_buffer("scales", quant_linear_module.scales) + self.register_buffer("g_idx", quant_linear_module.g_idx) + + if hasattr(quant_linear_module, "wf"): + self.wf = quant_linear_module.wf + if hasattr(quant_linear_module, "kernel_switch_threshold"): + self.kernel_switch_threshold = quant_linear_module.kernel_switch_threshold + if hasattr(quant_linear_module, "autogptq_cuda_available"): + self.autogptq_cuda_available = quant_linear_module.autogptq_cuda_available + + self.trainable = quant_linear_module.trainable + + self.forward = quant_linear_module.forward + + @classmethod + def inject_to_model(cls, model, target_module_type): + for name, m in model.named_modules(): + if not isinstance(m, target_module_type): + continue + new_m = cls(m) + if "." in name: + parent_name = name.rsplit(".", 1)[0] + child_name = name[len(parent_name) + 1 :] + parent = model.get_submodule(parent_name) + else: + parent_name = "" + parent = model + child_name = name + + setattr(parent, child_name, new_m) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_cuda.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_cuda.py new file mode 100644 index 0000000000000000000000000000000000000000..b73b639493f30cc391a6c26f8c019019837508b1 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_cuda.py @@ -0,0 +1,320 @@ +import math +from logging import getLogger + +import numpy as np +import torch +import torch.nn as nn +import transformers + + +logger = getLogger(__name__) + +try: + import autogptq_cuda_64 + import autogptq_cuda_256 + + _autogptq_cuda_available = True +except ImportError: + logger.warning("CUDA extension not installed.") + autogptq_cuda_256 = None + autogptq_cuda_64 = None + _autogptq_cuda_available = False + + +class QuantLinear(nn.Module): + QUANT_TYPE = "cuda" + + def __init__( + self, + bits, + group_size, + infeatures, + outfeatures, + bias, + kernel_switch_threshold=128, + trainable=False, + weight_dtype=torch.float16, + ): + super().__init__() + global _autogptq_cuda_available + if bits not in [2, 3, 4, 8]: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + if trainable: + _autogptq_cuda_available = False + + self.infeatures = infeatures + self.outfeatures = outfeatures + self.bits = bits + self.group_size = group_size if group_size != -1 else infeatures + self.maxq = 2**self.bits - 1 + + self.register_buffer( + "qweight", + torch.zeros((infeatures // 32 * self.bits, outfeatures), dtype=torch.int32), + ) + self.register_buffer( + "qzeros", + torch.zeros( + ( + math.ceil(infeatures / self.group_size), + outfeatures // 32 * self.bits, + ), + dtype=torch.int32, + ), + ) + self.register_buffer( + "scales", + torch.zeros( + (math.ceil(infeatures / self.group_size), outfeatures), + dtype=weight_dtype, + ), + ) + self.register_buffer( + "g_idx", + torch.tensor([i // self.group_size for i in range(infeatures)], dtype=torch.int32), + ) + if bias: + self.register_buffer("bias", torch.zeros((outfeatures), dtype=weight_dtype)) + else: + self.bias = None + + # is performed by unpacking the weights and using torch.matmul + if self.bits in [2, 4, 8]: + self.wf = torch.tensor(list(range(0, 32, self.bits)), dtype=torch.int32).unsqueeze(0) + elif self.bits == 3: + self.wf = torch.tensor( + [ + [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 0], + [0, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31], + [0, 2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 0], + ], + dtype=torch.int32, + ).reshape(1, 3, 12) + + self.kernel_switch_threshold = kernel_switch_threshold + self.autogptq_cuda_available = _autogptq_cuda_available + + self.autogptq_cuda = autogptq_cuda_256 + if infeatures % 256 != 0 or outfeatures % 256 != 0: + self.autogptq_cuda = autogptq_cuda_64 + if infeatures % 64 != 0 or outfeatures % 64 != 0: + self.autogptq_cuda_available = False + + self.trainable = trainable + + def post_init(self): + pass + + def pack(self, linear, scales, zeros, g_idx=None): + W = linear.weight.data.clone() + if isinstance(linear, nn.Conv2d): + W = W.flatten(1) + if isinstance(linear, transformers.pytorch_utils.Conv1D): + W = W.t() + + self.g_idx = g_idx.clone() if g_idx is not None else self.g_idx + + scales = scales.t().contiguous() + zeros = zeros.t().contiguous() + scale_zeros = zeros * scales + self.scales = scales.clone().to(dtype=linear.weight.dtype) + if linear.bias is not None: + self.bias = linear.bias.clone().to(dtype=linear.weight.dtype) + + intweight = [] + for idx in range(self.infeatures): + intweight.append( + torch.round((W[:, idx] + scale_zeros[self.g_idx[idx]]) / self.scales[self.g_idx[idx]]).to(torch.int)[ + :, None + ] + ) + intweight = torch.cat(intweight, dim=1) + intweight = intweight.t().contiguous() + intweight = intweight.numpy().astype(np.uint32) + + i = 0 + row = 0 + qweight = np.zeros((intweight.shape[0] // 32 * self.bits, intweight.shape[1]), dtype=np.uint32) + while row < qweight.shape[0]: + if self.bits in [2, 4, 8]: + for j in range(i, i + (32 // self.bits)): + qweight[row] |= intweight[j] << (self.bits * (j - i)) + i += 32 // self.bits + row += 1 + elif self.bits == 3: + for j in range(i, i + 10): + qweight[row] |= intweight[j] << (3 * (j - i)) + i += 10 + qweight[row] |= intweight[i] << 30 + row += 1 + qweight[row] |= (intweight[i] >> 2) & 1 + i += 1 + for j in range(i, i + 10): + qweight[row] |= intweight[j] << (3 * (j - i) + 1) + i += 10 + qweight[row] |= intweight[i] << 31 + row += 1 + qweight[row] |= (intweight[i] >> 1) & 0x3 + i += 1 + for j in range(i, i + 10): + qweight[row] |= intweight[j] << (3 * (j - i) + 2) + i += 10 + row += 1 + else: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + + qweight = qweight.astype(np.int32) + self.qweight = torch.from_numpy(qweight) + + zeros -= 1 + zeros = zeros.numpy().astype(np.uint32) + qzeros = np.zeros((zeros.shape[0], zeros.shape[1] // 32 * self.bits), dtype=np.uint32) + i = 0 + col = 0 + while col < qzeros.shape[1]: + if self.bits in [2, 4, 8]: + for j in range(i, i + (32 // self.bits)): + qzeros[:, col] |= zeros[:, j] << (self.bits * (j - i)) + i += 32 // self.bits + col += 1 + elif self.bits == 3: + for j in range(i, i + 10): + qzeros[:, col] |= zeros[:, j] << (3 * (j - i)) + i += 10 + qzeros[:, col] |= zeros[:, i] << 30 + col += 1 + qzeros[:, col] |= (zeros[:, i] >> 2) & 1 + i += 1 + for j in range(i, i + 10): + qzeros[:, col] |= zeros[:, j] << (3 * (j - i) + 1) + i += 10 + qzeros[:, col] |= zeros[:, i] << 31 + col += 1 + qzeros[:, col] |= (zeros[:, i] >> 1) & 0x3 + i += 1 + for j in range(i, i + 10): + qzeros[:, col] |= zeros[:, j] << (3 * (j - i) + 2) + i += 10 + col += 1 + else: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + + qzeros = qzeros.astype(np.int32) + self.qzeros = torch.from_numpy(qzeros) + + def forward(self, x: torch.Tensor): + out_shape = x.shape[:-1] + (self.outfeatures,) + x = x.reshape(-1, x.shape[-1]) + x_dtype = x.dtype + if ( + x.device.type == "cuda" + and self.autogptq_cuda_available + and (self.kernel_switch_threshold == 0 or x.shape[0] < self.kernel_switch_threshold) + ): + out = torch.zeros((x.shape[0], self.outfeatures), device=x.device, dtype=torch.float32) + if self.bits == 2: + self.autogptq_cuda.vecquant2matmul( + x.float(), + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.g_idx, + ) + elif self.bits == 3: + self.autogptq_cuda.vecquant3matmul( + x.float(), + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.g_idx, + ) + elif self.bits == 4: + self.autogptq_cuda.vecquant4matmul( + x.float(), + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.g_idx, + ) + elif self.bits == 8: + self.autogptq_cuda.vecquant8matmul( + x.float(), + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.g_idx, + ) + else: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + else: + if self.wf.device != self.qzeros.device: + self.wf = self.wf.to(self.qzeros.device) + + if self.bits in [2, 4, 8]: + zeros = torch.bitwise_right_shift( + torch.unsqueeze(self.qzeros, 2).expand(-1, -1, 32 // self.bits), + self.wf.unsqueeze(0), + ).to(torch.int16 if self.bits == 8 else torch.int8) + zeros = torch.bitwise_and(zeros, (2**self.bits) - 1) + + zeros = zeros + 1 + zeros = zeros.reshape(self.scales.shape) + + weight = torch.bitwise_right_shift( + torch.unsqueeze(self.qweight, 1).expand(-1, 32 // self.bits, -1), + self.wf.unsqueeze(-1), + ).to(torch.int16 if self.bits == 8 else torch.int8) + weight = torch.bitwise_and(weight, (2**self.bits) - 1) + elif self.bits == 3: + zeros = self.qzeros.reshape(self.qzeros.shape[0], self.qzeros.shape[1] // 3, 3, 1).expand( + -1, -1, -1, 12 + ) + zeros = zeros >> self.wf.unsqueeze(0) + zeros[:, :, 0, 10] = (zeros[:, :, 0, 10] & 0x3) | ((zeros[:, :, 1, 0] << 2) & 0x4) + zeros[:, :, 1, 11] = (zeros[:, :, 1, 11] & 0x1) | ((zeros[:, :, 2, 0] << 1) & 0x6) + zeros = zeros & 0x7 + zeros = torch.cat( + [zeros[:, :, 0, :11], zeros[:, :, 1, 1:12], zeros[:, :, 2, 1:11]], + dim=2, + ) + + zeros = zeros + 1 + zeros = zeros.reshape(self.scales.shape) + + weight = self.qweight.reshape(self.qweight.shape[0] // 3, 3, 1, self.qweight.shape[1]).expand( + -1, -1, 12, -1 + ) + weight = (weight >> self.wf.unsqueeze(-1)) & 0x7 + weight[:, 0, 10] = (weight[:, 0, 10] & 0x3) | ((weight[:, 1, 0] << 2) & 0x4) + weight[:, 1, 11] = (weight[:, 1, 11] & 0x1) | ((weight[:, 2, 0] << 1) & 0x6) + weight = weight & 0x7 + weight = torch.cat([weight[:, 0, :11], weight[:, 1, 1:12], weight[:, 2, 1:11]], dim=1) + else: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + + weight = weight.reshape(weight.shape[0] * weight.shape[1], weight.shape[2]) + num_itr = self.g_idx.shape[0] // x.shape[-1] + if num_itr == 1: + weights = self.scales[self.g_idx.long()] * (weight - zeros[self.g_idx.long()]) + else: + num_dim = self.g_idx.shape[0] // num_itr + weights = [] + for i in range(num_itr): + scale_i = self.scales[:, i * num_dim : (i + 1) * num_dim] + weight_i = weight[:, i * num_dim : (i + 1) * num_dim] + zeros_i = zeros[:, i * num_dim : (i + 1) * num_dim] + g_idx_i = self.g_idx[i * num_dim : (i + 1) * num_dim] + weights.append(scale_i[g_idx_i.long()] * (weight_i - zeros_i[g_idx_i.long()])) + weights = torch.cat(weights, dim=1) + out = torch.matmul(x, weights) + out = out.to(x_dtype) + out = out.reshape(out_shape) + out = out + self.bias if self.bias is not None else out + return out + + +__all__ = ["QuantLinear"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_cuda_old.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_cuda_old.py new file mode 100644 index 0000000000000000000000000000000000000000..a8fe2d996de79955fefccfe232cf435c7663c3ae --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_cuda_old.py @@ -0,0 +1,358 @@ +import math +from logging import getLogger + +import numpy as np +import torch +import torch.nn as nn +import transformers + + +logger = getLogger(__name__) +try: + import autogptq_cuda_64 + import autogptq_cuda_256 + + _autogptq_cuda_available = True +except ImportError: + logger.warning("CUDA extension not installed.") + autogptq_cuda_256 = None + autogptq_cuda_64 = None + _autogptq_cuda_available = False + + +class QuantLinear(nn.Module): + QUANT_TYPE = "cuda-old" + + def __init__( + self, + bits, + group_size, + infeatures, + outfeatures, + bias, + use_cuda_fp16=True, + kernel_switch_threshold=128, + trainable=False, + weight_dtype=torch.float16, + ): + super().__init__() + global _autogptq_cuda_available + if bits not in [2, 3, 4, 8]: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + if trainable: + _autogptq_cuda_available = False + self.infeatures = infeatures + self.outfeatures = outfeatures + self.bits = bits + self.group_size = group_size if group_size != -1 else infeatures + self.maxq = 2**self.bits - 1 + + self.register_buffer( + "qweight", + torch.zeros((infeatures // 32 * self.bits, outfeatures), dtype=torch.int32), + ) + self.register_buffer( + "qzeros", + torch.zeros( + ( + math.ceil(infeatures / self.group_size), + outfeatures // 32 * self.bits, + ), + dtype=torch.int32, + ), + ) + self.register_buffer( + "scales", + torch.zeros( + (math.ceil(infeatures / self.group_size), outfeatures), + dtype=weight_dtype, + ), + ) + self.register_buffer( + "g_idx", + torch.tensor([i // self.group_size for i in range(infeatures)], dtype=torch.int32), + ) + + if bias: + self.register_buffer("bias", torch.zeros((outfeatures), dtype=weight_dtype)) + else: + self.bias = None + self.half_indim = self.infeatures // 2 + + self.use_cuda_fp16 = use_cuda_fp16 if bits != 8 else False + + # is performed by unpacking the weights and using torch.matmul + if self.bits in [2, 4, 8]: + self.wf = torch.tensor(list(range(0, 32, self.bits)), dtype=torch.int32).unsqueeze(0) + elif self.bits == 3: + self.wf = torch.tensor( + [ + [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 0], + [0, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31], + [0, 2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 0], + ], + dtype=torch.int32, + ).reshape(1, 3, 12) + + self.kernel_switch_threshold = kernel_switch_threshold + self.autogptq_cuda_available = _autogptq_cuda_available + self.autogptq_cuda = autogptq_cuda_256 + if infeatures % 256 != 0 or outfeatures % 256 != 0: + self.autogptq_cuda = autogptq_cuda_64 + if infeatures % 64 != 0 or outfeatures % 64 != 0: + self.autogptq_cuda_available = False + + self.trainable = trainable + + def post_init(self): + pass + + def pack(self, linear, scales, zeros, g_idx): + W = linear.weight.data.clone() + if isinstance(linear, nn.Conv2d): + W = W.flatten(1) + if isinstance(linear, transformers.pytorch_utils.Conv1D): + W = W.t() + + scales = scales.t().contiguous() + zeros = zeros.t().contiguous() + scale_zeros = zeros * scales + self.scales = scales.clone().to(dtype=linear.weight.dtype) + if linear.bias is not None: + self.bias = linear.bias.clone().to(dtype=linear.weight.dtype) + + intweight = [] + for idx in range(self.infeatures): + g_idx = idx // self.group_size + intweight.append(torch.round((W[:, idx] + scale_zeros[g_idx]) / self.scales[g_idx]).to(torch.int)[:, None]) + intweight = torch.cat(intweight, dim=1) + intweight = intweight.t().contiguous() + intweight = intweight.numpy().astype(np.uint32) + + i = 0 + row = 0 + qweight = np.zeros((intweight.shape[0] // 32 * self.bits, intweight.shape[1]), dtype=np.uint32) + while row < qweight.shape[0]: + if self.bits in [2, 4, 8]: + for j in range(i, i + (32 // self.bits)): + qweight[row] |= intweight[j] << (self.bits * (j - i)) + i += 32 // self.bits + row += 1 + elif self.bits == 3: + for j in range(i, i + 10): + qweight[row] |= intweight[j] << (3 * (j - i)) + i += 10 + qweight[row] |= intweight[i] << 30 + row += 1 + qweight[row] |= (intweight[i] >> 2) & 1 + i += 1 + for j in range(i, i + 10): + qweight[row] |= intweight[j] << (3 * (j - i) + 1) + i += 10 + qweight[row] |= intweight[i] << 31 + row += 1 + qweight[row] |= (intweight[i] >> 1) & 0x3 + i += 1 + for j in range(i, i + 10): + qweight[row] |= intweight[j] << (3 * (j - i) + 2) + i += 10 + row += 1 + else: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + + qweight = qweight.astype(np.int32) + self.qweight = torch.from_numpy(qweight) + + zeros -= 1 + zeros = zeros.numpy().astype(np.uint32) + qzeros = np.zeros((zeros.shape[0], zeros.shape[1] // 32 * self.bits), dtype=np.uint32) + i = 0 + col = 0 + while col < qzeros.shape[1]: + if self.bits in [2, 4, 8]: + for j in range(i, i + (32 // self.bits)): + qzeros[:, col] |= zeros[:, j] << (self.bits * (j - i)) + i += 32 // self.bits + col += 1 + elif self.bits == 3: + for j in range(i, i + 10): + qzeros[:, col] |= zeros[:, j] << (3 * (j - i)) + i += 10 + qzeros[:, col] |= zeros[:, i] << 30 + col += 1 + qzeros[:, col] |= (zeros[:, i] >> 2) & 1 + i += 1 + for j in range(i, i + 10): + qzeros[:, col] |= zeros[:, j] << (3 * (j - i) + 1) + i += 10 + qzeros[:, col] |= zeros[:, i] << 31 + col += 1 + qzeros[:, col] |= (zeros[:, i] >> 1) & 0x3 + i += 1 + for j in range(i, i + 10): + qzeros[:, col] |= zeros[:, j] << (3 * (j - i) + 2) + i += 10 + col += 1 + else: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + + qzeros = qzeros.astype(np.int32) + self.qzeros = torch.from_numpy(qzeros) + + def forward(self, x): + x_dtype = x.dtype + out_shape = x.shape[:-1] + (self.outfeatures,) + x = x.reshape(-1, x.shape[-1]) + if ( + x.device.type == "cuda" + and self.autogptq_cuda_available is True + and (self.kernel_switch_threshold is False or x.shape[0] < self.kernel_switch_threshold) + ): + out = torch.zeros(x.shape[0], out_shape[-1], dtype=torch.float, device=x.device) + if self.use_cuda_fp16: + if x_dtype != torch.float16: + logger.warning_once( + f"The cuda-old kernel for GPTQ with use_cuda_fp16=True requires a float16 input activation, while {x_dtype} was passed. Casting to float16.\nMake sure you loaded your model with torch_dtype=torch.float16, that the model definition does not inadvertently cast to float32, or disable AMP Autocast that may produce float32 intermediate activations in the model." + ) + + if self.bits == 2: + self.autogptq_cuda.vecquant2matmul_faster_old( + x, + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.group_size, + self.half_indim, + ) + elif self.bits == 3: + self.autogptq_cuda.vecquant3matmul_faster_old( + x, + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.group_size, + self.half_indim, + ) + elif self.bits == 4: + self.autogptq_cuda.vecquant4matmul_faster_old( + x, + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.group_size, + self.half_indim, + ) + + else: + raise NotImplementedError("Only 2,3,4 bits are supported.") + else: + x = x.to(torch.float32) # This is required for autocast compatibility. + if self.bits == 2: + self.autogptq_cuda.vecquant2matmul_old( + x, + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.group_size, + ) + elif self.bits == 3: + self.autogptq_cuda.vecquant3matmul_old( + x, + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.group_size, + ) + elif self.bits == 4: + self.autogptq_cuda.vecquant4matmul_old( + x, + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.group_size, + ) + elif self.bits == 8: + self.autogptq_cuda.vecquant8matmul_old( + x, + self.qweight, + out, + self.scales.float(), + self.qzeros, + self.group_size, + ) + else: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + else: + if self.wf.device != self.qzeros.device: + self.wf = self.wf.to(self.qzeros.device) + + if self.bits in [2, 4, 8]: + zeros = torch.bitwise_right_shift( + torch.unsqueeze(self.qzeros, 2).expand(-1, -1, 32 // self.bits), + self.wf.unsqueeze(0), + ).to(torch.int16 if self.bits == 8 else torch.int8) + + zeros = zeros + 1 + zeros = torch.bitwise_and( + zeros, (2**self.bits) - 1 + ) # NOTE: It appears that casting here after the `zeros = zeros + 1` is important. + + zeros = zeros.reshape(-1, 1, zeros.shape[1] * zeros.shape[2]) + + scales = self.scales + scales = scales.reshape(-1, 1, scales.shape[-1]) + + weight = torch.bitwise_right_shift( + torch.unsqueeze(self.qweight, 1).expand(-1, 32 // self.bits, -1), + self.wf.unsqueeze(-1), + ).to(torch.int16 if self.bits == 8 else torch.int8) + weight = torch.bitwise_and(weight, (2**self.bits) - 1) + weight = weight.reshape(-1, self.group_size, weight.shape[2]) + elif self.bits == 3: + zeros = self.qzeros.reshape(self.qzeros.shape[0], self.qzeros.shape[1] // 3, 3, 1).expand( + -1, -1, -1, 12 + ) + zeros = zeros >> self.wf.unsqueeze(0) + zeros[:, :, 0, 10] = (zeros[:, :, 0, 10] & 0x3) | ((zeros[:, :, 1, 0] << 2) & 0x4) + zeros[:, :, 1, 11] = (zeros[:, :, 1, 11] & 0x1) | ((zeros[:, :, 2, 0] << 1) & 0x6) + zeros = zeros & 0x7 + zeros = torch.cat( + [zeros[:, :, 0, :11], zeros[:, :, 1, 1:12], zeros[:, :, 2, 1:11]], + dim=2, + ) + + zeros = zeros + 1 + zeros = zeros.reshape(-1, 1, zeros.shape[1] * zeros.shape[2]) + + scales = self.scales + scales = scales.reshape(-1, 1, scales.shape[-1]) + + weight = self.qweight.reshape(self.qweight.shape[0] // 3, 3, 1, self.qweight.shape[1]).expand( + -1, -1, 12, -1 + ) + weight = (weight >> self.wf.unsqueeze(-1)) & 0x7 + weight[:, 0, 10] = (weight[:, 0, 10] & 0x3) | ((weight[:, 1, 0] << 2) & 0x4) + weight[:, 1, 11] = (weight[:, 1, 11] & 0x1) | ((weight[:, 2, 0] << 1) & 0x6) + weight = weight & 0x7 + weight = torch.cat([weight[:, 0, :11], weight[:, 1, 1:12], weight[:, 2, 1:11]], dim=1) + weight = weight.reshape(-1, self.group_size, weight.shape[2]) + else: + raise NotImplementedError("Only 2,3,4,8 bits are supported.") + + weight = scales * (weight - zeros) + weight = weight.reshape(weight.shape[0] * weight.shape[1], weight.shape[2]) + out = torch.matmul(x, weight) + out = out.to(dtype=x_dtype).reshape( + out_shape + ) # A cast is needed here as for some reason the vecquant2matmul_faster_old still allocate a float32 output. + out = out + self.bias if self.bias is not None else out + return out + + +__all__ = ["QuantLinear"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_exllama.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_exllama.py new file mode 100644 index 0000000000000000000000000000000000000000..cfff42a7377182a57571ee92d32739e497991c53 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_exllama.py @@ -0,0 +1,192 @@ +# Adapted from turboderp exllama: https://github.com/turboderp/exllama + +import math +from logging import getLogger + +import numpy as np +import torch +import torch.nn as nn +import transformers + + +logger = getLogger(__name__) + +try: + from exllama_kernels import make_q4, q4_matmul +except ImportError as e: + exllama_import_exception = e + + def error_raiser_exllama(*args, **kwargs): + raise ValueError( + f"Trying to use the exllama backend, but could not import the C++/CUDA dependencies with the following error: {exllama_import_exception}" + ) + + make_q4 = error_raiser_exllama + q4_matmul = error_raiser_exllama + +# Dummy tensor to pass instead of g_idx since there is no way to pass "None" to a C++ extension +none_tensor = torch.empty((1, 1), device="meta") + + +def ext_make_q4(qweight, qzeros, scales, g_idx, device): + """Construct Q4Matrix, return handle""" + return make_q4(qweight, qzeros, scales, g_idx if g_idx is not None else none_tensor, device) + + +def ext_q4_matmul(x, q4, q4_width): + """Matrix multiplication, returns x @ q4""" + outshape = x.shape[:-1] + (q4_width,) + x = x.view(-1, x.shape[-1]) + output = torch.empty((x.shape[0], q4_width), dtype=torch.float16, device=x.device) + + q4_matmul(x, q4, output) + + return output.view(outshape) + + +class QuantLinear(nn.Module): + QUANT_TYPE = "exllama" + + """Linear layer implementation with per-group 4-bit quantization of the weights""" + + def __init__(self, bits, group_size, infeatures, outfeatures, bias, trainable=False, **kwargs): + super().__init__() + if bits != 4: + raise ValueError( + f"Exllama kernel supports only bits=4, requested bits={bits}. Something is wrong in the model initialization." + ) + if trainable: + raise NotImplementedError("Exllama kernel does not support training.") + + self.padding = -outfeatures % 32 + self.outfeatures = outfeatures + self.padding + outfeatures = self.outfeatures + + self.infeatures = infeatures + self.bits = bits + self.group_size = group_size if group_size != -1 else infeatures + self.trainable = trainable + self.maxq = 2**self.bits - 1 + + assert infeatures % 32 == 0 + assert infeatures % self.group_size == 0 + assert outfeatures % 32 == 0 + + self.register_buffer( + "qweight", + torch.zeros((infeatures // 32 * self.bits, outfeatures), dtype=torch.int32), + ) + self.register_buffer( + "qzeros", + torch.zeros( + ( + math.ceil(infeatures / self.group_size), + outfeatures // 32 * self.bits, + ), + dtype=torch.int32, + ), + ) + self.register_buffer( + "scales", + torch.zeros( + (math.ceil(infeatures / self.group_size), outfeatures), + dtype=torch.float16, + ), + ) + self.register_buffer( + "g_idx", + torch.tensor([i // self.group_size for i in range(infeatures)], dtype=torch.int32), + ) + + if bias: + self.register_buffer("bias", torch.zeros((outfeatures), dtype=torch.float16)) + else: + self.bias = None + + def post_init(self): + assert self.qweight.device.type == "cuda" + assert self.qweight.device.index is not None + + self.width = self.qweight.shape[1] + + # make_q4 segfaults if g_idx is not on cpu in the act-order case. In the non act-order case, None needs to be passed for g_idx. + self.q4 = ext_make_q4( + self.qweight, + self.qzeros, + self.scales, + self.g_idx.to("cpu") if self._use_act_order else None, + self.qweight.device.index, + ) + + def pack(self, linear, scales, zeros, g_idx=None): + W = linear.weight.data.clone() + if isinstance(linear, nn.Conv2d): + W = W.flatten(1) + if isinstance(linear, transformers.pytorch_utils.Conv1D): + W = W.t() + + self.g_idx = g_idx.clone() if g_idx is not None else self.g_idx + + scales = scales.t().contiguous() + zeros = zeros.t().contiguous() + scale_zeros = zeros * scales + self.scales = scales.clone().half() + if linear.bias is not None: + self.bias = linear.bias.clone().half() + + intweight = [] + for idx in range(self.infeatures): + intweight.append( + torch.round((W[:, idx] + scale_zeros[self.g_idx[idx]]) / self.scales[self.g_idx[idx]]).to(torch.int)[ + :, None + ] + ) + intweight = torch.cat(intweight, dim=1) + intweight = intweight.t().contiguous() + intweight = intweight.numpy().astype(np.uint32) + + i = 0 + row = 0 + qweight = np.zeros((intweight.shape[0] // 32 * self.bits, intweight.shape[1]), dtype=np.uint32) + while row < qweight.shape[0]: + if self.bits in [4]: + for j in range(i, i + (32 // self.bits)): + qweight[row] |= intweight[j] << (self.bits * (j - i)) + i += 32 // self.bits + row += 1 + else: + raise NotImplementedError("Only 4 bits are supported.") + + qweight = qweight.astype(np.int32) + self.qweight = torch.from_numpy(qweight) + + zeros -= 1 + zeros = zeros.numpy().astype(np.uint32) + qzeros = np.zeros((zeros.shape[0], zeros.shape[1] // 32 * self.bits), dtype=np.uint32) + i = 0 + col = 0 + while col < qzeros.shape[1]: + if self.bits in [4]: + for j in range(i, i + (32 // self.bits)): + qzeros[:, col] |= zeros[:, j] << (self.bits * (j - i)) + i += 32 // self.bits + col += 1 + else: + raise NotImplementedError("Only 4 bits are supported.") + + qzeros = qzeros.astype(np.int32) + self.qzeros = torch.from_numpy(qzeros) + + def forward(self, x): + if x.dtype != torch.float16: + logger.warning_once( + f"The exllama kernel for GPTQ requires a float16 input activation, while {x.dtype} was passed. Casting to float16.\nMake sure you loaded your model with torch_dtype=torch.float16, that the model definition does not inadvertently cast to float32, or disable AMP Autocast that may produce float32 intermediate activations in the model." + ) + + x = x.half() + + out = ext_q4_matmul(x, self.q4, self.width) + + if self.bias is not None: + out.add_(self.bias) + return out diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_exllamav2.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_exllamav2.py new file mode 100644 index 0000000000000000000000000000000000000000..6a8ad42cdd6618188ec29a663b380a27ceff32cf --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_exllamav2.py @@ -0,0 +1,231 @@ +# Adapted from turboderp exllama: https://github.com/turboderp/exllamav2 + +import math +from logging import getLogger + +import torch +import torch.nn as nn + + +logger = getLogger(__name__) + +try: + from exllamav2_kernels import gemm_half_q_half, make_q_matrix +except ImportError as e: + exllama_v2_import_exception = e + + def error_raiser_exllama(*args, **kwargs): + raise ValueError( + f"Trying to use the exllama v2 backend, but could not import the C++/CUDA dependencies with the following error: {exllama_v2_import_exception}" + ) + + make_q_matrix = error_raiser_exllama + gemm_half_q_half = error_raiser_exllama + +# Dummy tensor to pass instead of g_idx since there is no way to pass "None" to a C++ extension +none_tensor = torch.empty((1, 1), device="meta") + + +def _torch_device(idx): + if idx == -1: + return "cpu" + return f"cuda:{idx}" + + +def ext_gemm_half_q_half(x, q_handle, q4_width, force_cuda): + """Matrix multiplication, returns x @ q4""" + output_shape = x.shape[:-1] + (q4_width,) + x = x.view(-1, x.shape[-1]) + output = torch.empty((x.shape[0], q4_width), dtype=torch.half, device=x.device) + gemm_half_q_half(x, q_handle, output, force_cuda) + return output.view(output_shape) + + +def ext_make_q_matrix(w: dict, temp_dq, key: str = None): + """ + Create Q matrix + """ + # EXL2 + # won't work as the moment because the tensors are not the same. + if "q_weight" in w: + w["q_scale_max"] /= 256 + w["q_perm"] = w["q_perm"].short() + w["q_invperm"] = w["q_invperm"].short() + return make_q_matrix( + w["q_weight"], + w["q_perm"], + w["q_invperm"], + w["q_scale"], + w["q_scale_max"], + w["q_groups"], + none_tensor, + none_tensor, + none_tensor, + temp_dq, + ) + # GPTQ + elif "qweight" in w: + if w["scales"].dtype == torch.float: + w["scales"] = w["scales"].half() + + # GPTQ with g_idx (act_order) + if "g_idx" in w and not (w["g_idx"] == 0).all().item(): + w["q_perm"] = torch.empty( + (w["qweight"].shape[0] * 8,), + dtype=torch.short, + device=w["qweight"].device, + ) + w["q_invperm"] = torch.empty_like(w["q_perm"]) + # make_q4 segfaults if g_idx is not on cpu in the act-order case. In the non act-order case, None needs to be passed for g_idx. + return make_q_matrix( + w["qweight"], + w["q_perm"], + w["q_invperm"], + none_tensor, + none_tensor, + none_tensor, + w["qzeros"], + w["scales"], + w["g_idx"].cpu(), + temp_dq, + ) + # GPTQ without g_idx + else: + return make_q_matrix( + w["qweight"], + none_tensor, + none_tensor, + none_tensor, + none_tensor, + none_tensor, + w["qzeros"], + w["scales"], + none_tensor, + temp_dq, + ) + + +class QuantLinear(nn.Module): + QUANT_TYPE = "exllamav2" + + """Linear layer implementation with per-group 4-bit quantization of the weights""" + + def __init__(self, bits, group_size, infeatures, outfeatures, bias, trainable=False, **kwargs): + super().__init__() + if bits != 4: + raise ValueError( + f"Exllamav2 kernel supports only bits=4, requested bits={bits}. Something is wrong in the model initialization." + ) + if trainable: + raise NotImplementedError("Exllamav2 kernel does not support training.") + + self.q_handle = None + self.q_tensors = None + + self.padding = -outfeatures % 32 + self.outfeatures = outfeatures + self.padding + outfeatures = self.outfeatures + + self.infeatures = infeatures + self.bits = bits + self.group_size = group_size if group_size != -1 else infeatures + self.trainable = trainable + self.maxq = 2**self.bits - 1 + + assert infeatures % 32 == 0 + assert infeatures % self.group_size == 0 + assert outfeatures % 32 == 0 + + # I need to register the tensors, otherwise, we won't be able to load them easily using transformers ... + self.register_buffer( + "qweight", + torch.zeros((infeatures // 32 * self.bits, outfeatures), dtype=torch.int32), + ) + self.register_buffer( + "qzeros", + torch.zeros( + ( + math.ceil(infeatures / self.group_size), + outfeatures // 32 * self.bits, + ), + dtype=torch.int32, + ), + ) + self.register_buffer( + "scales", + torch.zeros( + (math.ceil(infeatures / self.group_size), outfeatures), + dtype=torch.float16, + ), + ) + self.register_buffer( + "g_idx", + torch.tensor([i // self.group_size for i in range(infeatures)], dtype=torch.int32), + ) + + if bias: + self.register_buffer("bias", torch.zeros((outfeatures), dtype=torch.float16)) + else: + self.bias = None + + def post_init(self, temp_dq): + assert self.qweight.device.type == "cuda" + assert self.qweight.device.index is not None + self.q_tensors = { + "qweight": self.qweight, + "qzeros": self.qzeros, + "scales": self.scales, + "g_idx": self.g_idx, + } + temp_dq = temp_dq.get_scratch_slice(self.temp_dq_size()) + self.q_handle = ext_make_q_matrix(self.q_tensors, temp_dq) + + def forward(self, x, force_cuda=False): + if x.dtype != torch.float16: + logger.warning_once( + f"The exllama v2 kernel for GPTQ requires a float16 input activation, while {x.dtype} was passed. Casting to float16.\nMake sure you loaded your model with torch_dtype=torch.float16, that the model definition does not inadvertently cast to float32, or disable AMP Autocast that may produce float32 intermediate activations in the model." + ) + + x = x.half() + + output = ext_gemm_half_q_half(x, self.q_handle, self.outfeatures, force_cuda) + + if self.bias is not None: + output.add_(self.bias) + return output + + def temp_dq_size(self): + return self.infeatures * self.outfeatures * 2 + 128 + + def temp_fwd_size(self, max_input_len, max_batch_size): + return self.outfeatures * max_input_len * max_batch_size * 4 + 128 + + def scratch_space_fixed(self, max_input_len=2048, max_batch_size=8): + return self.temp_dq_size() + self.temp_fwd_size(max_input_len, max_batch_size) + + +class ExLlamaV2DeviceTensors: + device_idx: int + scratch_bytes: int + scratch_idx: int + scratch: torch.tensor = None + + def __init__(self, device_idx, scratch_bytes): + self.device_idx = device_idx + self.scratch_bytes = scratch_bytes + + def prepare(self): + self.scratch = torch.empty( + (self.scratch_bytes // 2,), + dtype=torch.half, + device=_torch_device(self.device_idx), + ) + + def get_scratch_slice(self, size_bytes): + if self.scratch is None: + self.prepare() + + size_bytes = ((size_bytes + 127) // 128) * 128 + size_half = size_bytes // 2 + scratch_slice = self.scratch.narrow(0, 0, size_half) + return scratch_slice diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_marlin.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_marlin.py new file mode 100644 index 0000000000000000000000000000000000000000..54a2d257662125e66d47714c0cc65ab9a49bb2b9 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_marlin.py @@ -0,0 +1,256 @@ +# Copyright (C) Marlin.2024 Elias Frantar (elias.frantar@ist.ac.at) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from logging import getLogger + +import numpy as np +import torch +import torch.nn as nn + + +logger = getLogger(__name__) + +try: + import autogptq_marlin_cuda +except ImportError as e: + marlin_import_exception = e + + def error_raiser_marlin(*args, **kwargs): + raise ValueError( + f"Trying to use the marlin backend, but could not import the C++/CUDA dependencies with the following error: {marlin_import_exception}" + ) + + autogptq_marlin_cuda = error_raiser_marlin + + +def mul(A, B, C, s, workspace, thread_k=-1, thread_n=-1, sms=-1, max_par=16): + """Marlin FP16xINT4 multiply; can be used within `torch.compile`. + @A: `torch.half` input matrix of shape `(m, k)` in standard row-major layout + @B: `torch.int` weight matrix of original shape `(k, n)` in Marlin format; see `Layer.pack()` + @C: `torch.half` out matrix of shape `(m, n)` in standard row-major layout + @s: `torch.half` scales of shape `(m / group_size, n)` + @workspace: `torch.int` tensor with at least `n / 128 * max_par` entries that are all zero + @thread_k: `k` size of a thread_tile in `B` (can usually be left as auto -1) + @thread_n: `n` size of a thread_tile in `B` (can usually be left as auto -1) + @sms: number of SMs to use for the kernel (can usually be left as auto -1) + @max_par: maximum number of batch 64 problems to solve in parallel for large input sizes + """ + autogptq_marlin_cuda.mul(A, B, C, s, workspace, thread_k, thread_n, sms, max_par) + + +# Precompute permutations for Marlin weight and scale shuffling + + +def _get_perms(): + perm = [] + for i in range(32): + perm1 = [] + col = i // 4 + for block in [0, 1]: + for row in [ + 2 * (i % 4), + 2 * (i % 4) + 1, + 2 * (i % 4 + 4), + 2 * (i % 4 + 4) + 1, + ]: + perm1.append(16 * row + col + 8 * block) + for j in range(4): + perm.extend([p + 256 * j for p in perm1]) + + perm = np.array(perm) + interleave = np.array([0, 2, 4, 6, 1, 3, 5, 7]) + perm = perm.reshape((-1, 8))[:, interleave].ravel() + perm = torch.from_numpy(perm) + scale_perm = [] + for i in range(8): + scale_perm.extend([i + 8 * j for j in range(8)]) + scale_perm_single = [] + for i in range(4): + scale_perm_single.extend([2 * i + j for j in [0, 1, 8, 9, 16, 17, 24, 25]]) + return perm, scale_perm, scale_perm_single + + +_perm, _scale_perm, _scale_perm_single = _get_perms() + + +class QuantLinear(nn.Module): + QUANT_TYPE = "marlin" + + def __init__(self, bits, group_size, infeatures, outfeatures, bias, trainable=False, **kwargs): + super().__init__() + + if torch.version.hip: + raise ValueError("Can not use Marlin int4*fp16 kernel with AMD ROCm version of PyTorch as the kernel is not compatible. Please do not use `use_marlin=True` when using ROCm devices.") + if not torch.cuda.get_device_capability()[0] >= 8: + raise ValueError(f'Can not use Marlin int4*fp16 kernel with a device of compute capability {torch.cuda.get_device_capability()}, the minimum compute capability is 8.0 for Marlin kernel. Please do not use `use_marlin=True`, or please upgrade your GPU ("The more you buy, the more you save." - Taiwanese proverb).') + + if infeatures % 128 != 0 or outfeatures % 256 != 0: + raise ValueError("`infeatures` must be divisible by 128 and `outfeatures` by 256.") + if bits not in [4]: + raise NotImplementedError("Only 4 bits are supported.") + if group_size not in [-1, 128] and group_size != infeatures: + raise ValueError("Only group_size -1 and 128 are supported.") + if infeatures % group_size != 0: + raise ValueError("`infeatures` must be divisible by `group_size`.") + if trainable: + raise NotImplementedError("Marlin does not support train.") + + self.infeatures = infeatures + self.outfeatures = outfeatures + self.group_size = group_size if group_size != -1 else infeatures + self.register_buffer( + "B", + torch.empty((self.infeatures // 16, self.outfeatures * 16 // 8), dtype=torch.int), + ) + self.register_buffer( + "s", + torch.empty((self.infeatures // group_size, self.outfeatures), dtype=torch.half), + ) + # 128 is currently the minimum `tile_n`, hence it gives the maximum workspace size; 16 is the default `max_par` + self.register_buffer( + "workspace", + torch.zeros(self.outfeatures // 128 * 16, dtype=torch.int), + persistent=False, + ) + if bias: + self.register_buffer("bias", torch.zeros((outfeatures), dtype=torch.half)) + else: + self.bias = None + + def post_init(self): + pass + + def pack(self, linear, scales): + """Pack a fake-quantized linear layer into this actual Marlin representation. + @linear: fake-quantized `torch.nn.Linear` layer to convert (must be of type `torch.half`) + @scales: corresponding quantization scales of shape `(infeatures, groups)` + """ + if linear.weight.dtype != torch.half: + raise ValueError("Only `torch.half` weights are supported.") + tile = 16 + maxq = 2**4 - 1 + s = scales.t() + w = linear.weight.data.t() + if self.group_size != self.infeatures: + w = w.reshape((-1, self.group_size, self.outfeatures)) + w = w.permute(1, 0, 2) + w = w.reshape((self.group_size, -1)) + s = s.reshape((1, -1)) + w = torch.round(w / s).int() + w += (maxq + 1) // 2 + w = torch.clamp(w, 0, maxq) + if self.group_size != self.infeatures: + w = w.reshape((self.group_size, -1, self.outfeatures)) + w = w.permute(1, 0, 2) + w = w.reshape((self.infeatures, self.outfeatures)).contiguous() + s = s.reshape((-1, len(_scale_perm)))[:, _scale_perm] + else: + s = s.reshape((-1, len(_scale_perm_single)))[:, _scale_perm_single] + s = s.reshape((-1, self.outfeatures)).contiguous() + w = w.reshape((self.infeatures // tile, tile, self.outfeatures // tile, tile)) + w = w.permute((0, 2, 1, 3)) + w = w.reshape((self.infeatures // tile, self.outfeatures * tile)) + res = w + res = res.reshape((-1, _perm.numel()))[:, _perm].reshape(res.shape) + q = np.zeros((res.shape[0], res.shape[1] // 8), dtype=np.uint32) + res = res.cpu().numpy().astype(np.uint32) + for i in range(8): + q |= res[:, i::8] << 4 * i + q = torch.from_numpy(q.astype(np.int32)).to(w.device) + self.B[:, :] = q.to(self.B.device) + self.s[:, :] = s.to(self.s.device) + if linear.bias is not None: + if self.bias is not None: + self.bias[:] = linear.bias.data.to(self.bias.device) + else: + self.bias = linear.bias.clone() + + def forward(self, A): + A = A.half() + C = torch.empty(A.shape[:-1] + (self.s.shape[1],), dtype=A.dtype, device=A.device) + mul( + A.view((-1, A.shape[-1])), + self.B, + C.view((-1, C.shape[-1])), + self.s, + self.workspace, + ) + C = C + self.bias if self.bias is not None else C + return C + + +# Copied from https://github.com/IST-DASLab/marlin/pull/1 +@torch.no_grad() +def unpack_4bit_to_32bit_signed(qweight, qzeros): + # Unpack 4-bit values and interpret them as signed integers + unpacked_weights = torch.zeros( + (qweight.shape[0] * 8, qweight.shape[1]), + dtype=torch.int8, + device=qweight.device, + requires_grad=False, + ) + + unpacked_zeros = torch.zeros( + (qzeros.shape[0], qzeros.shape[1] * 8), + dtype=torch.int8, + device=qzeros.device, + requires_grad=False, + ) + + for row in range(unpacked_weights.shape[0]): + i = row % 8 + unpacked_weights[row, :] = (qweight[row // 8, :] >> (4 * i)) & 0xF + + for col in range(unpacked_zeros.shape[1]): + i = col % 8 + unpacked_zeros[:, col] = (qzeros[:, col // 8] >> (4 * i)) & 0xF + + return unpacked_weights, unpacked_zeros + 1 + +def unpack_qzeros(qzeros): + unpacked_zeros = torch.zeros( + (qzeros.shape[0], qzeros.shape[1] * 8), + dtype=torch.int8, + device=qzeros.device, + requires_grad=False, + ) + + for col in range(unpacked_zeros.shape[1]): + i = col % 8 + unpacked_zeros[:, col] = (qzeros[:, col // 8] >> (4 * i)) & 0xF + + return unpacked_zeros + 1 + + +# Copied from https://github.com/IST-DASLab/marlin/pull/1 +@torch.no_grad() +def dequantize_weight(layer): + qweight, qzeros, scales = layer.qweight, layer.qzeros, layer.scales + unpacked_qweight, unpacked_qzeros = unpack_4bit_to_32bit_signed(qweight, qzeros) + group_size = unpacked_qweight.shape[0] // scales.shape[0] + scales = scales.repeat_interleave(group_size, dim=0) + unpacked_qzeros = unpacked_qzeros.repeat_interleave(group_size, dim=0) + unpacked_qweight = (unpacked_qweight - unpacked_qzeros) * scales + + return unpacked_qweight.T, unpacked_qzeros + +def dequantize_qzeros(layer): + qzeros = layer.qzeros + unpacked_qzeros = unpack_qzeros(qzeros) + group_size = layer.group_size + unpacked_qzeros = unpacked_qzeros.repeat_interleave(group_size, dim=0) + + return unpacked_qzeros + + +__all__ = ["QuantLinear", "dequantize_weight"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_qigen.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_qigen.py new file mode 100644 index 0000000000000000000000000000000000000000..b935fb7ed17abc160b556e73c9c438fa6f75c145 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_qigen.py @@ -0,0 +1,377 @@ +import math +from logging import getLogger + +import numpy as np +import torch +from gekko import GEKKO +from torch import nn + + +logger = getLogger(__name__) + +try: + import cQIGen as qinfer +except ImportError as e: + exception_qinfer = e + + class FakeQInfer: + def __getattr__(self, name): + raise ImportError(f"cQIGen is not installed or not correctly installed. {exception_qinfer}") + + +def mem_model(N, M, T, mu, tu, bits, l1, p, gs): + m = GEKKO() # create GEKKO model + # cinfergen if bits==3: + # tu = tu*3 + B = m.Const(value=bits) + TP = m.Const(value=T // p) + k = m.Var(1, integer=True, lb=1) + z = m.Var(1, integer=True, lb=1) + w = m.Var(1, integer=True, lb=1) + y = m.Var(1, integer=True, lb=1) + mb = m.Var(mu, integer=True, lb=1) + if gs != -1: + gg = m.Var(1, integer=True, lb=1) + tb = m.Var(tu, integer=True, lb=1, ub=int(T / p)) + L = m.Var(integer=True, lb=0, ub=l1) + m.Equation(L == 32 * mb * N + B * mb * tb + 32 * tb * N) + m.Equation(mb * k == M) + if gs != -1: + m.Equation(gs * gg == mb) + # m.Equation(tb * z == T) + m.Equation(tb * z == TP) + m.Equation(mu * w == mb) + m.Equation(tu * y == tb) + # m.Equation(tb * v == tt) + m.Maximize(L) + m.options.SOLVER = 1 + m.solver_options = [ + "minlp_maximum_iterations 1000", # minlp iterations with integer solution + "minlp_max_iter_with_int_sol 10", # treat minlp as nlp + "minlp_as_nlp 0", # nlp sub-problem max iterations + "nlp_maximum_iterations 100", # 1 = depth first, 2 = breadth first + "minlp_branch_method 2", # maximum deviation from whole number + "minlp_integer_tol 0.00", # covergence tolerance + "minlp_gap_tol 0.01", + ] + try: + m.solve(disp=False) + except Exception: + try: + m.solver_options = [ + "minlp_maximum_iterations 1000", # minlp iterations with integer solution + "minlp_max_iter_with_int_sol 10", # treat minlp as nlp + "minlp_as_nlp 0", # nlp sub-problem max iterations + "nlp_maximum_iterations 100", # 1 = depth first, 2 = breadth first + "minlp_branch_method 1", # maximum deviation from whole number + "minlp_integer_tol 0.00", # covergence tolerance + "minlp_gap_tol 0.01", + ] + m.solve(disp=False) + except Exception: + # mytb = T//p + mytb = tu + if gs != -1: + mymb = gs + while 32 * (mymb + gs) * N + bits * (mymb + gs) * mytb + 32 * mytb * N < l1: + mymb += gs + while M % mymb != 0: + mymb -= gs + return (int(mymb), int(mytb)) + else: + mymb = mu + while 32 * (mymb + mu) * N + bits * (mymb + mu) * mytb + 32 * mytb * N < l1: + mymb += mu + while M % mymb != 0: + mymb -= mu + return (int(mymb), int(mytb)) + + return (int(mb.value[0]), int(tb.value[0])) + + +params = {} + + +def compute_reductions(x, gs=-1, cpp=True): + if cpp: + if len(x.shape) != 1: + rows, cols = x.shape + else: + rows = 1 + cols = x.shape[0] + if gs == -1: + out = torch.zeros(rows).float().contiguous() + mygs = cols + else: + out = torch.zeros(rows, cols // gs).float().contiguous() + mygs = gs + + qinfer.compute_reduction_cpp(x, out, rows, cols, mygs) + return out + if gs == -1: + if len(x.shape) != 1: + return torch.sum(x, 1) + else: + return torch.sum(x) + else: + if len(x.shape) != 1: + rows, cols = x.shape + out = torch.zeros(rows, cols // gs).float().contiguous() + for i in range(cols // gs): + out[:, i] = torch.sum(x[:, i * gs : (i + 1) * gs], 1) + return out + else: + cols = x.shape[0] + out = torch.zeros(cols // gs).float().contiguous() + for i in range(cols // gs): + out[i] = torch.sum(x[i * gs : (i + 1) * gs]) + return out + + +def process_zeros_scales(zeros, scales, bits, M): + if zeros.dtype != torch.float32: + new_zeros = torch.zeros_like(scales).float().contiguous() + if bits == 4: + qinfer.unpack_zeros4(zeros, new_zeros, new_zeros.shape[0], new_zeros.shape[1]) + elif bits == 2: + qinfer.unpack_zeros2(zeros, new_zeros, new_zeros.shape[0], new_zeros.shape[1]) + elif bits == 3: + logger.info("Unpacking zeros for 3 bits") + new_scales = scales.contiguous() + else: + if scales.shape[1] != M: + new_scales = scales.transpose(0, 1).contiguous() + else: + new_scales = scales.contiguous() + if zeros.shape[1] != M: + new_zeros = zeros.transpose(0, 1).contiguous() + else: + new_zeros = zeros.contiguous() + + return new_zeros, new_scales + + +class QuantLinear(nn.Module): + QUANT_TYPE = "qigen" + + def __init__( + self, + bits, + group_size, + infeatures, + outfeatures, + bias=None, + trainable=False, + hint=1, + p=8, + l1=2**18, + ): + super().__init__() + if bits not in [2, 4]: + raise NotImplementedError("Only 2,4 bits are supported.") + if trainable: + raise NotImplementedError("Qigen kernel does not support training.") + self.bits = bits + + self.infeatures = infeatures + self.outfeatures = outfeatures + + n = hint + m = self.infeatures + t = self.outfeatures + + # registers for now are fixed + if bits == 3: + packed = 32 + mu = 32 + tu = 32 + else: + packed = 32 // bits + mu = 16 + tu = 32 + + global params + if (m, t) in params: + mb = params[(m, t)][0] + tb = params[(m, t)][1] + else: + mb, tb = mem_model(n, m, t, mu, tu, bits, l1, p, group_size) + params[(m, t)] = (mb, tb) + + split = np.ones(p) + split = split * tb + while np.sum(split) < t: + split = split + tb + + idx = p - 1 + while np.sum(split) > t: + split[idx] = split[idx] - tb + idx = idx - 1 + + assert np.sum(split) == t + + split = split.astype(int) + self.tt = int(split[0]) + + if split[0] == split[-1]: + self.cutoff = int(p + 1) + else: + self.cutoff = int(idx + 1) + + self.mb = mb # // packed + self.tb = tb + + self.group_size = group_size + + self.register_buffer("bias", torch.zeros(self.outfeatures)) + self.register_buffer( + "zeros", + torch.zeros( + (math.ceil(infeatures / self.group_size), outfeatures), + dtype=torch.float32, + ), + ) + self.register_buffer( + "scales", + torch.zeros( + (math.ceil(infeatures / self.group_size), outfeatures), + dtype=torch.float32, + ), + ) + if bits == 4: + self.register_buffer( + "qweight", + torch.zeros(int(self.infeatures // packed * self.outfeatures)).int().contiguous(), + ) + elif bits == 3: + self.register_buffer( + "qweight", + torch.zeros(int(self.infeatures // packed * 3 * self.outfeatures)).int().contiguous(), + ) + elif bits == 2: + self.register_buffer( + "qweight", + torch.zeros(int(self.infeatures // packed * self.outfeatures)).int().contiguous(), + ) + + def forward(self, x): + out_shape = x.shape[:-1] + (self.outfeatures,) + x = x.reshape((-1, x.shape[-1])).to(torch.float32) + B = x.shape[0] + new_x = x.T.contiguous() + out = torch.zeros((B, self.outfeatures), dtype=torch.float32) + sums = compute_reductions(x, gs=self.group_size, cpp=True).contiguous() + if self.group_size == -1: + if self.bits == 4: + qinfer.forward4( + new_x, + self.qweight, + out, + self.bias, + self.scales, + self.zeros, + sums, + B, + self.infeatures, + self.outfeatures, + B, + self.mb, + self.tb, + self.tt, + self.cutoff, + ) + elif self.bits == 2: + qinfer.forward2( + new_x, + self.qweight, + out, + self.bias, + self.scales, + self.zeros, + sums, + B, + self.infeatures, + self.outfeatures, + B, + self.mb, + self.tb, + self.tt, + self.cutoff, + ) + elif self.bits == 3: + qinfer.forward3( + new_x, + self.qweight, + out, + self.bias, + self.scales, + self.zeros, + sums, + B, + self.infeatures, + self.outfeatures, + B, + self.mb, + self.tb, + self.tt, + self.cutoff, + ) + else: + if self.bits == 4: + qinfer.forward_gs4( + new_x, + self.qweight, + out, + self.bias, + self.scales, + self.zeros, + sums, + B, + self.infeatures, + self.outfeatures, + B, + self.mb, + self.tb, + self.tt, + self.group_size, + self.cutoff, + ) + elif self.bits == 2: + qinfer.forward_gs2( + new_x, + self.qweight, + out, + self.bias, + self.scales, + self.zeros, + sums, + B, + self.infeatures, + self.outfeatures, + B, + self.mb, + self.tb, + self.tt, + self.group_size, + self.cutoff, + ) + elif self.bits == 3: + qinfer.forward_gs3( + new_x, + self.qweight, + out, + self.bias, + self.scales, + self.zeros, + sums, + B, + self.infeatures, + self.outfeatures, + B, + self.mb, + self.tb, + self.tt, + self.group_size, + self.cutoff, + ) + return out.reshape(out_shape) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_triton.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_triton.py new file mode 100644 index 0000000000000000000000000000000000000000..93bd0f268465c9f0edce23ac6f5103c44e38fd6e --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_triton.py @@ -0,0 +1,218 @@ +import math +from logging import getLogger + +import numpy as np +import torch +import torch.nn as nn +import transformers + +from ..triton_utils.mixin import TritonModuleMixin + + +logger = getLogger(__name__) + +try: + from ..triton_utils.kernels import ( + QuantLinearFunction, + QuantLinearInferenceOnlyFunction, + quant_matmul_248, + quant_matmul_inference_only_248, + transpose_quant_matmul_248, + ) +except ImportError as e: + triton_import_exception = e + + def error_raiser_triton(*args, **kwargs): + raise ValueError( + f"Trying to use the triton backend, but could not import triton dependencies with the following error: {triton_import_exception}" + ) + + class FakeTriton: + def __getattr__(self, name): + raise ImportError( + f"Trying to use the triton backend, but could not import triton dependencies with the following error: {triton_import_exception}" + ) + + quant_matmul_248 = error_raiser_triton + transpose_quant_matmul_248 = error_raiser_triton + quant_matmul_inference_only_248 = error_raiser_triton + QuantLinearFunction = FakeTriton + QuantLinearInferenceOnlyFunction = FakeTriton + + +class QuantLinear(nn.Module, TritonModuleMixin): + QUANT_TYPE = "triton" + + def __init__(self, bits, group_size, infeatures, outfeatures, bias, trainable=False, **kwargs): + super().__init__() + if bits not in [2, 4, 8]: + raise NotImplementedError("Only 2,4,8 bits are supported.") + if infeatures % 32 != 0 or outfeatures % 32 != 0: + raise NotImplementedError("in_feature and out_feature must be divisible by 32.") + self.infeatures = infeatures + self.outfeatures = outfeatures + self.bits = bits + self.group_size = group_size if group_size != -1 else infeatures + self.maxq = 2**self.bits - 1 + + self.register_buffer( + "qweight", + torch.zeros((infeatures // 32 * self.bits, outfeatures), dtype=torch.int32), + ) + self.register_buffer( + "qzeros", + torch.zeros( + ( + math.ceil(infeatures / self.group_size), + outfeatures // 32 * self.bits, + ), + dtype=torch.int32, + ), + ) + self.register_buffer( + "scales", + torch.zeros( + (math.ceil(infeatures / self.group_size), outfeatures), + dtype=torch.float16, + ), + ) + self.register_buffer( + "g_idx", + torch.tensor([i // self.group_size for i in range(infeatures)], dtype=torch.int32), + ) + if bias: + self.register_buffer("bias", torch.zeros((outfeatures), dtype=torch.float16)) + else: + self.bias = None + + self.trainable = trainable + + def post_init(self): + pass + + def pack(self, linear, scales, zeros, g_idx=None): + W = linear.weight.data.clone() + if isinstance(linear, nn.Conv2d): + W = W.flatten(1) + if isinstance(linear, transformers.pytorch_utils.Conv1D): + W = W.t() + + self.g_idx = g_idx.clone() if g_idx is not None else self.g_idx + + scales = scales.t().contiguous() + zeros = zeros.t().contiguous() + scale_zeros = zeros * scales + self.scales = scales.clone().half() + if linear.bias is not None: + self.bias = linear.bias.clone().half() + + intweight = [] + for idx in range(self.infeatures): + intweight.append( + torch.round((W[:, idx] + scale_zeros[self.g_idx[idx]]) / self.scales[self.g_idx[idx]]).to(torch.int)[ + :, None + ] + ) + intweight = torch.cat(intweight, dim=1) + intweight = intweight.t().contiguous() + intweight = intweight.numpy().astype(np.uint32) + + i = 0 + row = 0 + qweight = np.zeros((intweight.shape[0] // 32 * self.bits, intweight.shape[1]), dtype=np.uint32) + while row < qweight.shape[0]: + if self.bits in [2, 4, 8]: + for j in range(i, i + (32 // self.bits)): + qweight[row] |= intweight[j] << (self.bits * (j - i)) + i += 32 // self.bits + row += 1 + else: + raise NotImplementedError("Only 2,4,8 bits are supported.") + + qweight = qweight.astype(np.int32) + self.qweight = torch.from_numpy(qweight) + + zeros -= 1 + zeros = zeros.numpy().astype(np.uint32) + qzeros = np.zeros((zeros.shape[0], zeros.shape[1] // 32 * self.bits), dtype=np.uint32) + i = 0 + col = 0 + while col < qzeros.shape[1]: + if self.bits in [2, 4, 8]: + for j in range(i, i + (32 // self.bits)): + qzeros[:, col] |= zeros[:, j] << (self.bits * (j - i)) + i += 32 // self.bits + col += 1 + else: + raise NotImplementedError("Only 2,4,8 bits are supported.") + + qzeros = qzeros.astype(np.int32) + self.qzeros = torch.from_numpy(qzeros) + + def forward(self, x): + out_shape = x.shape[:-1] + (self.outfeatures,) + quant_linear_fn = QuantLinearFunction if self.trainable else QuantLinearInferenceOnlyFunction + out = quant_linear_fn.apply( + x.reshape(-1, x.shape[-1]), + self.qweight, + self.scales, + self.qzeros, + self.g_idx, + self.bits, + self.maxq, + ) + out = out.half().reshape(out_shape) + out = out + self.bias if self.bias is not None else out + return out + + @classmethod + def warmup(cls, model, transpose=False, seqlen=2048): + """ + Pre-tunes the quantized kernel + """ + from tqdm import tqdm + + kn_values = {} + + for _, m in model.named_modules(): + if not isinstance(m, cls): + continue + + k = m.infeatures + n = m.outfeatures + + if (k, n) not in kn_values: + kn_values[(k, n)] = ( + m.qweight, + m.scales, + m.qzeros, + m.g_idx, + m.bits, + m.maxq, + ) + + logger.info(f"Found {len(kn_values)} unique KN Linear values.") + logger.info("Warming up autotune cache ...") + with torch.no_grad(): + for m in tqdm(range(0, math.ceil(math.log2(seqlen)) + 1)): + m = 2**m + for (k, n), ( + qweight, + scales, + qzeros, + g_idx, + bits, + maxq, + ) in kn_values.items(): + if transpose: + a = torch.randn(m, k, dtype=torch.float16, device=model.device) + quant_matmul_248(a, qweight, scales, qzeros, g_idx, bits, maxq) + a = torch.randn(m, n, dtype=torch.float16, device=model.device) + transpose_quant_matmul_248(a, qweight, scales, qzeros, g_idx, bits, maxq) + else: + a = torch.randn(m, k, dtype=torch.float16, device=model.device) + quant_matmul_inference_only_248(a, qweight, scales, qzeros, g_idx, bits, maxq) + del kn_values + + +__all__ = ["QuantLinear"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_tritonv2.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_tritonv2.py new file mode 100644 index 0000000000000000000000000000000000000000..82e948ac589ccb55d8ac9ca339893714432d3b45 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/qlinear/qlinear_tritonv2.py @@ -0,0 +1,226 @@ +import math +from logging import getLogger + +import numpy as np +import torch +import torch.nn as nn +import transformers + +from ..triton_utils.mixin import TritonModuleMixin + + +logger = getLogger(__name__) + +try: + from ..triton_utils.dequant import QuantLinearFunction, quant_matmul_248 +except ImportError as e: + triton_import_exception = e + + def error_raiser_triton(*args, **kwargs): + raise ValueError( + f"Trying to use the triton backend, but could not import triton dependencies with the following error: {triton_import_exception}" + ) + + class FakeTriton: + def __getattr__(self, name): + raise ImportError( + f"Trying to use the triton backend, but could not import triton dependencies with the following error: {triton_import_exception}" + ) + + quant_matmul_248 = error_raiser_triton + QuantLinearFunction = FakeTriton + QuantLinearInferenceOnlyFunction = FakeTriton + + +class QuantLinear(nn.Module, TritonModuleMixin): + """ + Triton v2 quantized linear layer. + + Calls dequant kernel (see triton_utils/dequant) to dequantize the weights then uses + torch.matmul to compute the output whereas original `triton` quantized linear layer fused + dequant and matmul into single kernel.add() + """ + + QUANT_TYPE = "tritonv2" + + def __init__( + self, bits, group_size, infeatures, outfeatures, bias, trainable=False, **kwargs + ): + super().__init__() + if bits not in [2, 4, 8]: + raise NotImplementedError("Only 2,4,8 bits are supported.") + if infeatures % 32 != 0 or outfeatures % 32 != 0: + raise NotImplementedError( + "in_feature and out_feature must be divisible by 32." + ) + self.infeatures = infeatures + self.outfeatures = outfeatures + self.bits = bits + self.group_size = group_size if group_size != -1 else infeatures + self.maxq = 2**self.bits - 1 + + self.register_buffer( + "qweight", + torch.zeros((infeatures // 32 * self.bits, outfeatures), dtype=torch.int32), + ) + self.register_buffer( + "qzeros", + torch.zeros( + ( + math.ceil(infeatures / self.group_size), + outfeatures // 32 * self.bits, + ), + dtype=torch.int32, + ), + ) + self.register_buffer( + "scales", + torch.zeros( + (math.ceil(infeatures / self.group_size), outfeatures), + dtype=torch.float16, + ), + ) + self.register_buffer( + "g_idx", + torch.tensor( + [i // self.group_size for i in range(infeatures)], dtype=torch.int32 + ), + ) + if bias: + self.register_buffer( + "bias", torch.zeros((outfeatures), dtype=torch.float16) + ) + else: + self.bias = None + + self.trainable = trainable + + def post_init(self): + pass + + def pack(self, linear, scales, zeros, g_idx=None): + W = linear.weight.data.clone() + if isinstance(linear, nn.Conv2d): + W = W.flatten(1) + if isinstance(linear, transformers.pytorch_utils.Conv1D): + W = W.t() + + self.g_idx = g_idx.clone() if g_idx is not None else self.g_idx + + scales = scales.t().contiguous() + zeros = zeros.t().contiguous() + scale_zeros = zeros * scales + self.scales = scales.clone().half() + if linear.bias is not None: + self.bias = linear.bias.clone().half() + + intweight = [] + for idx in range(self.infeatures): + intweight.append( + torch.round( + (W[:, idx] + scale_zeros[self.g_idx[idx]]) + / self.scales[self.g_idx[idx]] + ).to(torch.int)[:, None] + ) + intweight = torch.cat(intweight, dim=1) + intweight = intweight.t().contiguous() + intweight = intweight.numpy().astype(np.uint32) + + i = 0 + row = 0 + qweight = np.zeros( + (intweight.shape[0] // 32 * self.bits, intweight.shape[1]), dtype=np.uint32 + ) + while row < qweight.shape[0]: + if self.bits in [2, 4, 8]: + for j in range(i, i + (32 // self.bits)): + qweight[row] |= intweight[j] << (self.bits * (j - i)) + i += 32 // self.bits + row += 1 + else: + raise NotImplementedError("Only 2,4,8 bits are supported.") + + qweight = qweight.astype(np.int32) + self.qweight = torch.from_numpy(qweight) + + zeros -= 1 + zeros = zeros.numpy().astype(np.uint32) + qzeros = np.zeros( + (zeros.shape[0], zeros.shape[1] // 32 * self.bits), dtype=np.uint32 + ) + i = 0 + col = 0 + while col < qzeros.shape[1]: + if self.bits in [2, 4, 8]: + for j in range(i, i + (32 // self.bits)): + qzeros[:, col] |= zeros[:, j] << (self.bits * (j - i)) + i += 32 // self.bits + col += 1 + else: + raise NotImplementedError("Only 2,4,8 bits are supported.") + + qzeros = qzeros.astype(np.int32) + self.qzeros = torch.from_numpy(qzeros) + + def forward(self, x): + out_shape = x.shape[:-1] + (self.outfeatures,) + quant_linear_fn = QuantLinearFunction + + out = quant_linear_fn.apply( + x.reshape(-1, x.shape[-1]), + self.qweight, + self.scales, + self.qzeros, + self.g_idx, + self.bits, + self.maxq, + ) + out = out.half().reshape(out_shape) + out = out + self.bias if self.bias is not None else out + return out + + @classmethod + def warmup(cls, model, transpose=False, seqlen=2048): + """ + Pre-tunes the quantized kernel + """ + from tqdm import tqdm + + kn_values = {} + + for _, m in model.named_modules(): + if not isinstance(m, cls): + continue + + k = m.infeatures + n = m.outfeatures + + if (k, n) not in kn_values: + kn_values[(k, n)] = ( + m.qweight, + m.scales, + m.qzeros, + m.g_idx, + m.bits, + m.maxq, + ) + + logger.info(f"Found {len(kn_values)} unique KN Linear values.") + logger.info("Warming up autotune cache ...") + with torch.no_grad(): + for m in tqdm(range(0, math.ceil(math.log2(seqlen)) + 1)): + m = 2**m + for (k, n), ( + qweight, + scales, + qzeros, + g_idx, + bits, + maxq, + ) in kn_values.items(): + a = torch.randn(m, k, dtype=torch.float16, device=model.device) + quant_matmul_248(a, qweight, scales, qzeros, g_idx, bits, maxq) + del kn_values + + +__all__ = ["QuantLinear"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/custom_autotune.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/custom_autotune.py new file mode 100644 index 0000000000000000000000000000000000000000..ff2d14a3cd59324e0e6a0d3babba1b20de776852 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/custom_autotune.py @@ -0,0 +1,219 @@ +import builtins +import math +import time +from typing import Dict + +import triton + + +# code based https://github.com/fpgaminer/GPTQ-triton +""" +Mostly the same as the autotuner in Triton, but with a few changes like using 40 runs instead of 100. +""" + + +class CustomizedTritonAutoTuner(triton.KernelInterface): + def __init__( + self, + fn, + arg_names, + configs, + key, + reset_to_zero, + prune_configs_by: Dict = None, + nearest_power_of_two: bool = False, + ): + if not configs: + self.configs = [triton.Config({}, num_warps=4, num_stages=2)] + else: + self.configs = configs + self.key_idx = [arg_names.index(k) for k in key] + self.nearest_power_of_two = nearest_power_of_two + self.cache = {} + # hook to reset all required tensor to zeros before relaunching a kernel + self.hook = lambda args: 0 + if reset_to_zero is not None: + self.reset_idx = [arg_names.index(k) for k in reset_to_zero] + + def _hook(args): + for i in self.reset_idx: + args[i].zero_() + + self.hook = _hook + self.arg_names = arg_names + # prune configs + if prune_configs_by: + perf_model, top_k = ( + prune_configs_by["perf_model"], + prune_configs_by["top_k"], + ) + if "early_config_prune" in prune_configs_by: + early_config_prune = prune_configs_by["early_config_prune"] + else: + perf_model, top_k, early_config_prune = None, None, None + self.perf_model, self.configs_top_k = perf_model, top_k + self.early_config_prune = early_config_prune + self.fn = fn + + def _bench(self, *args, config, **meta): + # check for conflicts, i.e. meta-parameters both provided + # as kwargs and by the autotuner + conflicts = meta.keys() & config.kwargs.keys() + if conflicts: + raise ValueError( + f"Conflicting meta-parameters: {', '.join(conflicts)}." + " Make sure that you don't re-define auto-tuned symbols." + ) + # augment meta-parameters with tunable ones + current = dict(meta, **config.kwargs) + + def kernel_call(): + if config.pre_hook: + config.pre_hook(self.nargs) + self.hook(args) + self.fn.run( + *args, + num_warps=config.num_warps, + num_stages=config.num_stages, + **current, + ) + + try: + # In testings using only 40 reps seems to be close enough and it appears to be what PyTorch uses + # PyTorch also sets fast_flush to True, but I didn't see any speedup so I'll leave the default + return triton.testing.do_bench(kernel_call, quantiles=(0.5, 0.2, 0.8), rep=40) + except triton.OutOfResources: + return (float("inf"), float("inf"), float("inf")) + + def run(self, *args, **kwargs): + self.nargs = dict(zip(self.arg_names, args)) + if len(self.configs) > 1: + key = tuple(args[i] for i in self.key_idx) + + # This reduces the amount of autotuning by rounding the keys to the nearest power of two + # In my testing this gives decent results, and greatly reduces the amount of tuning required + if self.nearest_power_of_two: + key = tuple([2 ** int(math.log2(x) + 0.5) for x in key]) + + if key not in self.cache: + # prune configs + pruned_configs = self.prune_configs(kwargs) + bench_start = time.time() + timings = {config: self._bench(*args, config=config, **kwargs) for config in pruned_configs} + bench_end = time.time() + self.bench_time = bench_end - bench_start + self.cache[key] = builtins.min(timings, key=timings.get) + self.hook(args) + self.configs_timings = timings + config = self.cache[key] + else: + config = self.configs[0] + self.best_config = config + if config.pre_hook is not None: + config.pre_hook(self.nargs) + return self.fn.run( + *args, + num_warps=config.num_warps, + num_stages=config.num_stages, + **kwargs, + **config.kwargs, + ) + + def prune_configs(self, kwargs): + pruned_configs = self.configs + if self.early_config_prune: + pruned_configs = self.early_config_prune(self.configs, self.nargs) + if self.perf_model: + top_k = self.configs_top_k + if isinstance(top_k, float) and top_k <= 1.0: + top_k = int(len(self.configs) * top_k) + if len(pruned_configs) > top_k: + est_timing = { + config: self.perf_model( + **self.nargs, + **kwargs, + **config.kwargs, + num_stages=config.num_stages, + num_warps=config.num_warps, + ) + for config in pruned_configs + } + pruned_configs = sorted(est_timing.keys(), key=lambda x: est_timing[x])[:top_k] + return pruned_configs + + def warmup(self, *args, **kwargs): + self.nargs = dict(zip(self.arg_names, args)) + for config in self.prune_configs(kwargs): + self.fn.warmup( + *args, + num_warps=config.num_warps, + num_stages=config.num_stages, + **kwargs, + **config.kwargs, + ) + self.nargs = None + + +def autotune(configs, key, prune_configs_by=None, reset_to_zero=None, nearest_power_of_two=False): + def decorator(fn): + return CustomizedTritonAutoTuner( + fn, + fn.arg_names, + configs, + key, + reset_to_zero, + prune_configs_by, + nearest_power_of_two, + ) + + return decorator + + +def matmul248_kernel_config_pruner(configs, nargs): + """ + The main purpose of this function is to shrink BLOCK_SIZE_* when the corresponding dimension is smaller. + """ + m = max(2 ** int(math.ceil(math.log2(nargs["M"]))), 16) + n = max(2 ** int(math.ceil(math.log2(nargs["N"]))), 16) + k = max(2 ** int(math.ceil(math.log2(nargs["K"]))), 16) + + used = set() + for config in configs: + block_size_m = min(m, config.kwargs["BLOCK_SIZE_M"]) + block_size_n = min(n, config.kwargs["BLOCK_SIZE_N"]) + block_size_k = min(k, config.kwargs["BLOCK_SIZE_K"]) + group_size_m = config.kwargs["GROUP_SIZE_M"] + + if ( + block_size_m, + block_size_n, + block_size_k, + group_size_m, + config.num_stages, + config.num_warps, + ) in used: + continue + + used.add( + ( + block_size_m, + block_size_n, + block_size_k, + group_size_m, + config.num_stages, + config.num_warps, + ) + ) + yield triton.Config( + { + "BLOCK_SIZE_M": block_size_m, + "BLOCK_SIZE_N": block_size_n, + "BLOCK_SIZE_K": block_size_k, + "GROUP_SIZE_M": group_size_m, + }, + num_stages=config.num_stages, + num_warps=config.num_warps, + ) + + +__all__ = ["autotune"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/dequant.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/dequant.py new file mode 100644 index 0000000000000000000000000000000000000000..ea7375a737f5789ba26a8d17dedb365d045ecd87 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/dequant.py @@ -0,0 +1,145 @@ +import itertools + +import torch +import triton +import triton.language as tl +from torch.cuda.amp import custom_bwd, custom_fwd + + +def make_dequant_configs(block_sizes, num_warps): + configs = [] + for bs, ws in itertools.product(block_sizes, num_warps): + configs.append(triton.Config({"X_BLOCK": bs}, num_warps=ws)) + return configs + + +DEFAULT_DEQUANT_CONFIGS = make_dequant_configs([128, 256, 512, 1024], [4, 8]) + + +@triton.autotune(DEFAULT_DEQUANT_CONFIGS, key=["numels"]) +@triton.jit +def dequant_kernel_248( + g_idx_ptr, + scales_ptr, + qweight_ptr, + qzeros_ptr, + out_ptr, + numels, + maxq: tl.constexpr, + bits: tl.constexpr, + outfeatures: tl.constexpr, + num_groups: tl.constexpr, + X_BLOCK: tl.constexpr, +): + # Block indexing + xoffset = tl.program_id(0) * X_BLOCK + x_index = xoffset + tl.arange(0, X_BLOCK) + xmask = x_index < numels + row_idx = x_index // outfeatures + col_idx = x_index % outfeatures + + elements_per_feature: tl.constexpr = 32 // bits + + # Load parameters + g_idx = tl.load(g_idx_ptr + (row_idx), None, eviction_policy="evict_last") + qweights = tl.load( + qweight_ptr + (col_idx + (outfeatures * (row_idx // elements_per_feature))), + None, + ) + + wf_weights = (row_idx % elements_per_feature) * bits + + wf_zeros = (col_idx % elements_per_feature) * bits + + tmp1 = g_idx + num_groups + tmp2 = g_idx < 0 + tl.device_assert(g_idx >= 0, "index out of bounds: 0 <= tmp0 < 0") + groups = tl.where(tmp2, tmp1, g_idx) # tmp3 are g_idx + + scales = tl.load(scales_ptr + (col_idx + (outfeatures * groups)), None).to( + tl.float32 + ) + + # Unpack weights + weights = qweights >> wf_weights # bit shift qweight + + weights = weights & maxq + + # Unpack zeros + qzero_ncols: tl.constexpr = outfeatures // elements_per_feature + qzeros = tl.load( + qzeros_ptr + ((qzero_ncols * groups) + (col_idx // elements_per_feature)), + None, + eviction_policy="evict_last", + ) + zeros = qzeros >> wf_zeros + zeros = zeros & maxq + + # Dequantize + zeros = zeros + 1 + weights = weights - zeros + weights = weights.to(tl.float32) + weights = scales * weights + + tl.store(out_ptr + (x_index), weights, mask=xmask) + + +def dequant248(qweight, scales, qzeros, g_idx, bits, maxq=None): + """ + Launcher for triton dequant kernel. Only valid for bits = 2, 4, 8 + """ + + num_groups = scales.shape[0] + outfeatures = scales.shape[1] + infeatures = g_idx.shape[0] + + out = torch.empty((infeatures, outfeatures), device="cuda", dtype=torch.float16) + numels = out.numel() + maxq = 2**bits - 1 if maxq is None else maxq + grid = lambda meta: (triton.cdiv(numels, meta["X_BLOCK"]),) # noqa: E731 + + dequant_kernel_248[grid]( + g_idx, + scales, + qweight, + qzeros, + out, + numels, + maxq=maxq, + bits=bits, + outfeatures=outfeatures, + num_groups=num_groups, + ) + return out + + +def quant_matmul_248( + input, qweight, scales, qzeros, g_idx, bits, maxq=None, transpose=False +): + W = dequant248(qweight, scales, qzeros, g_idx, bits, maxq=maxq) + if transpose: + return input @ W.t() + return input @ W + + +class QuantLinearFunction(torch.autograd.Function): + @staticmethod + @custom_fwd + def forward(ctx, input, qweight, scales, qzeros, g_idx, bits, maxq): + output = quant_matmul_248(input, qweight, scales, qzeros, g_idx, bits, maxq) + ctx.save_for_backward(qweight, scales, qzeros, g_idx) + ctx.bits, ctx.maxq = bits, maxq + return output + + @staticmethod + @custom_bwd + def backward(ctx, grad_output): + qweight, scales, qzeros, g_idx = ctx.saved_tensors + bits, maxq = ctx.bits, ctx.maxq + grad_input = None + + if ctx.needs_input_grad[0]: + grad_input = quant_matmul_248( + grad_output, qweight, scales, qzeros, g_idx, bits, maxq, transpose=True + ) + return grad_input, None, None, None, None, None, None diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/kernels.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/kernels.py new file mode 100644 index 0000000000000000000000000000000000000000..30c6caa88d8c6d04736d2e714da349f6a5af9ce6 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/kernels.py @@ -0,0 +1,464 @@ +from logging import getLogger + +import torch +import triton +import triton.language as tl +from torch.cuda.amp import custom_bwd, custom_fwd + +from . import custom_autotune + + +logger = getLogger(__name__) + + +# code based https://github.com/fpgaminer/GPTQ-triton + + +@custom_autotune.autotune( + configs=[ + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 256, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 128, + "BLOCK_SIZE_N": 128, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 128, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 128, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 64, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 128, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=2, + num_warps=8, + ), + ], + key=["M", "N", "K"], + nearest_power_of_two=True, + prune_configs_by={ + "early_config_prune": custom_autotune.matmul248_kernel_config_pruner, + "perf_model": None, + "top_k": None, + }, +) +@triton.jit +def quant_matmul_248_kernel( + a_ptr, + b_ptr, + c_ptr, + scales_ptr, + zeros_ptr, + g_ptr, + M, + N, + K, + bits, + maxq, + stride_am, + stride_ak, + stride_bk, + stride_bn, + stride_cm, + stride_cn, + stride_scales, + stride_zeros, + BLOCK_SIZE_M: tl.constexpr, + BLOCK_SIZE_N: tl.constexpr, + BLOCK_SIZE_K: tl.constexpr, + GROUP_SIZE_M: tl.constexpr, +): + """ + Compute the matrix multiplication C = A x B. + A is of shape (M, K) float16 + B is of shape (K//8, N) int32 + C is of shape (M, N) float16 + scales is of shape (G, N) float16 + zeros is of shape (G, N) float16 + g_ptr is of shape (K) int32 + """ + infearure_per_bits = 32 // bits + + pid = tl.program_id(axis=0) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_k = tl.cdiv(K, BLOCK_SIZE_K) + num_pid_in_group = GROUP_SIZE_M * num_pid_n + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + (pid % group_size_m) + pid_n = (pid % num_pid_in_group) // group_size_m + + offs_am = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) + offs_bn = pid_n * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N) + offs_k = tl.arange(0, BLOCK_SIZE_K) + a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak) # (BLOCK_SIZE_M, BLOCK_SIZE_K) + a_mask = offs_am[:, None] < M + # b_ptrs is set up such that it repeats elements along the K axis 8 times + b_ptrs = b_ptr + ( + (offs_k[:, None] // infearure_per_bits) * stride_bk + offs_bn[None, :] * stride_bn + ) # (BLOCK_SIZE_K, BLOCK_SIZE_N) + g_ptrs = g_ptr + offs_k + # shifter is used to extract the N bits of each element in the 32-bit word from B + scales_ptrs = scales_ptr + offs_bn[None, :] + zeros_ptrs = zeros_ptr + (offs_bn[None, :] // infearure_per_bits) + + shifter = (offs_k % infearure_per_bits) * bits + zeros_shifter = (offs_bn % infearure_per_bits) * bits + accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_N), dtype=tl.float32) + + for k in range(0, num_pid_k): + g_idx = tl.load(g_ptrs) + + # Fetch scales and zeros; these are per-outfeature and thus reused in the inner loop + scales = tl.load(scales_ptrs + g_idx[:, None] * stride_scales) # (BLOCK_SIZE_K, BLOCK_SIZE_N,) + zeros = tl.load(zeros_ptrs + g_idx[:, None] * stride_zeros) # (BLOCK_SIZE_K, BLOCK_SIZE_N,) + + zeros = (zeros >> zeros_shifter[None, :]) & maxq + zeros = zeros + 1 + + a = tl.load(a_ptrs, mask=a_mask, other=0.0) # (BLOCK_SIZE_M, BLOCK_SIZE_K) + b = tl.load(b_ptrs) # (BLOCK_SIZE_K, BLOCK_SIZE_N), but repeated + + # Now we need to unpack b (which is N-bit values) into 32-bit values + b = (b >> shifter[:, None]) & maxq # Extract the N-bit values + b = (b - zeros) * scales # Scale and shift + + accumulator += tl.dot(a, b) + a_ptrs += BLOCK_SIZE_K + b_ptrs += (BLOCK_SIZE_K // infearure_per_bits) * stride_bk + g_ptrs += BLOCK_SIZE_K + + c_ptrs = c_ptr + stride_cm * offs_am[:, None] + stride_cn * offs_bn[None, :] + c_mask = (offs_am[:, None] < M) & (offs_bn[None, :] < N) + tl.store(c_ptrs, accumulator, mask=c_mask) + + +@custom_autotune.autotune( + configs=[ + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 256, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 128, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 128, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 128, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 128, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 32, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 64, + "GROUP_SIZE_M": 8, + }, + num_stages=4, + num_warps=4, + ), + triton.Config( + { + "BLOCK_SIZE_M": 64, + "BLOCK_SIZE_N": 32, + "BLOCK_SIZE_K": 128, + "GROUP_SIZE_M": 8, + }, + num_stages=2, + num_warps=8, + ), + ], + key=["M", "N", "K"], + nearest_power_of_two=True, +) +@triton.jit +def transpose_quant_matmul_248_kernel( + a_ptr, + b_ptr, + c_ptr, + scales_ptr, + zeros_ptr, + g_ptr, + M, + N, + K, + bits, + maxq, + stride_am, + stride_ak, + stride_bk, + stride_bn, + stride_cm, + stride_cn, + stride_scales, + stride_zeros, + BLOCK_SIZE_M: tl.constexpr, + BLOCK_SIZE_N: tl.constexpr, + BLOCK_SIZE_K: tl.constexpr, + GROUP_SIZE_M: tl.constexpr, +): + """ + Compute the matrix multiplication C = A x B. + A is of shape (M, N) float16 + B is of shape (K//8, N) int32 + C is of shape (M, K) float16 + scales is of shape (G, N) float16 + zeros is of shape (G, N) float16 + g_ptr is of shape (K) int32 + """ + infearure_per_bits = 32 // bits + + pid = tl.program_id(axis=0) + num_pid_m = tl.cdiv(M, BLOCK_SIZE_M) + num_pid_k = tl.cdiv(K, BLOCK_SIZE_K) + num_pid_n = tl.cdiv(N, BLOCK_SIZE_N) + num_pid_in_group = GROUP_SIZE_M * num_pid_k + group_id = pid // num_pid_in_group + first_pid_m = group_id * GROUP_SIZE_M + group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M) + pid_m = first_pid_m + (pid % group_size_m) + pid_k = (pid % num_pid_in_group) // group_size_m + + offs_am = pid_m * BLOCK_SIZE_M + tl.arange(0, BLOCK_SIZE_M) + offs_bk = pid_k * BLOCK_SIZE_K + tl.arange(0, BLOCK_SIZE_K) + offs_n = tl.arange(0, BLOCK_SIZE_N) + a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_n[None, :] * stride_ak) # (BLOCK_SIZE_M, BLOCK_SIZE_N) + a_mask = offs_am[:, None] < M + # b_ptrs is set up such that it repeats elements along the K axis 8 times + b_ptrs = b_ptr + ( + (offs_bk[:, None] // infearure_per_bits) * stride_bk + offs_n[None, :] * stride_bn + ) # (BLOCK_SIZE_K, BLOCK_SIZE_N) + g_ptrs = g_ptr + offs_bk + g_idx = tl.load(g_ptrs) + + # shifter is used to extract the N bits of each element in the 32-bit word from B + scales_ptrs = scales_ptr + offs_n[None, :] + g_idx[:, None] * stride_scales + zeros_ptrs = zeros_ptr + (offs_n[None, :] // infearure_per_bits) + g_idx[:, None] * stride_zeros + + shifter = (offs_bk % infearure_per_bits) * bits + zeros_shifter = (offs_n % infearure_per_bits) * bits + accumulator = tl.zeros((BLOCK_SIZE_M, BLOCK_SIZE_K), dtype=tl.float32) + + for k in range(0, num_pid_n): + # Fetch scales and zeros; these are per-outfeature and thus reused in the inner loop + scales = tl.load(scales_ptrs) # (BLOCK_SIZE_K, BLOCK_SIZE_N,) + zeros = tl.load(zeros_ptrs) # (BLOCK_SIZE_K, BLOCK_SIZE_N,) + + zeros = (zeros >> zeros_shifter[None, :]) & maxq + zeros = zeros + 1 + + a = tl.load(a_ptrs, mask=a_mask, other=0.0) # (BLOCK_SIZE_M, BLOCK_SIZE_N) + b = tl.load(b_ptrs) # (BLOCK_SIZE_K, BLOCK_SIZE_N), but repeated + + # Now we need to unpack b (which is N-bit values) into 32-bit values + b = (b >> shifter[:, None]) & maxq # Extract the N-bit values + b = (b - zeros) * scales # Scale and shift + b = tl.trans(b) + + accumulator += tl.dot(a, b) + a_ptrs += BLOCK_SIZE_N + b_ptrs += BLOCK_SIZE_N + scales_ptrs += BLOCK_SIZE_N + zeros_ptrs += BLOCK_SIZE_N // infearure_per_bits + + c_ptrs = c_ptr + stride_cm * offs_am[:, None] + stride_cn * offs_bk[None, :] + c_mask = (offs_am[:, None] < M) & (offs_bk[None, :] < K) + tl.store(c_ptrs, accumulator, mask=c_mask) + + +@triton.jit +def silu(x): + return x * tl.sigmoid(x) + + +def quant_matmul_248(input, qweight, scales, qzeros, g_idx, bits, maxq): + with torch.cuda.device(input.device): + output = torch.empty((input.shape[0], qweight.shape[1]), device=input.device, dtype=input.dtype) + grid = lambda META: ( # noqa: E731 + triton.cdiv(input.shape[0], META["BLOCK_SIZE_M"]) * triton.cdiv(qweight.shape[1], META["BLOCK_SIZE_N"]), + ) + quant_matmul_248_kernel[grid]( + input, + qweight, + output, + scales.to(input.dtype), + qzeros, + g_idx, + input.shape[0], + qweight.shape[1], + input.shape[1], + bits, + maxq, + input.stride(0), + input.stride(1), + qweight.stride(0), + qweight.stride(1), + output.stride(0), + output.stride(1), + scales.stride(0), + qzeros.stride(0), + ) + return output + + +def transpose_quant_matmul_248(input, qweight, scales, qzeros, g_idx, bits, maxq): + with torch.cuda.device(input.device): + output_dim = (qweight.shape[0] * 32) // bits + output = torch.empty((input.shape[0], output_dim), device=input.device, dtype=input.dtype) + grid = lambda META: ( # noqa: E731 + triton.cdiv(input.shape[0], META["BLOCK_SIZE_M"]) * triton.cdiv(output_dim, META["BLOCK_SIZE_K"]), + ) + transpose_quant_matmul_248_kernel[grid]( + input, + qweight, + output, + scales.to(input.dtype), + qzeros, + g_idx, + input.shape[0], + qweight.shape[1], + output_dim, + bits, + maxq, + input.stride(0), + input.stride(1), + qweight.stride(0), + qweight.stride(1), + output.stride(0), + output.stride(1), + scales.stride(0), + qzeros.stride(0), + ) + return output + + +class QuantLinearFunction(torch.autograd.Function): + @staticmethod + @custom_fwd + def forward(ctx, input, qweight, scales, qzeros, g_idx, bits, maxq): + output = quant_matmul_248(input, qweight, scales, qzeros, g_idx, bits, maxq) + ctx.save_for_backward(qweight, scales, qzeros, g_idx) + ctx.bits, ctx.maxq = bits, maxq + return output + + @staticmethod + @custom_bwd + def backward(ctx, grad_output): + qweight, scales, qzeros, g_idx = ctx.saved_tensors + bits, maxq = ctx.bits, ctx.maxq + grad_input = None + + if ctx.needs_input_grad[0]: + grad_input = transpose_quant_matmul_248(grad_output, qweight, scales, qzeros, g_idx, bits, maxq) + return grad_input, None, None, None, None, None, None + + +def quant_matmul_inference_only_248(input, qweight, scales, qzeros, g_idx, bits, maxq): + with torch.cuda.device(input.device): + output = torch.empty((input.shape[0], qweight.shape[1]), device=input.device, dtype=torch.float16) + grid = lambda META: ( # noqa: E731 + triton.cdiv(input.shape[0], META["BLOCK_SIZE_M"]) * triton.cdiv(qweight.shape[1], META["BLOCK_SIZE_N"]), + ) + quant_matmul_248_kernel[grid]( + input, + qweight, + output, + scales, + qzeros, + g_idx, + input.shape[0], + qweight.shape[1], + input.shape[1], + bits, + maxq, + input.stride(0), + input.stride(1), + qweight.stride(0), + qweight.stride(1), + output.stride(0), + output.stride(1), + scales.stride(0), + qzeros.stride(0), + ) + return output + + +class QuantLinearInferenceOnlyFunction(torch.autograd.Function): + @staticmethod + @custom_fwd(cast_inputs=torch.float16) + def forward(ctx, input, qweight, scales, qzeros, g_idx, bits, maxq): + output = quant_matmul_248(input, qweight, scales, qzeros, g_idx, bits, maxq) + return output diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/mixin.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/mixin.py new file mode 100644 index 0000000000000000000000000000000000000000..16161183836589522d5a6f014bdcf66c1c6e0205 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/nn_modules/triton_utils/mixin.py @@ -0,0 +1,4 @@ +class TritonModuleMixin: + @classmethod + def warmup(cls, model, transpose=False, seqlen=2048): + pass diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/ACKNOWLEDGEMENT.md b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/ACKNOWLEDGEMENT.md new file mode 100644 index 0000000000000000000000000000000000000000..7c8dedc55228a902b2263c2f222a7fbb8342ae48 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/ACKNOWLEDGEMENT.md @@ -0,0 +1 @@ +The codes in this directory are mainly referenced from @qwopqwop200 's [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa/tree/cuda), which itself is based on [gptq](https://github.com/IST-DASLab/gptq) \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1d0e82be090fecb8c38912eac130306463f3bb0b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/__init__.py @@ -0,0 +1,11 @@ +from .config import ( + CHECKPOINT_FORMAT, + CHECKPOINT_FORMAT_FIELD, + CHECKPOINT_FORMAT_FIELD_COMPAT_MARLIN, + QUANT_CONFIG_FILENAME, + QUANT_METHOD, + QUANT_METHOD_FIELD, + BaseQuantizeConfig, +) +from .gptq import GPTQ +from .quantizer import Quantizer, quantize diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/config.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/config.py new file mode 100644 index 0000000000000000000000000000000000000000..f436db6dae8c094459a851f6c15d519e494b58d6 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/config.py @@ -0,0 +1,258 @@ +import json +import logging +import os +from dataclasses import dataclass, field, fields +from os.path import isdir, join +from typing import Optional + +import huggingface_hub +from transformers.utils.hub import PushToHubMixin, cached_file + + +logger = logging.getLogger(__name__) +handler = logging.StreamHandler() +formatter = logging.Formatter("%(levelname)s - %(message)s") +handler.setFormatter(formatter) +logger.propagate = False +logger.addHandler(handler) +logger.setLevel(logging.INFO) + +CHECKPOINT_FORMAT_FIELD = "checkpoint_format" +CHECKPOINT_FORMAT_FIELD_COMPAT_MARLIN = "is_marlin_format" +QUANT_METHOD_FIELD = "quant_method" +QUANT_CONFIG_FILENAME = "quantize_config.json" + + +# checkpoint formats +class CHECKPOINT_FORMAT: + GPTQ = "gptq" + MARLIN = "marlin" + AWQ_GEMM = "gemm" + + +# quant methods +class QUANT_METHOD: + GPTQ = "gptq" + AWQ = "awq" + + +QUANT_METHOD_FORMAT_MAPPING = { + QUANT_METHOD.GPTQ: { + CHECKPOINT_FORMAT.GPTQ, + CHECKPOINT_FORMAT.MARLIN, + }, + QUANT_METHOD.AWQ: { + CHECKPOINT_FORMAT.AWQ_GEMM + } +} + +# awq is inference only +QUANTIZE_BLACK_LIST = {QUANT_METHOD.AWQ} + +# compat +QUANT_CONFIG_ARG_SYNONYMS = { + "w_bit": "bits", + "q_group_size": "group_size", +} + + +@dataclass +class BaseQuantizeConfig(PushToHubMixin): + bits: int = field(default=4, metadata={"choices": [2, 3, 4, 8]}) + group_size: int = field(default=-1) + damp_percent: float = field(default=0.01) + desc_act: bool = field(default=True) + static_groups: bool = field(default=False) + sym: bool = field(default=True) + true_sequential: bool = field(default=True) + quant_method: str = field(default=QUANT_METHOD.GPTQ) + checkpoint_format: str = field(default=CHECKPOINT_FORMAT.GPTQ) + model_name_or_path: Optional[str] = field(default=None) + model_file_base_name: Optional[str] = field(default=None) + + def __post_init__(self): + fields_info = fields(self) + + # validate quant method and format is matched + valid_checkpoint_formats = QUANT_METHOD_FORMAT_MAPPING.get(self.quant_method, None) + if valid_checkpoint_formats is None: + raise ValueError(f"Unsupported quantization method: {self.quant_method}") + + if self.checkpoint_format not in valid_checkpoint_formats: + raise ValueError( + f"The checkpoint format used is {self.checkpoint_format}, and the quantization method is {self.quant_method}. " + f"This is not supported, please open an issue at https://github.com/AutoGPTQ/AutoGPTQ/issues.") + + if self.bits not in fields_info[0].metadata["choices"]: + raise ValueError(f"only support quantize to {fields_info[0].metadata['choices']} bits.") + + if self.group_size != -1 and self.group_size <= 0: + raise ValueError("unless equal to -1, group_size must greater then 0.") + + if not (0 < self.damp_percent < 1): + raise ValueError("damp_percent must between 0 and 1.") + + def save_pretrained(self, save_dir: str, **kwargs): + with open(join(save_dir, QUANT_CONFIG_FILENAME), "w", encoding="utf-8") as f: + json.dump(self.to_dict(), f, indent=2) + + @classmethod + # normalize quant config for compat and also performs validation + def from_quant_config(cls, quantize_cfg, checkpoint_format: str = None): + valid_formats = {CHECKPOINT_FORMAT.GPTQ, CHECKPOINT_FORMAT.MARLIN, CHECKPOINT_FORMAT.AWQ_GEMM} + + checkpoint_format_auto_inferred = False + # compat: checkpoint_format can be passed in via from_quantized() if field missing from json + if checkpoint_format: + if checkpoint_format not in valid_formats: + raise ValueError(f"Unknown quantization checkpoint format: {checkpoint_format}.") + if quantize_cfg.get(CHECKPOINT_FORMAT_FIELD): + raise ValueError("Conflict: quantization checkpoint_format is passed in and also exists in model config.") + # compat: warn if checkpoint_format is missing + elif quantize_cfg.get(CHECKPOINT_FORMAT_FIELD) is None: + checkpoint_format_auto_inferred = True + + field_names = [field.name for field in fields(cls)] + + normalized = {QUANT_METHOD_FIELD: QUANT_METHOD.GPTQ, CHECKPOINT_FORMAT_FIELD: checkpoint_format if checkpoint_format else CHECKPOINT_FORMAT.GPTQ} + for key, val in quantize_cfg.items(): + key = key.lower() + + # remap keys according to compat map + if key in QUANT_CONFIG_ARG_SYNONYMS and QUANT_CONFIG_ARG_SYNONYMS[key] in field_names: + key = QUANT_CONFIG_ARG_SYNONYMS[key] + + if key == CHECKPOINT_FORMAT_FIELD: + val = val.lower() + + if val in {CHECKPOINT_FORMAT.GPTQ, CHECKPOINT_FORMAT.MARLIN, CHECKPOINT_FORMAT.AWQ_GEMM}: + normalized[key] = val + else: + raise ValueError(f"Unknown quantization format: {val}.") + elif key == QUANT_METHOD_FIELD: + val = val.lower() + # compat: some hf models use quant_method=marlin + if val == CHECKPOINT_FORMAT.MARLIN: + normalized[CHECKPOINT_FORMAT_FIELD] = CHECKPOINT_FORMAT.MARLIN + elif val not in {QUANT_METHOD.GPTQ, QUANT_METHOD.AWQ}: + raise ValueError(f"Unknown quantization method: {val}.") + else: + normalized[QUANT_METHOD_FIELD] = val + elif key == CHECKPOINT_FORMAT_FIELD_COMPAT_MARLIN and val: + normalized[CHECKPOINT_FORMAT_FIELD] = CHECKPOINT_FORMAT.MARLIN + elif key == "version" and val.lower() == CHECKPOINT_FORMAT.AWQ_GEMM: + normalized[QUANT_METHOD_FIELD] = QUANT_METHOD.AWQ + normalized[CHECKPOINT_FORMAT_FIELD] = CHECKPOINT_FORMAT.AWQ_GEMM + elif key in field_names: + normalized[key] = val + else: + logger.info(f"Ignoring unknown parameter in the quantization configuration: {key}.") + + if checkpoint_format_auto_inferred: + logger.info(f"`checkpoint_format` is missing from the quantization configuration and is automatically inferred to {normalized[CHECKPOINT_FORMAT_FIELD]}.") + + if normalized[CHECKPOINT_FORMAT_FIELD] in {CHECKPOINT_FORMAT.AWQ_GEMM, CHECKPOINT_FORMAT.MARLIN}: + # AWQ and Marlin do not reorder the rows. + normalized["desc_act"] = False + + if "sym" not in normalized: + logger.warning( + "The quantization configuration does not contain an entry `sym` (symmetric quantization). " + "This may result in silent errors. Defaulting to `sym=True`." + ) + + return cls(**normalized) + + @classmethod + def from_pretrained(cls, save_dir: str, **kwargs): + # Parameters related to loading from Hugging Face Hub + cache_dir = kwargs.pop("cache_dir", None) + force_download = kwargs.pop("force_download", False) + resume_download = kwargs.pop("resume_download", False) + proxies = kwargs.pop("proxies", None) + local_files_only = kwargs.pop("local_files_only", False) + use_auth_token = kwargs.pop("use_auth_token", None) + revision = kwargs.pop("revision", None) + subfolder = kwargs.pop("subfolder", None) + commit_hash = kwargs.pop("_commit_hash", None) + checkpoint_format = kwargs.pop("checkpoint_format", None) + + transformers_config = False + for quantize_config_filename in [ + QUANT_CONFIG_FILENAME, + "quant_config.json", + "config.json", + ]: + if isdir(save_dir): # Local + resolved_config_file = join(save_dir, quantize_config_filename) + else: # Remote + resolved_config_file = cached_file( + save_dir, + quantize_config_filename, + cache_dir=cache_dir, + force_download=force_download, + resume_download=resume_download, + proxies=proxies, + use_auth_token=use_auth_token, + revision=revision, + local_files_only=local_files_only, + subfolder=subfolder, + _raise_exceptions_for_missing_entries=False, + _raise_exceptions_for_connection_errors=False, + _commit_hash=commit_hash, + ) + if resolved_config_file is not None: + if quantize_config_filename == "config.json": + transformers_config = True + break + + if resolved_config_file is None: + raise ValueError( + "No quantize_config.json, quant_config.json or config.json file was found in the model repository." + ) + + with open(resolved_config_file, "r", encoding="utf-8") as f: + args_from_json = json.load(f) + + if transformers_config: + args_from_json = args_from_json["quantization_config"] + + return cls.from_quant_config(args_from_json, checkpoint_format) + + def get_cache_file_path(self, quant_method: QUANT_METHOD = None, checkpoint_format: CHECKPOINT_FORMAT = None): + """ + Gets The Cached Weight Path. + If remote: $HF_HOME/assets/autogptq/{model_name_or_path}/_{quant-method}_{checkpoint_format}.safetensors + If local: {model_name_or_path}/autogptq_model_{quant-method}_{checkpoint_format}.safetensors + """ + + use_quant_method = quant_method if quant_method else self.quant_method + use_checkpoint_format = checkpoint_format if checkpoint_format else self.checkpoint_format + + cache_file_name = f"autogptq_model_{use_quant_method}_{use_checkpoint_format}.safetensors" + + if os.path.isdir(self.model_name_or_path): + cache_file_name = os.path.join(self.model_name_or_path, cache_file_name) + else: + namespace, subfolder = self.model_name_or_path.split("/") + assets_path = huggingface_hub.cached_assets_path( + library_name="auto_gptq", namespace=namespace, subfolder=subfolder + ) + cache_file_name = os.path.join(assets_path, cache_file_name) + + return cache_file_name, os.path.isfile(cache_file_name) + + def to_dict(self): + return { + "bits": self.bits, + "group_size": self.group_size, + "damp_percent": self.damp_percent, + "desc_act": self.desc_act, + "static_groups": self.static_groups, + "sym": self.sym, + "true_sequential": self.true_sequential, + "model_name_or_path": self.model_name_or_path, + "model_file_base_name": self.model_file_base_name, + QUANT_METHOD_FIELD: self.quant_method, + CHECKPOINT_FORMAT_FIELD: self.checkpoint_format, + } diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/gptq.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/gptq.py new file mode 100644 index 0000000000000000000000000000000000000000..cda3e7acff29d0426c8153d2483b7261fe4b0811 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/gptq.py @@ -0,0 +1,206 @@ +import math +import os +import time +from logging import getLogger + +import torch +import torch.nn as nn +import transformers + +from .quantizer import Quantizer + + +logger = getLogger(__name__) + +torch.backends.cuda.matmul.allow_tf32 = False +torch.backends.cudnn.allow_tf32 = False + + +class GPTQ: + def __init__(self, layer): + self.layer = layer + self.dev = self.layer.weight.device + W = layer.weight.data.clone() + if isinstance(self.layer, nn.Conv2d): + W = W.flatten(1) + if isinstance(self.layer, transformers.pytorch_utils.Conv1D): + W = W.t() + self.rows = W.shape[0] + self.columns = W.shape[1] + self.H = torch.zeros((self.columns, self.columns), device=self.dev) + self.nsamples = 0 + self.quantizer = Quantizer() + + def add_batch(self, inp, out): + if os.environ.get("DEBUG"): + self.inp1 = inp + self.out1 = out + if len(inp.shape) == 2: + inp = inp.unsqueeze(0) + tmp = inp.shape[0] + if isinstance(self.layer, nn.Linear) or isinstance(self.layer, transformers.Conv1D): + if len(inp.shape) == 3: + inp = inp.reshape((-1, inp.shape[-1])) + inp = inp.t() + if isinstance(self.layer, nn.Conv2d): + unfold = nn.Unfold( + self.layer.kernel_size, + dilation=self.layer.dilation, + padding=self.layer.padding, + stride=self.layer.stride, + ) + inp = unfold(inp) + inp = inp.permute([1, 0, 2]) + inp = inp.flatten(1) + self.H *= self.nsamples / (self.nsamples + tmp) + self.nsamples += tmp + # inp = inp.float() + inp = math.sqrt(2 / self.nsamples) * inp.float() + # self.H += 2 / self.nsamples * inp.matmul(inp.t()) + self.H += inp.matmul(inp.t()) + + def fasterquant( + self, + blocksize=128, + percdamp=0.01, + group_size=-1, + actorder=False, + static_groups=False, + ): + W = self.layer.weight.data.clone() + if isinstance(self.layer, nn.Conv2d): + W = W.flatten(1) + if isinstance(self.layer, transformers.Conv1D): + W = W.t() + W = W.float() + + tick = time.time() + + if not self.quantizer.ready(): + self.quantizer.find_params(W, weight=True) + + H = self.H + del self.H + dead = torch.diag(H) == 0 + H[dead, dead] = 1 + W[:, dead] = 0 + + g_idx = [] + scale = [] + zero = [] + now_idx = 1 + + if static_groups: + import copy + + groups = [] + for i in range(0, self.columns, group_size): + quantizer = copy.deepcopy(self.quantizer) + quantizer.find_params(W[:, i : (i + group_size)], weight=True) + scale.append(quantizer.scale) + zero.append(quantizer.zero) + groups.append(quantizer) + + if actorder: + perm = torch.argsort(torch.diag(H), descending=True) + W = W[:, perm] + H = H[perm][:, perm] + invperm = torch.argsort(perm) + + Losses = torch.zeros_like(W) + Q = torch.zeros_like(W) + + damp = percdamp * torch.mean(torch.diag(H)) + diag = torch.arange(self.columns, device=self.dev) + H[diag, diag] += damp + H = torch.linalg.cholesky(H) + H = torch.cholesky_inverse(H) + H = torch.linalg.cholesky(H, upper=True) + Hinv = H + + for i1 in range(0, self.columns, blocksize): + i2 = min(i1 + blocksize, self.columns) + count = i2 - i1 + + W1 = W[:, i1:i2].clone() + Q1 = torch.zeros_like(W1) + Err1 = torch.zeros_like(W1) + Losses1 = torch.zeros_like(W1) + Hinv1 = Hinv[i1:i2, i1:i2] + + for i in range(count): + w = W1[:, i] + d = Hinv1[i, i] + + if group_size != -1: + if not static_groups: + if (i1 + i) % group_size == 0: + self.quantizer.find_params(W[:, (i1 + i) : (i1 + i + group_size)], weight=True) + + if ((i1 + i) // group_size) - now_idx == -1: + scale.append(self.quantizer.scale) + zero.append(self.quantizer.zero) + now_idx += 1 + else: + idx = i1 + i + if actorder: + idx = perm[idx] + self.quantizer = groups[idx // group_size] + + q = self.quantizer.quantize(w.unsqueeze(1)).flatten() + Q1[:, i] = q + Losses1[:, i] = (w - q) ** 2 / d**2 + + err1 = (w - q) / d + W1[:, i:] -= err1.unsqueeze(1).matmul(Hinv1[i, i:].unsqueeze(0)) + Err1[:, i] = err1 + + Q[:, i1:i2] = Q1 + Losses[:, i1:i2] = Losses1 / 2 + + W[:, i2:] -= Err1.matmul(Hinv[i1:i2, i2:]) + + if os.environ.get("DEBUG"): + self.layer.weight.data[:, :i2] = Q[:, :i2] + self.layer.weight.data[:, i2:] = W[:, i2:] + logger.debug(torch.sum((self.layer(self.inp1) - self.out1) ** 2)) + logger.debug(torch.sum(Losses)) + + torch.cuda.synchronize() + logger.info(f"duration: {(time.time() - tick)}") + logger.info(f"avg loss: {torch.sum(Losses).item() / self.nsamples}") + + group_size = group_size if group_size != -1 else self.columns + if static_groups and actorder: + g_idx = [perm[i] // group_size for i in range(self.columns)] + else: + g_idx = [i // group_size for i in range(self.columns)] + g_idx = torch.tensor(g_idx, dtype=torch.int32, device=Q.device) + if actorder: + Q = Q[:, invperm] + g_idx = g_idx[invperm] + + if isinstance(self.layer, transformers.Conv1D): + Q = Q.t() + self.layer.weight.data = Q.reshape(self.layer.weight.shape).type_as(self.layer.weight.data) + if os.environ.get("DEBUG"): + logger.debug(torch.sum((self.layer(self.inp1) - self.out1) ** 2)) + + if scale == []: + scale.append(self.quantizer.scale) + zero.append(self.quantizer.zero) + scale = torch.cat(scale, dim=1) + zero = torch.cat(zero, dim=1) + return scale, zero, g_idx + + def free(self): + if os.environ.get("DEBUG"): + self.inp1 = None + self.out1 = None + self.H = None + self.Losses = None + self.Trace = None + torch.cuda.empty_cache() + + +__all__ = ["GPTQ"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/quantizer.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/quantizer.py new file mode 100644 index 0000000000000000000000000000000000000000..e945a7040bdf045ef746ce8923af788874d91387 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/quantization/quantizer.py @@ -0,0 +1,140 @@ +from logging import getLogger + +import torch +import torch.nn as nn + + +logger = getLogger(__name__) + + +def quantize(x, scale, zero, maxq): + if maxq < 0: + return (x > scale / 2).float() * scale + (x < zero / 2).float() * zero + q = torch.clamp(torch.round(x / scale) + zero, 0, maxq) + return scale * (q - zero) + + +class Quantizer(nn.Module): + def __init__(self, shape=1): + super(Quantizer, self).__init__() + self.register_buffer("maxq", torch.tensor(0)) + self.register_buffer("scale", torch.zeros(shape)) + self.register_buffer("zero", torch.zeros(shape)) + + def configure( + self, + bits, + perchannel=False, + sym=True, + mse=False, + norm=2.4, + grid=100, + maxshrink=0.8, + trits=False, + ): + self.maxq = torch.tensor(2**bits - 1) + self.perchannel = perchannel + self.sym = sym + self.mse = mse + self.norm = norm + self.grid = grid + self.maxshrink = maxshrink + if trits: + self.maxq = torch.tensor(-1) + + def find_params(self, x, weight=False): + dev = x.device + self.maxq = self.maxq.to(dev) + + shape = x.shape + if self.perchannel: + if weight: + x = x.flatten(1) + else: + if len(shape) == 4: + x = x.permute([1, 0, 2, 3]) + x = x.flatten(1) + if len(shape) == 3: + x = x.reshape((-1, shape[-1])).t() + if len(shape) == 2: + x = x.t() + else: + x = x.flatten().unsqueeze(0) + + tmp = torch.zeros(x.shape[0], device=dev) + xmin = torch.minimum(x.min(1)[0], tmp) + xmax = torch.maximum(x.max(1)[0], tmp) + + if self.sym: + xmax = torch.maximum(torch.abs(xmin), xmax) + tmp = xmin < 0 + if torch.any(tmp): + xmin[tmp] = -xmax[tmp] + tmp = (xmin == 0) & (xmax == 0) + xmin[tmp] = -1 + xmax[tmp] = +1 + + if self.maxq < 0: + self.scale = xmax + self.zero = xmin + else: + self.scale = (xmax - xmin) / self.maxq + if self.sym: + self.zero = torch.full_like(self.scale, (self.maxq + 1) / 2) + else: + self.zero = torch.round(-xmin / self.scale) + + if self.mse: + best = torch.full([x.shape[0]], float("inf"), device=dev) + for i in range(int(self.maxshrink * self.grid)): + p = 1 - i / self.grid + xmin1 = p * xmin + xmax1 = p * xmax + scale1 = (xmax1 - xmin1) / self.maxq + zero1 = torch.round(-xmin1 / scale1) if not self.sym else self.zero + q = quantize(x, scale1.unsqueeze(1), zero1.unsqueeze(1), self.maxq) + q -= x + q.abs_() + q.pow_(self.norm) + err = torch.sum(q, 1) + tmp = err < best + if torch.any(tmp): + best[tmp] = err[tmp] + self.scale[tmp] = scale1[tmp] + self.zero[tmp] = zero1[tmp] + if not self.perchannel: + if weight: + tmp = shape[0] + else: + tmp = shape[1] if len(shape) != 3 else shape[2] + self.scale = self.scale.repeat(tmp) + self.zero = self.zero.repeat(tmp) + + if weight: + shape = [-1] + [1] * (len(shape) - 1) + self.scale = self.scale.reshape(shape) + self.zero = self.zero.reshape(shape) + return + if len(shape) == 4: + self.scale = self.scale.reshape((1, -1, 1, 1)) + self.zero = self.zero.reshape((1, -1, 1, 1)) + if len(shape) == 3: + self.scale = self.scale.reshape((1, 1, -1)) + self.zero = self.zero.reshape((1, 1, -1)) + if len(shape) == 2: + self.scale = self.scale.unsqueeze(0) + self.zero = self.zero.unsqueeze(0) + + def quantize(self, x): + if self.ready(): + return quantize(x, self.scale, self.zero, self.maxq) + return x + + def enabled(self): + return self.maxq > 0 + + def ready(self): + return torch.all(self.scale != 0) + + +__all__ = ["Quantizer"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..2f75305add3f6a92a87e9680ef8feab4766f03f6 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/__init__.py @@ -0,0 +1 @@ +from .perplexity_utils import Perplexity diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/accelerate_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/accelerate_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..15a4b94cc381a255a57419659a4edfca4f4908cd --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/accelerate_utils.py @@ -0,0 +1,248 @@ + +import gc +import json +import logging +import os +import shutil +import tempfile +from typing import Dict, List, Optional, Union + +import torch +import torch.nn as nn +from accelerate.utils.constants import SAFE_WEIGHTS_NAME, WEIGHTS_NAME +from accelerate.utils.modeling import ( + check_tied_parameters_in_config, + check_tied_parameters_on_same_device, + find_tied_parameters, + load_offloaded_weights, + load_state_dict, + retie_parameters, + set_module_tensor_to_device, +) +from accelerate.utils.offload import offload_weight, save_offload_index + + +logger = logging.getLogger(__name__) + +# TODO: Remove and use instead accelerate.utils.modeling.load_checkpoint_in_model once https://github.com/huggingface/accelerate/pull/2588 is merged & accelerate 0.29 is released. +def load_checkpoint_in_model( + model: nn.Module, + checkpoint: Union[str, os.PathLike], + device_map: Optional[Dict[str, Union[int, str, torch.device]]] = None, + offload_folder: Optional[Union[str, os.PathLike]] = None, + dtype: Optional[Union[str, torch.dtype]] = None, + offload_state_dict: bool = False, + offload_buffers: bool = False, + keep_in_fp32_modules: List[str] = None, + offload_8bit_bnb: bool = False, + strict: bool = False, +): + """ + Loads a (potentially sharded) checkpoint inside a model, potentially sending weights to a given device as they are + loaded. + + + + Once loaded across devices, you still need to call [`dispatch_model`] on your model to make it able to run. To + group the checkpoint loading and dispatch in one single call, use [`load_checkpoint_and_dispatch`]. + + + + Args: + model (`torch.nn.Module`): + The model in which we want to load a checkpoint. + checkpoint (`str` or `os.PathLike`): + The folder checkpoint to load. It can be: + - a path to a file containing a whole model state dict + - a path to a `.json` file containing the index to a sharded checkpoint + - a path to a folder containing a unique `.index.json` file and the shards of a checkpoint. + - a path to a folder containing a unique pytorch_model.bin or a model.safetensors file. + device_map (`Dict[str, Union[int, str, torch.device]]`, *optional*): + A map that specifies where each submodule should go. It doesn't need to be refined to each parameter/buffer + name, once a given module name is inside, every submodule of it will be sent to the same device. + offload_folder (`str` or `os.PathLike`, *optional*): + If the `device_map` contains any value `"disk"`, the folder where we will offload weights. + dtype (`str` or `torch.dtype`, *optional*): + If provided, the weights will be converted to that type when loaded. + offload_state_dict (`bool`, *optional*, defaults to `False`): + If `True`, will temporarily offload the CPU state dict on the hard drive to avoid getting out of CPU RAM if + the weight of the CPU state dict + the biggest shard does not fit. + offload_buffers (`bool`, *optional*, defaults to `False`): + Whether or not to include the buffers in the weights offloaded to disk. + keep_in_fp32_modules(`List[str]`, *optional*): + A list of the modules that we keep in `torch.float32` dtype. + offload_8bit_bnb (`bool`, *optional*): + Whether or not to enable offload of 8-bit modules on cpu/disk. + strict (`bool`, *optional*, defaults to `False`): + Whether to strictly enforce that the keys in the checkpoint state_dict match the keys of the model's state_dict. + + """ + if offload_8bit_bnb: + from accelerate.utils.bnb import quantize_and_offload_8bit + + tied_params = find_tied_parameters(model) + + if check_tied_parameters_in_config(model) and len(tied_params) == 0: + logger.warn( + "The model weights are not tied. Please use the `tie_weights` method before using the `infer_auto_device` function." + ) + if device_map is not None: + check_tied_parameters_on_same_device(tied_params, device_map) + + if offload_folder is None and device_map is not None and "disk" in device_map.values(): + raise ValueError( + "At least one of the model submodule will be offloaded to disk, please pass along an `offload_folder`." + ) + elif offload_folder is not None and device_map is not None and "disk" in device_map.values(): + os.makedirs(offload_folder, exist_ok=True) + + if isinstance(dtype, str): + # We accept "torch.float16" or just "float16" + dtype = dtype.replace("torch.", "") + dtype = getattr(torch, dtype) + + checkpoint_files = None + index_filename = None + if os.path.isfile(checkpoint): + if str(checkpoint).endswith(".json"): + index_filename = checkpoint + else: + checkpoint_files = [checkpoint] + elif os.path.isdir(checkpoint): + # check if the whole state dict is present + potential_state_bin = [f for f in os.listdir(checkpoint) if f == WEIGHTS_NAME] + potential_state_safetensor = [f for f in os.listdir(checkpoint) if f == SAFE_WEIGHTS_NAME] + if len(potential_state_bin) == 1: + checkpoint_files = [os.path.join(checkpoint, potential_state_bin[0])] + elif len(potential_state_safetensor) == 1: + checkpoint_files = [os.path.join(checkpoint, potential_state_safetensor[0])] + else: + # otherwise check for sharded checkpoints + potential_index = [f for f in os.listdir(checkpoint) if f.endswith(".index.json")] + if len(potential_index) == 0: + raise ValueError( + f"{checkpoint} is not a folder containing a `.index.json` file or a {WEIGHTS_NAME} or a {SAFE_WEIGHTS_NAME} file" + ) + elif len(potential_index) == 1: + index_filename = os.path.join(checkpoint, potential_index[0]) + else: + raise ValueError( + f"{checkpoint} containing more than one `.index.json` file, delete the irrelevant ones." + ) + else: + raise ValueError( + "`checkpoint` should be the path to a file containing a whole state dict, or the index of a sharded " + f"checkpoint, or a folder containing a sharded checkpoint or the whole state dict, but got {checkpoint}." + ) + + if index_filename is not None: + checkpoint_folder = os.path.split(index_filename)[0] + with open(index_filename) as f: + index = json.loads(f.read()) + + if "weight_map" in index: + index = index["weight_map"] + checkpoint_files = sorted(list(set(index.values()))) # noqa: C414 + checkpoint_files = [os.path.join(checkpoint_folder, f) for f in checkpoint_files] + + # Logic for missing/unexepected keys goes here. + + offload_index = {} + if offload_state_dict: + state_dict_folder = tempfile.mkdtemp() + state_dict_index = {} + + unexpected_keys = set() + model_keys = set(model.state_dict().keys()) + buffer_names = [name for name, _ in model.named_buffers()] + for checkpoint_file in checkpoint_files: + loaded_checkpoint = load_state_dict(checkpoint_file, device_map=device_map) + if device_map is None: + model.load_state_dict(loaded_checkpoint, strict=strict) + unexpected_keys.update(set(loaded_checkpoint.keys()) - model_keys) + else: + for param_name, param in loaded_checkpoint.items(): + # skip SCB parameter (for 8-bit serialization) + if "SCB" in param_name: + continue + + if param_name not in model_keys: + unexpected_keys.add(param_name) + if not strict: + continue # Skip loading this parameter. + + module_name = param_name + + while len(module_name) > 0 and module_name not in device_map: + module_name = ".".join(module_name.split(".")[:-1]) + if module_name == "" and "" not in device_map: + # TODO: group all errors and raise at the end. + raise ValueError(f"{param_name} doesn't have any device set.") + param_device = device_map[module_name] + new_dtype = dtype + if dtype is not None and torch.is_floating_point(param): + if keep_in_fp32_modules is not None and dtype == torch.float16: + proceed = False + for key in keep_in_fp32_modules: + if ((key in param_name) and (key + "." in param_name)) or key == param_name: + proceed = True + break + if proceed: + new_dtype = torch.float32 + + if "weight" in param_name and param_name.replace("weight", "SCB") in loaded_checkpoint.keys(): + if param.dtype == torch.int8: + fp16_statistics = loaded_checkpoint[param_name.replace("weight", "SCB")] + else: + fp16_statistics = None + + if param_device == "disk": + if offload_buffers or param_name not in buffer_names: + if new_dtype is None: + new_dtype = param.dtype + if offload_8bit_bnb: + quantize_and_offload_8bit( + model, param, param_name, new_dtype, offload_folder, offload_index, fp16_statistics + ) + continue + else: + set_module_tensor_to_device(model, param_name, "meta", dtype=new_dtype) + offload_weight(param, param_name, offload_folder, index=offload_index) + elif param_device == "cpu" and offload_state_dict: + if new_dtype is None: + new_dtype = param.dtype + if offload_8bit_bnb: + quantize_and_offload_8bit( + model, param, param_name, new_dtype, state_dict_folder, state_dict_index, fp16_statistics + ) + else: + set_module_tensor_to_device(model, param_name, "meta", dtype=new_dtype) + offload_weight(param, param_name, state_dict_folder, index=state_dict_index) + else: + set_module_tensor_to_device( + model, + param_name, + param_device, + value=param, + dtype=new_dtype, + fp16_statistics=fp16_statistics, + ) + + # Force Python to clean up. + del loaded_checkpoint + gc.collect() + + if not strict and len(unexpected_keys) > 0: + logger.warning( + f"Some weights of the model checkpoint at {checkpoint} were not used when" + f" initializing {model.__class__.__name__}: {unexpected_keys}. This may or may not be an issue - make sure that the checkpoint does not have unnecessary parameters, or that the model definition correctly corresponds to the checkpoint." + ) + + save_offload_index(offload_index, offload_folder) + + # Load back offloaded state dict on CPU + if offload_state_dict: + load_offloaded_weights(model, state_dict_index, state_dict_folder) + shutil.rmtree(state_dict_folder) + + retie_parameters(model, tied_params) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/data_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/data_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..ba4222d32092ae352b5f8ca857f8d364224d4714 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/data_utils.py @@ -0,0 +1,263 @@ +import copy +import random +from functools import partial +from typing import Callable, Dict, List, Optional + +import torch +from datasets import DatasetDict, IterableDatasetDict, load_dataset +from torch import LongTensor +from torch.utils.data import DataLoader +from transformers import PreTrainedTokenizer + + +def make_data_block( + samples: Dict[str, List[str]], + prompt_col_name: str, + label_col_name: str, + tokenizer: PreTrainedTokenizer, + preprocess_fn: Optional[Callable] = None, + sample_max_len: int = 1024, + block_max_len: int = 2048, + add_eos_token: bool = False, + truncate_prompt: bool = True, + merge_prompt_label: bool = False, +) -> Dict[str, List[LongTensor]]: + """A simple implementation of text generation oriented smart batching to maximize VRAM usage when evaluation + + :param samples: Dict[str, List[str]], samples that used to make data blocks + :param prompt_col_name: str, name of the key in samples whose value stores prompt + :param label_col_name: str, name of the key in samples whose value stores label + :param tokenizer: transformers.PretrainedTokenizer, tokenizer that used to tokenize samples + :param preprocess_fn: Optional[Callable], optional function that used to preprocess samples such as + refactor the data structure of samples, note the output of this function must be a dict whose keys + at least contains `prompt_col_name` and `label_col_name` + :param sample_max_len: int, defaults to 1024, max tokens number of each sample (before padding) + :param block_max_len: int, defaults to 2048, max tokens number of each data block (after padding) + :param add_eos_token: bool, defaults to False, whether add eos_token or not to the label + :param truncate_prompt: bool, defaults to True, whether to truncate prompt if the sample's total tokens + number exceeds `sample_max_len`, if not, will truncate label and drop this sample when all tokens + in label are truncated + :param merge_prompt_label: bool, defaults to False, will merge label into prompt if set to True, usually + this only required when doing language modeling task + :return: Dict[str, List[torch.LongTensor]], a dict whose keys are `input_ids`, `attention_mask` and + `label` and values are a list of torch.LongTensor + """ + if preprocess_fn: + samples = preprocess_fn(samples) + + prompts = samples[prompt_col_name] + labels = samples[label_col_name] + + # tokenize samples + tokenized_prompts = tokenizer(prompts, truncation=False)["input_ids"] + tokenized_labels = tokenizer(labels, truncation=False)["input_ids"] + + # filter tokenized samples by length + dropped_indices = [] + for idx, (tokenized_prompt, tokenized_label) in enumerate(zip(tokenized_prompts, tokenized_labels)): + if add_eos_token: + tokenized_label += [tokenizer.eos_token_id] + len_prompt = len(tokenized_prompt) + len_label = len(tokenized_label) + exceed_len = len_prompt + len_label - sample_max_len + if exceed_len > 0: + if truncate_prompt: + tokenized_prompt = tokenized_prompt[exceed_len:] + else: + tokenized_label = tokenized_label[:-exceed_len] + tokenized_prompts[idx] = tokenized_prompt + tokenized_labels[idx] = tokenized_label + if not tokenized_label: + dropped_indices.append(idx) + + # make data blocks of samples + tokenized_samples = sorted( + [(p, l) for idx, (p, l) in enumerate(zip(tokenized_prompts, tokenized_labels)) if idx not in dropped_indices], + key=lambda x: (len(x[0]) + len(x[1])) if merge_prompt_label else len(x[0]), + ) + sample_blocks = [] + sample_block = [] + blk_max_len = 0 + blk_total_len = 0 + for tokenized_sample in tokenized_samples: + prompt_ids, label_ids = tokenized_sample + ori_sample_len = len(prompt_ids) + if merge_prompt_label: + ori_sample_len += len(label_ids) + if ori_sample_len <= blk_max_len: + additional_len = blk_max_len + sample_len = blk_max_len + else: + additional_len = len(sample_block) * (ori_sample_len - blk_max_len) + ori_sample_len + sample_len = ori_sample_len + + if blk_total_len + additional_len > block_max_len: + sample_blocks.append((copy.copy(sample_block), blk_max_len)) + sample_block = [] + blk_max_len = 0 + blk_total_len = 0 + sample_len = ori_sample_len + additional_len = ori_sample_len + + sample_block.append(tokenized_sample) + blk_max_len = max(blk_max_len, sample_len) + blk_total_len += additional_len + + if sample_block: + sample_blocks.append((copy.copy(sample_block), blk_max_len)) + del sample_block + del blk_max_len + del blk_total_len + + new_samples = {"input_ids": [], "attention_mask": [], "labels": []} + # padding each data block internally + for block, blk_max_len in sample_blocks: + input_ids = [] + attention_mask = [] + label_ids = [] + label_max_len = max([len(sample[1]) for sample in block]) + + for sample in block: + tokenized_prompt, tokenized_label = sample + sample_len = len(tokenized_prompt) + if merge_prompt_label: + sample_len += len(tokenized_label) + pad_num = blk_max_len - sample_len + if merge_prompt_label: + input_ids.append([tokenizer.pad_token_id] * pad_num + tokenized_prompt + tokenized_label) + label_ids.append([-100] * (pad_num + len(tokenized_prompt)) + tokenized_label) + else: + input_ids.append([tokenizer.pad_token_id] * pad_num + tokenized_prompt) + label_ids.append([-100] * (label_max_len - len(tokenized_label)) + tokenized_label) + attention_mask.append([0] * pad_num + [1] * sample_len) + + new_samples["input_ids"].append(input_ids) + new_samples["attention_mask"].append(attention_mask) + new_samples["labels"].append(label_ids) + + return new_samples + + +def collate_data(blocks: List[Dict[str, List[List[int]]]], pad_token_id: int) -> Dict[str, LongTensor]: + def pad_block(block, pads): + return torch.cat((pads.to(block.device), block), dim=-1) + + input_ids_blocks = [LongTensor(block["input_ids"]) for block in blocks] + attention_mask_blocks = [LongTensor(block["attention_mask"]) for block in blocks] + label_blocks = [LongTensor(block["labels"]) for block in blocks] + + bsz = len(blocks) + inp_max_len = max([block.size(-1) for block in input_ids_blocks]) + label_max_len = max([block.size(-1) for block in label_blocks]) + + for i in range(bsz): + block_bsz, block_inp_len = input_ids_blocks[i].shape + block_label_len = label_blocks[i].shape[-1] + pad_num = inp_max_len - block_inp_len + if pad_num > 0: + input_ids_blocks[i] = pad_block(input_ids_blocks[i], torch.ones((block_bsz, pad_num)) * pad_token_id) + attention_mask_blocks[i] = pad_block(attention_mask_blocks[i], torch.zeros((block_bsz, pad_num))) + label_pad_num = label_max_len - block_label_len + if label_pad_num > 0: + label_blocks[i] = pad_block(label_blocks[i], torch.ones((block_bsz, label_pad_num)) * -100) + + return { + "input_ids": torch.cat(input_ids_blocks, dim=0).long(), + "attention_mask": torch.cat(attention_mask_blocks, dim=0).long(), + "labels": torch.cat(label_blocks, dim=0).long(), + } + + +def get_dataloader( + data_path_or_name: str, + prompt_col_name: str, + label_col_name: str, + tokenizer: PreTrainedTokenizer, + load_fn: Optional[Callable] = None, + preprocess_fn: Optional[Callable] = None, + num_samples: int = 128, + sample_max_len: int = 1024, + block_max_len: int = 2048, + add_eos_token: bool = False, + truncate_prompt: bool = True, + merge_prompt_label: bool = False, + load_fn_kwargs: Optional[dict] = None, + preprocess_fn_kwargs: Optional[dict] = None, + **kwargs, +) -> DataLoader: + """load dataset and build dataloader + + :param data_path_or_name: str, dataset name in hf-hub or local file path + :param prompt_col_name: str, see `make_data_block` + :param label_col_name: str, see `make_data_block` + :param tokenizer: str, see `make_data_block` + :param load_fn: Optional[Callable], defaults to None, function used to load dataset, if not specified, + use `datasets.load_dataset` + :param preprocess_fn: Optional[Callable], see `make_data_block` + :param num_samples: int, defaults to 128, total samples used to evaluation + :param sample_max_len: int, see `make_data_block` + :param block_max_len: int, see `make_data_block` + :param add_eos_token: bool, see `make_data_block` + :param truncate_prompt: bool, see `make_data_block` + :param merge_prompt_label: bool, see `make_data_block` + :param load_fn_kwargs: Optional[dict], defaults to None, keyword arguments used + for `load_fn` or `datasets.load_dataset` + :param preprocess_fn_kwargs: Optional[dict], defaults to None, keyword arguments used + for `preprocess_fn` + :param kwargs: additional keyword arguments will be passed to torch's `DataLoader` initialization, + note values of `batch_size`, `shuffle` and `collate_fn` will always be overridden to fixed value + :return: torch.utils.data.DataLoader + """ + + if not load_fn_kwargs: + load_fn_kwargs = {} + if not preprocess_fn_kwargs: + preprocess_fn_kwargs = {} + + if load_fn: + ds = load_fn(data_path_or_name, **load_fn_kwargs) + else: + ds = load_dataset(data_path_or_name, **load_fn_kwargs) + if isinstance(ds, (DatasetDict, IterableDatasetDict)): + if "evaluation" in ds: + ds = ds["evaluation"] + elif "test" in ds: + ds = ds["test"] + else: + ds = ds["train"] + + ds = ds.select( + indices=random.sample(range(len(ds)), min(len(ds), num_samples)), + keep_in_memory=True, + ) + ds = ds.map( + make_data_block, + batched=True, + batch_size=len(ds), + num_proc=1, + remove_columns=ds.column_names, + keep_in_memory=True, + load_from_cache_file=False, + fn_kwargs={ + "prompt_col_name": prompt_col_name, + "label_col_name": label_col_name, + "tokenizer": tokenizer, + "preprocess_fn": partial(preprocess_fn, **preprocess_fn_kwargs), + "sample_max_len": sample_max_len, + "block_max_len": block_max_len, + "add_eos_token": add_eos_token, + "truncate_prompt": truncate_prompt, + "merge_prompt_label": merge_prompt_label, + }, + ) + + # override some arguments' values in kwargs despite user specified + kwargs["batch_size"] = 1 + kwargs["shuffle"] = False + kwargs["collate_fn"] = partial(collate_data, pad_token_id=tokenizer.pad_token_id) + dl = DataLoader(ds, **kwargs) + + return dl + + +__all__ = ["make_data_block", "collate_data", "get_dataloader"] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/exllama_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/exllama_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..84b5da2fcad218e44edd9154046fa5f78903a5fb --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/exllama_utils.py @@ -0,0 +1,79 @@ +import gc + +import torch + +from ..nn_modules.qlinear.qlinear_exllama import QuantLinear as ExllamaQuantLinear + + +def exllama_set_max_input_length(model, max_input_length: int): + """ + This method does not necessarily require `model` to inherit from BaseGPTQForCausalLM. + + When using the exllama backend with act-order, it is necessary to initialize a buffer that depends on the maximum expected input length. In case the + default used (EXLLAMA_DEFAULT_MAX_INPUT_LENGTH) is too short, this method can be called to extend the buffer size without reloading the whole model. + """ + + # The import is set here to avoid a global import. Arguably this is quite ugly, it would be better to have lazy loading. + from exllama_kernels import cleanup_buffers_cuda, prepare_buffers + + if not model.quantize_config.desc_act: + raise ValueError( + "The method exllama_set_max_input_length should be called only when using the exllama backend **with act-order**." + ) + + uses_exllama = False + for name, submodule in model.named_modules(): + if isinstance(submodule, ExllamaQuantLinear): + uses_exllama = True + + if not uses_exllama: + raise ValueError( + f"The function exllama_set_max_input_length was called, but the model (instance of {model.__class__.__name__}) does not use the exllama backend for GPTQ. An other implementation is used (exllamav2, cuda, cuda-old, triton) and that the call to exllama_set_max_input_length is unnecessary. Please remove the call to exllama_set_max_input_length or use the exllama v1 backend." + ) + + device_to_buffers_size = {} + for device, buffers in model.device_to_buffers.items(): + device_to_buffers_size[device] = { + "max_dq_buffer_size": buffers["max_dq_buffer_size"], + "max_inner_outer_dim": buffers["max_inner_outer_dim"], + } + + # For an unknown reason calling just `del model.device_to_buffers` raises an AttributeError. + for key in list(model.device_to_buffers.keys()): + del model.device_to_buffers[key] + model.device_to_buffers = None + del model.device_to_buffers + + gc.collect() + torch.cuda.empty_cache() + cleanup_buffers_cuda() + + device_to_buffers = {} + for device, buffers_size in device_to_buffers_size.items(): + # The temp_state buffer is required to reorder X in the act-order case. + # The temp_dq buffer is required to dequantize weights when using cuBLAS, typically for the prefill. + device_to_buffers[device] = { + "temp_state": torch.zeros( + (max_input_length, buffers_size["max_inner_outer_dim"]), + dtype=torch.float16, + device=device, + ), + "temp_dq": torch.zeros( + (1, buffers_size["max_dq_buffer_size"]), + dtype=torch.float16, + device=device, + ), + "max_dq_buffer_size": buffers_size["max_dq_buffer_size"], + "max_inner_outer_dim": buffers_size["max_inner_outer_dim"], + } + + prepare_buffers( + device, + device_to_buffers[device]["temp_state"], + device_to_buffers[device]["temp_dq"], + ) + + # Buffers need to be persistent to avoid any bug. + model.device_to_buffers = device_to_buffers + + return model diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/import_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/import_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..fe9aabf7db9aae5fc9d77437f0a7eec9c4f14c0b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/import_utils.py @@ -0,0 +1,121 @@ +from logging import getLogger +from typing import Optional + +import torch +from packaging.version import parse as parse_version + + +try: + import triton # noqa: F401 + + TRITON_AVAILABLE = True +except ImportError: + TRITON_AVAILABLE = False + +try: + import autogptq_cuda_64 # noqa: F401 + + AUTOGPTQ_CUDA_AVAILABLE = True +except Exception: + AUTOGPTQ_CUDA_AVAILABLE = False + + +try: + import exllama_kernels # noqa: F401 + + EXLLAMA_KERNELS_AVAILABLE = True +except Exception: + EXLLAMA_KERNELS_AVAILABLE = False + +try: + import exllamav2_kernels # noqa: F401 + + EXLLAMAV2_KERNELS_AVAILABLE = True +except Exception: + EXLLAMAV2_KERNELS_AVAILABLE = False + +try: + import cQIGen # noqa: F401 + + QIGEN_AVAILABLE = True + QIGEN_EXCEPTION = None +except Exception as e: + QIGEN_AVAILABLE = False + QIGEN_EXCEPTION = e + +try: + import autogptq_marlin_cuda # noqa: F401 + + MARLIN_AVAILABLE = True + MARLIN_EXCEPTION = None +except Exception as e: + MARLIN_AVAILABLE = False + MARLIN_EXCEPTION = e + + +logger = getLogger(__name__) + + +def dynamically_import_QuantLinear( + use_triton: bool, + desc_act: bool, + group_size: int, + bits: int, + disable_exllama: Optional[bool] = None, + disable_exllamav2: bool = False, + use_qigen: bool = False, + use_marlin: bool = False, + use_tritonv2: bool = False, +): + if use_qigen: + if not QIGEN_AVAILABLE: + raise ValueError( + f"QIGen appears to be not available with the error: {QIGEN_EXCEPTION}. Please check your installation or use `use_qigen=False`." + ) + from ..nn_modules.qlinear.qlinear_qigen import QuantLinear + else: + if use_triton or use_tritonv2: + if torch.version.hip: + logger.warning( + "Running GPTQ triton version on AMD GPUs is untested and may result in errors or wrong predictions. Please use use_triton=False." + ) + if use_tritonv2: + logger.debug("Using tritonv2 for GPTQ") + from ..nn_modules.qlinear.qlinear_tritonv2 import QuantLinear + else: + from ..nn_modules.qlinear.qlinear_triton import QuantLinear + else: + # If disable_exllamav2 is True, we want to fall back on the exllama kernel and not the cuda/cuda_old ones. + if disable_exllama is None: + if disable_exllamav2: + disable_exllama = False + else: + disable_exllama = True + if bits == 4 and use_marlin: + from ..nn_modules.qlinear.qlinear_marlin import QuantLinear + elif bits == 4 and not disable_exllamav2 and EXLLAMAV2_KERNELS_AVAILABLE: + from ..nn_modules.qlinear.qlinear_exllamav2 import QuantLinear + elif bits == 4 and not disable_exllama and EXLLAMA_KERNELS_AVAILABLE: + from ..nn_modules.qlinear.qlinear_exllama import QuantLinear + elif not desc_act or group_size == -1: + from ..nn_modules.qlinear.qlinear_cuda_old import QuantLinear + else: + from ..nn_modules.qlinear.qlinear_cuda import QuantLinear + + return QuantLinear + + +def compare_transformers_version(version: str = "v4.28.0", op: str = "eq"): + assert op in ["eq", "lt", "le", "gt", "ge"] + + from transformers import __version__ + + return getattr(parse_version(__version__), f"__{op}__")(parse_version(version)) + + +def compare_pytorch_version(version: str = "v2.0.0", op: str = "eq"): + assert op in ["eq", "lt", "le", "gt", "ge"] + + from torch import __version__ + + return getattr(parse_version(__version__), f"__{op}__")(parse_version(version)) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/marlin_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/marlin_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..61e1c62d7c9b78a3db0390771e020c34bb056d6a --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/marlin_utils.py @@ -0,0 +1,211 @@ +import gc +from logging import getLogger +from typing import Tuple + +import torch +from accelerate.utils import find_tied_parameters +from safetensors.torch import save_file as safe_save +from tqdm import tqdm + +from ..nn_modules.qlinear.qlinear_marlin import QuantLinear as MarlinQuantLinear +from ..nn_modules.qlinear.qlinear_marlin import _get_perms, unpack_qzeros +from ..quantization import CHECKPOINT_FORMAT, QUANT_METHOD, BaseQuantizeConfig +from .accelerate_utils import load_checkpoint_in_model +from .import_utils import MARLIN_AVAILABLE, MARLIN_EXCEPTION +from .modeling_utils import recurse_getattr, recurse_setattr + + +if MARLIN_AVAILABLE: + import autogptq_marlin_cuda + +logger = getLogger(__name__) + + +def prepare_model_for_marlin_load( + model, + quantize_config: BaseQuantizeConfig, + quant_linear_class, + torch_dtype, + current_model_save_name, + device_map, +): + # The model (e.g. model.safetensors) is already serialized in the Marlin format, load it directly. + if quantize_config.checkpoint_format == CHECKPOINT_FORMAT.MARLIN: + model_save_name = current_model_save_name + logger.info(f"Loading a GPTQ model, detected Marlin serialized format at {model_save_name}.") + model = convert_to_marlin(model, quant_linear_class, quantize_config, repack=False) + else: + model_save_name, is_cached = quantize_config.get_cache_file_path(quant_method=QUANT_METHOD.GPTQ, + checkpoint_format=CHECKPOINT_FORMAT.MARLIN) + + # If GPTQ model has Marlin version cached locally, load from the cached version (no repacking needed). + if is_cached: + logger.info( + f"Loading a GPTQ model, detected a cached repacked weight for Marlin kernel at {model_save_name}." + ) + model = convert_to_marlin(model, quant_linear_class, quantize_config, repack=False) + + # Otherwise, convert the model to Marlin format first and cache locally. + else: + # Loading the GPTQ checkpoint to do the conversion. + # TODO: Avoid loading the model with wrong QuantLinear, and directly use + # Marlin ones. The repacking can be done directly on the safetensors, just + # as for AWQ checkpoints. + load_checkpoint_in_model( + model, + dtype=torch_dtype, # This is very hacky but works due to https://github.com/huggingface/accelerate/blob/bd72a5f1a80d5146554458823f8aeda0a9db5297/src/accelerate/utils/modeling.py#L292 + checkpoint=current_model_save_name, + device_map=device_map, + offload_state_dict=True, + offload_buffers=True, + ) + # Convert model to marlin, repacking weights into Marlin format. + model = convert_to_marlin(model, quant_linear_class, quantize_config, repack=True) + + # Safetensors is unable to save tied weights, so we untie them here. Reference: https://github.com/huggingface/safetensors/issues/202 + tied_params = find_tied_parameters(model) + + for weight_group in tied_params: + for param_name in weight_group: + if isinstance(recurse_getattr(model, param_name), torch.nn.Parameter): + recurse_setattr( + model, + param_name, + torch.nn.Parameter(recurse_getattr(model, param_name).clone()), + ) + else: + recurse_setattr( + model, + param_name, + recurse_getattr(model, param_name).clone(), + ) + + # Cache the converted model. + safe_save(model.state_dict(), model_save_name) + + return model, model_save_name + + +# Validate marlin support +def _validate_marlin_device_support() -> Tuple[bool, bool]: + """ + Validates if the current device is compatible and optimized for Marlin. + ref: https://github.com/IST-DASLab/marlin?tab=readme-ov-file#requirements + + Returns: + Tuple[bool, bool]: The first indicates if CUDA device is compatible for Marlin, + the second indicates if CUDA device is optimized for Marlin. + """ + supported = False + optimized = False + + # >=hopper is compatible but not optimized + if torch.cuda.get_device_capability()[0] >= 9: + supported = True + optimized = False + # ampere and ada are supported and optimized + elif torch.cuda.get_device_capability()[0] >= 8: + supported = True + optimized = True + + return supported, optimized + + +# Adapted from https://github.com/rib-2/marlin/tree/conversion +def _validate_marlin_compatibility(cfg: BaseQuantizeConfig): + if not MARLIN_AVAILABLE: + return f"AutoGPTQ is not compiled with the Marlin kernel, with the following error: {MARLIN_EXCEPTION}" + if cfg.bits != 4: + return f"The quantized model uses a bitwidth different than 4 (found {cfg.bits})" + if cfg.group_size != 128 and cfg.group_size != -1: + return "The quantized model uses a group size that is not 128 or -1 (found quantization_config.group_size)" + if not cfg.sym: + return "The quantized model uses asymmetric quantization" + if cfg.desc_act: + return "The quantized model uses act-order (also called desc-act) scheme" + if cfg.quant_method == QUANT_METHOD.AWQ: + return "awq_gemm format is currently not compatible with marlin" + return None + + +@torch.no_grad() +def convert_to_marlin(model, model_quantlinear, quantization_config: BaseQuantizeConfig, repack: bool, strict: bool = False): + """ + Converts GPTQ-packed weights to the Marlin format. This assumes that the model already meets Marlin kernel constraints. + + Arguments: + repack (`bool`): + Whether to repack the qweights from `model` into the Marlin's QuantLinear layers. + """ + if repack: + message = "Repacking weights to be compatible with Marlin kernel..." + else: + # TODO: load directly Marlin QuantLinear. + message = "Overriding QuantLinear layers to use Marlin's QuantLinear..." + + for name, module in tqdm(model.named_modules(), desc=message, total=len(list(model.named_modules()))): + if not isinstance(module, model_quantlinear): + continue + + parent_name = ".".join(name.split(".")[:-1]) + layer_name = name[len(parent_name) + 1 :] + + # We could use `torch.count_nonzero(module.bias) > 0` here to discard zero bias, but this has issues when + # loading weights from checkpoints holding zero bias. + with torch.device("meta"): + new_module = MarlinQuantLinear( + bits=4, + group_size=module.group_size, + infeatures=module.infeatures, + outfeatures=module.outfeatures, + bias=module.bias is not None, + trainable=False, + ) + + # workspace is never in the state_dict, thus we need to allocate it manually. + new_module.workspace = torch.zeros(module.outfeatures // 128 * 16, dtype=torch.int, device=module.device) + + # Dequantize the weight. + if repack: + marlin_repacked_weight = autogptq_marlin_cuda.gptq_repack(module.qweight) + + if strict: + dequantized_qzeros = unpack_qzeros(module.qzeros) + + if not torch.all(dequantized_qzeros == 8): + raise ValueError( + "Marlin kernel is compatible only with checkpoints using symmetric quantization." + "Found non-symmetric quantization for the weight {name}." + ) + + + _, _scale_perm, _scale_perm_single = _get_perms() + + s = module.scales.data.clone() + if module.group_size != module.infeatures: + s = s.reshape((1, -1)) + s = s.reshape((-1, len(_scale_perm)))[:, _scale_perm] + else: + s = s.reshape((-1, len(_scale_perm_single)))[:, _scale_perm_single] + s = s.reshape((-1, module.outfeatures)).contiguous() + + new_module.B = marlin_repacked_weight + new_module.s = s + new_module.bias = module.bias + + new_module = new_module.to(module.device) + + # Save to parent. + parent_module = model.get_submodule(parent_name) + setattr(parent_module, layer_name, new_module) + + # Free cuda memory. + del module + if repack: + del marlin_repacked_weight + gc.collect() + + # Set quantization config to be Marlin. + quantization_config.checkpoint_format = CHECKPOINT_FORMAT.MARLIN + + return model diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/modeling_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/modeling_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..bf298e957c1a39a0daa9c21a481c0b201f1e95d7 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/modeling_utils.py @@ -0,0 +1,27 @@ +import functools + + +def recurse_getattr(obj, attr: str): + """ + Recursive `getattr`. + + Args: + obj: + A class instance holding the attribute. + attr (`str`): + The attribute that is to be retrieved, e.g. 'attribute1.attribute2'. + """ + + def _getattr(obj, attr): + return getattr(obj, attr) + + return functools.reduce(_getattr, [obj] + attr.split(".")) + + +def recurse_setattr(module, name, value): + """A function to recursively set attributes to a module.""" + if "." not in name: + setattr(module, name, value) + else: + name, rest = name.split(".", 1) + recurse_setattr(getattr(module, name), rest, value) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/peft_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/peft_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..6030ba7419b211aa93e5ff5e495cbf92b0ab63a5 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/peft_utils.py @@ -0,0 +1,421 @@ +import warnings +from contextlib import contextmanager +from typing import List, Optional, Tuple, Union + +import torch +from peft import PeftConfig, PeftModel, PeftType, get_peft_model +from peft.mapping import PEFT_TYPE_TO_CONFIG_MAPPING +from peft.peft_model import PEFT_TYPE_TO_MODEL_MAPPING +from peft.tuners.adalora import AdaLoraConfig, AdaLoraLayer, AdaLoraModel +from peft.tuners.lora import LoraConfig, LoraLayer, LoraModel + +from ..modeling._base import BaseGPTQForCausalLM +from ..nn_modules.qlinear import GeneralQuantLinear +from ..nn_modules.qlinear.qlinear_cuda import QuantLinear as QuantLinearCuda +from ..nn_modules.qlinear.qlinear_cuda_old import QuantLinear as QuantLinearCudaOld +from ..nn_modules.qlinear.qlinear_exllama import QuantLinear as QuantLinearExllama +from ..nn_modules.qlinear.qlinear_exllama import QuantLinear as QuantLinearExllamaV2 +from ..nn_modules.qlinear.qlinear_qigen import QuantLinear as QuantLinearQigen +from ..nn_modules.qlinear.qlinear_triton import QuantLinear as QuantLinearTriton + + +LinearLayer = Union[ + torch.nn.Linear, + GeneralQuantLinear, + QuantLinearCuda, + QuantLinearCudaOld, + QuantLinearExllama, + QuantLinearExllamaV2, + QuantLinearQigen, + QuantLinearTriton, +] + + +class GPTQLoraConfig(LoraConfig): + injected_fused_attention: bool = False + injected_fused_mlp: bool = False + + +def _get_linear_feature_count(linear_layer: LinearLayer) -> Tuple[int, int]: + in_features = getattr(linear_layer, "in_features", getattr(linear_layer, "infeatures")) + out_features = getattr(linear_layer, "out_features", getattr(linear_layer, "outfeatures")) + return in_features, out_features + + +def _get_weight(linear_layer: LinearLayer) -> torch.Tensor: + return getattr(linear_layer, "weight", getattr(linear_layer, "qweight")) + + +class GPTQLoraLinear(torch.nn.Linear, LoraLayer): + def __init__( + self, + adapter_name: str, + linear_module: LinearLayer, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + fan_in_fan_out: bool = False, # Set this to True if the layer to replace stores weight like (fan_in, fan_out) + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + + in_features, out_features = _get_linear_feature_count(linear_module) + torch.nn.Linear.__init__(self, in_features, out_features) + LoraLayer.__init__(self, in_features, out_features) + + self.linear_module = linear_module + + delattr(self, "weight") + self.weight = _get_weight(linear_module) + delattr(self, "bias") + + self.fan_in_fan_out = fan_in_fan_out + if fan_in_fan_out: + assert hasattr(linear_module, "weight") + linear_module.weight.data = linear_module.weight.data.T + + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def reset_lora_parameters(self, adapter_name): + if adapter_name in self.lora_A.keys(): + torch.nn.init.xavier_uniform_(self.lora_A[adapter_name].weight) + torch.nn.init.zeros_(self.lora_B[adapter_name].weight) + + def merge(self): + raise NotImplementedError("gptq model not support merge lora adapter") + + def unmerge(self): + raise NotImplementedError("gptq model not support unmerge lora adapter") + + def forward(self, x: torch.Tensor): + previous_dtype = x.dtype + if self.active_adapter not in self.lora_A.keys(): + return self.linear_module(x) + if self.disable_adapters: + if self.r[self.active_adapter] > 0 and self.merged: + self.unmerge() + result = self.linear_module(x) + elif self.r[self.active_adapter] > 0 and not self.merged: + result = self.linear_module(x) + + lora_B = self.lora_B[self.active_adapter] + lora_A = self.lora_A[self.active_adapter] + lora_dropout = self.lora_dropout[self.active_adapter] + scale = self.scaling[self.active_adapter] + + x = x.type_as(lora_A.weight.data) + adapter_result = (lora_B(lora_A(lora_dropout(x))) * scale).type_as(result) + result += adapter_result + else: + result = self.linear_module(x) + + result = result.to(previous_dtype) + + return result + + +class GPTQLoraModel(LoraModel): + def _replace_module(self, parent_module, child_name, new_module, old_module): + setattr(parent_module, child_name, new_module) + if not isinstance(new_module, GPTQLoraLinear): + new_module.weight = old_module.weight + if hasattr(old_module, "bias"): + if old_module.bias is not None: + new_module.bias = old_module.bias + + if getattr(old_module, "state", None) is not None: + new_module.state = old_module.state + new_module.to(old_module.weight.device) + + # dispatch to correct device + for name, module in new_module.named_modules(): + if "lora_" in name: + device = (list(old_module.parameters()) + list(old_module.buffers()))[0].device + module.to(device) + + @staticmethod + def _create_new_module( + lora_config: GPTQLoraConfig, + adapter_name: str, + target: torch.nn.Linear, + **kwargs, + ): + gptq_quantlinears = { + GeneralQuantLinear, + QuantLinearCuda, + QuantLinearCudaOld, + QuantLinearExllama, + QuantLinearExllamaV2, + QuantLinearQigen, + QuantLinearTriton, + } + + is_gptq_layer = any(isinstance(target, cls) for cls in gptq_quantlinears) + if is_gptq_layer: + return GPTQLoraLinear( + adapter_name, + target, + r=lora_config.r, + lora_alpha=lora_config.lora_alpha, + lora_dropout=lora_config.lora_dropout, + fan_in_fan_out=lora_config.fan_in_fan_out, + ) + else: + return LoraModel._create_new_module(lora_config, adapter_name, target, **kwargs) + + def merge_adapter(self): + raise NotImplementedError("gptq model not support merge ada lora adapter") + + def unmerge_adapter(self): + raise NotImplementedError("gptq model not support unmerge ada lora adapter") + + def merge_and_unload(self): + raise NotImplementedError("gptq model not support merge and unload") + + +class GPTQAdaLoraConfig(AdaLoraConfig): + injected_fused_attention: bool = False + injected_fused_mlp: bool = False + + +class GPTQSVDLinear(torch.nn.Linear, AdaLoraLayer): + def __init__( + self, + adapter_name: str, + linear_module: LinearLayer, + r: int = 0, + lora_alpha: int = 1, + lora_dropout: float = 0.0, + fan_in_fan_out: bool = False, # Set this to True if the layer to replace stores weight like (fan_in, fan_out) + **kwargs, + ): + init_lora_weights = kwargs.pop("init_lora_weights", True) + + in_features, out_features = _get_linear_feature_count(linear_module) + torch.nn.Linear.__init__(self, in_features, out_features) + AdaLoraLayer.__init__(self, in_features, out_features) + + self.linear_module = linear_module + + delattr(self, "weight") + self.weight = _get_weight(linear_module) + delattr(self, "bias") + self.fan_in_fan_out = fan_in_fan_out + if fan_in_fan_out: + assert hasattr(linear_module, "weight") + linear_module.weight.data = linear_module.weight.data.T + + self.update_layer(adapter_name, r, lora_alpha, lora_dropout, init_lora_weights) + self.active_adapter = adapter_name + + def merge(self): + raise NotImplementedError("gptq model not support merge lora adapter") + + def unmerge(self): + raise NotImplementedError("gptq model not support unmerge lora adapter") + + def forward(self, x: torch.Tensor): + if self.active_adapter not in self.lora_A.keys(): + return self.linear_module(x) + if self.disable_adapters: + if self.r[self.active_adapter] > 0 and self.merged: + self.unmerge() + result = self.linear_module(x) + elif self.r[self.active_adapter] > 0 and not self.merged: + result = self.linear_module(x) + result += ( + ( + self.lora_dropout[self.active_adapter](x) + @ (self.lora_A[self.active_adapter] * self.lora_E[self.active_adapter]).T + @ self.lora_B[self.active_adapter].T + ) + * self.scaling[self.active_adapter] + / (self.ranknum[self.active_adapter] + 1e-5) + ) + else: + result = self.linear_module(x) + return result + + def reset_lora_parameters(self, adapter_name): + if adapter_name in self.lora_A.keys(): + # Peft standard values seems too high + # Still not ideal, just not causing NaNs with fp16 anymore + torch.nn.init.normal_(self.lora_E[adapter_name], mean=0.0, std=0.005) + torch.clamp_(self.lora_E[adapter_name].data, -0.1, 0.1) + torch.nn.init.normal_(self.lora_A[adapter_name], mean=0.0, std=0.005) + torch.clamp_(self.lora_A[adapter_name].data, -0.1, 0.1) + torch.nn.init.normal_(self.lora_B[adapter_name], mean=0.0, std=0.005) + torch.clamp_(self.lora_B[adapter_name].data, -0.1, 0.1) + + +class GPTQAdaLoraModel(AdaLoraModel): + def _replace_module(self, parent_module, child_name, new_module, old_module): + setattr(parent_module, child_name, new_module) + + # dispatch to correct device + for name, module in new_module.named_modules(): + if "lora_" in name: + device = (list(old_module.parameters()) + list(old_module.buffers()))[0].device + module.to(device) + + @staticmethod + def _create_new_module( + lora_config: GPTQLoraConfig, + adapter_name: str, + target: torch.nn.Linear, + **kwargs, + ): + gptq_quantlinears = { + GeneralQuantLinear, + QuantLinearCuda, + QuantLinearCudaOld, + QuantLinearExllama, + QuantLinearExllamaV2, + QuantLinearQigen, + QuantLinearTriton, + } + + is_gptq_layer = any(isinstance(target, cls) for cls in gptq_quantlinears) + if is_gptq_layer: + return GPTQSVDLinear( + adapter_name, + target, + r=lora_config.r, + lora_alpha=lora_config.lora_alpha, + lora_dropout=lora_config.lora_dropout, + fan_in_fan_out=lora_config.fan_in_fan_out, + ) + else: + return LoraModel._create_new_module(lora_config, adapter_name, target, **kwargs) + + def merge_adapter(self): + raise NotImplementedError("gptq model not support merge ada lora adapter") + + def unmerge_adapter(self): + raise NotImplementedError("gptq model not support unmerge ada lora adapter") + + def merge_and_unload(self): + raise NotImplementedError("gptq model not support merge and unload") + + +def find_all_linear_names( + model: BaseGPTQForCausalLM, + ignore: Optional[List[str]] = None, + ignore_lm_head: bool = True, +): + if not ignore: + ignore = [] + lm_head_name = model.lm_head_name + if ignore_lm_head and lm_head_name not in ignore: + ignore.append(lm_head_name) + results = set() + for n, m in model.named_modules(): + if isinstance(m, torch.nn.Linear): + res = n.split(".")[-1] + if res not in ignore: + results.add(res) + return list(results) + + +@contextmanager +def hijack_peft_mappings(): + PEFT_TYPE_TO_CONFIG_MAPPING[PeftType.LORA] = GPTQLoraConfig + PEFT_TYPE_TO_MODEL_MAPPING[PeftType.LORA] = GPTQLoraModel + PEFT_TYPE_TO_CONFIG_MAPPING[PeftType.ADALORA] = GPTQAdaLoraConfig + PEFT_TYPE_TO_MODEL_MAPPING[PeftType.ADALORA] = GPTQAdaLoraModel + + try: + yield + except: + PEFT_TYPE_TO_CONFIG_MAPPING[PeftType.LORA] = GPTQLoraConfig + PEFT_TYPE_TO_MODEL_MAPPING[PeftType.LORA] = GPTQLoraModel + PEFT_TYPE_TO_CONFIG_MAPPING[PeftType.ADALORA] = GPTQAdaLoraConfig + PEFT_TYPE_TO_MODEL_MAPPING[PeftType.ADALORA] = GPTQAdaLoraModel + raise + finally: + PEFT_TYPE_TO_CONFIG_MAPPING[PeftType.LORA] = GPTQLoraConfig + PEFT_TYPE_TO_MODEL_MAPPING[PeftType.LORA] = GPTQLoraModel + PEFT_TYPE_TO_CONFIG_MAPPING[PeftType.ADALORA] = GPTQAdaLoraConfig + PEFT_TYPE_TO_MODEL_MAPPING[PeftType.ADALORA] = GPTQAdaLoraModel + + +def get_gptq_peft_model( + model: BaseGPTQForCausalLM, + peft_config: PeftConfig = None, + model_id: str = None, + adapter_name: str = "default", + auto_find_all_linears: bool = True, + train_mode: bool = False, +): + if train_mode and not model.trainable: + model.enable_trainable_mode() + if train_mode and not peft_config: + raise ValueError("peft_config not specified when in train mode.") + if not train_mode and not model_id: + raise ValueError("model_id(where to load adapters) not specified when in inference mode.") + + if model.fused_attn_module_type is not None and not model.injected_fused_attention: + peft_types = [PeftType.LORA.value, PeftType.ADALORA.value] + warnings.warn( + f"You can just ignore this warning if the peft type you use isn't in {peft_types}.\n" + f"{model.__class__.__name__} supports injecting fused attention but not enables this time. " + "If you are training adapters, you must also disable fused attention injection when loading quantized " + "base model at inference time, otherwise adapters may not be added to base model properly. " + "If you are loading adapters to do inference, you can reference to adapter's config file to check " + "whether the adapters are trained using base model that not enable fused attention injection." + ) + if model.injected_fused_mlp: + raise NotImplementedError( + "GPTQ model that enables fused mlp injection is not supported to integrate with peft." + ) + + if train_mode: + peft_type = peft_config.peft_type + if not isinstance(peft_type, str): + peft_type = peft_type.value + if peft_type in [PeftType.LORA.value, PeftType.ADALORA.value]: + if auto_find_all_linears: + peft_config.target_modules = find_all_linear_names(model, ignore_lm_head=True) + if peft_type == PeftType.LORA.value and not isinstance(peft_config, GPTQLoraConfig): + peft_config = GPTQLoraConfig(**peft_config.to_dict()) + if peft_type == PeftType.ADALORA.value and not isinstance(peft_config, GPTQAdaLoraConfig): + peft_config = GPTQAdaLoraConfig(**peft_config.to_dict()) + peft_config.injected_fused_attention = model.injected_fused_attention + peft_config.injected_fused_mlp = model.injected_fused_mlp + if peft_type == PeftType.ADAPTION_PROMPT.value: + if peft_config.adapter_layers > model.config.num_hidden_layers: + warnings.warn( + f"model has only {model.config.num_hidden_layers} layers " + f"but adapter_layers is set to {peft_config.adapter_layers}, " + f"will reset value to {model.config.num_hidden_layers}." + ) + peft_config.adapter_layers = model.config.num_hidden_layers + if model.injected_fused_attention: + raise NotImplementedError( + "model with fused attention injected isn't supported to use ADAPTION_PROMPT peft type yet." + ) + + with hijack_peft_mappings(): + try: + if train_mode: + peft_model = get_peft_model(model.model, peft_config, adapter_name=adapter_name) + else: + peft_model = PeftModel.from_pretrained(model.model, model_id, adapter_name) + except: + raise + raise NotImplementedError( + f"{model.__class__.__name__} not support {peft_config.peft_type.value} peft type yet." + ) + + return peft_model + + +__all__ = [ + "GPTQLoraConfig", + "GPTQLoraModel", + "GPTQAdaLoraConfig", + "GPTQAdaLoraModel", + "find_all_linear_names", + "get_gptq_peft_model", +] diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/perplexity_utils.py b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/perplexity_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..2d9f103469f4c5e6c115907b7cbdea101a10ead7 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/auto_gptq/utils/perplexity_utils.py @@ -0,0 +1,223 @@ +import sys + +import numpy as np +import torch +from datasets import load_dataset +from tqdm import tqdm + + +class Perplexity: + """ + A class for calculating the perplexity of a language model. + """ + + def __init__( + self, + model, + tokenizer, + dataset_path="wikitext", + dataset_name=None, + split="test", + text_column="text", + ): + """ + Calculate perplexity using the same method as seen in llama.cpp. + + Parameters + ---------- + model : AutoModelForCausalLM + The language model for which the perplexity is calculated. + tokenizer : AutoTokenizer + The tokenizer corresponding to the model. + device : str, optional + The device to run the calculations on. If auto, the device that your model uses + will be the device used for these calculations. Default is 'auto'. + dataset_path : str, optional + The path to the dataset on the Hugging Face dataset hub. Default is 'wikitext'. + dataset_name : str, optional + The name of the dataset. Default is None. + split : str, optional + The split of the dataset to use. Default is 'test'. + text_column : str, optional + The name of the column in the dataset that contains the text data. Default is 'text'. + """ + self._model = model + self._tokenizer = tokenizer + self._dataset_path = dataset_path + self._dataset_name = dataset_name + self._split = split + self._text_column = text_column + self._text = self._prepare_data() + + def _get_device(self): + if torch.backends.mps.is_available(): + return "mps" + elif torch.cuda.is_available(): + return "cuda:0" + else: + return "cpu" + + def _prepare_data(self): + """ + Prepares the dataset by loading and formatting. + + Returns + ------- + str + The formatted dataset as a single string. + """ + if self._dataset_path == "wikitext": + self._dataset_name = "wikitext-2-raw-v1" + + # Load the dataset + data = load_dataset(self._dataset_path, self._dataset_name, split=self._split) + # Format the text column of the dataset + text_list = [" \n" if s == "" else s for s in data[self._text_column]] + return "".join(text_list) + + @staticmethod + def softmax(logits): + """ + Static method for applying the softmax function. + + Parameters + ---------- + logits : np.ndarray + The input to the softmax function. + + Returns + ------- + np.ndarray + The output of the softmax function. + """ + e_x = np.exp(logits - np.max(logits)) + return e_x / e_x.sum(axis=0) + + def calculate_perplexity(self, n_ctx=512, n_batch=512): + """ + Calculates the perplexity of the language model. + + Parameters + ---------- + n_ctx : int + The context size. + n_batch : int + The batch size. + + Returns + ------- + list + The list of perplexity scores calculated. + """ + # Tokenize the text + self._tokenizer.model_max_length = sys.maxsize + tokens = self._tokenizer(self._text, truncation=False, return_tensors="pt").input_ids.to(self._model.device) + + nll = 0.0 # Negative log likelihood + count = 0 # Counter for processed tokens + curr_ppl = 0 + all_perplexity = [] + + with tqdm(range(len(tokens[0]) // n_ctx), desc="Perplexity: - ") as progress: + for i in progress: + # Process each batch of tokens + nll, count = self._process_batch(i, n_ctx, n_batch, tokens, nll, count) + + # Calculate and display the current perplexity + curr_ppl = np.exp(nll / count) + all_perplexity.append(curr_ppl) + progress.set_description(f"Perplexity: {curr_ppl:.4f}") + + return all_perplexity + + def _process_batch(self, i, n_ctx, n_batch, tokens, nll, count): + """ + Processes each batch of tokens. + + Parameters + ---------- + i : int + The batch index. + n_ctx : int + The context size. + n_batch : int + The batch size. + tokens : torch.Tensor + The tokenized text. + nll : float + The current negative log likelihood. + count : int + The current count of processed tokens. + + Returns + ------- + float + The updated negative log likelihood. + int + The updated count of processed tokens. + """ + start = i * n_ctx + end = start + n_ctx + + num_batches = (n_ctx + n_batch - 1) // n_batch + + logits = [] + + for j in range(num_batches): + batch_start = start + j * n_batch + batch_size = min(end - batch_start, n_batch) + + token_org = tokens[0][batch_start].item() + + if j == 0: + # Replace the first token with the BOS token + tokens[0][batch_start] = self._tokenizer.bos_token_id + + # Compute the logits for the current batch of tokens + batch_logits = self._compute_batch_logits(tokens, batch_start, batch_size) + + tokens[0][batch_start] = token_org + + logits.append(batch_logits) + + # We rely on the fact that attention in the forward pass only looks at previous + # tokens here, so the logits returned for each token are an accurate representation + # of what the model would have predicted at that point. + # + # Example, we have a context window of 512, we will compute perplexity for each of the + # last 256 tokens. Then, we split the input up into context window size chunks to + # process the entire prompt. + + for j in range(min(512, n_ctx // 2), n_ctx - 1): + tok_logits = logits[0][0][j].cpu().numpy() + # Compute the probability of the next token + prob = self.softmax(tok_logits)[tokens[0][start + j + 1]] + + # Update the negative log likelihood and the count of processed tokens + nll += -np.log(prob, where=prob > 0) + count += 1 + + return nll, count + + def _compute_batch_logits(self, tokens, batch_start, batch_size): + """ + Computes the logits for a batch of tokens. + + Parameters + ---------- + tokens : torch.Tensor + The tokenized text. + batch_start : int + The start index of the batch. + batch_size : int + The size of the batch. + + Returns + ------- + torch.Tensor + The logits for the batch of tokens. + """ + # Compute the logits without keeping track of gradients + with torch.no_grad(): + outputs = self._model(tokens[:, batch_start : batch_start + batch_size]) + return outputs.logits.detach() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_256/autogptq_cuda_256.cpp b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_256/autogptq_cuda_256.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dad762e6e5a0da0a8e9704b97c6ddfe113f8e183 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_256/autogptq_cuda_256.cpp @@ -0,0 +1,187 @@ +#include +#include +#include + +void vecquant2matmul_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +); + +void vecquant2matmul( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant2matmul_cuda(vec, mat, mul, scales, zeros, g_idx); +} + +void vecquant3matmul_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +); + +void vecquant3matmul( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant3matmul_cuda(vec, mat, mul, scales, zeros, g_idx); +} + +void vecquant4matmul_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +); + +void vecquant4matmul( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant4matmul_cuda(vec, mat, mul, scales, zeros, g_idx); +} + +void vecquant8matmul_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +); + +void vecquant8matmul( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant8matmul_cuda(vec, mat, mul, scales, zeros, g_idx); +} + + +// old + +void vecquant2matmul_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +); + +void vecquant2matmul_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant2matmul_cuda_old(vec, mat, mul, scales, zeros,groupsize); +} + +void vecquant3matmul_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +); + +void vecquant3matmul_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant3matmul_cuda_old(vec, mat, mul, scales, zeros, groupsize); +} + +void vecquant4matmul_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +); + +void vecquant4matmul_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant4matmul_cuda_old(vec, mat, mul, scales, zeros, groupsize); +} + +void vecquant8matmul_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +); + +void vecquant8matmul_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant8matmul_cuda_old(vec, mat, mul, scales, zeros, groupsize); +} + +void vecquant2matmul_faster_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +); + +void vecquant2matmul_faster_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant2matmul_faster_cuda_old(vec, mat, mul, scales, zeros, groupsize, vec_height); +} + +void vecquant3matmul_faster_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +); + +void vecquant3matmul_faster_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant3matmul_faster_cuda_old(vec, mat, mul, scales, zeros, groupsize, vec_height); +} + +void vecquant4matmul_faster_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +); + +void vecquant4matmul_faster_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant4matmul_faster_cuda_old(vec, mat, mul, scales, zeros, groupsize, vec_height); +} + + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("vecquant2matmul", &vecquant2matmul, "Vector 2-bit Quantized Matrix Multiplication (CUDA) (desc_act)"); + m.def("vecquant3matmul", &vecquant3matmul, "Vector 3-bit Quantized Matrix Multiplication (CUDA) (desc_act)"); + m.def("vecquant4matmul", &vecquant4matmul, "Vector 4-bit Quantized Matrix Multiplication (CUDA) (desc_act)"); + m.def("vecquant8matmul", &vecquant8matmul, "Vector 8-bit Quantized Matrix Multiplication (CUDA) (desc_act)"); + + m.def("vecquant2matmul_old", &vecquant2matmul_old, "Vector 2-bit Quantized Matrix Multiplication (CUDA)"); + m.def("vecquant3matmul_old", &vecquant3matmul_old, "Vector 3-bit Quantized Matrix Multiplication (CUDA)"); + m.def("vecquant4matmul_old", &vecquant4matmul_old, "Vector 4-bit Quantized Matrix Multiplication (CUDA)"); + m.def("vecquant8matmul_old", &vecquant8matmul_old, "Vector 8-bit Quantized Matrix Multiplication (CUDA)"); + m.def("vecquant2matmul_faster_old", &vecquant2matmul_faster_old, "Vector 2-bit Quantized Matrix Multiplication (CUDA), faster version"); + m.def("vecquant3matmul_faster_old", &vecquant3matmul_faster_old, "Vector 3-bit Quantized Matrix Multiplication (CUDA), faster version"); + m.def("vecquant4matmul_faster_old", &vecquant4matmul_faster_old, "Vector 4-bit Quantized Matrix Multiplication (CUDA), faster version"); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_256/autogptq_cuda_kernel_256.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_256/autogptq_cuda_kernel_256.cu new file mode 100644 index 0000000000000000000000000000000000000000..9768f3d1b4cbc99a26e019b5d4d0fb7e75ba4b14 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_256/autogptq_cuda_kernel_256.cu @@ -0,0 +1,1437 @@ +#include +#include +#include +#include +#include + +// atomicAdd for double-precision floating-point numbers on hardware with +// compute capability < 6.0 from: +// https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#atomic-functions +// #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600 +// __device__ double atomicAdd( +// double* address, +// double val +// ) { +// unsigned long long int* address_as_ull = (unsigned long long int*)address; +// unsigned long long int old = *address_as_ull, assumed; +// +// do { +// assumed = old; +// old = atomicCAS( +// address_as_ull, +// assumed, +// __double_as_longlong(val + __longlong_as_double(assumed)) +// ); +// +// // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) +// } while (assumed != old); +// +// return __longlong_as_double(old); +// } +// #endif + +#if (defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 700) || defined(USE_ROCM) +// adapted from https://github.com/torch/cutorch/blob/master/lib/THC/THCAtomics.cuh + +__device__ __forceinline__ void atomicAdd(c10::Half* address, c10::Half val) { + unsigned int *address_as_ui = reinterpret_cast(reinterpret_cast(address) - (reinterpret_cast(address) & 2)); + unsigned int old = *address_as_ui; + unsigned int assumed; + + do { + assumed = old; + unsigned short hsum = reinterpret_cast(address) & 2 ? (old >> 16) : (old & 0xffff); + hsum += val; + old = reinterpret_cast(address) & 2 + ? (old & 0xffff) | (hsum << 16) + : (old & 0xffff0000) | hsum; + old = atomicCAS(address_as_ui, assumed, old); + + // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) + } while (assumed != old); +} +__device__ __forceinline__ void atomicAdd(__half* address, c10::Half val) { + unsigned int * address_as_ui = (unsigned int *) ((char *)address - ((size_t)address & 2)); + unsigned int old = *address_as_ui; + unsigned int assumed; + + do { + assumed = old; + __half_raw hsum; + hsum.x = (size_t)address & 2 ? (old >> 16) : (old & 0xffff); + half tmpres = __hadd(hsum, val); + hsum = __half_raw(tmpres); + old = (size_t)address & 2 ? (old & 0xffff) | (hsum.x << 16) : (old & 0xffff0000) | hsum.x; + old = atomicCAS(address_as_ui, assumed, old); + } while (assumed != old); +} +#endif + + +template +__global__ void VecQuant2MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +); + +template +__global__ void VecQuant3MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +); + +template +__global__ void VecQuant4MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +); + +template +__global__ void VecQuant8MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +); + +template +__global__ void VecQuant2MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +template +__global__ void VecQuant3MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +template +__global__ void VecQuant4MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +template +__global__ void VecQuant8MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +__global__ void VecQuant2MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +__global__ void VecQuant3MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +__global__ void VecQuant4MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + + +const int BLOCKWIDTH = 256; +const int BLOCKHEIGHT2 = 16; +const int BLOCKHEIGHT3 = 24; +const int BLOCKHEIGHT4 = 32; +const int BLOCKHEIGHT8 = 64; + +__device__ inline unsigned int as_unsigned(int i) { + return *reinterpret_cast(&i); +} + +__device__ inline int as_int(int i) { + return *reinterpret_cast(&i); +} + + +void vecquant2matmul_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + torch::Tensor g_idx +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT2 - 1) / BLOCKHEIGHT2, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant2matmul_cuda", ([&] { + VecQuant2MatMulKernel<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), g_idx.data(), + batch, vec_height, height, width, zero_width + ); + }) + ); +} + +template +__global__ void VecQuant2MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +) { + int h = BLOCKHEIGHT2 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + int i = width * h + w; + int g_h = h * 16; + int k; + unsigned int g; + scalar_t w_tmp; + + int z_w = w / 16; + int z_mod = (w % 16) * 2; + + float weight[BLOCKWIDTH]; + + for (k = 0; k < BLOCKWIDTH; ++k){ + int k_w = (k / 16); + int k_bit = (k % 16) * 2; + + g = as_int(g_idx[g_h + k]); + scalar_t scale = scales[g * width + w]; + + // Avoid overflows with & 0x0f. + scalar_t zero = scalar_t(((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod & 0x3) + 1) & 0x0f); + + w_tmp = ((as_unsigned(mat[i + (k_w * width)]) >> k_bit) & 0x3); + + weight[k] = scale * (w_tmp - zero); + } + + scalar_t res; + for (int b = 0; b < batch; ++b){ + res = 0; + + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + for (k = 0; k < BLOCKWIDTH; ++k){ + res += weight[k] * blockvec[k]; + } + atomicAdd(&mul[b * width + w], res); + __syncthreads(); + } +} + +void vecquant3matmul_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + torch::Tensor g_idx +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT3 - 1) / BLOCKHEIGHT3, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant3matmul_cuda", ([&] { + VecQuant3MatMulKernel<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), g_idx.data(), + batch, vec_height, height, width, zero_width + ); + }) + ); +} + +template +__global__ void VecQuant3MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +) { + int h = BLOCKHEIGHT3 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + int i = width * h + w; + int g_h = (h / 3) * 32; + int k; + unsigned int g; + scalar_t w_tmp; + + int z_w = (w / 32) * 3; + int z_mod = w % 32; + int z_bit; + unsigned int z_tmp; + if (z_mod != 10){ + if (z_mod != 21){ + z_bit = z_mod; + if (z_bit > 21){ + z_bit -= 22; + z_bit *= 3; + z_bit += 2; + z_w += 2; + } else if (z_bit > 10){ + z_bit -= 11; + z_bit *= 3; + z_bit += 1; + z_w += 1; + } else { + z_bit *= 3; + } + } else { + z_w += 1; + } + } + + float weight[BLOCKWIDTH]; + + for (k = 0; k < BLOCKWIDTH; ++k){ + int k_w = (k / 32) * 3; + int k_mod = k % 32; + int k_bit; + + if (k_mod != 10){ + if (k_mod != 21){ + k_bit = k_mod; + if (k_bit > 21){ + k_bit -= 22; + k_bit *= 3; + k_bit += 2; + k_w += 2; + } else if (k_bit > 10){ + k_bit -= 11; + k_bit *= 3; + k_bit += 1; + k_w += 1; + } else { + k_bit *= 3; + } + } else { + k_w += 1; + } + } + + g = as_int(g_idx[g_h + k]); + scalar_t scale = scales[g * width + w]; + scalar_t zero; + if (z_mod == 10) { + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 30) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 2) & 0x4); + zero = scalar_t(((z_tmp) + 1) & 0x0f); // Avoid overflows + } else if (z_mod == 21){ + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 31) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 1) & 0x6); + zero = scalar_t(((z_tmp) + 1) & 0x0f); + } else { + zero = scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_bit) & 0x7) + 1) & 0x0f); + } + + if (k_mod == 10) { + w_tmp = (as_unsigned(mat[i + (k_w * width)]) >> 30) | ((as_unsigned(mat[i + ((k_w + 1)* width)]) << 2) & 0x4); + } else if (k_mod == 21){ + w_tmp = (as_unsigned(mat[i + (k_w * width)]) >> 31) | ((as_unsigned(mat[i + ((k_w + 1)* width)]) << 1) & 0x6); + } else { + w_tmp = ((as_unsigned(mat[i + (k_w * width)]) >> k_bit) & 0x7); + } + weight[k] = scale * (w_tmp - zero); + } + + scalar_t res; + for (int b = 0; b < batch; ++b){ + res = 0; + + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + for (k = 0; k < BLOCKWIDTH; ++k){ + res += weight[k] * blockvec[k]; + } + atomicAdd(&mul[b * width + w], res); + __syncthreads(); + } +} + +void vecquant4matmul_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + torch::Tensor g_idx +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT4 - 1) / BLOCKHEIGHT4, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant4matmul_cuda", ([&] { + VecQuant4MatMulKernel<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), g_idx.data(), + batch, vec_height, height, width, zero_width + ); + }) + ); +} + +template +__global__ void VecQuant4MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +) { + int h = BLOCKHEIGHT4 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + int i = width * h + w; + int g_h = h * 8; + int k; + unsigned int g; + scalar_t w_tmp; + + + int z_w = w / 8; + int z_mod = (w % 8) * 4; + + float weight[BLOCKWIDTH]; + + for (k = 0; k < BLOCKWIDTH; ++k){ + int k_w = (k / 8); + int k_bit = (k % 8) * 4; + + g = as_int(g_idx[g_h + k]); + scalar_t scale = scales[g * width + w]; + scalar_t zero = scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xF) + 1) & 0x0f); + + w_tmp = ((as_unsigned(mat[i + (k_w * width)]) >> k_bit) & 0xF); + + weight[k] = scale * (w_tmp - zero); + } + + scalar_t res; + for (int b = 0; b < batch; ++b){ + res = 0; + + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + for (k = 0; k < BLOCKWIDTH; ++k){ + res += weight[k] * blockvec[k]; + } + atomicAdd(&mul[b * width + w], res); + __syncthreads(); + } +} + +void vecquant8matmul_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + torch::Tensor g_idx +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT8 - 1) / BLOCKHEIGHT8, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant8matmul_cuda", ([&] { + VecQuant8MatMulKernel<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), g_idx.data(), + batch, vec_height, height, width, zero_width + ); + }) + ); +} + +template +__global__ void VecQuant8MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +) { + int h = BLOCKHEIGHT8 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + int i = width * h + w; + int g_h = h * 4; + int k; + unsigned int g; + scalar_t w_tmp; + + int z_w = w / 4; + int z_mod = (w % 4) * 8; + + float weight[BLOCKWIDTH]; + + for (k = 0; k < BLOCKWIDTH; ++k){ + int k_w = (k / 4); + int k_bit = (k % 4) * 8; + + g = as_int(g_idx[g_h + k]); + scalar_t scale = scales[g * width + w]; + scalar_t zero = scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xFF) + 1) & 0x0f); + + w_tmp = ((as_unsigned(mat[i + (k_w * width)]) >> k_bit) & 0xFF); + + weight[k] = scale * (w_tmp - zero); + } + + scalar_t res; + for (int b = 0; b < batch; ++b){ + res = 0; + + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + for (k = 0; k < BLOCKWIDTH; ++k){ + res += weight[k] * blockvec[k]; + } + atomicAdd(&mul[b * width + w], res); + __syncthreads(); + } +} + + +void vecquant2matmul_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT2 - 1) / BLOCKHEIGHT2, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant2matmul_cuda_old", ([&] { + VecQuant2MatMulKernel_old<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), + batch, vec_height, height, width, zero_width, groupsize + ); + }) + ); +} + +template +__global__ void VecQuant2MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + int b = blockIdx.z; + int h = BLOCKHEIGHT2 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + scalar_t res = 0; + int i = width * h + w; + int g_h = h * 16; + int k = 0; + + int z_w = w / 16; + int z_mod = (w % 16) * 2; + + unsigned int tmp; + + while (k < BLOCKWIDTH) { + tmp = as_unsigned(mat[i]); + + int g = (g_h + k) / groupsize; + scalar_t scale = scales[g * width + w]; + scalar_t zero = scale * scalar_t(((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod & 0x3) + 1) & 0x0f); + + res += (scale * scalar_t((tmp >> 0) & 0x3) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp >> 2) & 0x3) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp >> 4) & 0x3) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp >> 6) & 0x3) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp >> 8) & 0x3) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp >> 10) & 0x3) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp >> 12) & 0x3) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp >> 14) & 0x3) - zero) * blockvec[k + 7]; + res += (scale * scalar_t((tmp >> 16) & 0x3) - zero) * blockvec[k + 8]; + res += (scale * scalar_t((tmp >> 18) & 0x3) - zero) * blockvec[k + 9]; + res += (scale * scalar_t((tmp >> 20) & 0x3) - zero) * blockvec[k + 10]; + res += (scale * scalar_t((tmp >> 22) & 0x3) - zero) * blockvec[k + 11]; + res += (scale * scalar_t((tmp >> 24) & 0x3) - zero) * blockvec[k + 12]; + res += (scale * scalar_t((tmp >> 26) & 0x3) - zero) * blockvec[k + 13]; + res += (scale * scalar_t((tmp >> 28) & 0x3) - zero) * blockvec[k + 14]; + res += (scale * scalar_t((tmp >> 30) & 0x3) - zero) * blockvec[k + 15]; + + i += width; + k += 16; + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant3matmul_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT3 - 1) / BLOCKHEIGHT3, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant3matmul_cuda_old", ([&] { + VecQuant3MatMulKernel_old<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), + batch, vec_height, height, width, zero_width, groupsize + ); + }) + ); +} + +template +__global__ void VecQuant3MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + int b = blockIdx.z; + int h = BLOCKHEIGHT3 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + scalar_t res = 0; + int i = width * h + w; + int g_h = (h / 3) * 32; + int k = 0; + + int z_w = (w / 32) * 3; + int z_mod = w % 32; + int z_bit; + + if (z_mod != 10){ + if (z_mod != 21){ + z_bit = z_mod; + if (z_bit > 21){ + z_bit -= 22; + z_bit *= 3; + z_bit += 2; + z_w += 2; + } else if (z_bit > 10){ + z_bit -= 11; + z_bit *= 3; + z_bit += 1; + z_w += 1; + } else { + z_bit *= 3; + } + } else { + z_w += 1; + } + } + + unsigned int tmp1; + unsigned int tmp2; + unsigned int tmp; + unsigned int z_tmp; + + while (k < BLOCKWIDTH) { + tmp1 = as_unsigned(mat[i]); + + int g = (g_h + k) / groupsize; + scalar_t scale = scales[g * width + w]; + scalar_t zero; + if (z_mod == 10) { + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 30) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 2) & 0x4); + zero = scale * scalar_t(((z_tmp) + 1) & 0x0f); + } else if (z_mod == 21){ + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 31) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 1) & 0x6); + zero = scale * scalar_t(((z_tmp) + 1) & 0x0f); + } else { + zero = scale * scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_bit) & 0x7) + 1) & 0x0f); + } + + res += (scale * scalar_t((tmp1 >> 0) & 0x7) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp1 >> 3) & 0x7) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp1 >> 6) & 0x7) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp1 >> 9) & 0x7) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp1 >> 12) & 0x7) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp1 >> 15) & 0x7) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp1 >> 18) & 0x7) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp1 >> 21) & 0x7) - zero) * blockvec[k + 7]; + res += (scale * scalar_t((tmp1 >> 24) & 0x7) - zero) * blockvec[k + 8]; + res += (scale * scalar_t((tmp1 >> 27) & 0x7) - zero) * blockvec[k + 9]; + + i += width; + tmp2 = as_unsigned(mat[i]); + tmp = (tmp1 >> 30) | ((tmp2 << 2) & 0x4); + tmp2 >>= 1; + res += (scale * scalar_t(tmp) - zero) * blockvec[k + 10]; + k += 11; + + res += (scale * scalar_t((tmp2 >> 0) & 0x7) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp2 >> 3) & 0x7) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp2 >> 6) & 0x7) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp2 >> 9) & 0x7) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp2 >> 12) & 0x7) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp2 >> 15) & 0x7) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp2 >> 18) & 0x7) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp2 >> 21) & 0x7) - zero) * blockvec[k + 7]; + res += (scale * scalar_t((tmp2 >> 24) & 0x7) - zero) * blockvec[k + 8]; + res += (scale * scalar_t((tmp2 >> 27) & 0x7) - zero) * blockvec[k + 9]; + + i += width; + tmp1 = as_unsigned(mat[i]); + tmp = (tmp2 >> 30) | ((tmp1 << 1) & 0x6); + tmp1 >>= 2; + res += (scale * scalar_t(tmp) - zero) * blockvec[k + 10]; + k += 11; + + res += (scale * scalar_t((tmp1 >> 0) & 0x7) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp1 >> 3) & 0x7) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp1 >> 6) & 0x7) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp1 >> 9) & 0x7) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp1 >> 12) & 0x7) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp1 >> 15) & 0x7) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp1 >> 18) & 0x7) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp1 >> 21) & 0x7) - zero) * blockvec[k + 7]; + res += (scale * scalar_t((tmp1 >> 24) & 0x7) - zero) * blockvec[k + 8]; + res += (scale * scalar_t((tmp1 >> 27) & 0x7) - zero) * blockvec[k + 9]; + + i += width; + k += 10; + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant4matmul_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT4 - 1) / BLOCKHEIGHT4, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant4matmul_cuda_old", ([&] { + VecQuant4MatMulKernel_old<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), + batch, vec_height, height, width, zero_width, groupsize + ); + }) + ); +} + +template +__global__ void VecQuant4MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + int b = blockIdx.z; + int h = BLOCKHEIGHT4 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + scalar_t res = 0; + int i = width * h + w; + int g_h = h * 8; + int k = 0; + + int z_w = w / 8; + int z_mod = (w % 8) * 4; + + unsigned int tmp; + + while (k < BLOCKWIDTH) { + tmp = as_unsigned(mat[i]); + + int g = (g_h + k) / groupsize; + scalar_t scale = scales[g * width + w]; + scalar_t zero = scale * scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xF) + 1) & 0x0f); + + res += (scale * scalar_t((tmp >> 0) & 0xF) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp >> 4) & 0xF) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp >> 8) & 0xF) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp >> 12) & 0xF) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp >> 16) & 0xF) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp >> 20) & 0xF) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp >> 24) & 0xF) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp >> 28) & 0xF) - zero) * blockvec[k + 7]; + + i += width; + k += 8; + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant8matmul_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT8 - 1) / BLOCKHEIGHT8, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant8matmul_cuda_old", ([&] { + VecQuant8MatMulKernel_old<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), + batch, vec_height, height, width, zero_width, groupsize + ); + }) + ); +} + +template +__global__ void VecQuant8MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + int b = blockIdx.z; + int h = BLOCKHEIGHT8 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + scalar_t res = 0; + int i = width * h + w; + int g_h = h * 4; + int k = 0; + + int z_w = w / 4; + int z_mod = (w % 4) * 8; + + unsigned int tmp; + + while (k < BLOCKWIDTH) { + tmp = as_unsigned(mat[i]); + + int g = (g_h + k) / groupsize; + scalar_t scale = scales[g * width + w]; + scalar_t zero = scale * scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xFF) + 1) & 0x0f); + + res += (scale * scalar_t((tmp >> 0) & 0xFF) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp >> 8) & 0xFF) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp >> 16) & 0xFF) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp >> 24) & 0xFF) - zero) * blockvec[k + 3]; + + i += width; + k += 4; + } + + atomicAdd(&mul[b * width + w], res); +} + + +void vecquant2matmul_faster_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize, + int vec_height +) { + int batch = vec.size(0); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT2 - 1) / BLOCKHEIGHT2, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + VecQuant2MatMulKernelFaster_old<<>>( + (half2*) vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + scales.data_ptr(), + zeros.data_ptr(), + batch, vec_height, height, width, zero_width, groupsize + ); +} + +__global__ void VecQuant2MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + const int blockwidth2 = BLOCKWIDTH / 2; + int b = blockIdx.z; + int h = BLOCKHEIGHT2 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ half2 blockvec[blockwidth2]; + if (threadIdx.x < blockwidth2) + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * blockwidth2 + threadIdx.x]; + + __shared__ half2 deq2[16][16]; + int val = threadIdx.x / 16; + int off = threadIdx.x % 16; + for (; val < 16; val += BLOCKWIDTH / 16) { + deq2[val][off] = __halves2half2( + __int2half_rn(val & 0x3), __int2half_rn(val >> 2) + ); + } + + int i = width * h + w; + int g_h = h * 16; + int k = 0; + + int z_w = w / 16; + int z_mod = (w % 16) * 2; + + float res = 0; + half2 res2; + + unsigned int tmp; + + __syncthreads(); + + while (k < blockwidth2) { + int g = (g_h + (k * 2)) / groupsize; + float scale_f = scales[g * width + w]; + half2 scale = __float2half2_rn(scale_f); + half2 zero = __float2half2_rn(-(scale_f * ((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0x3) + 1) & 0x0f))); + + std::memset(&res2, 0, sizeof(half2)); + tmp = as_unsigned(mat[i]); + res2 = __hfma2(__hfma2(deq2[(tmp >> 0) & 0xf][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 4) & 0xf][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 8) & 0xf][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 12) & 0xf][off], scale, zero), blockvec[k + 3], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 16) & 0xf][off], scale, zero), blockvec[k + 4], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 20) & 0xf][off], scale, zero), blockvec[k + 5], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 24) & 0xf][off], scale, zero), blockvec[k + 6], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 28) & 0xf][off], scale, zero), blockvec[k + 7], res2); + i += width; + k += 8; + res += __low2float(res2) + __high2float(res2); + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant3matmul_faster_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize, + int vec_height +) { + int batch = vec.size(0); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT3 - 1) / BLOCKHEIGHT3, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + VecQuant3MatMulKernelFaster_old<<>>( + (half2*) vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + scales.data_ptr(), + zeros.data_ptr(), + batch, vec_height, height, width, zero_width, groupsize + ); +} + +__global__ void VecQuant3MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + const int blockwidth2 = BLOCKWIDTH / 2; + int b = blockIdx.z; + int h = BLOCKHEIGHT3 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ half2 blockvec[blockwidth2]; + if (threadIdx.x < blockwidth2) + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * blockwidth2 + threadIdx.x]; + + __shared__ half2 deq2[64][32]; + int val = threadIdx.x / 32; + int off = threadIdx.x % 32; + for (; val < 64; val += BLOCKWIDTH / 32) { + deq2[val][off] = __halves2half2( + __int2half_rn(val & 0x7), __int2half_rn(val >> 3) + ); + } + + int i = width * h + w; + int g_h = (h / 3) * 32; + int k = 0; + + int z_w = (w / 32) * 3; + int z_mod = w % 32; + int z_bit; + + if (z_mod != 10){ + if (z_mod != 21){ + z_bit = z_mod; + if (z_bit > 21){ + z_bit -= 22; + z_bit *= 3; + z_bit += 2; + z_w += 2; + } else if (z_bit > 10){ + z_bit -= 11; + z_bit *= 3; + z_bit += 1; + z_w += 1; + } else { + z_bit *= 3; + } + } else { + z_w += 1; + } + } + + float res = 0; + half2 res2; + + unsigned int tmp1; + unsigned int tmp2; + unsigned int tmp; + unsigned int z_tmp; + + __syncthreads(); + + while (k < blockwidth2) { + int g = (g_h + (k * 2)) / groupsize; + float scale_f = scales[g * width + w]; + half2 scale = __float2half2_rn(scale_f); + half2 zero; + if (z_mod == 10) { + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 30) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 2) & 0x4); + zero = __float2half2_rn(-(scale_f * (((z_tmp) + 1) & 0x0f))); + } else if (z_mod == 21){ + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 31) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 1) & 0x6); + zero = __float2half2_rn(-(scale_f * (((z_tmp) + 1) & 0x0f))); + } else { + zero = __float2half2_rn(-(scale_f * ((((as_unsigned(zeros[g * zero_width + z_w]) >> z_bit) & 0x7) + 1) & 0x0f))); + } + + std::memset(&res2, 0, sizeof(half2)); + tmp1 = as_unsigned(mat[i]); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 0) & 0x3f][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 6) & 0x3f][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 12) & 0x3f][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 18) & 0x3f][off], scale, zero), blockvec[k + 3], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 24) & 0x3f][off], scale, zero), blockvec[k + 4], res2); + i += width; + tmp2 = as_unsigned(mat[i]); + tmp = (tmp1 >> 30) | ((tmp2 << 2) & 0x3c); + res2 = __hfma2(__hfma2(deq2[tmp][off], scale, zero), blockvec[k + 5], res2); + tmp2 >>= 4; + k += 6; + res2 = __hfma2(__hfma2(deq2[(tmp2 >> 0) & 0x3f][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp2 >> 6) & 0x3f][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp2 >> 12) & 0x3f][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp2 >> 18) & 0x3f][off], scale, zero), blockvec[k + 3], res2); + i += width; + tmp1 = as_unsigned(mat[i]); + tmp = (tmp2 >> 24) | ((tmp1 << 4) & 0x30); + res2 = __hfma2(__hfma2(deq2[tmp][off], scale, zero), blockvec[k + 4], res2); + tmp1 >>= 2; + k += 5; + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 0) & 0x3f][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 6) & 0x3f][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 12) & 0x3f][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 18) & 0x3f][off], scale, zero), blockvec[k + 3], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 24) & 0x3f][off], scale, zero), blockvec[k + 4], res2); + i += width; + k += 5; + res += __low2float(res2) + __high2float(res2); + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant4matmul_faster_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize, + int vec_height +) { + int batch = vec.size(0); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT4 - 1) / BLOCKHEIGHT4, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + VecQuant4MatMulKernelFaster_old<<>>( + (half2*) vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + scales.data_ptr(), + zeros.data_ptr(), + batch, vec_height, height, width, zero_width, groupsize + ); +} + +__global__ void VecQuant4MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + const int blockwidth2 = BLOCKWIDTH / 2; + int b = blockIdx.z; + int h = BLOCKHEIGHT4 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ half2 blockvec[blockwidth2]; + if (threadIdx.x < blockwidth2) + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * blockwidth2 + threadIdx.x]; + + __shared__ half2 deq2[256][8]; + int val = threadIdx.x / 8; + int off = threadIdx.x % 8; + for (; val < 256; val += BLOCKWIDTH / 8) { + deq2[val][off] = __halves2half2( + __int2half_rn(val & 0xF), __int2half_rn(val >> 4) + ); + } + + int i = width * h + w; + int g_h = h * 8; + int k = 0; + + int z_w = w / 8; + int z_mod = (w % 8) * 4; + + float res = 0; + half2 res2; + + unsigned int tmp; + + __syncthreads(); + + while (k < blockwidth2) { + int g = (g_h + (k * 2)) / groupsize; + float scale_f = scales[g * width + w]; + + half2 scale = __float2half2_rn(scale_f); + half2 zero = __float2half2_rn(-(scale_f * ((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xF) + 1) & 0x0f))); + + //std::memset(&res2, 0, sizeof(half2)); + + //res2 = __float2half2_rn((float)0.); + + std::memset(&res2, 0, sizeof(half2)); + tmp = as_unsigned(mat[i]); + res2 = __hfma2(__hfma2(deq2[(tmp >> 0) & 0xff][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 8) & 0xff][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 16) & 0xff][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 24) & 0xff][off], scale, zero), blockvec[k + 3], res2); + i += width; + k += 4; + + res += __low2float(res2) + __high2float(res2); + + } + + atomicAdd(&mul[b * width + w], res); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_64/autogptq_cuda_64.cpp b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_64/autogptq_cuda_64.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dad762e6e5a0da0a8e9704b97c6ddfe113f8e183 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_64/autogptq_cuda_64.cpp @@ -0,0 +1,187 @@ +#include +#include +#include + +void vecquant2matmul_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +); + +void vecquant2matmul( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant2matmul_cuda(vec, mat, mul, scales, zeros, g_idx); +} + +void vecquant3matmul_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +); + +void vecquant3matmul( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant3matmul_cuda(vec, mat, mul, scales, zeros, g_idx); +} + +void vecquant4matmul_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +); + +void vecquant4matmul( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant4matmul_cuda(vec, mat, mul, scales, zeros, g_idx); +} + +void vecquant8matmul_cuda( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +); + +void vecquant8matmul( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + torch::Tensor g_idx +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant8matmul_cuda(vec, mat, mul, scales, zeros, g_idx); +} + + +// old + +void vecquant2matmul_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +); + +void vecquant2matmul_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant2matmul_cuda_old(vec, mat, mul, scales, zeros,groupsize); +} + +void vecquant3matmul_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +); + +void vecquant3matmul_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant3matmul_cuda_old(vec, mat, mul, scales, zeros, groupsize); +} + +void vecquant4matmul_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +); + +void vecquant4matmul_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant4matmul_cuda_old(vec, mat, mul, scales, zeros, groupsize); +} + +void vecquant8matmul_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +); + +void vecquant8matmul_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant8matmul_cuda_old(vec, mat, mul, scales, zeros, groupsize); +} + +void vecquant2matmul_faster_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +); + +void vecquant2matmul_faster_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant2matmul_faster_cuda_old(vec, mat, mul, scales, zeros, groupsize, vec_height); +} + +void vecquant3matmul_faster_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +); + +void vecquant3matmul_faster_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant3matmul_faster_cuda_old(vec, mat, mul, scales, zeros, groupsize, vec_height); +} + +void vecquant4matmul_faster_cuda_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +); + +void vecquant4matmul_faster_old( + torch::Tensor vec, torch::Tensor mat, torch::Tensor mul, + torch::Tensor scales, torch::Tensor zeros, + int groupsize, int vec_height +) { + const at::cuda::OptionalCUDAGuard device_guard(device_of(vec)); + vecquant4matmul_faster_cuda_old(vec, mat, mul, scales, zeros, groupsize, vec_height); +} + + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("vecquant2matmul", &vecquant2matmul, "Vector 2-bit Quantized Matrix Multiplication (CUDA) (desc_act)"); + m.def("vecquant3matmul", &vecquant3matmul, "Vector 3-bit Quantized Matrix Multiplication (CUDA) (desc_act)"); + m.def("vecquant4matmul", &vecquant4matmul, "Vector 4-bit Quantized Matrix Multiplication (CUDA) (desc_act)"); + m.def("vecquant8matmul", &vecquant8matmul, "Vector 8-bit Quantized Matrix Multiplication (CUDA) (desc_act)"); + + m.def("vecquant2matmul_old", &vecquant2matmul_old, "Vector 2-bit Quantized Matrix Multiplication (CUDA)"); + m.def("vecquant3matmul_old", &vecquant3matmul_old, "Vector 3-bit Quantized Matrix Multiplication (CUDA)"); + m.def("vecquant4matmul_old", &vecquant4matmul_old, "Vector 4-bit Quantized Matrix Multiplication (CUDA)"); + m.def("vecquant8matmul_old", &vecquant8matmul_old, "Vector 8-bit Quantized Matrix Multiplication (CUDA)"); + m.def("vecquant2matmul_faster_old", &vecquant2matmul_faster_old, "Vector 2-bit Quantized Matrix Multiplication (CUDA), faster version"); + m.def("vecquant3matmul_faster_old", &vecquant3matmul_faster_old, "Vector 3-bit Quantized Matrix Multiplication (CUDA), faster version"); + m.def("vecquant4matmul_faster_old", &vecquant4matmul_faster_old, "Vector 4-bit Quantized Matrix Multiplication (CUDA), faster version"); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_64/autogptq_cuda_kernel_64.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_64/autogptq_cuda_kernel_64.cu new file mode 100644 index 0000000000000000000000000000000000000000..10c63617ed0cb24c32dfec2b5077b33edc01b92b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_64/autogptq_cuda_kernel_64.cu @@ -0,0 +1,1431 @@ +#include +#include +#include +#include +#include + +// atomicAdd for double-precision floating-point numbers on hardware with +// compute capability < 6.0 from: +// https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#atomic-functions +// #if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600 +// __device__ double atomicAdd( +// double* address, +// double val +// ) { +// unsigned long long int* address_as_ull = (unsigned long long int*)address; +// unsigned long long int old = *address_as_ull, assumed; +// +// do { +// assumed = old; +// old = atomicCAS( +// address_as_ull, +// assumed, +// __double_as_longlong(val + __longlong_as_double(assumed)) +// ); +// +// // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) +// } while (assumed != old); +// +// return __longlong_as_double(old); +// } +// #endif + + +#if (defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 700) || defined(USE_ROCM) +// adapted from https://github.com/torch/cutorch/blob/master/lib/THC/THCAtomics.cuh +__device__ __forceinline__ void atomicAdd(c10::Half* address, c10::Half val) { + unsigned int *address_as_ui = reinterpret_cast(reinterpret_cast(address) - (reinterpret_cast(address) & 2)); + unsigned int old = *address_as_ui; + unsigned int assumed; + + do { + assumed = old; + unsigned short hsum = reinterpret_cast(address) & 2 ? (old >> 16) : (old & 0xffff); + hsum += val; + old = reinterpret_cast(address) & 2 + ? (old & 0xffff) | (hsum << 16) + : (old & 0xffff0000) | hsum; + old = atomicCAS(address_as_ui, assumed, old); + + // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) + } while (assumed != old); +} +__device__ __forceinline__ void atomicAdd(__half* address, c10::Half val) { + unsigned int * address_as_ui = (unsigned int *) ((char *)address - ((size_t)address & 2)); + unsigned int old = *address_as_ui; + unsigned int assumed; + + do { + assumed = old; + __half_raw hsum; + hsum.x = (size_t)address & 2 ? (old >> 16) : (old & 0xffff); + half tmpres = __hadd(hsum, val); + hsum = __half_raw(tmpres); + old = (size_t)address & 2 ? (old & 0xffff) | (hsum.x << 16) : (old & 0xffff0000) | hsum.x; + old = atomicCAS(address_as_ui, assumed, old); + } while (assumed != old); +} +#endif + + +template +__global__ void VecQuant2MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +); + +template +__global__ void VecQuant3MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +); + +template +__global__ void VecQuant4MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +); + + +template +__global__ void VecQuant8MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +); + +template +__global__ void VecQuant2MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +template +__global__ void VecQuant3MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +template +__global__ void VecQuant4MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +template +__global__ void VecQuant8MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +__global__ void VecQuant2MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +__global__ void VecQuant3MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + +__global__ void VecQuant4MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +); + + +const int BLOCKWIDTH = 64; +const int BLOCKHEIGHT2 = 4; +const int BLOCKHEIGHT3 = 6; +const int BLOCKHEIGHT4 = 8; +const int BLOCKHEIGHT8 = 16; + +__device__ inline unsigned int as_unsigned(int i) { + return *reinterpret_cast(&i); +} + +__device__ inline int as_int(int i) { + return *reinterpret_cast(&i); +} + + +void vecquant2matmul_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + torch::Tensor g_idx +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT2 - 1) / BLOCKHEIGHT2, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant2matmul_cuda", ([&] { + VecQuant2MatMulKernel<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), g_idx.data(), + batch, vec_height, height, width, zero_width + ); + }) + ); +} + +template +__global__ void VecQuant2MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +) { + int h = BLOCKHEIGHT2 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + int i = width * h + w; + int g_h = h * 16; + int k; + unsigned int g; + scalar_t w_tmp; + + int z_w = w / 16; + int z_mod = (w % 16) * 2; + + float weight[BLOCKWIDTH]; + + for (k = 0; k < BLOCKWIDTH; ++k){ + int k_w = (k / 16); + int k_bit = (k % 16) * 2; + + g = as_int(g_idx[g_h + k]); + scalar_t scale = scales[g * width + w]; + + // Avoid overflows with & 0x0f. + scalar_t zero = scalar_t(((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod & 0x3) + 1) & 0x0f); + + w_tmp = ((as_unsigned(mat[i + (k_w * width)]) >> k_bit) & 0x3); + + weight[k] = scale * (w_tmp - zero); + } + + scalar_t res; + for (int b = 0; b < batch; ++b){ + res = 0; + + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + for (k = 0; k < BLOCKWIDTH; ++k){ + res += weight[k] * blockvec[k]; + } + atomicAdd(&mul[b * width + w], res); + __syncthreads(); + } +} + +void vecquant3matmul_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + torch::Tensor g_idx +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT3 - 1) / BLOCKHEIGHT3, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant3matmul_cuda", ([&] { + VecQuant3MatMulKernel<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), g_idx.data(), + batch, vec_height, height, width, zero_width + ); + }) + ); +} + +template +__global__ void VecQuant3MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +) { + int h = BLOCKHEIGHT3 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + int i = width * h + w; + int g_h = (h / 3) * 32; + int k; + unsigned int g; + scalar_t w_tmp; + + int z_w = (w / 32) * 3; + int z_mod = w % 32; + int z_bit; + unsigned int z_tmp; + if (z_mod != 10){ + if (z_mod != 21){ + z_bit = z_mod; + if (z_bit > 21){ + z_bit -= 22; + z_bit *= 3; + z_bit += 2; + z_w += 2; + } else if (z_bit > 10){ + z_bit -= 11; + z_bit *= 3; + z_bit += 1; + z_w += 1; + } else { + z_bit *= 3; + } + } else { + z_w += 1; + } + } + + float weight[BLOCKWIDTH]; + + for (k = 0; k < BLOCKWIDTH; ++k){ + int k_w = (k / 32) * 3; + int k_mod = k % 32; + int k_bit; + + if (k_mod != 10){ + if (k_mod != 21){ + k_bit = k_mod; + if (k_bit > 21){ + k_bit -= 22; + k_bit *= 3; + k_bit += 2; + k_w += 2; + } else if (k_bit > 10){ + k_bit -= 11; + k_bit *= 3; + k_bit += 1; + k_w += 1; + } else { + k_bit *= 3; + } + } else { + k_w += 1; + } + } + + g = as_int(g_idx[g_h + k]); + scalar_t scale = scales[g * width + w]; + scalar_t zero; + if (z_mod == 10) { + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 30) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 2) & 0x4); + zero = scalar_t(((z_tmp) + 1) & 0x0f); // Avoid overflows + } else if (z_mod == 21){ + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 31) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 1) & 0x6); + zero = scalar_t(((z_tmp) + 1) & 0x0f); // Avoid overflows + } else { + zero = scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_bit) & 0x7) + 1) & 0x0f); + } + + if (k_mod == 10) { + w_tmp = (as_unsigned(mat[i + (k_w * width)]) >> 30) | ((as_unsigned(mat[i + ((k_w + 1)* width)]) << 2) & 0x4); + } else if (k_mod == 21){ + w_tmp = (as_unsigned(mat[i + (k_w * width)]) >> 31) | ((as_unsigned(mat[i + ((k_w + 1)* width)]) << 1) & 0x6); + } else { + w_tmp = ((as_unsigned(mat[i + (k_w * width)]) >> k_bit) & 0x7); + } + weight[k] = scale * (w_tmp - zero); + } + + scalar_t res; + for (int b = 0; b < batch; ++b){ + res = 0; + + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + for (k = 0; k < BLOCKWIDTH; ++k){ + res += weight[k] * blockvec[k]; + } + atomicAdd(&mul[b * width + w], res); + __syncthreads(); + } +} + +void vecquant4matmul_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + torch::Tensor g_idx +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT4 - 1) / BLOCKHEIGHT4, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant4matmul_cuda", ([&] { + VecQuant4MatMulKernel<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), g_idx.data(), + batch, vec_height, height, width, zero_width + ); + }) + ); +} + +template +__global__ void VecQuant4MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +) { + int h = BLOCKHEIGHT4 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + int i = width * h + w; + int g_h = h * 8; + int k; + unsigned int g; + scalar_t w_tmp; + + + int z_w = w / 8; + int z_mod = (w % 8) * 4; + + float weight[BLOCKWIDTH]; + + for (k = 0; k < BLOCKWIDTH; ++k){ + int k_w = (k / 8); + int k_bit = (k % 8) * 4; + + g = as_int(g_idx[g_h + k]); + scalar_t scale = scales[g * width + w]; + scalar_t zero = scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xF) + 1) & 0x0f); + + w_tmp = ((as_unsigned(mat[i + (k_w * width)]) >> k_bit) & 0xF); + + weight[k] = scale * (w_tmp - zero); + } + + scalar_t res; + for (int b = 0; b < batch; ++b){ + res = 0; + + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + for (k = 0; k < BLOCKWIDTH; ++k){ + res += weight[k] * blockvec[k]; + } + atomicAdd(&mul[b * width + w], res); + __syncthreads(); + } +} + +void vecquant8matmul_cuda( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + torch::Tensor g_idx +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT8 - 1) / BLOCKHEIGHT8, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant8matmul_cuda", ([&] { + VecQuant8MatMulKernel<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), g_idx.data(), + batch, vec_height, height, width, zero_width + ); + }) + ); +} + +template +__global__ void VecQuant8MatMulKernel( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + const int* __restrict__ g_idx, + int batch, + int vec_height, + int height, + int width, + int zero_width +) { + int h = BLOCKHEIGHT8 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + int i = width * h + w; + int g_h = h * 4; + int k; + unsigned int g; + scalar_t w_tmp; + + int z_w = w / 4; + int z_mod = (w % 4) * 8; + + float weight[BLOCKWIDTH]; + + for (k = 0; k < BLOCKWIDTH; ++k){ + int k_w = (k / 4); + int k_bit = (k % 4) * 8; + + g = as_int(g_idx[g_h + k]); + scalar_t scale = scales[g * width + w]; + scalar_t zero = scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xFF) + 1) & 0x0f); + + w_tmp = ((as_unsigned(mat[i + (k_w * width)]) >> k_bit) & 0xFF); + + weight[k] = scale * (w_tmp - zero); + } + + scalar_t res; + for (int b = 0; b < batch; ++b){ + res = 0; + + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + for (k = 0; k < BLOCKWIDTH; ++k){ + res += weight[k] * blockvec[k]; + } + atomicAdd(&mul[b * width + w], res); + __syncthreads(); + } +} + + +void vecquant2matmul_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT2 - 1) / BLOCKHEIGHT2, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant2matmul_cuda_old", ([&] { + VecQuant2MatMulKernel_old<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), + batch, vec_height, height, width, zero_width, groupsize + ); + }) + ); +} + +template +__global__ void VecQuant2MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + int b = blockIdx.z; + int h = BLOCKHEIGHT2 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + scalar_t res = 0; + int i = width * h + w; + int g_h = h * 16; + int k = 0; + + int z_w = w / 16; + int z_mod = (w % 16) * 2; + + unsigned int tmp; + + while (k < BLOCKWIDTH) { + tmp = as_unsigned(mat[i]); + + int g = (g_h + k) / groupsize; + scalar_t scale = scales[g * width + w]; + scalar_t zero = scale * scalar_t(((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod & 0x3) + 1) & 0x0f); + + res += (scale * scalar_t((tmp >> 0) & 0x3) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp >> 2) & 0x3) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp >> 4) & 0x3) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp >> 6) & 0x3) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp >> 8) & 0x3) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp >> 10) & 0x3) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp >> 12) & 0x3) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp >> 14) & 0x3) - zero) * blockvec[k + 7]; + res += (scale * scalar_t((tmp >> 16) & 0x3) - zero) * blockvec[k + 8]; + res += (scale * scalar_t((tmp >> 18) & 0x3) - zero) * blockvec[k + 9]; + res += (scale * scalar_t((tmp >> 20) & 0x3) - zero) * blockvec[k + 10]; + res += (scale * scalar_t((tmp >> 22) & 0x3) - zero) * blockvec[k + 11]; + res += (scale * scalar_t((tmp >> 24) & 0x3) - zero) * blockvec[k + 12]; + res += (scale * scalar_t((tmp >> 26) & 0x3) - zero) * blockvec[k + 13]; + res += (scale * scalar_t((tmp >> 28) & 0x3) - zero) * blockvec[k + 14]; + res += (scale * scalar_t((tmp >> 30) & 0x3) - zero) * blockvec[k + 15]; + + i += width; + k += 16; + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant3matmul_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT3 - 1) / BLOCKHEIGHT3, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant3matmul_cuda_old", ([&] { + VecQuant3MatMulKernel_old<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), + batch, vec_height, height, width, zero_width, groupsize + ); + }) + ); +} + +template +__global__ void VecQuant3MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + int b = blockIdx.z; + int h = BLOCKHEIGHT3 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + scalar_t res = 0; + int i = width * h + w; + int g_h = (h / 3) * 32; + int k = 0; + + int z_w = (w / 32) * 3; + int z_mod = w % 32; + int z_bit; + + if (z_mod != 10){ + if (z_mod != 21){ + z_bit = z_mod; + if (z_bit > 21){ + z_bit -= 22; + z_bit *= 3; + z_bit += 2; + z_w += 2; + } else if (z_bit > 10){ + z_bit -= 11; + z_bit *= 3; + z_bit += 1; + z_w += 1; + } else { + z_bit *= 3; + } + } else { + z_w += 1; + } + } + + unsigned int tmp1; + unsigned int tmp2; + unsigned int tmp; + unsigned int z_tmp; + + while (k < BLOCKWIDTH) { + tmp1 = as_unsigned(mat[i]); + + int g = (g_h + k) / groupsize; + scalar_t scale = scales[g * width + w]; + scalar_t zero; + if (z_mod == 10) { + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 30) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 2) & 0x4); + zero = scale * scalar_t(((z_tmp) + 1) & 0x0f); + } else if (z_mod == 21){ + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 31) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 1) & 0x6); + zero = scale * scalar_t(((z_tmp) + 1) & 0x0f); + } else { + zero = scale * scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_bit) & 0x7) + 1) & 0x0f); + } + + res += (scale * scalar_t((tmp1 >> 0) & 0x7) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp1 >> 3) & 0x7) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp1 >> 6) & 0x7) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp1 >> 9) & 0x7) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp1 >> 12) & 0x7) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp1 >> 15) & 0x7) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp1 >> 18) & 0x7) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp1 >> 21) & 0x7) - zero) * blockvec[k + 7]; + res += (scale * scalar_t((tmp1 >> 24) & 0x7) - zero) * blockvec[k + 8]; + res += (scale * scalar_t((tmp1 >> 27) & 0x7) - zero) * blockvec[k + 9]; + + i += width; + tmp2 = as_unsigned(mat[i]); + tmp = (tmp1 >> 30) | ((tmp2 << 2) & 0x4); + tmp2 >>= 1; + res += (scale * scalar_t(tmp) - zero) * blockvec[k + 10]; + k += 11; + + res += (scale * scalar_t((tmp2 >> 0) & 0x7) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp2 >> 3) & 0x7) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp2 >> 6) & 0x7) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp2 >> 9) & 0x7) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp2 >> 12) & 0x7) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp2 >> 15) & 0x7) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp2 >> 18) & 0x7) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp2 >> 21) & 0x7) - zero) * blockvec[k + 7]; + res += (scale * scalar_t((tmp2 >> 24) & 0x7) - zero) * blockvec[k + 8]; + res += (scale * scalar_t((tmp2 >> 27) & 0x7) - zero) * blockvec[k + 9]; + + i += width; + tmp1 = as_unsigned(mat[i]); + tmp = (tmp2 >> 30) | ((tmp1 << 1) & 0x6); + tmp1 >>= 2; + res += (scale * scalar_t(tmp) - zero) * blockvec[k + 10]; + k += 11; + + res += (scale * scalar_t((tmp1 >> 0) & 0x7) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp1 >> 3) & 0x7) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp1 >> 6) & 0x7) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp1 >> 9) & 0x7) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp1 >> 12) & 0x7) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp1 >> 15) & 0x7) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp1 >> 18) & 0x7) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp1 >> 21) & 0x7) - zero) * blockvec[k + 7]; + res += (scale * scalar_t((tmp1 >> 24) & 0x7) - zero) * blockvec[k + 8]; + res += (scale * scalar_t((tmp1 >> 27) & 0x7) - zero) * blockvec[k + 9]; + + i += width; + k += 10; + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant4matmul_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT4 - 1) / BLOCKHEIGHT4, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant4matmul_cuda_old", ([&] { + VecQuant4MatMulKernel_old<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), + batch, vec_height, height, width, zero_width, groupsize + ); + }) + ); +} + +template +__global__ void VecQuant4MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + int b = blockIdx.z; + int h = BLOCKHEIGHT4 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + scalar_t res = 0; + int i = width * h + w; + int g_h = h * 8; + int k = 0; + + int z_w = w / 8; + int z_mod = (w % 8) * 4; + + unsigned int tmp; + + while (k < BLOCKWIDTH) { + tmp = as_unsigned(mat[i]); + + int g = (g_h + k) / groupsize; + scalar_t scale = scales[g * width + w]; + scalar_t zero = scale * scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xF) + 1) & 0x0f); + + res += (scale * scalar_t((tmp >> 0) & 0xF) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp >> 4) & 0xF) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp >> 8) & 0xF) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp >> 12) & 0xF) - zero) * blockvec[k + 3]; + res += (scale * scalar_t((tmp >> 16) & 0xF) - zero) * blockvec[k + 4]; + res += (scale * scalar_t((tmp >> 20) & 0xF) - zero) * blockvec[k + 5]; + res += (scale * scalar_t((tmp >> 24) & 0xF) - zero) * blockvec[k + 6]; + res += (scale * scalar_t((tmp >> 28) & 0xF) - zero) * blockvec[k + 7]; + + i += width; + k += 8; + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant8matmul_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize +) { + int batch = vec.size(0); + int vec_height = vec.size(1); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT8 - 1) / BLOCKHEIGHT8, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + AT_DISPATCH_FLOATING_TYPES( + vec.type(), "vecquant8matmul_cuda_old", ([&] { + VecQuant8MatMulKernel_old<<>>( + vec.data(), mat.data(), mul.data(), + scales.data(), zeros.data(), + batch, vec_height, height, width, zero_width, groupsize + ); + }) + ); +} + +template +__global__ void VecQuant8MatMulKernel_old( + const scalar_t* __restrict__ vec, + const int* __restrict__ mat, + scalar_t* __restrict__ mul, + const scalar_t* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + int b = blockIdx.z; + int h = BLOCKHEIGHT8 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ scalar_t blockvec[BLOCKWIDTH]; + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * BLOCKWIDTH + threadIdx.x]; + __syncthreads(); + + scalar_t res = 0; + int i = width * h + w; + int g_h = h * 4; + int k = 0; + + int z_w = w / 4; + int z_mod = (w % 4) * 8; + + unsigned int tmp; + + while (k < BLOCKWIDTH) { + tmp = as_unsigned(mat[i]); + + int g = (g_h + k) / groupsize; + scalar_t scale = scales[g * width + w]; + scalar_t zero = scale * scalar_t((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xFF) + 1) & 0x0f); + + res += (scale * scalar_t((tmp >> 0) & 0xFF) - zero) * blockvec[k + 0]; + res += (scale * scalar_t((tmp >> 8) & 0xFF) - zero) * blockvec[k + 1]; + res += (scale * scalar_t((tmp >> 16) & 0xFF) - zero) * blockvec[k + 2]; + res += (scale * scalar_t((tmp >> 24) & 0xFF) - zero) * blockvec[k + 3]; + + i += width; + k += 4; + } + + atomicAdd(&mul[b * width + w], res); +} + + +void vecquant2matmul_faster_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize, + int vec_height +) { + int batch = vec.size(0); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT2 - 1) / BLOCKHEIGHT2, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + VecQuant2MatMulKernelFaster_old<<>>( + (half2*) vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + scales.data_ptr(), + zeros.data_ptr(), + batch, vec_height, height, width, zero_width, groupsize + ); +} + +__global__ void VecQuant2MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + const int blockwidth2 = BLOCKWIDTH / 2; + int b = blockIdx.z; + int h = BLOCKHEIGHT2 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ half2 blockvec[blockwidth2]; + if (threadIdx.x < blockwidth2) + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * blockwidth2 + threadIdx.x]; + + __shared__ half2 deq2[16][16]; + int val = threadIdx.x / 16; + int off = threadIdx.x % 16; + for (; val < 16; val += BLOCKWIDTH / 16) { + deq2[val][off] = __halves2half2( + __int2half_rn(val & 0x3), __int2half_rn(val >> 2) + ); + } + + int i = width * h + w; + int g_h = h * 16; + int k = 0; + + int z_w = w / 16; + int z_mod = (w % 16) * 2; + + float res = 0; + half2 res2; + + unsigned int tmp; + + __syncthreads(); + + while (k < blockwidth2) { + int g = (g_h + (k * 2)) / groupsize; + float scale_f = scales[g * width + w]; + half2 scale = __float2half2_rn(scale_f); + half2 zero = __float2half2_rn(-(scale_f * ((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0x3) + 1) & 0x0f))); + + std::memset(&res2, 0, sizeof(half2)); + tmp = as_unsigned(mat[i]); + res2 = __hfma2(__hfma2(deq2[(tmp >> 0) & 0xf][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 4) & 0xf][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 8) & 0xf][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 12) & 0xf][off], scale, zero), blockvec[k + 3], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 16) & 0xf][off], scale, zero), blockvec[k + 4], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 20) & 0xf][off], scale, zero), blockvec[k + 5], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 24) & 0xf][off], scale, zero), blockvec[k + 6], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 28) & 0xf][off], scale, zero), blockvec[k + 7], res2); + i += width; + k += 8; + res += __low2float(res2) + __high2float(res2); + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant3matmul_faster_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize, + int vec_height +) { + int batch = vec.size(0); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT3 - 1) / BLOCKHEIGHT3, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + VecQuant3MatMulKernelFaster_old<<>>( + (half2*) vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + scales.data_ptr(), + zeros.data_ptr(), + batch, vec_height, height, width, zero_width, groupsize + ); +} + +__global__ void VecQuant3MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + const int blockwidth2 = BLOCKWIDTH / 2; + int b = blockIdx.z; + int h = BLOCKHEIGHT3 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ half2 blockvec[blockwidth2]; + if (threadIdx.x < blockwidth2) + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * blockwidth2 + threadIdx.x]; + + __shared__ half2 deq2[64][32]; + int val = threadIdx.x / 32; + int off = threadIdx.x % 32; + for (; val < 64; val += BLOCKWIDTH / 32) { + deq2[val][off] = __halves2half2( + __int2half_rn(val & 0x7), __int2half_rn(val >> 3) + ); + } + + int i = width * h + w; + int g_h = (h / 3) * 32; + int k = 0; + + int z_w = (w / 32) * 3; + int z_mod = w % 32; + int z_bit; + + if (z_mod != 10){ + if (z_mod != 21){ + z_bit = z_mod; + if (z_bit > 21){ + z_bit -= 22; + z_bit *= 3; + z_bit += 2; + z_w += 2; + } else if (z_bit > 10){ + z_bit -= 11; + z_bit *= 3; + z_bit += 1; + z_w += 1; + } else { + z_bit *= 3; + } + } else { + z_w += 1; + } + } + + float res = 0; + half2 res2; + + unsigned int tmp1; + unsigned int tmp2; + unsigned int tmp; + unsigned int z_tmp; + + __syncthreads(); + + while (k < blockwidth2) { + int g = (g_h + (k * 2)) / groupsize; + float scale_f = scales[g * width + w]; + half2 scale = __float2half2_rn(scale_f); + half2 zero; + if (z_mod == 10) { + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 30) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 2) & 0x4); + zero = __float2half2_rn(-(scale_f * (((z_tmp) + 1) & 0x0f))); + } else if (z_mod == 21){ + z_tmp = (as_unsigned(zeros[g * zero_width + z_w]) >> 31) | ((as_unsigned(zeros[g * zero_width + (z_w + 1)]) << 1) & 0x6); + zero = __float2half2_rn(-(scale_f * (((z_tmp) + 1) & 0x0f))); + } else { + zero = __float2half2_rn(-(scale_f * ((((as_unsigned(zeros[g * zero_width + z_w]) >> z_bit) & 0x7) + 1) & 0x0f))); + } + + std::memset(&res2, 0, sizeof(half2)); + tmp1 = as_unsigned(mat[i]); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 0) & 0x3f][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 6) & 0x3f][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 12) & 0x3f][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 18) & 0x3f][off], scale, zero), blockvec[k + 3], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 24) & 0x3f][off], scale, zero), blockvec[k + 4], res2); + i += width; + tmp2 = as_unsigned(mat[i]); + tmp = (tmp1 >> 30) | ((tmp2 << 2) & 0x3c); + res2 = __hfma2(__hfma2(deq2[tmp][off], scale, zero), blockvec[k + 5], res2); + tmp2 >>= 4; + k += 6; + res2 = __hfma2(__hfma2(deq2[(tmp2 >> 0) & 0x3f][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp2 >> 6) & 0x3f][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp2 >> 12) & 0x3f][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp2 >> 18) & 0x3f][off], scale, zero), blockvec[k + 3], res2); + i += width; + tmp1 = as_unsigned(mat[i]); + tmp = (tmp2 >> 24) | ((tmp1 << 4) & 0x30); + res2 = __hfma2(__hfma2(deq2[tmp][off], scale, zero), blockvec[k + 4], res2); + tmp1 >>= 2; + k += 5; + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 0) & 0x3f][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 6) & 0x3f][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 12) & 0x3f][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 18) & 0x3f][off], scale, zero), blockvec[k + 3], res2); + res2 = __hfma2(__hfma2(deq2[(tmp1 >> 24) & 0x3f][off], scale, zero), blockvec[k + 4], res2); + i += width; + k += 5; + res += __low2float(res2) + __high2float(res2); + } + + atomicAdd(&mul[b * width + w], res); +} + +void vecquant4matmul_faster_cuda_old( + torch::Tensor vec, + torch::Tensor mat, + torch::Tensor mul, + torch::Tensor scales, + torch::Tensor zeros, + int groupsize, + int vec_height +) { + int batch = vec.size(0); + int height = mat.size(0); + int width = mat.size(1); + int zero_width = zeros.size(1); + + dim3 blocks( + (height + BLOCKHEIGHT4 - 1) / BLOCKHEIGHT4, + (width + BLOCKWIDTH - 1) / BLOCKWIDTH, + batch + ); + dim3 threads(BLOCKWIDTH); + + VecQuant4MatMulKernelFaster_old<<>>( + (half2*) vec.data_ptr(), + mat.data_ptr(), + mul.data_ptr(), + scales.data_ptr(), + zeros.data_ptr(), + batch, vec_height, height, width, zero_width, groupsize + ); +} + +__global__ void VecQuant4MatMulKernelFaster_old( + const half2* __restrict__ vec, + const int* __restrict__ mat, + float* __restrict__ mul, + const float* __restrict__ scales, + const int* __restrict__ zeros, + int batch, + int vec_height, + int height, + int width, + int zero_width, + int groupsize +) { + const int blockwidth2 = BLOCKWIDTH / 2; + int b = blockIdx.z; + int h = BLOCKHEIGHT4 * blockIdx.x; + int w = BLOCKWIDTH * blockIdx.y + threadIdx.x; + + __shared__ half2 blockvec[blockwidth2]; + if (threadIdx.x < blockwidth2) + blockvec[threadIdx.x] = vec[b * vec_height + blockIdx.x * blockwidth2 + threadIdx.x]; + + __shared__ half2 deq2[256][8]; + int val = threadIdx.x / 8; + int off = threadIdx.x % 8; + for (; val < 256; val += BLOCKWIDTH / 8) { + deq2[val][off] = __halves2half2( + __int2half_rn(val & 0xF), __int2half_rn(val >> 4) + ); + } + + int i = width * h + w; + int g_h = h * 8; + int k = 0; + + int z_w = w / 8; + int z_mod = (w % 8) * 4; + + float res = 0; + half2 res2; + + unsigned int tmp; + + __syncthreads(); + + while (k < blockwidth2) { + int g = (g_h + (k * 2)) / groupsize; + float scale_f = scales[g * width + w]; + half2 scale = __float2half2_rn(scale_f); + half2 zero = __float2half2_rn(-(scale_f * ((((as_unsigned(zeros[g * zero_width + z_w]) >> z_mod) & 0xF) + 1) & 0x0f))); + + std::memset(&res2, 0, sizeof(half2)); + tmp = as_unsigned(mat[i]); + res2 = __hfma2(__hfma2(deq2[(tmp >> 0) & 0xff][off], scale, zero), blockvec[k + 0], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 8) & 0xff][off], scale, zero), blockvec[k + 1], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 16) & 0xff][off], scale, zero), blockvec[k + 2], res2); + res2 = __hfma2(__hfma2(deq2[(tmp >> 24) & 0xff][off], scale, zero), blockvec[k + 3], res2); + i += width; + k += 4; + res += __low2float(res2) + __high2float(res2); + } + + atomicAdd(&mul[b * width + w], res); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cu_compat.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cu_compat.cuh new file mode 100644 index 0000000000000000000000000000000000000000..c5258813e147554e033eaf9a80c27dd694a50961 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cu_compat.cuh @@ -0,0 +1,58 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _cuda_compat_cuh +#define _cuda_compat_cuh + +// atomicAdd for half types, to support CC < 7.x + +__device__ __forceinline__ void atomicAdd_half(half* address, half val) +{ + unsigned int * address_as_ui = (unsigned int *) ((char *)address - ((size_t)address & 2)); + unsigned int old = *address_as_ui; + unsigned int assumed; + + do + { + assumed = old; + __half_raw hsum; + hsum.x = (size_t)address & 2 ? (old >> 16) : (old & 0xffff); + half tmpres = __hadd(hsum, val); + hsum = __half_raw(tmpres); + old = (size_t)address & 2 ? (old & 0xffff) | (hsum.x << 16) : (old & 0xffff0000) | hsum.x; + old = atomicCAS(address_as_ui, assumed, old); + } + while (assumed != old); +} + +// atomicAdd for half2 types + +__device__ __forceinline__ void atomicAdd_half2(half2* address, half2 val) +{ + unsigned int* address_as_ui = (unsigned int*)address; + unsigned int old = *address_as_ui; + unsigned int assumed; + do + { + assumed = old; + half2 old_val = *((half2*)&old); + half2 new_val = __hadd2(old_val, val); + old = atomicCAS(address_as_ui, assumed, *((unsigned int*)&new_val)); + } + while (assumed != old); +} + +// + +#if defined(__CUDA_ARCH__) || defined(USE_ROCM) +#if __CUDA_ARCH__ < 700 || defined(USE_ROCM) + +__device__ __forceinline__ void atomicAdd(half* address, half val) { atomicAdd_half(address, val); } + +#if __CUDA_ARCH__ < 600 || defined(USE_ROCM) +__device__ __forceinline__ void atomicAdd(half2* address, half2 val) { atomicAdd_half2(address, val); } +#endif + +#endif +#endif + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_buffers.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_buffers.cu new file mode 100644 index 0000000000000000000000000000000000000000..4416027c8387a17726f061519f49cd181843ac1d --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_buffers.cu @@ -0,0 +1,75 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#define _cuda_buffers_cu +#include "cuda_buffers.cuh" + +CudaBuffers* g_buffers[CUDA_MAX_DEVICES] = {NULL}; +// __constant__ half2 q4_table[16][256]; +// half2 q4_table_host[16][256]; +// bool q4_table_init = false; + +CudaBuffers::CudaBuffers +( + int _device, + int _temp_state_size, + half* _temp_state, + half* _temp_dq +) : + device(_device), + temp_state_size(_temp_state_size), + temp_state(_temp_state), + temp_dq(_temp_dq) +{ + cudaSetDevice(_device); + + cudaStreamCreate(&alt_stream_1); + cudaStreamCreate(&alt_stream_2); + cudaStreamCreate(&alt_stream_3); + cudaEventCreate(&alt_stream_1_done); + cudaEventCreate(&alt_stream_2_done); + cudaEventCreate(&alt_stream_3_done); +} + +CudaBuffers::~CudaBuffers() +{ + cudaStreamDestroy(alt_stream_1); + cudaStreamDestroy(alt_stream_2); + cudaStreamDestroy(alt_stream_3); + cudaEventDestroy(alt_stream_1_done); + cudaEventDestroy(alt_stream_2_done); + cudaEventDestroy(alt_stream_3_done); +} + +CudaBuffers* get_buffers(const int device_index) +{ + return g_buffers[device_index]; +} + +void prepare_buffers_cuda +( + int _device, + int _temp_state_size, + half* _temp_state, + half* _temp_dq +) +{ + CudaBuffers* buffers = new CudaBuffers + ( + _device, + _temp_state_size, + _temp_state, + _temp_dq + ); + + g_buffers[_device] = buffers; +} + +void cleanup_buffers_cuda() +{ + for (int i = 0; i < CUDA_MAX_DEVICES; i++) + { + if (!g_buffers[i]) continue; + delete g_buffers[i]; + g_buffers[i] = NULL; + } +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_buffers.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_buffers.cuh new file mode 100644 index 0000000000000000000000000000000000000000..0bf2057c665cbfad46461d437ef5fe44b02f8f2e --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_buffers.cuh @@ -0,0 +1,55 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _cuda_buffers_cuh +#define _cuda_buffers_cuh + +#include +#include +#include +#include + +const int CUDA_MAX_DEVICES = 16; + +// #ifndef _cuda_buffers_cu +// extern __constant__ half2 q4_table[16][256]; +// #endif + +class CudaBuffers +{ +public: + int device; + + half* temp_state; // [max_hidden_rows * intermediate_size] + int temp_state_size; + half* temp_dq; // size of largest quant tensor * 8 + + cudaStream_t alt_stream_1; + cudaStream_t alt_stream_2; + cudaStream_t alt_stream_3; + cudaEvent_t alt_stream_1_done; + cudaEvent_t alt_stream_2_done; + cudaEvent_t alt_stream_3_done; + + CudaBuffers + ( + int _device, + int _temp_state_size, + half* _temp_state, + half* _temp_dq + ); + ~CudaBuffers(); +}; + +CudaBuffers* get_buffers(const int device_index); + +void prepare_buffers_cuda +( + int _device, + int _temp_state_size, + half* _temp_state, + half* _temp_dq +); + +void cleanup_buffers_cuda(); + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/column_remap.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/column_remap.cu new file mode 100644 index 0000000000000000000000000000000000000000..30e4039dd2e94691b3e303a99dfb7bf6aa873b4e --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/column_remap.cu @@ -0,0 +1,63 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#include "column_remap.cuh" +#include "../util.cuh" + +const int SHUF_BLOCKSIZE_X = 256; +const int SHUF_BLOCKSIZE_Y = 16; + +__global__ void column_remap_kernel +( + const half* __restrict__ x, + half* __restrict__ x_new, + const int x_width, + const int x_height, + const uint32_t* x_map +) +{ + int x_column = SHUF_BLOCKSIZE_X * blockIdx.x + threadIdx.x; + int x_row = SHUF_BLOCKSIZE_Y * blockIdx.y; + if (x_column >= x_width) return; + //if (x_row >= x_height) return; + + int x_stride = x_width; + int x_idx = x_row * x_stride + x_column; + + int x_row_end = min(x_row + SHUF_BLOCKSIZE_Y, x_height); + int x_idx_end = x_row_end * x_stride + x_column; + + int s_column = x_map[x_column]; + int s_idx = x_row * x_stride + s_column; + + while (x_idx < x_idx_end) + { + x_new[x_idx] = x[s_idx]; + x_idx += x_stride; + s_idx += x_stride; + } +} + +// Remap columns in x to correspond to sequential group index before matmul +// +// perform x -> seq_x such that seq_x @ seq_w == x @ w + +void column_remap_cuda +( + const half* x, + half* x_new, + const int x_height, + const int x_width, + const uint32_t* x_map +) +{ + dim3 threads(SHUF_BLOCKSIZE_X, 1, 1); + + dim3 blocks + ( + (x_width + SHUF_BLOCKSIZE_X - 1) / SHUF_BLOCKSIZE_X, + (x_height + SHUF_BLOCKSIZE_Y - 1) / SHUF_BLOCKSIZE_Y, + 1 + ); + + column_remap_kernel<<>>(x, x_new, x_width, x_height, x_map); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/column_remap.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/column_remap.cuh new file mode 100644 index 0000000000000000000000000000000000000000..6571c17d6fd51b85276b00fed5a48ea36df40a60 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/column_remap.cuh @@ -0,0 +1,19 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _column_remap_cuh +#define _column_remap_cuh + +#include +#include +#include + +void column_remap_cuda +( + const half* x, + half* x_new, + const int x_height, + const int x_width, + const uint32_t* x_map +); + +#endif \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matmul.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matmul.cu new file mode 100644 index 0000000000000000000000000000000000000000..a407c6b445adf9ef52fde346a92618456150ed7c --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matmul.cu @@ -0,0 +1,260 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#include "q4_matmul.cuh" +#include "column_remap.cuh" +#include "../util.cuh" +#include "../matrix.cuh" +#include "../cu_compat.cuh" +#include "../cuda_buffers.cuh" +#if defined(USE_ROCM) +#include "../hip_compat.cuh" +#endif + +const int THREADS_X = 32; // Block size and thread count along columns in w and out +const int THREADS_Y = 1; // Block size and thread count along rows in x and out + +typedef void (*fp_q4_matmul_kernel) +( + const half*, + const uint32_t*, + half*, + const half*, + const uint32_t*, + const int, + const int, + const int, + const int, + const int, + const uint32_t*, + bool +); + +template +__global__ void q4_matmul_kernel +( + const half* __restrict__ x, + const uint32_t* __restrict__ w, + half* __restrict__ out, + const half* __restrict__ w_scales, + const uint32_t* __restrict__ w_zeros, + const int height, + const int dim, + const int width, + const int groupsize, + const int block_size_z, + const uint32_t* __restrict__ x_map, + bool no_zero +) +{ + // Start of block + + int x_column = block_size_z * blockIdx.z; + int x_column_end = min(dim, block_size_z * (blockIdx.z + 1)); + + int w_column = THREADS_X * blockIdx.x + threadIdx.x; + int x_row = THREADS_Y * blockIdx.y + threadIdx.y; + + int iterations = (x_column_end - x_column) / 8; + + // Views + + MatrixView_half x_(x, height, dim); + MatrixView_half w_scales_(w_scales, dim / groupsize, width); + MatrixView_q4_row w_zeros_(w_zeros, dim / groupsize, width); + MatrixView_q4_column w_(w, dim, width); + MatrixView_half_rw out_(out, height, width); + + // Zero output + + if (!no_zero && blockIdx.z == 0 && (threadIdx.x & 1) == 0) + { + *((uint32_t*) out_.item_ptr(x_row, w_column)) = 0; + __syncthreads(); + } + + // Loop over part of x row (and w column) + + half2 acc = {}; + half acc_h = {}; + + if constexpr (use_groupsize) + { + // For quant matrices where groupsize divides BLOCK_SIZE_Z we always start on a group boundary, so this + // could be slightly faster + + for (int k = x_column, group = x_column / groupsize; k < x_column + iterations * 8; group++, k += groupsize) + { + if constexpr (use_half2) + { + half2 w_scale = w_scales_.item_half2half2(group, w_column); + uint32_t w_zero = (w_zeros_.item(group, w_column) + 1) & 0x0f; // Avoid overflows. + + if constexpr (use_x_map) acc = dot_product_8_x_map(acc, x_, x_row, k, w_, k, w_column, w_scale, w_zero, groupsize / 8, x_map); + else acc = dot_product_8 (acc, x_, x_row, k, w_, k, w_column, w_scale, w_zero, groupsize / 8); + } + else + { + half w_scale = w_scales_.item(group, w_column); + uint32_t w_zero = (w_zeros_.item(group, w_column) + 1) & 0x0f; // Avoid overflows. + + if constexpr (use_x_map) acc_h = dot_product_8_x_map_h(acc_h, x_, x_row, k, w_, k, w_column, w_scale, w_zero, groupsize / 8, x_map); + else acc_h = dot_product_8_h (acc_h, x_, x_row, k, w_, k, w_column, w_scale, w_zero, groupsize / 8); + } + } + } + else + { + // Otherwise assume groupsize is a multiple of 8, do 8 columns per iteration and trust the cache + + for (int k = x_column; k < x_column + iterations * 8; k += 8) + { + if constexpr (use_half2) + { + int group = k / groupsize; + half2 w_scale = w_scales_.item_half2half2(group, w_column); + uint32_t w_zero = (w_zeros_.item(group, w_column) + 1) & 0x0f; // Avoid overflows. + + if constexpr (use_x_map) acc = dot_product_8_x_map(acc, x_, x_row, k, w_, k, w_column, w_scale, w_zero, 1, x_map); + else acc = dot_product_8 (acc, x_, x_row, k, w_, k, w_column, w_scale, w_zero, 1); + } + else + { + int group = k / groupsize; + half w_scale = w_scales_.item(group, w_column); + uint32_t w_zero = (w_zeros_.item(group, w_column) + 1) & 0x0f; // Avoid overflows. + + if constexpr (use_x_map) acc_h = dot_product_8_x_map_h(acc_h, x_, x_row, k, w_, k, w_column, w_scale, w_zero, 1, x_map); + else acc_h = dot_product_8_h (acc_h, x_, x_row, k, w_, k, w_column, w_scale, w_zero, 1); + } + } + } + + // Add to block result + + if constexpr (use_half2) + { + half result = __hadd(__low2half(acc), __high2half(acc)); + atomicAdd(out_.item_ptr(x_row, w_column), result); + } + else + { + atomicAdd(out_.item_ptr(x_row, w_column), acc_h); + } +} + +fp_q4_matmul_kernel q4_matmul_kernel_pick(ExLlamaTuning* tuningParams, int block_size_z, int groupsize, uint32_t* x_map) +{ + // + if (tuningParams->matmul_no_half2) { + if (block_size_z % groupsize == 0) { + if (x_map) return q4_matmul_kernel; + else return q4_matmul_kernel; + } else { + if (x_map) return q4_matmul_kernel; + else return q4_matmul_kernel; + } + } else { + if (block_size_z % groupsize == 0) + { + if (x_map) return q4_matmul_kernel; + else return q4_matmul_kernel; + } else { + if (x_map) return q4_matmul_kernel; + else return q4_matmul_kernel; + } + } +}; + +// Compute y = x @ w + +void q4_matmul_cuda +( + ExLlamaTuning* tuningParams, + const half* x, + const int x_height, + const Q4Matrix* w, + half* out, + bool no_zero, + cudaStream_t alt_stream +) +{ + int height = x_height; + int dim = w->height; + int width = w->width; + + cudaSetDevice(w->device); + + uint32_t* x_map = w->cuda_x_map; + const half* x_mapped = x; + if (x_map && !tuningParams->matmul_fused_remap && !alt_stream) + { + CudaBuffers* buffers = get_buffers(w->device); + column_remap_cuda(x, buffers->temp_state, x_height, dim, w->cuda_x_map); + x_mapped = buffers->temp_state; + x_map = NULL; + } + + int block_size_z; + if (w->width == 4096) block_size_z = 384; // 7B + else if (w->width == 11008) block_size_z = 256; + else if (w->width == 5120) block_size_z = 384; // 13B + else if (w->width == 13824) block_size_z = 256; + else if (w->width == 6656) block_size_z = 256; // 33B + else if (w->width == 17920) block_size_z = 128; + else block_size_z = 256; + + //if (!no_zero) cudaMemsetAsync(out, 0, x_height * w->width * sizeof(half)); + + dim3 threads(THREADS_X, THREADS_Y, 1); + + dim3 blocks + ( + (width + threads.x - 1) / threads.x, + (height + threads.y - 1) / threads.y, + (dim + block_size_z - 1) / block_size_z + ); + + fp_q4_matmul_kernel kernel = q4_matmul_kernel_pick(tuningParams, block_size_z, w->groupsize, x_map); + + kernel<<>> (x_mapped, w->cuda_qweight, out, w->cuda_scales, w->cuda_qzeros, height, dim, width, w->groupsize, block_size_z, x_map, no_zero); +} + +void q4_matmul_recons_cuda +( + ExLlamaTuning* tuningParams, + const half* x, + const int x_height, + Q4Matrix* w, + half* out, + const cublasHandle_t handle, + bool no_zero +) +{ + int height = x_height; + int dim = w->height; + int width = w->width; + + cudaSetDevice(w->device); + CudaBuffers* buffers = get_buffers(w->device); + + const half* x_mapped = x; + if (w->cuda_x_map) + { + TORCH_CHECK(buffers->temp_state_size >= x_height * dim, "The temp_state buffer is too small in the exllama backend for GPTQ with act-order. Please call the exllama_set_max_input_length function to increase the buffer size for a sequence length >=", x_height, ":\nfrom auto_gptq import exllama_set_max_input_length\nmodel = exllama_set_max_input_length(model, max_input_length=", x_height, ")"); + column_remap_cuda(x, buffers->temp_state, x_height, dim, w->cuda_x_map); + x_mapped = buffers->temp_state; + } + + w->reconstruct(buffers->temp_dq); + +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 700 + const float alpha = 1.0f; + const float beta = no_zero ? 1.0f : 0.0f; + cublasSgemmEx(handle, CUBLAS_OP_N, CUBLAS_OP_N, width, height, dim, &alpha, buffers->temp_dq, CUDA_R_16F, width, + x_mapped, CUDA_R_16F, dim, &beta, out, CUDA_R_16F, width); +#else + const half alpha = __float2half(1.0f); + const half beta = no_zero ? __float2half(1.0f) : __float2half(0.0f); + cublasHgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, width, height, dim, &alpha, buffers->temp_dq, width, x_mapped, dim, &beta, out, width); +#endif +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matmul.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matmul.cuh new file mode 100644 index 0000000000000000000000000000000000000000..49967648f2fddfd2254fd377302977d49b7dd0b4 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matmul.cuh @@ -0,0 +1,43 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _q4_matmul_cuh +#define _q4_matmul_cuh + +#include +#include +#include +#include +#include + +#include "q4_matrix.cuh" +#include "../tuning.h" + +// Workaround for hipify_python using rocblas instead of hipblas. +#if defined(USE_ROCM) +#include +#define rocblas_handle hipblasHandle_t +#endif + +void q4_matmul_cuda +( + ExLlamaTuning* tuningParams, + const half* x, + const int x_height, + const Q4Matrix* w, + half* out, + bool no_zero = false, + cudaStream_t alt_stream = NULL +); + +void q4_matmul_recons_cuda +( + ExLlamaTuning* tuningParams, + const half* x, + const int x_height, + Q4Matrix* w, + half* out, + const cublasHandle_t handle, + bool no_zero = false +); + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matrix.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matrix.cu new file mode 100644 index 0000000000000000000000000000000000000000..1906232030c9830bf9c8a0fd04f21e9289d1a997 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matrix.cu @@ -0,0 +1,225 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#include "q4_matrix.cuh" +#include +#include "../util.cuh" +#include "../matrix.cuh" + +using namespace std; + +const int UNSHUF_BLOCKSIZE_X = 64; + +const int RECONS_THREADS_X = 64; // Block size and thread count along columns in out, each thread converts 1 column +const int RECONS_THREADS_Y = 1; // Block size and thread count along rows in x and out, each thread converts 8 rows + +vector g_q4_matrices; + +void g_q4_keep_matrix(Q4Matrix* m) +{ + g_q4_matrices.push_back(m); +} + +void g_q4_free_matrices() +{ + for (const auto& m : g_q4_matrices) delete m; + g_q4_matrices.clear(); +} + +Q4Matrix::Q4Matrix +( + const int _height, + const int _width, + const int _groups, + + uint32_t* _qweight, + uint32_t* _qzeros, + half* _scales, + uint32_t* _g_idx, + + const int _device +) : + height(_height), + width(_width), + groups(_groups), + device(_device) +{ + cudaSetDevice(device); + + cuda_qweight = _qweight; + cuda_qzeros = _qzeros; + cuda_scales = _scales; + + groupsize = height / groups; + + if (_g_idx) make_sequential(_g_idx); +} + +Q4Matrix::~Q4Matrix() +{ +} + +// Make sequential + +__global__ void make_sequential_kernel +( + const uint32_t* __restrict__ w, + uint32_t* __restrict__ w_new, + const uint32_t* __restrict__ x_map, + const int w_height, + const int w_width +) +{ + const uint64_t* w2 = (uint64_t*) w; + uint64_t* w_new2 = (uint64_t*) w_new; + int w2_stride = w_width >> 1; + + int w2_column = UNSHUF_BLOCKSIZE_X * blockIdx.x + threadIdx.x; + if (w2_column >= w2_stride) return; + + int w_new2_row = blockIdx.y; + + int x_map_idx = w_new2_row << 3; + + uint64_t dst = 0; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + int source_row = x_map[x_map_idx++]; + + int w2_row = source_row >> 3; + int w2_subrow = source_row & 0x07; + int w2_row_shift = w2_subrow << 2; + int wnew2_row_shift = i << 2; + + uint64_t src = w2[w2_row * w2_stride + w2_column]; + src >>= w2_row_shift; + src &= 0x0000000f0000000f; + src <<= wnew2_row_shift; + dst |= src; + } + + w_new2[w_new2_row * w2_stride + w2_column] = dst; +} + +void Q4Matrix::make_sequential(const uint32_t* cpu_g_idx) +{ + uint32_t* cuda_new_qweight = NULL; + cudaMalloc(&cuda_new_qweight, height / 8 * width * sizeof(uint32_t)); + cudaMalloc(&cuda_x_map, height * sizeof(uint32_t)); // TODO: Should probably be allocated in PyTorch + + uint32_t* cpu_g_idx_map = (uint32_t*) calloc(groups, sizeof(uint32_t)); + uint32_t* cpu_x_map = (uint32_t*) malloc(height * sizeof(uint32_t)); + uint32_t* cpu_x_map_inv = (uint32_t*) malloc(height * sizeof(uint32_t)); + + // Group histogram + + for (int i = 0; i < height; i++) cpu_g_idx_map[cpu_g_idx[i]]++; + + // Group map + + for (int i = 0, acc = 0; i < groups; i++) + { + short tmp = cpu_g_idx_map[i]; + cpu_g_idx_map[i] = acc; + acc += tmp; + } + + // X map (inverse) + + for (int row = 0; row < height; row++) + { + uint32_t target_group = cpu_g_idx[row]; + uint32_t target_row = cpu_g_idx_map[target_group]; + cpu_g_idx_map[target_group]++; + cpu_x_map_inv[row] = target_row; + } + + // X map + + for (int row = 0; row < height; row++) cpu_x_map[cpu_x_map_inv[row]] = row; + + // Move to CUDA + + cudaMemcpyAsync(cuda_x_map, cpu_x_map, height * sizeof(uint32_t), cudaMemcpyHostToDevice); + + // Rearrange rows in w + + dim3 threads(UNSHUF_BLOCKSIZE_X, 1, 1); + dim3 blocks + ( + (width + UNSHUF_BLOCKSIZE_X * 2 - 1) / (UNSHUF_BLOCKSIZE_X * 2), + height / 8, + 1 + ); + + make_sequential_kernel<<>>(cuda_qweight, cuda_new_qweight, cuda_x_map, height / 8, width); + + // Replace qweights + + cudaMemcpyAsync(cuda_qweight, cuda_new_qweight, height / 8 * width * sizeof(uint32_t), cudaMemcpyDeviceToDevice); + + // Cleanup + + cudaDeviceSynchronize(); + cudaFree(cuda_new_qweight); + free(cpu_g_idx_map); + free(cpu_x_map); + free(cpu_x_map_inv); +} + +__global__ void reconstruct_kernel +( + const uint32_t* __restrict__ w, + half* __restrict__ out, // (y) + const half* __restrict__ w_scales, + const uint32_t* __restrict__ w_zeros, + const int height, + const int width, + const int groupsize +) +{ + // Start of block + + int column = RECONS_THREADS_X * blockIdx.x + threadIdx.x; + int row = (RECONS_THREADS_Y * blockIdx.y + threadIdx.y) * 8; + if (column >= width) return; + + // Views + + MatrixView_q4_column w_(w, height, width); + MatrixView_half_rw out_(out, height, width); + MatrixView_half w_scales_(w_scales, height / groupsize, width); + MatrixView_q4_row w_zeros_(w_zeros, height / groupsize, width); + + // Groupsize version + + int group = row / groupsize; + + half w_scale = w_scales_.item(group, column); + uint32_t w_zero = (w_zeros_.item(group, column) + 1) & 0x0f; // Avoid overflows. + + uint32_t w_read = w_.item_uint32_t(row, column); + half* out_ptr = out_.item_ptr(row, column); + + #pragma unroll + for (int s = 0; s < 32; s += 4) + { + half w_item = __hmul(__int2half_rn((int)((w_read >> s) & 0x0f) - w_zero), w_scale); + *out_ptr = w_item; out_ptr += out_.width; + } +} + +void Q4Matrix::reconstruct(half* out) +{ + dim3 threads(RECONS_THREADS_X, RECONS_THREADS_Y, 1); + + dim3 blocks + ( + (width + threads.x - 1) / threads.x, + (height / 8 + threads.y - 1) / threads.y, + 1 + ); + + reconstruct_kernel<<>>(cuda_qweight, out, cuda_scales, cuda_qzeros, height / 8, width, groupsize); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matrix.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matrix.cuh new file mode 100644 index 0000000000000000000000000000000000000000..50cb72a41518593f6be4dded4f03c61772ef2ef9 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/cuda_func/q4_matrix.cuh @@ -0,0 +1,53 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _q4_matrix_cuh +#define _q4_matrix_cuh + +#include +#include +#include + +class Q4Matrix +{ +public: + + int device; + + int height; + int width; + int groups; + int groupsize; + + uint32_t* cuda_qweight = NULL; + uint32_t* cuda_qzeros = NULL; + half* cuda_scales = NULL; + uint32_t* cuda_x_map = NULL; + + Q4Matrix + ( + const int _height, + const int _width, + const int _groups, + + uint32_t* _qweight, + uint32_t* _qzeros, + half* _scales, + uint32_t* _g_idx, + + const int _device + ); + + ~Q4Matrix(); + + void reconstruct(half* out); + +private: + + void make_sequential(const uint32_t* cpu_g_idx); + +}; + +void g_q4_keep_matrix(Q4Matrix* m); +void g_q4_free_matrices(); + +#endif \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/exllama_ext.cpp b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/exllama_ext.cpp new file mode 100644 index 0000000000000000000000000000000000000000..020fee4e124b61568277821ba1d92f1bf6443839 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/exllama_ext.cpp @@ -0,0 +1,260 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#include +#include +#include +#include +#include +#include +#include +#include "util.cuh" +#include "tuning.h" +#include "cuda_buffers.cuh" +#include "cuda_func/q4_matrix.cuh" +#include "cuda_func/q4_matmul.cuh" +#include "cuda_func/column_remap.cuh" + +#include +#include +#include + +// Check CUDA return code. We don't want to include Torch headers in the .cu files because parsing them adds almost a +// minute to the compile time on a 12900K. Also passing exceptions back to Python is super tricky, so in place of +// exceptions, CUDA functions return with a cudaError_t which we can parse and dump to the console. + +void check_cuda(cudaError_t ret) +{ + switch (ret) + { + case cudaSuccess: + break; + + case cudaUnspecified: + printf(" **** Unspecified error\n"); + TORCH_CHECK(false, "CUDA error"); + break; + + default: + printf(" **** CUDA error\n"); \ + printf(" **** %s\n", cudaGetErrorString(ret)); \ + TORCH_CHECK(false, "CUDA error"); \ + break; + } +} + +// Some decluttering macros + +#define STRINGIFY_(__x) #__x +#define STRINGIFY(__x) STRINGIFY_(__x) +#define TORCH_CHECK_DTYPE(__x, __dtype) TORCH_CHECK((__x).dtype() == torch::__dtype, #__x " is incorrect datatype, must be " #__dtype) +#define TORCH_CHECK_DTYPE_OPT(__x, __dtype) TORCH_CHECK((__x).device().is_meta() || (__x).dtype() == torch::__dtype, #__x " is incorrect datatype, must be " #__dtype) +#define TORCH_CHECK_SHAPES(__x, __dim_x, __y, __dim_y, __scale_y) TORCH_CHECK((__x).size(__dim_x) == (__y).size(__dim_y) * __scale_y, #__x " and " #__y " have incompatible shapes") +#define TORCH_CHECK_SHAPES_OPT(__x, __dim_x, __y, __dim_y, __scale_y) TORCH_CHECK((__x).device().is_meta() || (__x).size(__dim_x) == (__y).size(__dim_y) * __scale_y, #__x " and " #__y " have incompatible shapes") +#define TORCH_CHECK_SHAPE_MOD(__x, __dim_x, __mod) TORCH_CHECK((__x).size(__dim_x) % __mod == 0, #__x ".shape[" STRINGIFY(__dim_x) "] must be a multiple of " STRINGIFY(__mod)) +#define TORCH_CHECK_BUFFER_SIZE(__buffer, __minimum_size) TORCH_CHECK((__buffer).numel() >= __minimum_size, #__buffer " is too small") + +#define TORCH_CHECK_DEVICE_INDEX(__index) \ +do { \ + TORCH_CHECK(__index >= 0, "no device index"); \ + TORCH_CHECK(__index < CUDA_MAX_DEVICES, "invalid device index"); \ +} while(0) + +#define TORCH_CHECK_QUANT(__w, __w_scales, __w_zeros, __seq_g_idx, __x_map) \ +do { \ + TORCH_CHECK_DTYPE(__w, kInt); \ + TORCH_CHECK_DTYPE(__w_scales, kHalf); \ + TORCH_CHECK_DTYPE(__w_zeros, kInt); \ + TORCH_CHECK_DTYPE_OPT(__seq_g_idx, kShort); \ + TORCH_CHECK_DTYPE_OPT(__x_map, kInt); \ + TORCH_CHECK_SHAPES_OPT(__seq_g_idx, 0, __w, 0, 2 * 8); \ + TORCH_CHECK_SHAPES_OPT(__x_map, 0, __w, 0, 8); \ +} while(0) + +int get_groupsize(torch::Tensor w, torch::Tensor w_zeros) +{ + int groupsize = w.size(0) * 8 / w_zeros.size(0); + TORCH_CHECK(groupsize * w_zeros.size(0) == w.size(0) * 8, "w.shape[-2] must be a multiple of zeros.shape[-2]") + return groupsize; +} + + +// Tuning parameters + +ExLlamaTuning tuningParams; + +void set_tuning_params +( + int matmul_recons_thd, + bool matmul_fused_remap, + bool matmul_no_half2 +) +{ + tuningParams.matmul_recons_thd = matmul_recons_thd; + tuningParams.matmul_fused_remap = matmul_fused_remap; + tuningParams.matmul_no_half2 = matmul_no_half2; +} + + +// Release all unmanaged objects allocated by the extension + +void cleanup() +{ + cleanup_buffers_cuda(); + g_q4_free_matrices(); +} + + +// Prepare buffers for forward pass + +void prepare_buffers +( + torch::Device device, + torch::Tensor temp_state, + torch::Tensor temp_dq +) +{ + int device_index = device.index(); + TORCH_CHECK_DEVICE_INDEX(device_index); + const at::cuda::OptionalCUDAGuard device_guard(device); + const long max_int = std::numeric_limits::max(); + + prepare_buffers_cuda + ( + device_index, + // buffer size used for sanity checks + std::clamp((long)temp_state.numel(), (long)0, max_int), + (half*) temp_state.data_ptr(), + (half*) temp_dq.data_ptr() + ); +} + + +// Create Q4Matrix, return handle + +uintptr_t make_q4 +( + torch::Tensor qweight, + torch::Tensor qzeros, + torch::Tensor scales, + torch::Tensor g_idx, + int device +) +{ + TORCH_CHECK_DTYPE(qweight, kInt); + TORCH_CHECK_DTYPE(qzeros, kInt); + TORCH_CHECK_DTYPE(scales, kHalf); + TORCH_CHECK_DTYPE_OPT(g_idx, kInt); + TORCH_CHECK_SHAPES(qweight, 1, qzeros, 1, 8); + TORCH_CHECK_SHAPES(scales, 1, qweight, 1, 1); + TORCH_CHECK_SHAPES(qzeros, 0, scales, 0, 1); + + int width = qweight.size(1); + int height = qweight.size(0) * 8; + int groups = qzeros.size(0); + + Q4Matrix* m = new Q4Matrix + ( + height, + width, + groups, + + (uint32_t*) qweight.data_ptr(), + (uint32_t*) qzeros.data_ptr(), + (half*) scales.data_ptr(), + g_idx.device().is_meta() ? NULL : (uint32_t*) g_idx.data_ptr(), + + device + ); + + g_q4_keep_matrix(m); + return reinterpret_cast (m); +} + + +// Matmul half @ quant -> half + +void q4_matmul +( + torch::Tensor x, + uintptr_t w, + torch::Tensor out +) +{ + Q4Matrix* wm = reinterpret_cast (w); + + TORCH_CHECK_DTYPE(x, kHalf); + TORCH_CHECK_DTYPE(out, kHalf); + TORCH_CHECK_SHAPES(x, 0, out, 0, 1); + TORCH_CHECK(wm->height == x.size(-1), "x and w have incompatible shapes") + + const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); + + int x_height = x.size(0); + + if (tuningParams.matmul_recons_thd == 0 || x_height < tuningParams.matmul_recons_thd) + { + q4_matmul_cuda + ( + &tuningParams, + (half*) x.data_ptr(), + x_height, + wm, + (half*) out.data_ptr() + ); + } + else + { + q4_matmul_recons_cuda + ( + &tuningParams, + (half*) x.data_ptr(), + x_height, + wm, + (half*) out.data_ptr(), + at::cuda::getCurrentCUDABlasHandle() + ); + } +} + + +// Remap columns in half tensor + +void column_remap +( + torch::Tensor x, + torch::Tensor x_new, + torch::Tensor x_map +) +{ + TORCH_CHECK_DTYPE(x, kHalf); + TORCH_CHECK_DTYPE(x_new, kHalf); + TORCH_CHECK_DTYPE(x_map, kInt); + TORCH_CHECK_SHAPES(x_map, 0, x, 1, 1); + + int height = x.size(0); + int width = x.size(1); + + TORCH_CHECK_BUFFER_SIZE(x_new, height * width); + + const at::cuda::OptionalCUDAGuard device_guard(device_of(x)); + + column_remap_cuda + ( + (half*) x.data_ptr(), + (half*) x_new.data_ptr(), + height, + width, + (uint32_t*) x_map.data_ptr() + ); +} + + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) +{ + m.def("set_tuning_params", &set_tuning_params, "set_tuning_params"); + m.def("prepare_buffers", &prepare_buffers, "prepare_buffers"); + m.def("cleanup", &cleanup, "cleanup"); + m.def("make_q4", &make_q4, "make_q4"); + m.def("q4_matmul", &q4_matmul, "q4_matmul"); + m.def("cleanup_buffers_cuda", &cleanup_buffers_cuda, "cleanup_buffers_cuda"); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/hip_compat.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/hip_compat.cuh new file mode 100644 index 0000000000000000000000000000000000000000..680274787bbfcf6720d2db343b01437a066ce667 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/hip_compat.cuh @@ -0,0 +1,53 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _hip_compat_cuh +#define _hip_compat_cuh + +// Workaround for a bug in hipamd, backported from upstream, this is fixed in ROCm 5.6. +__device__ __forceinline__ __half __compat_hrcp(__half x) { + return __half_raw{ + static_cast<_Float16>(__builtin_amdgcn_rcph(static_cast<__half_raw>(x).data))}; +} + +// ROCm 6.0 compatible from: /opt/rocm-6.0.0/include/hip/amd_detail/amd_hip_fp16.h:1708 +__device__ __forceinline__ __half2 __compat_h2rcp(__half2 x) { + return _Float16_2{ + _Float16_2{static_cast<_Float16>(1.0f), + static_cast<_Float16>(1.0f)} / x.data}; +} + +#define hrcp __compat_hrcp +#define h2rcp __compat_h2rcp + +// Automatic conversion of hipblasHgemm doesn't convert half to hipblasHalf. +__host__ __forceinline__ hipblasStatus_t __compat_hipblasHgemm(hipblasHandle_t handle, + hipblasOperation_t transA, + hipblasOperation_t transB, + int m, + int n, + int k, + const half* alpha, + const half* AP, + int lda, + const half* BP, + int ldb, + const half* beta, + half* CP, + int ldc) { + return hipblasHgemm(handle, transA, transB, m, n, k, + reinterpret_cast(alpha), + reinterpret_cast(AP), lda, + reinterpret_cast(BP), ldb, + reinterpret_cast(beta), + reinterpret_cast(CP), ldc); +} +#define hipblasHgemm __compat_hipblasHgemm + +// Previous version of PyTorch were converting to rocBLAS instead of hipBLAS. +#define rocblas_handle hipblasHandle_t +#define rocblas_operation_none HIPBLAS_OP_N +#define rocblas_get_stream hipblasGetStream +#define rocblas_set_stream hipblasSetStream +#define rocblas_hgemm __compat_hipblasHgemm + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/matrix.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/matrix.cuh new file mode 100644 index 0000000000000000000000000000000000000000..2fd5ab0b36cd0dd67c9b6081740bbed12711ee09 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/matrix.cuh @@ -0,0 +1,294 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _matrix_cuh +#define _matrix_cuh + +#include +#include + +class MatrixView_half +{ +public: + const half* data; + const int height; + const int width; + + __device__ __forceinline__ MatrixView_half(const half* data, const int height, const int width) + : data(data), height(height), width(width) + { } + + __device__ __forceinline__ half item(int row, int column) const { return data[row * width + column]; } + __device__ __forceinline__ half2 item_half2(int row, int column) const { return ((half2*)data)[(row * width + column) / 2]; } + __device__ __forceinline__ half2 item_half2half2(int row, int column) const { return __half2half2(data[row * width + column]); } + __device__ __forceinline__ const half* item_ptr(int row, int column) const { return &data[row * width + column]; } +}; + +class MatrixView_half_rw +{ +public: + half* data; + const int height; + const int width; + + __device__ __forceinline__ MatrixView_half_rw(half* data, const int height, const int width) + : data(data), height(height), width(width) + { } + + __device__ __forceinline__ half item(int row, int column) const { return data[row * width + column]; } + __device__ __forceinline__ half2 item_half2(int row, int column) const { return ((half2*)data)[(row * width + column) / 2]; } + __device__ __forceinline__ half* item_ptr(int row, int column) { return &data[row * width + column]; } + __device__ __forceinline__ void set(int row, int column, half value) { data[row * width + column] = value; } + __device__ __forceinline__ void set_half2(int row, int column, half2 value) { ((half2*)data)[(row * width + column) / 2] = value; } +}; + +class MatrixView_q4_row +{ +public: + const uint32_t* data; + const int height; + const int width; + + __device__ __forceinline__ MatrixView_q4_row(const uint32_t* data, const int height, const int width) + : data(data), height(height), width(width) + { } + + __device__ __forceinline__ int item(int row, int column) const + { + int shift = (column & 0x07) * 4; + return (data[row * width / 8 + column / 8] >> shift) & 0x0f; + } +}; + +class MatrixView_q4_column +{ +public: + const uint32_t* data; + const int height; + const int width; + + __device__ __forceinline__ MatrixView_q4_column(const uint32_t* data, const int height, const int width) + : data(data), height(height), width(width) + { } + + __device__ __forceinline__ int item(int row, int column) const + { + int shift = (row & 0x07) * 4; + return (data[row / 8 * width + column] >> shift) & 0x0f; + } + + __device__ __forceinline__ uint32_t item_uint32_t(int row, int column) { return data[row / 8 * width + column]; } + __device__ __forceinline__ const uint32_t* item_uint32_ptr(int row, int column) { return &data[row / 8 * width + column]; } +}; + +// TODO: Rewrite all these dot product functions using functors or something, move to q4_matmul.cu + +// Accumulated dot product of 8-element row vectors in h and quantized column vectors in v, constant zero/scale + +__device__ __forceinline__ half2 dot_product_8 +( + const half2 acc, + MatrixView_half& h_, + const int h_row, + const int h_column, // divisible by 8 + MatrixView_q4_column& v_, + const int v_row, // divisible by 8 + const int v_column, + const half2 v_scale_2, + const uint32_t v_zero, // + 1 (!!) + const int count +) +{ + const half2* h_ptr = (const half2*) h_.item_ptr(h_row, h_column); + const uint32_t* v_ptr = (const uint32_t*) v_.item_uint32_ptr(v_row, v_column); + half2 result = acc; + + for (int i = 0; i < count; i++) + { + uint32_t v_read = *v_ptr; v_ptr += v_.width; + + half v_0 = __int2half_rn((int)((v_read ) & 0x0f) - v_zero); + half v_1 = __int2half_rn((int)((v_read >> 4) & 0x0f) - v_zero); + half v_2 = __int2half_rn((int)((v_read >> 8) & 0x0f) - v_zero); + half v_3 = __int2half_rn((int)((v_read >> 12) & 0x0f) - v_zero); + half v_4 = __int2half_rn((int)((v_read >> 16) & 0x0f) - v_zero); + half v_5 = __int2half_rn((int)((v_read >> 20) & 0x0f) - v_zero); + half v_6 = __int2half_rn((int)((v_read >> 24) & 0x0f) - v_zero); + half v_7 = __int2half_rn((int)((v_read >> 28) ) - v_zero); + + half2 v_01 = __halves2half2(v_0, v_1); + half2 v_23 = __halves2half2(v_2, v_3); + half2 v_45 = __halves2half2(v_4, v_5); + half2 v_67 = __halves2half2(v_6, v_7); + +// half2 v_01 = q4_table[v_zero - 1][(v_read ) & 0xff]; // (constant memory is too slow apparently) +// half2 v_23 = q4_table[v_zero - 1][(v_read >> 8) & 0xff]; +// half2 v_45 = q4_table[v_zero - 1][(v_read >> 16) & 0xff]; +// half2 v_67 = q4_table[v_zero - 1][(v_read >> 24) ]; + + half2 tmp = __hmul2(*h_ptr++, v_01); + tmp = __hfma2(*h_ptr++, v_23, tmp); + tmp = __hfma2(*h_ptr++, v_45, tmp); + tmp = __hfma2(*h_ptr++, v_67, tmp); + result = __hfma2(v_scale_2, tmp, result); + } + + return result; +} + +__device__ __forceinline__ half dot_product_8_h +( + const half acc, + MatrixView_half& h_, + const int h_row, + const int h_column, // divisible by 8 + MatrixView_q4_column& v_, + const int v_row, // divisible by 8 + const int v_column, + const half v_scale, + const uint32_t v_zero, // + 1 (!!) + const int count +) +{ + const half* h_ptr = h_.item_ptr(h_row, h_column); + const uint32_t* v_ptr = (const uint32_t*) v_.item_uint32_ptr(v_row, v_column); + half result = acc; + + for (int i = 0; i < count; i++) + { + uint32_t v_read = *v_ptr; v_ptr += v_.width; + + half v_0 = __int2half_rn((int)((v_read ) & 0x0f) - v_zero); + half v_1 = __int2half_rn((int)((v_read >> 4) & 0x0f) - v_zero); + half v_2 = __int2half_rn((int)((v_read >> 8) & 0x0f) - v_zero); + half v_3 = __int2half_rn((int)((v_read >> 12) & 0x0f) - v_zero); + half v_4 = __int2half_rn((int)((v_read >> 16) & 0x0f) - v_zero); + half v_5 = __int2half_rn((int)((v_read >> 20) & 0x0f) - v_zero); + half v_6 = __int2half_rn((int)((v_read >> 24) & 0x0f) - v_zero); + half v_7 = __int2half_rn((int)((v_read >> 28) ) - v_zero); + + half tmp = __hmul(*h_ptr++, v_0); + tmp = __hfma(*h_ptr++, v_1, tmp); + tmp = __hfma(*h_ptr++, v_2, tmp); + tmp = __hfma(*h_ptr++, v_3, tmp); + tmp = __hfma(*h_ptr++, v_4, tmp); + tmp = __hfma(*h_ptr++, v_5, tmp); + tmp = __hfma(*h_ptr++, v_6, tmp); + tmp = __hfma(*h_ptr++, v_7, tmp); + result = __hfma(v_scale, tmp, result); + } + + return result; +} + +// Accumulated dot product of 8-element row vectors in h and quantized column vectors in v, constant zero/scale, with x_map + +__device__ __forceinline__ half2 dot_product_8_x_map +( + const half2 acc, + MatrixView_half& h_, + const int h_row, + const int h_column, // divisible by 8 + MatrixView_q4_column& v_, + const int v_row, // divisible by 8 + const int v_column, + const half2 v_scale_2, + const uint32_t v_zero, // + 1 (!!) + const int count, + const uint32_t* x_map +) +{ + const half* h_ptr = h_.item_ptr(h_row, 0); + const uint32_t* x_map_ptr = x_map + h_column; + const uint32_t* v_ptr = (const uint32_t*) v_.item_uint32_ptr(v_row, v_column); + half2 result = acc; + + for (int i = 0; i < count; i++) + { + uint32_t v_read = *v_ptr; v_ptr += v_.width; + + half v_0 = __int2half_rn((int)((v_read ) & 0x0f) - v_zero); + half v_1 = __int2half_rn((int)((v_read >> 4) & 0x0f) - v_zero); + half v_2 = __int2half_rn((int)((v_read >> 8) & 0x0f) - v_zero); + half v_3 = __int2half_rn((int)((v_read >> 12) & 0x0f) - v_zero); + half v_4 = __int2half_rn((int)((v_read >> 16) & 0x0f) - v_zero); + half v_5 = __int2half_rn((int)((v_read >> 20) & 0x0f) - v_zero); + half v_6 = __int2half_rn((int)((v_read >> 24) & 0x0f) - v_zero); + half v_7 = __int2half_rn((int)((v_read >> 28) ) - v_zero); + + half2 v_01 = __halves2half2(v_0, v_1); + half2 v_23 = __halves2half2(v_2, v_3); + half2 v_45 = __halves2half2(v_4, v_5); + half2 v_67 = __halves2half2(v_6, v_7); + + half h_0 = h_ptr[*x_map_ptr++]; + half h_1 = h_ptr[*x_map_ptr++]; + half h_2 = h_ptr[*x_map_ptr++]; + half h_3 = h_ptr[*x_map_ptr++]; + half h_4 = h_ptr[*x_map_ptr++]; + half h_5 = h_ptr[*x_map_ptr++]; + half h_6 = h_ptr[*x_map_ptr++]; + half h_7 = h_ptr[*x_map_ptr++]; + + half2 h_01 = __halves2half2(h_0, h_1); + half2 h_23 = __halves2half2(h_2, h_3); + half2 h_45 = __halves2half2(h_4, h_5); + half2 h_67 = __halves2half2(h_6, h_7); + + half2 tmp = __hmul2(h_01, v_01); + tmp = __hfma2(h_23, v_23, tmp); + tmp = __hfma2(h_45, v_45, tmp); + tmp = __hfma2(h_67, v_67, tmp); + result = __hfma2(v_scale_2, tmp, result); + } + + return result; +} + +__device__ __forceinline__ half dot_product_8_x_map_h +( + const half acc, + MatrixView_half& h_, + const int h_row, + const int h_column, // divisible by 8 + MatrixView_q4_column& v_, + const int v_row, // divisible by 8 + const int v_column, + const half v_scale, + const uint32_t v_zero, // + 1 (!!) + const int count, + const uint32_t* x_map +) +{ + const half* h_ptr = h_.item_ptr(h_row, 0); + const uint32_t* x_map_ptr = x_map + h_column; + const uint32_t* v_ptr = (const uint32_t*) v_.item_uint32_ptr(v_row, v_column); + half result = acc; + + for (int i = 0; i < count; i++) + { + uint32_t v_read = *v_ptr; v_ptr += v_.width; + + half v_0 = __int2half_rn((int)((v_read ) & 0x0f) - v_zero); + half v_1 = __int2half_rn((int)((v_read >> 4) & 0x0f) - v_zero); + half v_2 = __int2half_rn((int)((v_read >> 8) & 0x0f) - v_zero); + half v_3 = __int2half_rn((int)((v_read >> 12) & 0x0f) - v_zero); + half v_4 = __int2half_rn((int)((v_read >> 16) & 0x0f) - v_zero); + half v_5 = __int2half_rn((int)((v_read >> 20) & 0x0f) - v_zero); + half v_6 = __int2half_rn((int)((v_read >> 24) & 0x0f) - v_zero); + half v_7 = __int2half_rn((int)((v_read >> 28) ) - v_zero); + + half tmp = __hmul(h_ptr[*x_map_ptr++], v_0); + tmp = __hfma(h_ptr[*x_map_ptr++], v_1, tmp); + tmp = __hfma(h_ptr[*x_map_ptr++], v_2, tmp); + tmp = __hfma(h_ptr[*x_map_ptr++], v_3, tmp); + tmp = __hfma(h_ptr[*x_map_ptr++], v_4, tmp); + tmp = __hfma(h_ptr[*x_map_ptr++], v_5, tmp); + tmp = __hfma(h_ptr[*x_map_ptr++], v_6, tmp); + tmp = __hfma(h_ptr[*x_map_ptr++], v_7, tmp); + result = __hfma(v_scale, tmp, result); + } + + return result; +} + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/tuning.h b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/tuning.h new file mode 100644 index 0000000000000000000000000000000000000000..770ca46aa7c8b38ac96438445f647bbb29a7ea2b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/tuning.h @@ -0,0 +1,13 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _tuning_h +#define _tuning_h + +struct ExLlamaTuning +{ + int matmul_recons_thd; + bool matmul_fused_remap; + bool matmul_no_half2; +}; + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/util.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/util.cuh new file mode 100644 index 0000000000000000000000000000000000000000..7b397573214b2b1f1af50a82320f61aabee5c8f1 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllama/util.cuh @@ -0,0 +1,33 @@ +// Adapted from turboderp exllama: https://github.com/turboderp/exllama + +#ifndef _util_cuh +#define _util_cuh + +#include +#include +#include +#include + +#if defined(USE_ROCM) +#define cudaUnspecified hipErrorUnknown +#else +#define cudaUnspecified cudaErrorApiFailureBase +#endif + +// React to failure on return code != cudaSuccess + +#define _cuda_check(fn) \ +do { \ + {_cuda_err = fn;} \ + if (_cuda_err != cudaSuccess) goto _cuda_fail; \ +} while(false) + +// React to failure on return code == 0 + +#define _alloc_check(fn) \ +do { \ + if (!(fn)) { _cuda_err = cudaUnspecified; goto _cuda_fail; } \ + else _cuda_err = cudaSuccess; \ +} while(false) + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/config.h b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/config.h new file mode 100644 index 0000000000000000000000000000000000000000..86baaf4129d0d0f3415ba83ed73603403da6c6bc --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/config.h @@ -0,0 +1,13 @@ +#ifndef _config_h +#define _config_h + +#define MAX_Q_GEMM_ROWS 50 + +#define QMODE_2BIT 1 +#define QMODE_3BIT 1 +#define QMODE_4BIT 1 +#define QMODE_5BIT 1 +#define QMODE_6BIT 0 +#define QMODE_8BIT 0 + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cpp/util.h b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cpp/util.h new file mode 100644 index 0000000000000000000000000000000000000000..919703a89da8bb1124acd3a06fcbc76c3ce90d6a --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cpp/util.h @@ -0,0 +1,12 @@ +#ifndef _util_h +#define _util_h + +#define DBGS(__x) printf("%s\n", __x) +#define DBGI(__x) printf("%s: %i\n", #__x, __x) +#define DBGI2(__x, __y) printf("%s, %s: %i, %i\n", #__x, #__y, __x, __y) +#define DBGI3(__x, __y, __z) printf("%s, %s, %s: %i, %i, %i\n", #__x, #__y, #__z, __x, __y, __z) +#define DBGF(__x) printf("%s: %f\n", #__x, __x) +#define DBGF2(__x, __y) printf("%s, %s: %f, %f\n", #__x, #__y, __x, __y) +#define DBGF3(__x, __y, __z) printf("%s, %s, %s: %f, %f, %f\n", #__x, #__y, #__z, __x, __y, __z) + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/compat.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/compat.cuh new file mode 100644 index 0000000000000000000000000000000000000000..12684ff8b59fe5daa272dd218ccf2a0170e87333 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/compat.cuh @@ -0,0 +1,56 @@ +#ifndef _compat_cuh +#define _compat_cuh + +// atomicAdd for half types, to support CC < 7.x + +__device__ __forceinline__ void atomicAdd_half(half* address, half val) +{ + unsigned int * address_as_ui = (unsigned int *) ((char *)address - ((size_t)address & 2)); + unsigned int old = *address_as_ui; + unsigned int assumed; + + do + { + assumed = old; + __half_raw hsum; + hsum.x = (size_t)address & 2 ? (old >> 16) : (old & 0xffff); + half tmpres = __hadd(hsum, val); + hsum = __half_raw(tmpres); + old = (size_t)address & 2 ? (old & 0xffff) | (hsum.x << 16) : (old & 0xffff0000) | hsum.x; + old = atomicCAS(address_as_ui, assumed, old); + } + while (assumed != old); +} + +// atomicAdd for half2 types + +__device__ __forceinline__ void atomicAdd_half2(half2* address, half2 val) +{ + unsigned int* address_as_ui = (unsigned int*)address; + unsigned int old = *address_as_ui; + unsigned int assumed; + do + { + assumed = old; + half2 old_val = *((half2*)&old); + half2 new_val = __hadd2(old_val, val); + old = atomicCAS(address_as_ui, assumed, *((unsigned int*)&new_val)); + } + while (assumed != old); +} + +// + +#if defined(__CUDA_ARCH__) || defined(USE_ROCM) +#if __CUDA_ARCH__ < 700 || defined(USE_ROCM) + +__device__ __forceinline__ void atomicAdd(half* address, half val) { atomicAdd_half(address, val); } + +#if __CUDA_ARCH__ < 600 || defined(USE_ROCM) +__device__ __forceinline__ void atomicAdd(half2* address, half2 val) { atomicAdd_half2(address, val); } +#endif + +#endif +#endif + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/compat_gemm.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/compat_gemm.cuh new file mode 100644 index 0000000000000000000000000000000000000000..19b1e4a60416bc082189943eccbe710a10f3c82b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/compat_gemm.cuh @@ -0,0 +1,38 @@ +#ifndef _compat_gemm_cuh +#define _compat_gemm_cuh + +#if defined(USE_ROCM) + +// For some reason this include is not present anywhere in exllama_v2 codebase, but it is required +// for symbols as hipblasHalf. +#include + +__host__ __forceinline__ hipblasStatus_t __compat_hipblasHgemm(hipblasHandle_t handle, + hipblasOperation_t transA, + hipblasOperation_t transB, + int m, + int n, + int k, + const half* alpha, + const half* AP, + int lda, + const half* BP, + int ldb, + const half* beta, + half* CP, + int ldc) { + return hipblasHgemm(handle, transA, transB, m, n, k, + reinterpret_cast(alpha), + reinterpret_cast(AP), lda, + reinterpret_cast(BP), ldb, + reinterpret_cast(beta), + reinterpret_cast(CP), ldc); +} +#define hipblasHgemm __compat_hipblasHgemm + +// Previous version of PyTorch were converting to rocBLAS instead of hipBLAS. +#define rocblas_operation_none HIPBLAS_OP_N +#define rocblas_hgemm __compat_hipblasHgemm +#endif + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/matrix_view.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/matrix_view.cuh new file mode 100644 index 0000000000000000000000000000000000000000..55af84f23a29cd19370558c53447cd8a397db7c4 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/matrix_view.cuh @@ -0,0 +1,121 @@ +#ifndef _matrix_view_cuh +#define _matrix_view_cuh + +#include +#include + +#include "quant/qdq_util.cuh" + +class MatrixView_half +{ +public: + const half* data; + const int height; + const int width; + + __device__ __forceinline__ MatrixView_half(const half* data, const int height, const int width) + : data(data), height(height), width(width) + { } + + __device__ __forceinline__ half item(int row, int column) const { return data[row * width + column]; } + __device__ __forceinline__ half2 item_half2(int row, int column) const { return ((half2*)data)[(row * width + column) / 2]; } + __device__ __forceinline__ half2 item_half2half2(int row, int column) const { return __half2half2(data[row * width + column]); } + __device__ __forceinline__ const half* item_ptr(int row, int column) const { return &data[row * width + column]; } + + __device__ __forceinline__ void item4(half (&items)[4], int row, int column) const + { + half2* ptr = (half2*) item_ptr(row, column); + half2 i01 = ptr[0]; + half2 i23 = ptr[1]; + items[0] = __low2half(i01); + items[1] = __high2half(i01); + items[2] = __low2half(i23); + items[3] = __high2half(i23); + } + __device__ __forceinline__ void item4_f(float (&items)[4], int row, int column) const + { + half2* ptr = (half2*)item_ptr(row, column); + half2 i01 = ptr[0]; + half2 i23 = ptr[1]; + items[0] = __half2float(__low2half(i01)); + items[1] = __half2float(__high2half(i01)); + items[2] = __half2float(__low2half(i23)); + items[3] = __half2float(__high2half(i23)); + } + + __device__ __forceinline__ void item4_h2(half2 (&items)[4], int row, int column) const + { + half2* ptr = (half2*)item_ptr(row, column); + half2 i01 = ptr[0]; + half2 i23 = ptr[1]; + items[0] = __half2half2(__low2half(i01)); + items[1] = __half2half2(__high2half(i01)); + items[2] = __half2half2(__low2half(i23)); + items[3] = __half2half2(__high2half(i23)); + } +}; + +class MatrixView_half_rw +{ +public: + half* data; + const int height; + const int width; + + __device__ __forceinline__ MatrixView_half_rw(half* data, const int height, const int width) + : data(data), height(height), width(width) + { } + + __device__ __forceinline__ half item(int row, int column) const { return data[row * width + column]; } + __device__ __forceinline__ half2 item_half2(int row, int column) const { return ((half2*)data)[(row * width + column) / 2]; } + __device__ __forceinline__ half* item_ptr(int row, int column) { return &data[row * width + column]; } + __device__ __forceinline__ void set(int row, int column, half value) { data[row * width + column] = value; } + __device__ __forceinline__ void set_half2(int row, int column, half2 value) { ((half2*)data)[(row * width + column) / 2] = value; } + + __device__ __forceinline__ void set4(int row, int column, half v0, half v1, half v2, half v3) + { + half2 v01 = __halves2half2(v0, v1); + half2 v23 = __halves2half2(v2, v3); + half2* ptr = (half2*) item_ptr(row, column); + ptr[0] = v01; + ptr[1] = v23; + } +}; + +class MatrixView_q4_row +{ +public: + const uint32_t* data; + const int height; + const int width; + + __device__ __forceinline__ MatrixView_q4_row(const uint32_t* data, const int height, const int width) + : data(data), height(height), width(width) + { } + + __device__ __forceinline__ int item(int row, int column) const + { + int shift = (column & 0x07) * 4; + return (data[row * width / 8 + column / 8] >> shift) & 0x0f; + } + + __device__ __forceinline__ void item2(int (&items)[2], int row, int column) const + { + int shift = (column & 0x07) * 4; + uint32_t d = data[row * width / 8 + column / 8] >> shift; + items[0] = d & 0x0f; + items[1] = (d >> 4) & 0x0f; + } + + __device__ __forceinline__ void item4(int (&items)[4], int row, int column) const + { + int shift = (column & 0x07) * 4; + uint32_t d = data[row * width / 8 + column / 8] >> shift; + items[0] = d & 0x0f; + items[1] = (d >> 4) & 0x0f; + items[2] = (d >> 8) & 0x0f; + items[3] = (d >> 12) & 0x0f; + } +}; + +#endif \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm.cu new file mode 100644 index 0000000000000000000000000000000000000000..351b9cd5bd0d1d31a8bf7253caf2f997d6ce29bc --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm.cu @@ -0,0 +1,211 @@ +#include "q_gemm.cuh" +#include "util.cuh" +#include "matrix_view.cuh" +#include "../config.h" + +#include "quant/qdq_2.cuh" +#include "quant/qdq_3.cuh" +#include "quant/qdq_4.cuh" +#include "quant/qdq_5.cuh" +#include "quant/qdq_6.cuh" +#include "quant/qdq_8.cuh" + +#define BLOCK_KN_SIZE 128 +#define BLOCK_M_SIZE_MAX 8 +#define MAX_GROUPS_IN_BLOCK (BLOCK_KN_SIZE / 32) +#define CLEAR_N_SIZE 256 + +#include "q_gemm_kernel.cuh" +#include "q_gemm_kernel_gptq.cuh" + +#include "compat_gemm.cuh" + +void gemm_half_q_half_cuda_part +( + const half* a, + QMatrix* b, + half* c, + int size_m, + int size_n, + int size_k, + int m_count, + bool clear +) +{ + if (!b->is_gptq) + { + dim3 blockDim, gridDim; + blockDim.x = BLOCK_KN_SIZE; + blockDim.y = 1; + blockDim.z = 1; + gridDim.x = DIVIDE(size_n, BLOCK_KN_SIZE * 4); + gridDim.y = DIVIDE(size_m, m_count); + gridDim.z = DIVIDE(size_k, BLOCK_KN_SIZE); + + fp_gemm_half_q_half_kernel kernel = pick_gemm_half_q_half_kernel(true, m_count); + + kernel<<>> + ( + a, + b->cuda_q_weight, + b->cuda_q_scale, + b->cuda_q_scale_max, + c, + size_m, + size_n, + size_k, + b->groups, + b->groupsize, + b->cuda_q_perm, + b->rows_8, + b->rows_6, + b->rows_5, + b->rows_4, + b->rows_3, + b->rows_2, + clear + ); + } + else + { + dim3 blockDim, gridDim; + blockDim.x = BLOCK_KN_SIZE; + blockDim.y = 1; + blockDim.z = 1; + gridDim.x = DIVIDE(size_n, BLOCK_KN_SIZE * 4); + gridDim.y = DIVIDE(size_m, m_count); + gridDim.z = DIVIDE(size_k, BLOCK_KN_SIZE); + + fp_gemm_half_q_half_gptq_kernel kernel = pick_gemm_half_q_half_gptq_kernel(true, m_count); + +// DBGX((uint64_t) b->cuda_q_perm); +// DBGI(b->rows_4); +// DBGI(b->height); + + kernel<<>> + ( + a, + b->cuda_q_weight, + b->cuda_gptq_qzeros, + b->cuda_gptq_scales, + c, + size_m, + size_n, + size_k, + b->groups, + b->groupsize, + b->cuda_q_perm, + b->rows_4, + clear + ); + } +} + +void gemm_half_q_half_cuda +( + cublasHandle_t cublas_handle, + const half* a, + QMatrix* b, + half* c, + int size_m, + int size_n, + int size_k, + bool clear, + half* temp_dq, + bool force_cuda +) +{ + if (size_m > MAX_Q_GEMM_ROWS && !force_cuda) + { + //printf("cublas\n"); + + // Reconstruct FP16 matrix, then cuBLAS + + if (!temp_dq) temp_dq = b->temp_dq; + b->reconstruct(temp_dq); + + //cublasSetMathMode(cublas_handle, CUBLAS_TENSOR_OP_MATH); + + const half alpha = __float2half(1.0f); + const half beta = clear ? __float2half(0.0f) : __float2half(1.0f); + cublasHgemm(cublas_handle, + CUBLAS_OP_N, + CUBLAS_OP_N, + size_n, size_m, size_k, + &alpha, temp_dq, size_n, + a, size_k, + &beta, c, size_n); + + //const float alpha = 1.0f; + //const float beta = clear ? 0.0f : 1.0f; + //cublasSgemmEx(cublas_handle, + // CUBLAS_OP_N, + // CUBLAS_OP_N, + // size_n, size_m, size_k, + // &alpha, temp_dq, CUDA_R_16F, size_n, + // a, CUDA_R_16F, size_k, + // &beta, c, CUDA_R_16F, size_n); + + //const float alpha = 1.0f; + //const float beta = clear ? 0.0f : 1.0f; + //cublasGemmEx(cublas_handle, + // CUBLAS_OP_N, CUBLAS_OP_N, + // size_n, size_m, size_k, + // &alpha, temp_dq, CUDA_R_16F, size_n, + // a, CUDA_R_16F, size_k, + // &beta, c, CUDA_R_16F, size_n, + // CUDA_R_16F, CUBLAS_GEMM_DFALT_TENSOR_OP); + } + else + { + //printf("cuda\n"); + + // Quantized matmul + + //if (clear) clear_tensor_cuda(c, size_m, size_n); + + int max_chunks = size_m / BLOCK_M_SIZE_MAX; + int last_chunk = max_chunks * BLOCK_M_SIZE_MAX; + int last_chunk_size = size_m - last_chunk; + + if (max_chunks) + { + gemm_half_q_half_cuda_part(a, b, c, last_chunk, size_n, size_k, BLOCK_M_SIZE_MAX, clear); + } + + if (last_chunk_size) + { + gemm_half_q_half_cuda_part(a + last_chunk * size_k, b, c + last_chunk * size_n, last_chunk_size, size_n, size_k, last_chunk_size, clear); + } + } +} + +__global__ void clear_kernel +( + half* __restrict__ c, + const int size_m, + const int size_n +) +{ + int m = blockIdx.y; + int n = (blockIdx.x * CLEAR_N_SIZE + threadIdx.x) * 8; + if (n >= size_n) return; + int4* c_ptr = (int4*)(c + m * size_n + n); + *c_ptr = {}; +} + +void clear_tensor_cuda +( + half* c, + int size_m, + int size_n +) +{ + return; + dim3 blockDim, gridDim; + blockDim.x = CLEAR_N_SIZE; + blockDim.y = 1; + gridDim.x = DIVIDE(size_n / 8, CLEAR_N_SIZE); + gridDim.y = size_m; + clear_kernel<<>>(c, size_m, size_n); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm.cuh new file mode 100644 index 0000000000000000000000000000000000000000..c69f1a70968929f25387c80854c8d73d4d4537a5 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm.cuh @@ -0,0 +1,33 @@ +#ifndef _q_gemm_cuh +#define _q_gemm_cuh + +#include +#include +#include +#include +#include + +#include "q_matrix.cuh" + +void gemm_half_q_half_cuda +( + cublasHandle_t cublas_handle, + const half* a, + QMatrix* b, + half* c, + int size_m, + int size_n, + int size_k, + bool clear = false, + half* reconstruct = NULL, + bool force_cuda = false +); + +void clear_tensor_cuda +( + half* c, + int size_m, + int size_n +); + +#endif \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm_kernel.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..0b899a8406e95508d5b25c374d10f2dc429d22c6 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm_kernel.cuh @@ -0,0 +1,487 @@ +#include "compat.cuh" + +#include +#include + +__forceinline__ __device__ half2 dot22_8(half2(&dq)[4], const half* a_ptr, const half2 g_result, const half qs_h) +{ + half2 result = {}; + const half2* a2_ptr = (const half2*)a_ptr; + #pragma unroll + for (int i = 0; i < 4; i++) result = __hfma2(dq[i], *a2_ptr++, result); + return __hfma2(result, __halves2half2(qs_h, qs_h), g_result); +} + +__forceinline__ __device__ half2 dot22_16(half2(&dq)[8], const half* a_ptr, const half2 g_result, const half qs_h) +{ + half2 result = {}; + const half2* a2_ptr = (const half2*)a_ptr; + #pragma unroll + for (int i = 0; i < 8; i++) result = __hfma2(dq[i], *a2_ptr++, result); + return __hfma2(result, __halves2half2(qs_h, qs_h), g_result); +} + +__forceinline__ __device__ half2 dot22_32(half2(&dq)[16], const half* a_ptr, const half2 g_result, const half qs_h) +{ + half2 result = {}; + const half2* a2_ptr = (const half2*)a_ptr; + #pragma unroll + for (int i = 0; i < 16; i += 1) result = __hfma2(dq[i], *a2_ptr++, result); + return __hfma2(result, __halves2half2(qs_h, qs_h), g_result); +} + +__forceinline__ __device__ float dot22_8_f(half2(&dq)[4], const half* a_ptr, const float g_result, const float qs_f) +{ + half2 result = {}; + const half2* a2_ptr = (const half2*)a_ptr; + #pragma unroll + for (int i = 0; i < 4; i++) result = __hfma2(dq[i], *a2_ptr++, result); + float result_f = __half2float(__low2half(result)) + __half2float(__high2half(result)); + return fma(result_f, qs_f, g_result); +} + +__forceinline__ __device__ float dot22_16_f(half2(&dq)[8], const half* a_ptr, const float g_result, const float qs_f) +{ + half2 result = {}; + const half2* a2_ptr = (const half2*)a_ptr; + #pragma unroll + for (int i = 0; i < 8; i++) result = __hfma2(dq[i], *a2_ptr++, result); + float result_f = __half2float(__low2half(result)) + __half2float(__high2half(result)); + return fma(result_f, qs_f, g_result); +} + +__forceinline__ __device__ float dot22_32_f(half2(&dq)[16], const half* a_ptr, const float g_result, const float qs_f) +{ + half2 result = {}; + const half2* a2_ptr = (const half2*)a_ptr; + #pragma unroll + for (int i = 0; i < 16; i += 1) result = __hfma2(dq[i], *a2_ptr++, result); + float result_f = __half2float(__low2half(result)) + __half2float(__high2half(result)); + return fma(result_f, qs_f, g_result); +} + + + +typedef void (*fp_gemm_half_q_half_kernel) +( + const half*, + const uint32_t*, + const uint32_t*, + const half*, + half*, + const int, + const int, + const int, + const int, + const int, + const uint16_t*, + const int, + const int, + const int, + const int, + const int, + const int, + const bool +); + +template +__global__ void gemm_half_q_half_kernel +( + const half* __restrict__ a, + const uint32_t* __restrict__ b_q_weight, + const uint32_t* __restrict__ b_q_scale, + const half* __restrict__ b_q_scale_max, + half* __restrict__ c, + const int size_m, + const int size_n, + const int size_k, + const int groups, + const int groupsize, + const uint16_t* __restrict__ b_q_perm, + const int rows_8, + const int rows_6, + const int rows_5, + const int rows_4, + const int rows_3, + const int rows_2, + const bool clear +) +{ + MatrixView_half a_(a, size_m, size_k); + MatrixView_half_rw c_(c, size_m, size_n); + MatrixView_q4_row b_q_scale_(b_q_scale, groups, size_n); + + int t = threadIdx.x; + + // Block + + int offset_n = blockIdx.x * BLOCK_KN_SIZE * 4; + int offset_m = blockIdx.y * m_count; + int offset_k = blockIdx.z * BLOCK_KN_SIZE; + + int end_n = min(offset_n + BLOCK_KN_SIZE * 4, size_n); + int end_m = min(offset_m + m_count, size_m); + int end_k = min(offset_k + BLOCK_KN_SIZE, size_k); + int n = offset_n + t * 4; + + // Preload block_a + + __shared__ half block_a[m_count][BLOCK_KN_SIZE]; + + if (offset_k + t < end_k) + { + for (int m = 0; m < m_count; ++m) + { + const half* a_ptr = a_.item_ptr(offset_m + m, 0); + half* block_a_ptr = block_a[m]; + half a0 = a_ptr[b_q_perm[offset_k + t]]; + block_a_ptr[t] = a0; + } + } + + // Clear + + if (n >= size_n) return; + + if (clear && blockIdx.z == 0) // && (threadIdx.x & 1) == 0) + { + for (int m = 0; m < m_count; m++) + *((uint64_t*) c_.item_ptr(offset_m + m, n)) = 0; + } + + __syncthreads(); + + // Find initial group + + int group = offset_k / groupsize; + + // Preload scales + + float scales[MAX_GROUPS_IN_BLOCK][4]; + + int groups_in_block = DIVIDE((end_k - offset_k), groupsize); + for (int g = 0; g < groups_in_block; g++) + { + int qscales[4]; + b_q_scale_.item4(qscales, group + g, n); + qscales[0]++; + qscales[1]++; + qscales[2]++; + qscales[3]++; + float maxscale = __half2float(b_q_scale_max[group + g]); + scales[g][0] = __int2float_rn(qscales[0] * qscales[0]) * maxscale; + scales[g][1] = __int2float_rn(qscales[1] * qscales[1]) * maxscale; + scales[g][2] = __int2float_rn(qscales[2] * qscales[2]) * maxscale; + scales[g][3] = __int2float_rn(qscales[3] * qscales[3]) * maxscale; + } + + // a, b offset + + int pre_rows_8 = min(rows_8, offset_k); + int pre_rows_6 = offset_k > rows_8 ? min(rows_6, offset_k) - rows_8 : 0; + int pre_rows_5 = offset_k > rows_6 ? min(rows_5, offset_k) - rows_6 : 0; + int pre_rows_4 = offset_k > rows_5 ? min(rows_4, offset_k) - rows_5 : 0; + int pre_rows_3 = offset_k > rows_4 ? min(rows_3, offset_k) - rows_4 : 0; + int pre_rows_2 = offset_k > rows_3 ? min(rows_2, offset_k) - rows_3 : 0; + int qk = 0; + qk += pre_rows_8 / 32 * 8; + qk += pre_rows_6 / 32 * 6; + qk += pre_rows_5 / 32 * 5; + qk += pre_rows_4 / 32 * 4; + qk += pre_rows_3 / 32 * 3; + qk += pre_rows_2 / 32 * 2; + + const uint32_t* b_ptr = b_q_weight + qk * size_n + n; + const half* a_ptr = &block_a[0][0]; + int a_stride = BLOCK_KN_SIZE; + + // Initial group + + int scales_idx = 0; + float qs_f0 = scales[scales_idx][0]; + float qs_f1 = scales[scales_idx][1]; + float qs_f2 = scales[scales_idx][2]; + float qs_f3 = scales[scales_idx][3]; + int nextgroup = offset_k + groupsize; + + // Column result + + float block_c[m_count][4] = {}; + + // Dequantize groups + + int k = offset_k; + + while (k < rows_8 && k < end_k) + { + if (k == nextgroup) + { + group++; + scales_idx++; + qs_f0 = scales[scales_idx][0]; + qs_f1 = scales[scales_idx][1]; + qs_f2 = scales[scales_idx][2]; + qs_f3 = scales[scales_idx][3]; + nextgroup += groupsize; + } + + #pragma unroll + for (int j = 0; j < 4; j++) + { + int4 load_int4[2]; + load_int4[0] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[1] = *((int4*) b_ptr); b_ptr += size_n; + + half2 dq[4][4]; + dequant_8bit_8(load_int4[0].x, load_int4[1].x, dq[0], size_n); + dequant_8bit_8(load_int4[0].y, load_int4[1].y, dq[1], size_n); + dequant_8bit_8(load_int4[0].z, load_int4[1].z, dq[2], size_n); + dequant_8bit_8(load_int4[0].w, load_int4[1].w, dq[3], size_n); + + for (int m = 0; m < m_count; m++) + { + block_c[m][0] = dot22_8_f(dq[0], a_ptr + m * a_stride, block_c[m][0], qs_f0); + block_c[m][1] = dot22_8_f(dq[1], a_ptr + m * a_stride, block_c[m][1], qs_f1); + block_c[m][2] = dot22_8_f(dq[2], a_ptr + m * a_stride, block_c[m][2], qs_f2); + block_c[m][3] = dot22_8_f(dq[3], a_ptr + m * a_stride, block_c[m][3], qs_f3); + } + a_ptr += 8; + } + k += 32; + } + + while (k < rows_6 && k < end_k) + { + if (k == nextgroup) + { + group++; + scales_idx++; + qs_f0 = scales[scales_idx][0]; + qs_f1 = scales[scales_idx][1]; + qs_f2 = scales[scales_idx][2]; + qs_f3 = scales[scales_idx][3]; + nextgroup += groupsize; + } + + #pragma unroll + for (int j = 0; j < 2; j++) + { + int4 load_int4[3]; + load_int4[0] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[1] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[2] = *((int4*) b_ptr); b_ptr += size_n; + + half2 dq[4][8]; + dequant_6bit_16(load_int4[0].x, load_int4[1].x, load_int4[2].x, dq[0], size_n); + dequant_6bit_16(load_int4[0].y, load_int4[1].y, load_int4[2].y, dq[1], size_n); + dequant_6bit_16(load_int4[0].z, load_int4[1].z, load_int4[2].z, dq[2], size_n); + dequant_6bit_16(load_int4[0].w, load_int4[1].w, load_int4[2].w, dq[3], size_n); + + for (int m = 0; m < m_count; m++) + { + block_c[m][0] = dot22_16_f(dq[0], a_ptr + m * a_stride, block_c[m][0], qs_f0); + block_c[m][1] = dot22_16_f(dq[1], a_ptr + m * a_stride, block_c[m][1], qs_f1); + block_c[m][2] = dot22_16_f(dq[2], a_ptr + m * a_stride, block_c[m][2], qs_f2); + block_c[m][3] = dot22_16_f(dq[3], a_ptr + m * a_stride, block_c[m][3], qs_f3); + } + a_ptr += 16; + } + k += 32; + } + + while (k < rows_5 && k < end_k) + { + if (k == nextgroup) + { + group++; + scales_idx++; + qs_f0 = scales[scales_idx][0]; + qs_f1 = scales[scales_idx][1]; + qs_f2 = scales[scales_idx][2]; + qs_f3 = scales[scales_idx][3]; + nextgroup += groupsize; + } + + #pragma unroll + for (int j = 0; j < 1; j++) + { + int4 load_int4[5]; + load_int4[0] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[1] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[2] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[3] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[4] = *((int4*) b_ptr); b_ptr += size_n; + + half2 dq[4][16]; + dequant_5bit_32(load_int4[0].x, load_int4[1].x, load_int4[2].x, load_int4[3].x, load_int4[4].x, dq[0], size_n); + dequant_5bit_32(load_int4[0].y, load_int4[1].y, load_int4[2].y, load_int4[3].y, load_int4[4].y, dq[1], size_n); + dequant_5bit_32(load_int4[0].z, load_int4[1].z, load_int4[2].z, load_int4[3].z, load_int4[4].z, dq[2], size_n); + dequant_5bit_32(load_int4[0].w, load_int4[1].w, load_int4[2].w, load_int4[3].w, load_int4[4].w, dq[3], size_n); + + for (int m = 0; m < m_count; m++) + { + block_c[m][0] = dot22_32_f(dq[0], a_ptr + m * a_stride, block_c[m][0], qs_f0); + block_c[m][1] = dot22_32_f(dq[1], a_ptr + m * a_stride, block_c[m][1], qs_f1); + block_c[m][2] = dot22_32_f(dq[2], a_ptr + m * a_stride, block_c[m][2], qs_f2); + block_c[m][3] = dot22_32_f(dq[3], a_ptr + m * a_stride, block_c[m][3], qs_f3); + } + a_ptr += 32; + } + + k += 32; + } + + while (k < rows_4 && k < end_k) + { + if (k == nextgroup) + { + group++; + scales_idx++; + qs_f0 = scales[scales_idx][0]; + qs_f1 = scales[scales_idx][1]; + qs_f2 = scales[scales_idx][2]; + qs_f3 = scales[scales_idx][3]; + nextgroup += groupsize; + } + + #pragma unroll + for (int j = 0; j < 4; j++) + { + int4 load_int4[1]; + load_int4[0] = *((int4*) b_ptr); b_ptr += size_n; + + half2 dq[4][4]; + dequant_4bit_8(load_int4[0].x, dq[0], size_n); + dequant_4bit_8(load_int4[0].y, dq[1], size_n); + dequant_4bit_8(load_int4[0].z, dq[2], size_n); + dequant_4bit_8(load_int4[0].w, dq[3], size_n); + + for (int m = 0; m < m_count; m++) + { + block_c[m][0] = dot22_8_f(dq[0], a_ptr + m * a_stride, block_c[m][0], qs_f0); + block_c[m][1] = dot22_8_f(dq[1], a_ptr + m * a_stride, block_c[m][1], qs_f1); + block_c[m][2] = dot22_8_f(dq[2], a_ptr + m * a_stride, block_c[m][2], qs_f2); + block_c[m][3] = dot22_8_f(dq[3], a_ptr + m * a_stride, block_c[m][3], qs_f3); + } + a_ptr += 8; + } + k += 32; + } + + while (k < rows_3 && k < end_k) + { + if (k == nextgroup) + { + group++; + scales_idx++; + qs_f0 = scales[scales_idx][0]; + qs_f1 = scales[scales_idx][1]; + qs_f2 = scales[scales_idx][2]; + qs_f3 = scales[scales_idx][3]; + nextgroup += groupsize; + } + + #pragma unroll + for (int j = 0; j < 1; j++) + { + int4 load_int4[3]; + load_int4[0] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[1] = *((int4*) b_ptr); b_ptr += size_n; + load_int4[2] = *((int4*) b_ptr); b_ptr += size_n; + + half2 dq[4][16]; + dequant_3bit_32(load_int4[0].x, load_int4[1].x, load_int4[2].x, dq[0], size_n); + dequant_3bit_32(load_int4[0].y, load_int4[1].y, load_int4[2].y, dq[1], size_n); + dequant_3bit_32(load_int4[0].z, load_int4[1].z, load_int4[2].z, dq[2], size_n); + dequant_3bit_32(load_int4[0].w, load_int4[1].w, load_int4[2].w, dq[3], size_n); + + for (int m = 0; m < m_count; m++) + { + block_c[m][0] = dot22_32_f(dq[0], a_ptr + m * a_stride, block_c[m][0], qs_f0); + block_c[m][1] = dot22_32_f(dq[1], a_ptr + m * a_stride, block_c[m][1], qs_f1); + block_c[m][2] = dot22_32_f(dq[2], a_ptr + m * a_stride, block_c[m][2], qs_f2); + block_c[m][3] = dot22_32_f(dq[3], a_ptr + m * a_stride, block_c[m][3], qs_f3); + } + a_ptr += 32; + } + k += 32; + } + + while (k < rows_2 && k < end_k) + { + if (k == nextgroup) + { + group++; + scales_idx++; + qs_f0 = scales[scales_idx][0]; + qs_f1 = scales[scales_idx][1]; + qs_f2 = scales[scales_idx][2]; + qs_f3 = scales[scales_idx][3]; + nextgroup += groupsize; + } + + #pragma unroll + for (int j = 0; j < 2; j++) + { + int4 load_int4[1]; + load_int4[0] = *((int4*) b_ptr); b_ptr += size_n; + + half2 dq[4][8]; + dequant_2bit_16(load_int4[0].x, dq[0], size_n); + dequant_2bit_16(load_int4[0].y, dq[1], size_n); + dequant_2bit_16(load_int4[0].z, dq[2], size_n); + dequant_2bit_16(load_int4[0].w, dq[3], size_n); + + for (int m = 0; m < m_count; m++) + { + block_c[m][0] = dot22_16_f(dq[0], a_ptr + m * a_stride, block_c[m][0], qs_f0); + block_c[m][1] = dot22_16_f(dq[1], a_ptr + m * a_stride, block_c[m][1], qs_f1); + block_c[m][2] = dot22_16_f(dq[2], a_ptr + m * a_stride, block_c[m][2], qs_f2); + block_c[m][3] = dot22_16_f(dq[3], a_ptr + m * a_stride, block_c[m][3], qs_f3); + } + + a_ptr += 16; + } + k += 32; + } + + // Accumulate column sums in c + + for (int m = 0; m < m_count; m++) + { + half2* out = (half2*)c_.item_ptr(offset_m + m, n); + half2 result01 = __halves2half2(__float2half_rn(block_c[m][0]), __float2half_rn(block_c[m][1])); + half2 result23 = __halves2half2(__float2half_rn(block_c[m][2]), __float2half_rn(block_c[m][3])); + atomicAdd(out , result01); + atomicAdd(out + 1, result23); + } +} + +fp_gemm_half_q_half_kernel pick_gemm_half_q_half_kernel(bool first_block, const int m_count) +{ + #if BLOCK_M_SIZE_MAX >= 1 + if (m_count == 1) return gemm_half_q_half_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 2 + if (m_count == 2) return gemm_half_q_half_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 3 + if (m_count == 3) return gemm_half_q_half_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 4 + if (m_count == 4) return gemm_half_q_half_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 5 + if (m_count == 5) return gemm_half_q_half_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 6 + if (m_count == 6) return gemm_half_q_half_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 7 + if (m_count == 7) return gemm_half_q_half_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 8 + if (m_count == 8) return gemm_half_q_half_kernel; + #endif + return NULL; +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm_kernel_gptq.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm_kernel_gptq.cuh new file mode 100644 index 0000000000000000000000000000000000000000..ef595b3d09951e4e07bf3f1ed2f3fc06d2ba5de8 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_gemm_kernel_gptq.cuh @@ -0,0 +1,223 @@ +#include "compat.cuh" + +__forceinline__ __device__ half2 dot22_8(half2(&dq)[4], const half* a_ptr, const half2 g_result) +{ + half2 result = {}; + const half2* a2_ptr = (const half2*)a_ptr; + #pragma unroll + for (int i = 0; i < 4; i++) result = __hfma2(dq[i], *a2_ptr++, result); + return __hadd2(result, g_result); +} + +__forceinline__ __device__ float dot22_8_f(half2(&dq)[4], const half* a_ptr) +{ + half2 result = {}; + const half2* a2_ptr = (const half2*)a_ptr; + #pragma unroll + for (int i = 0; i < 4; i++) result = __hfma2(dq[i], *a2_ptr++, result); + return __half2float(__low2half(result)) + __half2float(__high2half(result)); +} + +typedef void (*fp_gemm_half_q_half_gptq_kernel) +( + const half*, + const uint32_t*, + const uint32_t*, + const half*, + half*, + const int, + const int, + const int, + const int, + const int, + const uint16_t*, + const int, + const bool +); + +template +__global__ void gemm_half_q_half_gptq_kernel +( + const half* __restrict__ a, + const uint32_t* __restrict__ b_q_weight, + const uint32_t* __restrict__ b_gptq_qzeros, + const half* __restrict__ b_gptq_scales, + half* __restrict__ c, + const int size_m, + const int size_n, + const int size_k, + const int groups, + const int groupsize, + const uint16_t* __restrict__ b_q_perm, + const int rows_4, + const bool clear +) +{ + MatrixView_half a_(a, size_m, size_k); + MatrixView_half_rw c_(c, size_m, size_n); + MatrixView_q4_row b_gptq_qzeros_(b_gptq_qzeros, groups, size_n); + MatrixView_half b_gptq_scales_(b_gptq_scales, groups, size_n); + + int t = threadIdx.x; + + // Block + + int offset_n = blockIdx.x * BLOCK_KN_SIZE * 4; + int offset_m = blockIdx.y * m_count; + int offset_k = blockIdx.z * BLOCK_KN_SIZE; + + int end_n = min(offset_n + BLOCK_KN_SIZE * 4, size_n); + int end_m = min(offset_m + m_count, size_m); + int end_k = min(offset_k + BLOCK_KN_SIZE, size_k); + + int n = offset_n + t * 4; + + // Preload block_a + + __shared__ half block_a[m_count][BLOCK_KN_SIZE]; + + if (offset_k + t < end_k) + { + for (int m = 0; m < m_count; ++m) + { + const half* a_ptr = a_.item_ptr(offset_m + m, 0); + half* block_a_ptr = block_a[m]; + + half a0; + if (b_q_perm) a0 = a_ptr[b_q_perm[offset_k + t]]; + else a0 = a_ptr[offset_k + t]; + block_a_ptr[t] = a0; + } + } + + // Zero output + + if (n >= size_n) return; + + if (clear && blockIdx.z == 0) // && (threadIdx.x & 1) == 0) + { + for (int m = 0; m < m_count; m++) + *((uint64_t*)c_.item_ptr(offset_m + m, n)) = 0; + } + + __syncthreads(); + + // Find initial group + + int group = offset_k / groupsize; + int nextgroup = offset_k + groupsize; + + // a, b offset + + int qk = offset_k / (32 / 4); + + const uint32_t* b_ptr = b_q_weight + qk * size_n + n; + const half* a_ptr = &block_a[0][0]; + int a_stride = BLOCK_KN_SIZE; + + // Initial group + + int zeros[4]; + float scales[4]; + half2 z1z16[4][2]; + half2 y1y16[4][2]; + b_gptq_qzeros_.item4(zeros, group, n); + b_gptq_scales_.item4_f(scales, group, n); + + // Avoid zeros overflow with & 0x0f. + dequant_4bit_8_prep_zero((zeros[0] + 1) & 0x0f, z1z16[0], y1y16[0]); + dequant_4bit_8_prep_zero((zeros[1] + 1) & 0x0f, z1z16[1], y1y16[1]); + dequant_4bit_8_prep_zero((zeros[2] + 1) & 0x0f, z1z16[2], y1y16[2]); + dequant_4bit_8_prep_zero((zeros[3] + 1) & 0x0f, z1z16[3], y1y16[3]); + +// __syncthreads(); + + // Column result + + float block_c[m_count][4] = {}; + + // Dequantize and multiply + + int k = offset_k; + while (k < end_k) + { + if (k == nextgroup) + { + group++; + nextgroup += groupsize; + b_gptq_qzeros_.item4(zeros, group, n); + b_gptq_scales_.item4_f(scales, group, n); + + // Avoid zeros overflow with & 0x0f. + dequant_4bit_8_prep_zero((zeros[0] + 1) & 0x0f, z1z16[0], y1y16[0]); + dequant_4bit_8_prep_zero((zeros[1] + 1) & 0x0f, z1z16[1], y1y16[1]); + dequant_4bit_8_prep_zero((zeros[2] + 1) & 0x0f, z1z16[2], y1y16[2]); + dequant_4bit_8_prep_zero((zeros[3] + 1) & 0x0f, z1z16[3], y1y16[3]); + } + + #pragma unroll + for (int j = 0; j < 4; j++) + { + const int4* b_ptr4 = (int4*) b_ptr; + int4 load_int4 = *b_ptr4; + + half2 dq[4][4]; + dequant_4bit_8_gptq(load_int4.x, dq[0], z1z16[0], y1y16[0], size_n, false); + dequant_4bit_8_gptq(load_int4.y, dq[1], z1z16[1], y1y16[1], size_n, false); + dequant_4bit_8_gptq(load_int4.z, dq[2], z1z16[2], y1y16[2], size_n, false); + dequant_4bit_8_gptq(load_int4.w, dq[3], z1z16[3], y1y16[3], size_n, false); + + #pragma unroll + for (int m = 0; m < m_count; m++) + { + block_c[m][0] = fma(dot22_8_f(dq[0], a_ptr + m * a_stride), scales[0], block_c[m][0]); + block_c[m][1] = fma(dot22_8_f(dq[1], a_ptr + m * a_stride), scales[1], block_c[m][1]); + block_c[m][2] = fma(dot22_8_f(dq[2], a_ptr + m * a_stride), scales[2], block_c[m][2]); + block_c[m][3] = fma(dot22_8_f(dq[3], a_ptr + m * a_stride), scales[3], block_c[m][3]); + } + + b_ptr += size_n; + a_ptr += 8; + } + + k += 32; + } + + for (int m = 0; m < m_count; m++) + { + half2 *out = (half2*) c_.item_ptr(offset_m + m, n); + half2 result01 = __halves2half2(__float2half_rn(block_c[m][0]), __float2half_rn(block_c[m][1])); + half2 result23 = __halves2half2(__float2half_rn(block_c[m][2]), __float2half_rn(block_c[m][3])); + atomicAdd(out , result01); + atomicAdd(out + 1, result23); + } +} + +fp_gemm_half_q_half_gptq_kernel pick_gemm_half_q_half_gptq_kernel(bool first_block, const int m_count) +{ + #if BLOCK_M_SIZE_MAX >= 1 + if (m_count == 1) return gemm_half_q_half_gptq_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 2 + if (m_count == 2) return gemm_half_q_half_gptq_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 3 + if (m_count == 3) return gemm_half_q_half_gptq_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 4 + if (m_count == 4) return gemm_half_q_half_gptq_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 5 + if (m_count == 5) return gemm_half_q_half_gptq_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 6 + if (m_count == 6) return gemm_half_q_half_gptq_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 7 + if (m_count == 7) return gemm_half_q_half_gptq_kernel; + #endif + #if BLOCK_M_SIZE_MAX >= 8 + if (m_count == 8) return gemm_half_q_half_gptq_kernel; + #endif + return NULL; +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_matrix.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_matrix.cu new file mode 100644 index 0000000000000000000000000000000000000000..39fc978bc334b43dcc07236e1423c0223d8948a7 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_matrix.cu @@ -0,0 +1,627 @@ +#include "q_matrix.cuh" +#include "matrix_view.cuh" +#include "util.cuh" + +#include "quant/qdq_2.cuh" +#include "quant/qdq_3.cuh" +#include "quant/qdq_4.cuh" +#include "quant/qdq_5.cuh" +#include "quant/qdq_6.cuh" +#include "quant/qdq_8.cuh" + +#define BLOCK_KN_SIZE 128 + +#define THREADS_X 32 +#define THREADS_Y 32 + +// Shuffle quantized data on load + +__global__ void shuffle_kernel +( + uint32_t* __restrict__ b_q_weight, + const int size_k, + const int size_n, + const int rows_8, + const int rows_6, + const int rows_5, + const int rows_4, + const int rows_3, + const int rows_2 +) +{ + int n = blockIdx.x * THREADS_X + threadIdx.x; + if (n >= size_n) return; + int k = 0; + uint32_t* b_ptr = b_q_weight + n; + while (k < rows_8) { shuffle_8bit_4 (b_ptr, size_n); b_ptr += 1 * size_n; k += 4; } + while (k < rows_6) { shuffle_6bit_16(b_ptr, size_n); b_ptr += 3 * size_n; k += 16; } + while (k < rows_5) { shuffle_5bit_32(b_ptr, size_n); b_ptr += 5 * size_n; k += 32; } + while (k < rows_4) { shuffle_4bit_8 (b_ptr, size_n); b_ptr += 1 * size_n; k += 8; } + while (k < rows_3) { shuffle_3bit_32(b_ptr, size_n); b_ptr += 3 * size_n; k += 32; } + while (k < rows_2) { shuffle_2bit_16(b_ptr, size_n); b_ptr += 1 * size_n; k += 16; } +} + + +// QMatrix constructor + +QMatrix::QMatrix +( + const int _device, + const int _height, + const int _width, + const int _groups, + + uint32_t* _q_weight, + uint16_t* _q_perm, + uint16_t* _q_invperm, + uint32_t* _q_scale, + half* _q_scale_max, + uint16_t* _q_groups, + + uint32_t* _gptq_qzeros, + half* _gptq_scales, + uint32_t* _gptq_g_idx, + + half* _temp_dq +) : + device(_device), + height(_height), + width(_width), + groups(_groups), + temp_dq(_temp_dq) +{ + cudaSetDevice(device); + + failed = false; + + cuda_q_weight = _q_weight; + cuda_q_perm = _q_perm; + cuda_q_invperm = _q_invperm; + cuda_q_scale = _q_scale; + cuda_q_scale_max = _q_scale_max; + cuda_q_groups = _q_groups; + cuda_gptq_qzeros = _gptq_qzeros; + cuda_gptq_scales = _gptq_scales; + + is_gptq = (_gptq_qzeros != NULL); + + groupsize = 1; + while (groupsize * groups < height) groupsize *= 2; + + // Create group map + + rows_8 = 0; + rows_6 = 0; + rows_5 = 0; + rows_4 = 0; + rows_3 = 0; + rows_2 = 0; + + if (!is_gptq) + { + uint16_t* cpu_q_groups = (uint16_t*)calloc(groups * 2, sizeof(uint16_t)); + cudaMemcpy(cpu_q_groups, cuda_q_groups, groups * 2 * sizeof(uint16_t), cudaMemcpyDeviceToHost); + + for (int i = 0; i < groups; i++) + { + int bits = cpu_q_groups[i * 2]; + if (bits == 8) rows_8 += groupsize; + if (bits == 6) rows_6 += groupsize; + if (bits == 5) rows_5 += groupsize; + if (bits == 4) rows_4 += groupsize; + if (bits == 3) rows_3 += groupsize; + if (bits == 2) rows_2 += groupsize; + } + + free(cpu_q_groups); + + rows_6 += rows_8; + rows_5 += rows_6; + rows_4 += rows_5; + rows_3 += rows_4; + rows_2 += rows_3; + } + else + { + rows_4 = height; + rows_3 = height; + rows_2 = height; + + if (_gptq_g_idx) + { + if (!make_sequential(_gptq_g_idx)) + { + failed = true; + //printf("FAIL\n"); + return; + } + } + } + + // Shuffle quantized data + + dim3 blockDim, gridDim; + blockDim.x = THREADS_X; + blockDim.y = 1; + gridDim.x = DIVIDE(width, THREADS_X); + gridDim.y = 1; + + shuffle_kernel<<>>(cuda_q_weight, height, width, rows_8, rows_6, rows_5, rows_4, rows_3, rows_2); +} + +QMatrix::~QMatrix() +{ +} + +// Reconstruct b[k,n] (GPTQ) + +__global__ void reconstruct_gptq_kernel +( + const uint32_t* __restrict__ b_q_weight, + const uint16_t* __restrict__ b_q_perm, + const uint32_t* __restrict__ b_gptq_qzeros, + const half* __restrict__ b_gptq_scales, + //const uint16_t* __restrict__ b_q_groups, + const int size_k, + const int size_n, + const int groupsize, + const int groups, + half* __restrict__ b, + const int rows_4 +) +{ + MatrixView_half_rw b_(b, size_k, size_n); + MatrixView_q4_row b_gptq_qzeros_(b_gptq_qzeros, groups, size_n); + MatrixView_half b_gptq_scales_(b_gptq_scales, groups, size_n); + + int offset_k = BLOCK_KN_SIZE * blockIdx.y; + int offset_n = BLOCK_KN_SIZE * blockIdx.x * 4; + + int end_k = min(offset_k + BLOCK_KN_SIZE, size_k); + + // Preload remapping table + + __shared__ uint16_t perm[BLOCK_KN_SIZE]; + int t = threadIdx.x; + + if (b_q_perm) + { + if (offset_k + t < size_k) + perm[t] = b_q_perm[offset_k + t]; + } + + // Column + + int n = offset_n + t * 4; + if (n >= size_n) return; + + // Find initial group + + int group = offset_k / groupsize; + int nextgroup = offset_k + groupsize; + + // b offset + + int qk = offset_k / (32 / 4); + + const uint32_t* b_ptr = b_q_weight + qk * size_n + n; + + // Initial zeros/scale + + int zeros[4]; + half2 scales[4]; + half2 z1z16[4][2]; + half2 y1y16[4][2]; + b_gptq_qzeros_.item4(zeros, group, n); + b_gptq_scales_.item4_h2(scales, group, n); + + // Avoid zeros overflow with & 0x0f. + dequant_4bit_8_prep_zero((zeros[0] + 1) & 0x0f, z1z16[0], y1y16[0]); + dequant_4bit_8_prep_zero((zeros[1] + 1) & 0x0f, z1z16[1], y1y16[1]); + dequant_4bit_8_prep_zero((zeros[2] + 1) & 0x0f, z1z16[2], y1y16[2]); + dequant_4bit_8_prep_zero((zeros[3] + 1) & 0x0f, z1z16[3], y1y16[3]); + + __syncthreads(); + + int k = offset_k; + int lk = 0; + + while (k < end_k) + { + if (k == nextgroup) + { + group++; + nextgroup += groupsize; + b_gptq_qzeros_.item4(zeros, group, n); + b_gptq_scales_.item4_h2(scales, group, n); + + // Avoid zeros overflow with & 0x0f. + dequant_4bit_8_prep_zero((zeros[0] + 1) & 0x0f, z1z16[0], y1y16[0]); + dequant_4bit_8_prep_zero((zeros[1] + 1) & 0x0f, z1z16[1], y1y16[1]); + dequant_4bit_8_prep_zero((zeros[2] + 1) & 0x0f, z1z16[2], y1y16[2]); + dequant_4bit_8_prep_zero((zeros[3] + 1) & 0x0f, z1z16[3], y1y16[3]); + } + + for (int p = 0; p < 4; p++) + { + half2 dq[4][4]; + const int4* b_ptr4 = (int4*) b_ptr; + int4 load_int4 = *b_ptr4; + + dequant_4bit_8_gptq(load_int4.x, dq[0], z1z16[0], y1y16[0], size_n, false); + dequant_4bit_8_gptq(load_int4.y, dq[1], z1z16[1], y1y16[1], size_n, false); + dequant_4bit_8_gptq(load_int4.z, dq[2], z1z16[2], y1y16[2], size_n, false); + dequant_4bit_8_gptq(load_int4.w, dq[3], z1z16[3], y1y16[3], size_n, false); + + b_ptr += size_n; + //half* dqh = (half*)dq; + if (b_q_perm) + { + for (int j = 0; j < 4; j++) + { + for (int v = 0; v < 4; v++) dq[v][j] = __hmul2(scales[v], dq[v][j]); + b_.set4(perm[lk++], n, __low2half(dq[0][j]), __low2half(dq[1][j]), __low2half(dq[2][j]), __low2half(dq[3][j])); + b_.set4(perm[lk++], n, __high2half(dq[0][j]), __high2half(dq[1][j]), __high2half(dq[2][j]), __high2half(dq[3][j])); + } + } + else + { + for (int j = 0; j < 4; j++) + { + for (int v = 0; v < 4; v++) dq[v][j] = __hmul2(scales[v], dq[v][j]); + b_.set4(offset_k + lk++, n, __low2half(dq[0][j]), __low2half(dq[1][j]), __low2half(dq[2][j]), __low2half(dq[3][j])); + b_.set4(offset_k + lk++, n, __high2half(dq[0][j]), __high2half(dq[1][j]), __high2half(dq[2][j]), __high2half(dq[3][j])); + } + } + } + k += 32; + } +} + + +// Reconstruct b[k,n] + +__global__ void reconstruct_kernel +( + const uint32_t* __restrict__ b_q_weight, + const uint16_t* __restrict__ b_q_perm, + const uint32_t* __restrict__ b_q_scale, + const half* __restrict__ b_q_scale_max, + //const uint16_t* __restrict__ b_q_groups, + const int size_k, + const int size_n, + const int groupsize, + const int groups, + half* __restrict__ b, + const int rows_8, + const int rows_6, + const int rows_5, + const int rows_4, + const int rows_3, + const int rows_2 +) +{ + MatrixView_half_rw b_(b, size_k, size_n); + MatrixView_q4_row b_q_scale_(b_q_scale, groups, size_n); + + int offset_k = BLOCK_KN_SIZE * blockIdx.y; + int offset_n = BLOCK_KN_SIZE * blockIdx.x; + + // Preload remapping table + + int t = threadIdx.x; + __shared__ uint16_t perm[BLOCK_KN_SIZE]; + if (offset_k + t < size_k) + perm[t] = b_q_perm[offset_k + t]; + + // Column + + int n = offset_n + t; + if (n >= size_n) return; + + // Find initial group + + int group = offset_k / groupsize; + + int pre_rows_8 = min(rows_8, offset_k); + int pre_rows_6 = offset_k > rows_8 ? min(rows_6, offset_k) - rows_8 : 0; + int pre_rows_5 = offset_k > rows_6 ? min(rows_5, offset_k) - rows_6 : 0; + int pre_rows_4 = offset_k > rows_5 ? min(rows_4, offset_k) - rows_5 : 0; + int pre_rows_3 = offset_k > rows_4 ? min(rows_3, offset_k) - rows_4 : 0; + int pre_rows_2 = offset_k > rows_3 ? min(rows_2, offset_k) - rows_3 : 0; + int qk = 0; + qk += pre_rows_8 / 32 * 8; + qk += pre_rows_6 / 32 * 6; + qk += pre_rows_5 / 32 * 5; + qk += pre_rows_4 / 32 * 4; + qk += pre_rows_3 / 32 * 3; + qk += pre_rows_2 / 32 * 2; + + const uint32_t* b_ptr = b_q_weight + qk * size_n + n; + + half qs_h = dq_scale(b_q_scale_.item(group, n), b_q_scale_max[group]); + half2 qs_h2 = __halves2half2(qs_h, qs_h); + int nextgroup = offset_k + groupsize; + + int end_k = min(offset_k + BLOCK_KN_SIZE, size_k); + int k = offset_k; + int lk = 0; + + __syncthreads(); + + while (k < rows_8 && k < end_k) + { + if (k == nextgroup) { group++; qs_h = dq_scale(b_q_scale_.item(group, n), b_q_scale_max[group]); nextgroup += groupsize; qs_h2 = __halves2half2(qs_h, qs_h); } + for (int p = 0; p < 4; p++) + { + half2 dq[4]; + uint32_t q_0 = *b_ptr; b_ptr += size_n; + uint32_t q_1 = *b_ptr; b_ptr += size_n; + dequant_8bit_8(q_0, q_1, dq, size_n); + for (int j = 0; j < 4; j++) dq[j] = __hmul2(dq[j], qs_h2); + half* dqh = (half*) dq; + for (int j = 0; j < 8; j++) b_.set(perm[lk++], n, dqh[j]); + } + k += 32; + } + + while (k < rows_6 && k < end_k) + { + if (k == nextgroup) { group++; qs_h = dq_scale(b_q_scale_.item(group, n), b_q_scale_max[group]); nextgroup += groupsize; qs_h2 = __halves2half2(qs_h, qs_h); } + for (int p = 0; p < 2; p++) + { + half2 dq[8]; + uint32_t q_0 = *b_ptr; b_ptr += size_n; + uint32_t q_1 = *b_ptr; b_ptr += size_n; + uint32_t q_2 = *b_ptr; b_ptr += size_n; + dequant_6bit_16(q_0, q_1, q_2, dq, size_n); + for (int j = 0; j < 8; j++) dq[j] = __hmul2(dq[j], qs_h2); + half* dqh = (half*) dq; + for (int j = 0; j < 16; j++) b_.set(perm[lk++], n, dqh[j]); + } + k += 32; + } + + while (k < rows_5 && k < end_k) + { + if (k == nextgroup) { group++; qs_h = dq_scale(b_q_scale_.item(group, n), b_q_scale_max[group]); nextgroup += groupsize; qs_h2 = __halves2half2(qs_h, qs_h); } + for (int p = 0; p < 1; p++) + { + half2 dq[16]; + uint32_t q_0 = *b_ptr; b_ptr += size_n; + uint32_t q_1 = *b_ptr; b_ptr += size_n; + uint32_t q_2 = *b_ptr; b_ptr += size_n; + uint32_t q_3 = *b_ptr; b_ptr += size_n; + uint32_t q_4 = *b_ptr; b_ptr += size_n; + dequant_5bit_32(q_0, q_1, q_2, q_3, q_4, dq, size_n); + for (int j = 0; j < 16; j++) dq[j] = __hmul2(dq[j], qs_h2); + half* dqh = (half*) dq; + for (int j = 0; j < 32; j++) b_.set(perm[lk++], n, dqh[j]); + } + k += 32; + } + + while (k < rows_4 && k < end_k) + { + if (k == nextgroup) { group++; qs_h = dq_scale(b_q_scale_.item(group, n), b_q_scale_max[group]); nextgroup += groupsize; qs_h2 = __halves2half2(qs_h, qs_h); } + for (int p = 0; p < 4; p++) + { + half2 dq[4]; + uint32_t q_0 = *b_ptr; b_ptr += size_n; + dequant_4bit_8(q_0, dq, size_n); + for (int j = 0; j < 4; j++) dq[j] = __hmul2(dq[j], qs_h2); + half* dqh = (half*) dq; + for (int j = 0; j < 8; j++) b_.set(perm[lk++], n, dqh[j]); + } + k += 32; + } + + while (k < rows_3 && k < end_k) + { + if (k == nextgroup) { group++; qs_h = dq_scale(b_q_scale_.item(group, n), b_q_scale_max[group]); nextgroup += groupsize; qs_h2 = __halves2half2(qs_h, qs_h); } + for (int p = 0; p < 1; p++) + { + half2 dq[16]; + uint32_t q_0 = *b_ptr; b_ptr += size_n; + uint32_t q_1 = *b_ptr; b_ptr += size_n; + uint32_t q_2 = *b_ptr; b_ptr += size_n; + dequant_3bit_32(q_0, q_1, q_2, dq, size_n); + for (int j = 0; j < 16; j++) dq[j] = __hmul2(dq[j], qs_h2); + half* dqh = (half*) dq; + for (int j = 0; j < 32; j++) b_.set(perm[lk++], n, dqh[j]); + } + k += 32; + } + + while (k < rows_2 && k < end_k) + { + if (k == nextgroup) { group++; qs_h = dq_scale(b_q_scale_.item(group, n), b_q_scale_max[group]); nextgroup += groupsize; qs_h2 = __halves2half2(qs_h, qs_h); } + for (int p = 0; p < 2; p++) + { + half2 dq[8]; + uint32_t q_0 = *b_ptr; b_ptr += size_n; + dequant_2bit_16(q_0, dq, size_n); + for (int j = 0; j < 8; j++) dq[j] = __hmul2(dq[j], qs_h2); + half* dqh = (half*) dq; + for (int j = 0; j < 16; j++) b_.set(perm[lk++], n, dqh[j]); + } + k += 32; + } +} + +void QMatrix::reconstruct(half* out) +{ + dim3 blockDim, gridDim; + blockDim.x = BLOCK_KN_SIZE; + blockDim.y = 1; + gridDim.y = DIVIDE(height, BLOCK_KN_SIZE); + + if (!is_gptq) + { + gridDim.x = DIVIDE(width, BLOCK_KN_SIZE); + reconstruct_kernel<<>> + ( + cuda_q_weight, + cuda_q_perm, + cuda_q_scale, + cuda_q_scale_max, + //cuda_q_groups, + height, + width, + groupsize, + groups, + out, + rows_8, + rows_6, + rows_5, + rows_4, + rows_3, + rows_2 + ); + } + else + { + gridDim.x = DIVIDE(width, BLOCK_KN_SIZE * 4); + reconstruct_gptq_kernel<<>> + ( + cuda_q_weight, + cuda_q_perm, + cuda_gptq_qzeros, + cuda_gptq_scales, + //const uint16_t* __restrict__ b_q_groups, + height, + width, + groupsize, + groups, + out, + rows_4 + ); + } +} + +__global__ void make_sequential_kernel +( + const uint32_t* __restrict__ w, + uint32_t* __restrict__ w_new, + const uint16_t* __restrict__ q_perm, + const int w_height, + const int w_width +) +{ + const uint64_t* w2 = (uint64_t*) w; + uint64_t* w_new2 = (uint64_t*) w_new; + int w2_stride = w_width >> 1; + + int w2_column = THREADS_X * blockIdx.x + threadIdx.x; + if (w2_column >= w2_stride) return; + + int w_new2_row = blockIdx.y; + + int q_perm_idx = w_new2_row << 3; + + uint64_t dst = 0; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + int source_row = q_perm[q_perm_idx++]; + + int w2_row = source_row >> 3; + int w2_subrow = source_row & 0x07; + int w2_row_shift = w2_subrow << 2; + int wnew2_row_shift = i << 2; + + uint64_t src = w2[w2_row * w2_stride + w2_column]; + src >>= w2_row_shift; + src &= 0x0000000f0000000f; + src <<= wnew2_row_shift; + dst |= src; + } + + w_new2[w_new2_row * w2_stride + w2_column] = dst; +} + +bool QMatrix::make_sequential(const uint32_t* cpu_g_idx) +{ + uint32_t* cuda_new_qweight = NULL; + cudaError_t err = cudaMalloc(&cuda_new_qweight, height / 8 * width * sizeof(uint32_t)); + if (err != cudaSuccess) { + cudaError_t cuda_status = cudaGetLastError(); // Clear error + return false; + } + + uint32_t* cpu_g_idx_map = (uint32_t*) calloc(groups, sizeof(uint32_t)); + uint32_t* cpu_x_map = (uint32_t*) malloc(height * sizeof(uint32_t)); + uint32_t* cpu_x_map_inv = (uint32_t*) malloc(height * sizeof(uint32_t)); + + // Group histogram + + for (int i = 0; i < height; i++) cpu_g_idx_map[cpu_g_idx[i]]++; + + // Group map + + for (int i = 0, acc = 0; i < groups; i++) + { + short tmp = cpu_g_idx_map[i]; + cpu_g_idx_map[i] = acc; + acc += tmp; + } + + // X map (inverse) + + for (int row = 0; row < height; row++) + { + uint32_t target_group = cpu_g_idx[row]; + uint32_t target_row = cpu_g_idx_map[target_group]; + cpu_g_idx_map[target_group]++; + cpu_x_map_inv[row] = target_row; + } + + // X map + + for (int row = 0; row < height; row++) cpu_x_map[cpu_x_map_inv[row]] = row; + + // Reduce to uint16_t + + uint16_t* cpu_x_map16 = (uint16_t*)cpu_x_map; + uint16_t* cpu_x_map_inv16 = (uint16_t*)cpu_x_map_inv; + for (int row = 0; row < height; row++) cpu_x_map16[row] = (uint16_t) cpu_x_map[row]; + for (int row = 0; row < height; row++) cpu_x_map_inv16[row] = (uint16_t) cpu_x_map_inv[row]; + + // Move to CUDA + + cudaMemcpyAsync(cuda_q_perm, cpu_x_map16, height * sizeof(uint16_t), cudaMemcpyHostToDevice); + cudaMemcpyAsync(cuda_q_invperm, cpu_x_map_inv16, height * sizeof(uint16_t), cudaMemcpyHostToDevice); + + // Rearrange rows in w + + dim3 blockDim, gridDim; + blockDim.x = THREADS_X; + blockDim.y = 1; + gridDim.x = DIVIDE(width, THREADS_X); + gridDim.y = height / 8; + + make_sequential_kernel<<>> + ( + cuda_q_weight, + cuda_new_qweight, + cuda_q_perm, + height / 8, + width + ); + + // Replace qweights + + cudaMemcpyAsync(cuda_q_weight, cuda_new_qweight, height / 8 * width * sizeof(uint32_t), cudaMemcpyDeviceToDevice); + + // Cleanup + + cudaDeviceSynchronize(); + + cudaFree(cuda_new_qweight); + free(cpu_g_idx_map); + free(cpu_x_map); + free(cpu_x_map_inv); + + return true; +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_matrix.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_matrix.cuh new file mode 100644 index 0000000000000000000000000000000000000000..dda83a4f395761d6c3683bf8a3b0d82b0b4afc28 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/q_matrix.cuh @@ -0,0 +1,73 @@ +#ifndef _q_matrix_cuh +#define _q_matrix_cuh + +#include +#include +#include +#include + +#define MAX_SUPERGROUPS 16 + +class QMatrix +{ +public: + + int device; + bool is_gptq; + + int height; + int width; + int groups; + int groupsize; + + int rows_8; + int rows_6; + int rows_5; + int rows_4; + int rows_3; + int rows_2; + + uint32_t* cuda_q_weight = NULL; + uint16_t* cuda_q_perm = NULL; + uint16_t* cuda_q_invperm = NULL; + uint32_t* cuda_q_scale = NULL; + half* cuda_q_scale_max = NULL; + uint16_t* cuda_q_groups = NULL; + uint32_t* cuda_gptq_qzeros = NULL; + half* cuda_gptq_scales = NULL; + + half* temp_dq; + + bool failed; + + QMatrix + ( + const int _device, + const int _height, + const int _width, + const int _groups, + + uint32_t* _q_weight, + uint16_t* _q_perm, + uint16_t* _q_invperm, + uint32_t* _q_scale, + half* _q_scale_max, + uint16_t* _q_groups, + + uint32_t* _gptq_qzeros, + half* _gptq_scales, + uint32_t* _gptq_g_idx, + + half* _temp_dq + ); + + ~QMatrix(); + + void reconstruct(half* out); + bool make_sequential(const uint32_t* cpu_g_idx); + +private: + +}; + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_2.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_2.cuh new file mode 100644 index 0000000000000000000000000000000000000000..3beaeefa9e28f01bc3dbb47ae01f0f1d3dc34ddd --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_2.cuh @@ -0,0 +1,103 @@ +#ifndef _qdq_2_cuh +#define _qdq_2_cuh + +#include "qdq_util.cuh" +#include "../../config.h" + +#if QMODE_2BIT == 1 + +// Permutation: +// +// ffddbb99 77553311 eeccaa88 66442200 + +__forceinline__ __device__ void shuffle_2bit_16 +( + uint32_t* q, + int stride +) +{ + uint32_t qa = q[0]; + uint32_t qb = 0; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + uint32_t qa0 = qa & 0x03; + uint32_t qa1 = (qa & 0x0c) >> 2; + qa >>= 4; + qb |= (qa1 << (i * 2 + 16)); + qb |= (qa0 << (i * 2)); + } + q[0] = qb; +} + +__forceinline__ __device__ void dequant_2bit_16 +( + const uint32_t q_0, + half2 (&dq)[8], + int stride +) +{ + const uint32_t c0 = 0x64006400; + const half y4_ = __float2half_rn(1.0f / 4.0f); + const half y16_ = __float2half_rn(1.0f / 16.0f); + const half y64_ = __float2half_rn(1.0f / 64.0f); + const half2 y4 = __halves2half2(y4_, y4_); + const half2 y16 = __halves2half2(y16_, y16_); + const half2 y64 = __halves2half2(y64_, y64_); + const half z1_ = __float2half_rn(-1024.0f - 2.0f); + const half z4_ = __float2half_rn(-1024.0f / 4.0f - 2.0f); + const half z16_ = __float2half_rn(-1024.0f / 16.0f - 2.0f); + const half z64_ = __float2half_rn(-1024.0f / 64.0f - 2.0f); + const half2 z1 = __halves2half2(z1_, z1_); + const half2 z4 = __halves2half2(z4_, z4_); + const half2 z16 = __halves2half2(z16_, z16_); + const half2 z64 = __halves2half2(z64_, z64_); + + uint32_t qa = q_0; + half2_uint32 q0((qa & 0x00030003) | c0); // half2(q[ 0], q[ 1]) + 1024 + half2_uint32 q1((qa & 0x000c000c) | c0); // half2(q[ 2], q[ 3]) * 4 + 1024 + half2_uint32 q2((qa & 0x00300030) | c0); // half2(q[ 4], q[ 5]) * 16 + 1024 + half2_uint32 q3((qa & 0x00c000c0) | c0); // half2(q[ 6], q[ 7]) * 64 + 1024 + qa >>= 8; + half2_uint32 q4((qa & 0x00030003) | c0); // half2(q[ 8], q[ 8]) + 1024 + half2_uint32 q5((qa & 0x000c000c) | c0); // half2(q[10], q[11]) * 4 + 1024 + half2_uint32 q6((qa & 0x00300030) | c0); // half2(q[12], q[13]) * 16 + 1024 + half2_uint32 q7((qa & 0x00c000c0) | c0); // half2(q[14], q[15]) * 64 + 1024 + + dq[0] = __hadd2(q0.as_half2, z1); + dq[1] = __hfma2(q1.as_half2, y4, z4); + dq[2] = __hfma2(q2.as_half2, y16, z16); + dq[3] = __hfma2(q3.as_half2, y64, z64); + dq[4] = __hadd2(q4.as_half2, z1); + dq[5] = __hfma2(q5.as_half2, y4, z4); + dq[6] = __hfma2(q6.as_half2, y16, z16); + dq[7] = __hfma2(q7.as_half2, y64, z64); +} + +#else + +__forceinline__ __device__ void shuffle_2bit_16 +( + uint32_t* q, + int stride +) +{ +} + +__forceinline__ __device__ void dequant_2bit_16 +( + const uint32_t q_0, + half2 (&dq)[8], + int stride +) +{ + half dqh[16]; + for (int i = 0; i < 16; i++) dqh[i] = dq_ns(exb(q_0, i * 2, 0x03), 2); + + for (int i = 0; i < 8; i++) dq[i] = __halves2half2(dqh[i * 2], dqh[i * 2 + 1]); +} + +#endif + +#endif \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_3.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_3.cuh new file mode 100644 index 0000000000000000000000000000000000000000..101173763dff938a3728fa2261ed6449f58c2ee3 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_3.cuh @@ -0,0 +1,169 @@ +#ifndef _qdq_3_cuh +#define _qdq_3_cuh + +#include "qdq_util.cuh" +#include "../../config.h" + +#if QMODE_3BIT == 1 + +// Permutation: +// +// v9997775 55333111 u8886664 44222000 (u, v lsb) +// vjjjhhhf ffdddbbb uiiiggge eecccaaa +// vtttrrrp ppnnnlll usssqqqo oommmkkk + +__forceinline__ __device__ void shuffle_3bit_32 +( + uint32_t* q, + int stride +) +{ + uint32_t qa = q[0 * stride]; + uint32_t qb = q[1 * stride]; + uint32_t qc = q[2 * stride]; + + // qa: aa999888 77766655 54443332 22111000 + // qb: lkkkjjji iihhhggg fffeeedd dcccbbba + // qc: vvvuuutt tsssrrrq qqpppooo nnnmmmll + + uint32_t qd = qc >> 26; + qc <<= 4; + qc |= qb >> 28; + qb <<= 2; + qb |= qa >> 30; + + // qa: ..999888 77766655 54443332 22111000 + // qb: ..jjjiii hhhgggff feeedddc ccbbbaaa + // qc: ..tttsss rrrqqqpp pooonnnm mmlllkkk + // qd: vvvuuu + + uint32_t za = 0; + uint32_t zb = 0; + uint32_t zc = 0; + + for (int i = 0; i < 5; i++) { uint32_t t0 = qa & 0x07; uint32_t t1 = (qa & 0x38) >> 3; qa >>= 6; za |= (t0 << (i * 3)); za |= (t1 << (i * 3 + 16)); } + for (int i = 0; i < 5; i++) { uint32_t t0 = qb & 0x07; uint32_t t1 = (qb & 0x38) >> 3; qb >>= 6; zb |= (t0 << (i * 3)); zb |= (t1 << (i * 3 + 16)); } + for (int i = 0; i < 5; i++) { uint32_t t0 = qc & 0x07; uint32_t t1 = (qc & 0x38) >> 3; qc >>= 6; zc |= (t0 << (i * 3)); zc |= (t1 << (i * 3 + 16)); } + + // za: 9997775 55333111 8886664 44222000 + // zb: jjjhhhf ffdddbbb iiiggge eecccaaa + // zc: tttrrrp ppnnnlll sssqqqo oommmkkk + // qd: vvvuuu + + za |= ((qd & 0x01) >> 0) << 15; + zb |= ((qd & 0x02) >> 1) << 15; + zc |= ((qd & 0x04) >> 2) << 15; + za |= ((qd & 0x08) >> 3) << 31; + zb |= ((qd & 0x10) >> 4) << 31; + zc |= ((qd & 0x20) >> 5) << 31; + + // za: v9997775 55333111 u8886664 44222000 (u, v lsb) + // zb: vjjjhhhf ffdddbbb uiiiggge eecccaaa + // zc: vtttrrrp ppnnnlll usssqqqo oommmkkk + + q[0 * stride] = za; + q[1 * stride] = zb; + q[2 * stride] = zc; +} + +__forceinline__ __device__ void dequant_3bit_32 +( + const uint32_t q_0, + const uint32_t q_1, + const uint32_t q_2, + half2 (&dq)[16], + int stride +) +{ + const uint32_t c0 = 0x64006400; + const half y8_ = __float2half_rn(1.0f / 8.0f); + const half y64_ = __float2half_rn(1.0f / 64.0f); + const half2 y8 = __halves2half2(y8_, y8_); + const half2 y64 = __halves2half2(y64_, y64_); + const half z1_ = __float2half_rn(-1024.0f - 4.0f); + const half z8_ = __float2half_rn(-1024.0f / 8.0f - 4.0f); + const half z64_ = __float2half_rn(-1024.0f / 64.0f - 4.0f); + const half2 z1 = __halves2half2(z1_, z1_); + const half2 z8 = __halves2half2(z8_, z8_); + const half2 z64 = __halves2half2(z64_, z64_); + + uint32_t qa = q_0; + uint32_t qb = q_1; + uint32_t qc = q_2; + + half2_uint32 q0((qa & 0x00070007) | c0); // half2(q[ 0], q[ 1]) + 1024 + half2_uint32 q1((qa & 0x00380038) | c0); // half2(q[ 2], q[ 3]) * 8 + 1024 + qa >>= 6; + half2_uint32 q2((qa & 0x00070007) | c0); // half2(q[ 4], q[ 5]) + 1024 + half2_uint32 q3((qa & 0x00380038) | c0); // half2(q[ 6], q[ 7]) * 8 + 1024 + half2_uint32 q4((qa & 0x01c001c0) | c0); // half2(q[ 8], q[ 9]) * 64 + 1024 + qa >>= 9; + qa &= 0x00010001; + half2_uint32 q5((qb & 0x00070007) | c0); // half2(q[10], q[11]) + 1024 + half2_uint32 q6((qb & 0x00380038) | c0); // half2(q[12], q[13]) * 8 + 1024 + qb >>= 6; + half2_uint32 q7((qb & 0x00070007) | c0); // half2(q[14], q[15]) + 1024 + half2_uint32 q8((qb & 0x00380038) | c0); // half2(q[16], q[17]) * 8 + 1024 + half2_uint32 q9((qb & 0x01c001c0) | c0); // half2(q[18], q[19]) * 64 + 1024 + qb >>= 8; + qb &= 0x00020002; + half2_uint32 q10((qc & 0x00070007) | c0); // half2(q[20], q[21]) + 1024 + half2_uint32 q11((qc & 0x00380038) | c0); // half2(q[22], q[23]) * 8 + 1024 + qc >>= 6; + half2_uint32 q12((qc & 0x00070007) | c0); // half2(q[24], q[25]) + 1024 + half2_uint32 q13((qc & 0x00380038) | c0); // half2(q[26], q[27]) * 8 + 1024 + half2_uint32 q14((qc & 0x01c001c0) | c0); // half2(q[28], q[29]) * 64 + 1024 + qc >>= 7; + qc &= 0x00040004; + half2_uint32 q15((qa | qb | qc) | c0); + + dq[ 0] = __hadd2( q0.as_half2, z1); + dq[ 1] = __hfma2( q1.as_half2, y8, z8); + dq[ 2] = __hadd2( q2.as_half2, z1); + dq[ 3] = __hfma2( q3.as_half2, y8, z8); + dq[ 4] = __hfma2( q4.as_half2, y64, z64); + dq[ 5] = __hadd2( q5.as_half2, z1); + dq[ 6] = __hfma2( q6.as_half2, y8, z8); + dq[ 7] = __hadd2( q7.as_half2, z1); + dq[ 8] = __hfma2( q8.as_half2, y8, z8); + dq[ 9] = __hfma2( q9.as_half2, y64, z64); + dq[10] = __hadd2(q10.as_half2, z1); + dq[11] = __hfma2(q11.as_half2, y8, z8); + dq[12] = __hadd2(q12.as_half2, z1); + dq[13] = __hfma2(q13.as_half2, y8, z8); + dq[14] = __hfma2(q14.as_half2, y64, z64); + dq[15] = __hadd2(q15.as_half2, z1); +} + +#else + +__forceinline__ __device__ void shuffle_3bit_32 +( + uint32_t* q, + int stride +) +{ +} + +__forceinline__ __device__ void dequant_3bit_32 +( + const uint32_t q_0, + const uint32_t q_1, + const uint32_t q_2, + half2 (&dq)[16], + int stride +) +{ + half dqh[32]; + for (int i = 0; i < 10; i++) dqh[ i] = dq_ns(exb( q_0, i * 3 , 0x07), 4); + dqh[10 ] = dq_ns(exb(q_1, q_0, 30, 0x07), 4); + for (int i = 0; i < 10; i++) dqh[11 + i] = dq_ns(exb( q_1, i * 3 + 1, 0x07), 4); + dqh[21 ] = dq_ns(exb(q_2, q_1, 31, 0x07), 4); + for (int i = 0; i < 10; i++) dqh[22 + i] = dq_ns(exb( q_2, i * 3 + 2, 0x07), 4); + + for (int i = 0; i < 16; i++) dq[i] = __halves2half2(dqh[i * 2], dqh[i * 2 + 1]); +} + +#endif + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_4.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_4.cuh new file mode 100644 index 0000000000000000000000000000000000000000..5fb070d06e44d7a52dd7d471a43d80cff9a7c5f5 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_4.cuh @@ -0,0 +1,227 @@ +#ifndef _qdq_4_cuh +#define _qdq_4_cuh + +#include "qdq_util.cuh" +#include "../../config.h" + +#if QMODE_4BIT == 1 + +// Permutation: +// +// 77775555 33331111 66664444 22220000 + +__forceinline__ __device__ void shuffle_4bit_8 +( + uint32_t* q, + int stride +) +{ + uint32_t qa = q[0]; + uint32_t qb = 0; + + #pragma unroll + for (int i = 0; i < 4; i++) + { + uint32_t qa0 = qa & 0x0f; + uint32_t qa1 = (qa & 0xf0) >> 4; + qa >>= 8; + qb |= (qa1 << (i * 4 + 16)); + qb |= (qa0 << (i * 4)); + } + q[0] = qb; +} + +__forceinline__ __device__ void dequant_4bit_8 +( + const uint32_t q_0, + half2 (&dq)[4], + int stride +) +{ + const uint32_t c0 = 0x64006400; + const half y16_ = __float2half_rn(1.0f / 16.0f); + const half2 y16 = __halves2half2(y16_, y16_); + const half z1_ = __float2half_rn(-1024.0f - 8.0f); + const half z16_ = __float2half_rn(-1024.0f / 16.0f - 8.0f); + const half2 z1 = __halves2half2(z1_, z1_); + const half2 z16 = __halves2half2(z16_, z16_); + + uint32_t qa = q_0; + half2_uint32 q0((qa & 0x000f000f) | c0); // half2(q[ 0], q[ 1]) + 1024 + half2_uint32 q1((qa & 0x00f000f0) | c0); // half2(q[ 2], q[ 3]) * 16 + 1024 + qa >>= 8; + half2_uint32 q2((qa & 0x000f000f) | c0); // half2(q[ 4], q[ 5]) + 1024 + half2_uint32 q3((qa & 0x00f000f0) | c0); // half2(q[ 6], q[ 7]) * 16 + 1024 + + dq[0] = __hadd2(q0.as_half2, z1); + dq[1] = __hfma2(q1.as_half2, y16, z16); + dq[2] = __hadd2(q2.as_half2, z1); + dq[3] = __hfma2(q3.as_half2, y16, z16); +} + +__forceinline__ __device__ void dequant_4bit_8_prep_zero_scale +( + const uint32_t zero, + const half scale, + half2 (&z1z16)[2], + half2 (&y1y16)[2] +) +{ + half_uint16 z1(0xe400 | zero); // half(-1024.0f - zero); + half z16 = __hsub(__int2half_rn(-64), __int2half_rn(zero)); + + half2 scale2 = __half2half2(scale); + + z1z16[0] = __hmul2(scale2, __half2half2(z1.as_half)); + z1z16[1] = __hmul2(scale2, __half2half2(z16)); + + const half y1 = __float2half_rn(1.0f); + const half y16 = __float2half_rn(1.0f / 16.0f); + + y1y16[0] = __hmul2(scale2, __half2half2(y1)); + y1y16[1] = __hmul2(scale2, __half2half2(y16)); +} + +__forceinline__ __device__ void dequant_4bit_8_prep_zero +( + const uint32_t zero, + half2(&z1z16)[2], + half2(&y1y16)[2] +) +{ + half_uint16 z1(0xe400 | zero); // half(-1024.0f - zero); + half z16 = __hsub(__int2half_rn(-64), __int2half_rn(zero)); + + z1z16[0] = __half2half2(z1.as_half); + z1z16[1] = __half2half2(z16); + + const half y1 = __float2half_rn(1.0f); + const half y16 = __float2half_rn(1.0f / 16.0f); + + y1y16[0] = __half2half2(y1); + y1y16[1] = __half2half2(y16); +} + + +__forceinline__ __device__ void dequant_4bit_8_gptq +( + const uint32_t q_0, + half2 (&dq)[4], + half2 (&z1z16)[2], + half2 (&y1y16)[2], + int stride, + bool scaled +) +{ + const uint32_t c0 = 0x64006400; + + uint32_t qa = q_0; + half2_uint32 q0((qa & 0x000f000f) | c0); // half2( q[0] + 1024, q[1] + 1024 ) + half2_uint32 q1((qa & 0x00f000f0) | c0); // half2( q[2] * 16 + 1024, q[3] * 16 + 1024 ) + qa >>= 8; + half2_uint32 q2((qa & 0x000f000f) | c0); // half2( q[4] + 1024, q[5] + 1024 ) + half2_uint32 q3((qa & 0x00f000f0) | c0); // half2( q[6] * 16 + 1024, q[7] * 16 + 1024 ) + + if (scaled) + { + dq[0] = __hfma2(q0.as_half2, y1y16[0], z1z16[0]); // half2( q[0] * s - z * s, q[1] * s - z * s) + dq[1] = __hfma2(q1.as_half2, y1y16[1], z1z16[1]); // half2( q[2] * s - z * s, q[3] * s - z * s) + dq[2] = __hfma2(q2.as_half2, y1y16[0], z1z16[0]); + dq[3] = __hfma2(q3.as_half2, y1y16[1], z1z16[1]); + } + else + { + dq[0] = __hadd2(q0.as_half2, z1z16[0]); // half2( q[0] - z, q[1] - z ) + dq[1] = __hfma2(q1.as_half2, y1y16[1], z1z16[1]); // half2( q[2] - z, q[3] - z ) + dq[2] = __hadd2(q2.as_half2, z1z16[0]); // half2( q[4] - z, q[5] - z ) + dq[3] = __hfma2(q3.as_half2, y1y16[1], z1z16[1]); // half2( q[6] - z, q[7] - z ) + } +} + +#else + +__forceinline__ __device__ void shuffle_4bit_8 +( + uint32_t* q, + int stride +) +{ +} + +__forceinline__ __device__ void dequant_4bit_8 +( + const uint32_t q_0, + half2 (&dq)[4], + int stride +) +{ + half dqh[8]; + for (int i = 0; i < 8; i++) dqh[i] = dq_ns(exb(q_0, i * 4, 0x0f), 8); + + for (int i = 0; i < 4; i++) dq[i] = __halves2half2(dqh[i * 2], dqh[i * 2 + 1]); +} + +__forceinline__ __device__ void dequant_4bit_8_prep_zero_scale +( + const uint32_t zero, + const half scale, + half2 (&z1)[2], + half2 (&y1)[2] +) +{ + half z = __int2half_rn(-((int)zero)); + z = __hmul(z, scale); + z1[0] = __half2half2(z); + y1[0] = __half2half2(scale); +} + +__forceinline__ __device__ void dequant_4bit_8_prep_zero +( + const uint32_t zero, + half2(&z1)[2], + half2(&y1)[2] +) +{ + half z = __int2half_rn(-((int)zero)); + z1[0] = __half2half2(z); +} + +__forceinline__ __device__ void dequant_4bit_8_gptq +( + const uint32_t q_0, + half2 (&dq)[4], + half2 (&z1)[2], + half2 (&y1)[2], + int stride, + bool scaled +) +{ + half2 dqh2[8]; + + uint32_t qa = q_0; + for (int i = 0; i < 4; i++) + { + half d0 = __int2half_rn(qa & 0x0f); qa >>= 4; + half d1 = __int2half_rn(qa & 0x0f); qa >>= 4; + dqh2[i] = __halves2half2(d0, d1); + } + + if (scaled) + { + dq[0] = __hfma2(dqh2[0], y1[0], z1[0]); + dq[1] = __hfma2(dqh2[1], y1[0], z1[0]); + dq[2] = __hfma2(dqh2[2], y1[0], z1[0]); + dq[3] = __hfma2(dqh2[3], y1[0], z1[0]); + } + else + { + dq[0] = __hadd2(dqh2[0], z1[0]); + dq[1] = __hadd2(dqh2[1], z1[0]); + dq[2] = __hadd2(dqh2[2], z1[0]); + dq[3] = __hadd2(dqh2[3], z1[0]); + } +} + +#endif + +#endif \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_5.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_5.cuh new file mode 100644 index 0000000000000000000000000000000000000000..454e4b93b21aaa6a8fc1f2547ce179be948e1ffe --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_5.cuh @@ -0,0 +1,207 @@ +#ifndef _qdq_5_cuh +#define _qdq_5_cuh + +#include "qdq_util.cuh" +#include "../../config.h" + +#if QMODE_5BIT == 1 + +// Permutation: +// +// v5555533 33311111 u4444422 22200000 (u, v lsb) +// vbbbbb99 99977777 uaaaaa88 88866666 +// vhhhhhff fffddddd ugggggee eeeccccc +// vnnnnnll llljjjjj ummmmmkk kkkiiiii +// vtttttrr rrrppppp usssssqq qqqooooo + +__forceinline__ __device__ void shuffle_5bit_32 +( + uint32_t* q, + int stride +) +{ + uint32_t qa = q[0 * stride]; + uint32_t qb = q[1 * stride]; + uint32_t qc = q[2 * stride]; + uint32_t qd = q[3 * stride]; + uint32_t qe = q[4 * stride]; + + // qa: 66555554 44443333 32222211 11100000 + // qb: ccccbbbb baaaaa99 99988888 77777666 + // qc: jiiiiihh hhhggggg fffffeee eedddddc + // qd: pppooooo nnnnnmmm mmlllllk kkkkjjjj + // qe: vvvvvuuu uuttttts ssssrrrr rqqqqqpp + + uint32_t qf = qe >> 22; + qe <<= 8; + qe |= qd >> 24; + qd <<= 6; + qd |= qc >> 26; + qc <<= 4; + qc |= qb >> 28; + qb <<= 2; + qb |= qa >> 30; + + // qa: 555554 44443333 32222211 11100000 + // qb: bbbbba aaaa9999 98888877 77766666 + // qc: hhhhhg ggggffff feeeeedd dddccccc + // qd: nnnnnm mmmmllll lkkkkkjj jjjiiiii + // qe: ttttts ssssrrrr rqqqqqpp pppooooo + // qf: vv vvvuuuuu + + uint32_t za = 0; + uint32_t zb = 0; + uint32_t zc = 0; + uint32_t zd = 0; + uint32_t ze = 0; + + for (int i = 0; i < 3; i++) { uint32_t t0 = qa & 0x1f; uint32_t t1 = (qa & 0x3e0) >> 5; qa >>= 10; za |= (t0 << (i * 5)); za |= (t1 << (i * 5 + 16)); } + for (int i = 0; i < 3; i++) { uint32_t t0 = qb & 0x1f; uint32_t t1 = (qb & 0x3e0) >> 5; qb >>= 10; zb |= (t0 << (i * 5)); zb |= (t1 << (i * 5 + 16)); } + for (int i = 0; i < 3; i++) { uint32_t t0 = qc & 0x1f; uint32_t t1 = (qc & 0x3e0) >> 5; qc >>= 10; zc |= (t0 << (i * 5)); zc |= (t1 << (i * 5 + 16)); } + for (int i = 0; i < 3; i++) { uint32_t t0 = qd & 0x1f; uint32_t t1 = (qd & 0x3e0) >> 5; qd >>= 10; zd |= (t0 << (i * 5)); zd |= (t1 << (i * 5 + 16)); } + for (int i = 0; i < 3; i++) { uint32_t t0 = qe & 0x1f; uint32_t t1 = (qe & 0x3e0) >> 5; qe >>= 10; ze |= (t0 << (i * 5)); ze |= (t1 << (i * 5 + 16)); } + + // za: 5555533 33311111 4444422 22200000 + // zb: bbbbb99 99977777 aaaaa88 88866666 + // zc: hhhhhff fffddddd gggggee eeeccccc + // zd: nnnnnll llljjjjj mmmmmkk kkkiiiii + // ze: tttttrr rrrppppp sssssqq qqqooooo + // qf: vv vvvuuuuu + + za |= ((qf & 0x001) >> 0) << 15; + zb |= ((qf & 0x002) >> 1) << 15; + zc |= ((qf & 0x004) >> 2) << 15; + zd |= ((qf & 0x008) >> 3) << 15; + ze |= ((qf & 0x010) >> 4) << 15; + za |= ((qf & 0x020) >> 5) << 31; + zb |= ((qf & 0x040) >> 6) << 31; + zc |= ((qf & 0x080) >> 7) << 31; + zd |= ((qf & 0x100) >> 8) << 31; + ze |= ((qf & 0x200) >> 9) << 31; + + // za: v5555533 33311111 u4444422 22200000 (u, v lsb) + // zb: vbbbbb99 99977777 uaaaaa88 88866666 + // zc: vhhhhhff fffddddd ugggggee eeeccccc + // zd: vnnnnnll llljjjjj ummmmmkk kkkiiiii + // ze: vtttttrr rrrppppp usssssqq qqqooooo + + q[0 * stride] = za; + q[1 * stride] = zb; + q[2 * stride] = zc; + q[3 * stride] = zd; + q[4 * stride] = ze; +} + +__forceinline__ __device__ void dequant_5bit_32 +( + const uint32_t q_0, + const uint32_t q_1, + const uint32_t q_2, + const uint32_t q_3, + const uint32_t q_4, + half2 (&dq)[16], + int stride +) +{ + const uint32_t c0 = 0x64006400; + const half y32_ = __float2half_rn(1.0f / 32.0f); + const half2 y32 = __halves2half2(y32_, y32_); + const half z1_ = __float2half_rn(-1024.0f - 16.0f); + const half z32_ = __float2half_rn(-1024.0f / 32.0f - 16.0f); + const half2 z1 = __halves2half2(z1_, z1_); + const half2 z32 = __halves2half2(z32_, z32_); + + uint32_t qa = q_0; + uint32_t qb = q_1; + uint32_t qc = q_2; + uint32_t qd = q_3; + uint32_t qe = q_4; + + half2_uint32 q0 ((qa & 0x001f001f) | c0); // half2(q[ 0], q[ 1]) + 1024 + half2_uint32 q1 ((qa & 0x03e003e0) | c0); // half2(q[ 2], q[ 3]) * 32 + 1024 + qa >>= 10; + half2_uint32 q2 ((qa & 0x001f001f) | c0); // half2(q[ 4], q[ 5]) + 1024 + qa >>= 5; + qa &= 0x00010001; + half2_uint32 q3 ((qb & 0x001f001f) | c0); // half2(q[ 6], q[ 7]) + 1024 + half2_uint32 q4 ((qb & 0x03e003e0) | c0); // half2(q[ 8], q[ 9]) * 32 + 1024 + qb >>= 10; + half2_uint32 q5 ((qb & 0x001f001f) | c0); // half2(q[10], q[11]) + 1024 + qb >>= 4; + qb &= 0x00020002; + half2_uint32 q6 ((qc & 0x001f001f) | c0); // half2(q[12], q[13]) + 1024 + half2_uint32 q7 ((qc & 0x03e003e0) | c0); // half2(q[14], q[15]) * 32 + 1024 + qc >>= 10; + half2_uint32 q8 ((qc & 0x001f001f) | c0); // half2(q[16], q[17]) + 1024 + qc >>= 3; + qc &= 0x00040004; + half2_uint32 q9 ((qd & 0x001f001f) | c0); // half2(q[18], q[19]) + 1024 + half2_uint32 q10((qd & 0x03e003e0) | c0); // half2(q[20], q[21]) * 32 + 1024 + qd >>= 10; + half2_uint32 q11((qd & 0x001f001f) | c0); // half2(q[22], q[23]) + 1024 + qd >>= 2; + qd &= 0x00080008; + half2_uint32 q12((qe & 0x001f001f) | c0); // half2(q[24], q[25]) + 1024 + half2_uint32 q13((qe & 0x03e003e0) | c0); // half2(q[26], q[27]) * 32 + 1024 + qe >>= 10; + half2_uint32 q14((qe & 0x001f001f) | c0); // half2(q[28], q[29]) + 1024 + qe >>= 1; + qe &= 0x00100010; + half2_uint32 q15((qa | qb | qc | qd | qe) | c0); + + dq[ 0] = __hadd2( q0.as_half2, z1); + dq[ 1] = __hfma2( q1.as_half2, y32, z32); + dq[ 2] = __hadd2( q2.as_half2, z1); + dq[ 3] = __hadd2( q3.as_half2, z1); + dq[ 4] = __hfma2( q4.as_half2, y32, z32); + dq[ 5] = __hadd2( q5.as_half2, z1); + dq[ 6] = __hadd2( q6.as_half2, z1); + dq[ 7] = __hfma2( q7.as_half2, y32, z32); + dq[ 8] = __hadd2( q8.as_half2, z1); + dq[ 9] = __hadd2( q9.as_half2, z1); + dq[10] = __hfma2(q10.as_half2, y32, z32); + dq[11] = __hadd2(q11.as_half2, z1); + dq[12] = __hadd2(q12.as_half2, z1); + dq[13] = __hfma2(q13.as_half2, y32, z32); + dq[14] = __hadd2(q14.as_half2, z1); + dq[15] = __hadd2(q15.as_half2, z1); +} + +#else + +__forceinline__ __device__ void shuffle_5bit_32 +( + uint32_t* q, + int stride +) +{ +} + +__forceinline__ __device__ void dequant_5bit_32 +( + const uint32_t q_0, + const uint32_t q_1, + const uint32_t q_2, + const uint32_t q_3, + const uint32_t q_4, + half2 (&dq)[16], + int stride +) +{ + half dqh[32]; + for (int i = 0; i < 6; i++) dqh[ i] = dq_ns(exb( q_0, i * 5 , 0x1f), 16); + dqh[ 6 ] = dq_ns(exb(q_1, q_0, 30, 0x1f), 16); + for (int i = 0; i < 5; i++) dqh[ 7 + i] = dq_ns(exb( q_1, i * 5 + 3, 0x1f), 16); + dqh[12 ] = dq_ns(exb(q_2, q_1, 28, 0x1f), 16); + for (int i = 0; i < 6; i++) dqh[13 + i] = dq_ns(exb( q_2, i * 5 + 1, 0x1f), 16); + dqh[19 ] = dq_ns(exb(q_3, q_2, 31, 0x1f), 16); + for (int i = 0; i < 5; i++) dqh[20 + i] = dq_ns(exb( q_3, i * 5 + 4, 0x1f), 16); + dqh[25 ] = dq_ns(exb(q_4, q_3, 29, 0x1f), 16); + for (int i = 0; i < 6; i++) dqh[26 + i] = dq_ns(exb( q_4, i * 5 + 2, 0x1f), 16); + + for (int i = 0; i < 16; i++) dq[i] = __halves2half2(dqh[i * 2], dqh[i * 2 + 1]); +} + +#endif + +#endif \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_6.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_6.cuh new file mode 100644 index 0000000000000000000000000000000000000000..c2eb8cfbfef034d764dfc273ea5cef129ce35c85 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_6.cuh @@ -0,0 +1,44 @@ +#ifndef _qdq_6_cuh +#define _qdq_6_cuh + +#include "qdq_util.cuh" +#include "../../config.h" + +#if QMODE_6BIT == 1 + + // Not implemented + +#else + +__forceinline__ __device__ void shuffle_6bit_16 +( + uint32_t* q, + int stride +) +{ +} + +__forceinline__ __device__ void dequant_6bit_16 +( + const uint32_t q_0, + const uint32_t q_1, + const uint32_t q_2, + half2 (&dq)[8], + int stride +) +{ + half dqh[16]; + for (int i = 0; i < 5; i++) dqh[ i] = dq_ns(exb( q_0, i * 6 , 0x3f), 32); + dqh[ 5 ] = dq_ns(exb(q_1, q_0, 30, 0x3f), 32); + for (int i = 0; i < 4; i++) dqh[ 6 + i] = dq_ns(exb( q_1, i * 6 + 4, 0x3f), 32); + dqh[10 ] = dq_ns(exb(q_2, q_1, 28, 0x3f), 32); + for (int i = 0; i < 5; i++) dqh[11 + i] = dq_ns(exb( q_2, i * 6 + 2, 0x3f), 32); + + for (int i = 0; i < 8; i++) dq[i] = __halves2half2(dqh[i * 2], dqh[i * 2 + 1]); +} + +#endif + +#endif + + diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_8.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_8.cuh new file mode 100644 index 0000000000000000000000000000000000000000..e2409efacd3a021a14488b19db43013bc71c466f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_8.cuh @@ -0,0 +1,38 @@ +#ifndef _qdq_8_cuh +#define _qdq_8_cuh + +#include "qdq_util.cuh" +#include "../../config.h" + +#if QMODE_8BIT == 1 + + // Not implemented + +#else + +__forceinline__ __device__ void shuffle_8bit_4 +( + uint32_t* q, + int stride +) +{ +} + +__forceinline__ __device__ void dequant_8bit_8 +( + const uint32_t q_0, + const uint32_t q_1, + half2 (&dq)[4], + int stride +) +{ + half dqh[8]; + for (int i = 0; i < 4; i++) dqh[i ] = dq_ns(exb(q_0, i * 8, 0xff), 128); + for (int i = 0; i < 4; i++) dqh[i + 4] = dq_ns(exb(q_1, i * 8, 0xff), 128); + + for (int i = 0; i < 4; i++) dq[i] = __halves2half2(dqh[i * 2], dqh[i * 2 + 1]); +} + +#endif + +#endif \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_util.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_util.cuh new file mode 100644 index 0000000000000000000000000000000000000000..71657191b911a3fb178cfd8af17d2e5f225460f3 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/quant/qdq_util.cuh @@ -0,0 +1,51 @@ +#ifndef _qdq_util_cuh +#define _qdq_util_cuh + +union half2_uint32 +{ + uint32_t as_uint32; + half2 as_half2; + __device__ half2_uint32(uint32_t val) : as_uint32(val) {} + __device__ half2_uint32(half2 val) : as_half2(val) {} +}; + +union half_uint16 +{ + uint16_t as_uint16; + half as_half; + __device__ half_uint16(uint16_t val) : as_uint16(val) {} + __device__ half_uint16(half val) : as_half(val) {} +}; + +// Max_scale premultiplied by 1/256 + +__forceinline__ __device__ half dq_scale(const int qs, const half max_scale) +{ + int qs_i = qs + 1; + half qs_h = __int2half_rn(qs_i * qs_i); + qs_h = __hmul(qs_h, max_scale); + return qs_h; +} + +__forceinline__ __device__ half dq(const int q, const int qzero, const half scale) +{ + return __hmul(__int2half_rn(q - qzero), scale); +} + +__forceinline__ __device__ half dq_ns(const int q, const int qzero) +{ + //return __hsub(__int2half_rn(q), __int2half_rn(qzero)); + return __int2half_rn(q - qzero); +} + +__forceinline__ __device__ int exb(const uint32_t q, const int shift, const int mask) +{ + return (int)((q >> shift) & mask); +} + +__forceinline__ __device__ int exb(const uint32_t q1, const uint32_t q0, const int shift, const int mask) +{ + return (int)(__funnelshift_rc(q0, q1, shift) & mask); +} + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/util.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/util.cuh new file mode 100644 index 0000000000000000000000000000000000000000..06a58d184b110daaaefbf9e87773ce2bdaddbaee --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/cuda/util.cuh @@ -0,0 +1,42 @@ + +#define DIVIDE(x, size) (((x) + (size) - 1) / (size)) + +#define DBGS(__x) printf("%s\n", __x) +#define DBGI(__x) printf("%s: %i\n", #__x, __x) +#define DBGI2(__x, __y) printf("%s, %s: %i, %i\n", #__x, #__y, __x, __y) +#define DBGI3(__x, __y, __z) printf("%s, %s, %s: %i, %i, %i\n", #__x, #__y, #__z, __x, __y, __z) +#define DBGX(__x) printf("%s: %x\n", #__x, __x) +#define DBGX2(__x, __y) printf("%s, %s: %x, %x\n", #__x, #__y, __x, __y) +#define DBGX3(__x, __y, __z) printf("%s, %s, %s: %x, %x, %x\n", #__x, #__y, #__z, __x, __y, __z) +#define DBGF(__x) printf("%s: %f\n", #__x, __x) +#define DBGF2(__x, __y) printf("%s, %s: %f, %f\n", #__x, #__y, __x, __y) +#define DBGF3(__x, __y, __z) printf("%s, %s, %s: %f, %f, %f\n", #__x, #__y, #__z, __x, __y, __z) +#define DBGH(__x) printf("%s: %f\n", #__x, __half2float(__x)) +#define DBGH2(__x, __y) printf("%s, %s: %f, %f\n", #__x, #__y, __half2float(__x), __half2float(__y)) +#define DBGH3(__x, __y, __z) printf("%s, %s, %s: %f, %f, %f\n", #__x, #__y, #__z, __half2float(__x), __half2float(__y), __half2float(__z)) + +#define DBGIH(__x, __y) printf("%s, %s: %i, %f\n", #__x, #__y, __x, __half2float(__y)) +#define DBGIH2(__x, __y, __z) printf("%s, %s, %s: %i, %f, %f\n", #__x, #__y, #__z, __x, __half2float(__y), __half2float(__z)) + +__forceinline__ __device__ half dq_scale_(const int qs, const half max_scale) +{ + half qs_h = __hmul(__int2half_rn(qs + 1), __float2half_rn(1.0f / 16.0f)); + qs_h = __hmul(qs_h, qs_h); + qs_h = __hmul(qs_h, max_scale); + return qs_h; +} + +__forceinline__ __device__ float clamp(float x, float a, float b) +{ + return fmaxf(a, fminf(b, x)); +} + +#define cuda_check(ans) { gpu_assert((ans), __FILE__, __LINE__); } +inline void gpu_assert(cudaError_t code, const char *file, int line, bool abort=true) +{ + if (code != cudaSuccess) + { + fprintf(stderr,"CUDA error: %s %s %d\n", cudaGetErrorString(code), file, line); + if (abort) exit(code); + } +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/ext.cpp b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/ext.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5e52e6abd3b486be46ea4732a2346a1ba679b8d2 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/exllamav2/ext.cpp @@ -0,0 +1,134 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" + +#include "cuda/q_matrix.cuh" +#include "cuda/q_gemm.cuh" + +#include "cpp/util.h" + +// Some decluttering macros + +#define TORCH_CHECK_DTYPE(__x, __dtype) TORCH_CHECK((__x).dtype() == torch::__dtype, #__x " is incorrect datatype, must be " #__dtype) +#define TORCH_CHECK_DTYPE_OPT(__x, __dtype) TORCH_CHECK((__x).device().is_meta() || (__x).dtype() == torch::__dtype, #__x " is incorrect datatype, must be " #__dtype) +#define TORCH_CHECK_SHAPES(__x, __dim_x, __y, __dim_y, __scale_y) TORCH_CHECK((__x).size(__dim_x) == (__y).size(__dim_y) * __scale_y, #__x " and " #__y " have incompatible shapes") +#define TORCH_CHECK_SHAPES_OPT(__x, __dim_x, __y, __dim_y, __scale_y) TORCH_CHECK((__x).device().is_meta() || (__x).size(__dim_x) == (__y).size(__dim_y) * __scale_y, #__x " and " #__y " have incompatible shapes") + + +// Quant matrix + +uintptr_t make_q_matrix +( + torch::Tensor q_weight, + torch::Tensor q_perm, + torch::Tensor q_invperm, + torch::Tensor q_scale, + torch::Tensor q_scale_max, + torch::Tensor q_groups, + torch::Tensor gptq_qzeros, + torch::Tensor gptq_scales, + torch::Tensor gptq_g_idx, + torch::Tensor temp_dq +) +{ + TORCH_CHECK_DTYPE(q_weight, kInt); + TORCH_CHECK_DTYPE_OPT(q_perm, kShort); + TORCH_CHECK_DTYPE_OPT(q_invperm, kShort); + TORCH_CHECK_DTYPE_OPT(q_scale, kInt); + TORCH_CHECK_DTYPE_OPT(q_scale_max, kHalf); + TORCH_CHECK_DTYPE_OPT(q_groups, kShort); + TORCH_CHECK_DTYPE_OPT(gptq_qzeros, kInt); + TORCH_CHECK_DTYPE_OPT(gptq_scales, kHalf); + TORCH_CHECK_DTYPE_OPT(gptq_g_idx, kInt); + + TORCH_CHECK_SHAPES(q_perm, 0, q_invperm, 0, 1); + + int device = q_weight.device().index(); + int width = q_weight.size(1); + int groups; + int height; + + if (!q_scale.device().is_meta()) + { + TORCH_CHECK_SHAPES(q_weight, 1, q_scale, 1, 8); + TORCH_CHECK_SHAPES(q_scale_max, 0, q_scale, 0, 1); + groups = q_scale.size(0); + height = q_invperm.size(0); + } + else + { + TORCH_CHECK_SHAPES(q_weight, 1, gptq_qzeros, 1, 8); + TORCH_CHECK_SHAPES(q_weight, 1, gptq_scales, 1, 1); + groups = gptq_qzeros.size(0); + height = q_weight.size(0) * 8; + } + + TORCH_CHECK(temp_dq.size(0) >= width * height, "Insufficient size of temp_dq buffer") + + QMatrix* m = new QMatrix + ( + device, + height, + width, + groups, + (uint32_t*) q_weight.data_ptr(), + q_perm.device().is_meta() ? NULL : (uint16_t*) q_perm.data_ptr(), + q_invperm.device().is_meta() ? NULL : (uint16_t*) q_invperm.data_ptr(), + q_scale.device().is_meta() ? NULL : (uint32_t*) q_scale.data_ptr(), + q_scale_max.device().is_meta() ? NULL : (half*) q_scale_max.data_ptr(), + q_groups.device().is_meta() ? NULL : (uint16_t*) q_groups.data_ptr(), + gptq_qzeros.device().is_meta() ? NULL : (uint32_t*) gptq_qzeros.data_ptr(), + gptq_scales.device().is_meta() ? NULL : (half*) gptq_scales.data_ptr(), + gptq_g_idx.device().is_meta() ? NULL : (uint32_t*) gptq_g_idx.data_ptr(), + (half*) temp_dq.data_ptr() + ); + + return reinterpret_cast (m); +} + +void gemm_half_q_half +( + torch::Tensor a, + uintptr_t b, + torch::Tensor c, + bool force_cuda +) +{ + QMatrix* qm = reinterpret_cast (b); + + TORCH_CHECK_DTYPE(a, kHalf); + TORCH_CHECK_DTYPE(c, kHalf); + TORCH_CHECK_SHAPES(a, 0, c, 0, 1); + TORCH_CHECK(qm->height == a.size(1), "a and b have incompatible shapes") + TORCH_CHECK(qm->width == c.size(1), "b and c have incompatible shapes") + + const at::cuda::OptionalCUDAGuard device_guard(device_of(a)); + + gemm_half_q_half_cuda + ( + at::cuda::getCurrentCUDABlasHandle(), + (const half*) a.data_ptr(), + qm, + (half*) c.data_ptr(), + c.size(0), // m + c.size(1), // n + a.size(1), // k + true, + NULL, + force_cuda + ); +} + +// Bindings + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) +{ + m.def("make_q_matrix", &make_q_matrix, "make_q_matrix"); + m.def("gemm_half_q_half", &gemm_half_q_half, "gemm_half_q_half"); +} diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda.cpp b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda.cpp new file mode 100644 index 0000000000000000000000000000000000000000..de9c448a10f1143d431023a5e96e4ee840f2741e --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) Marlin.2024 Elias Frantar (elias.frantar@ist.ac.at) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include + +#include "marlin_cuda_kernel.cuh" +#include "marlin_repack.cuh" + +const int ERR_PROB_SHAPE = 1; +const int ERR_KERN_SHAPE = 2; + +void mul( + const torch::Tensor& A, + const torch::Tensor& B, + torch::Tensor& C, + const torch::Tensor& s, + torch::Tensor& workspace, + int thread_k = -1, + int thread_n = -1, + int sms = -1, + int max_par = 8 +) { + int prob_m = A.size(0); + int prob_n = C.size(1); + int prob_k = A.size(1); + int groupsize = (s.size(0) == 1) ? -1 : prob_k / s.size(0); + if (groupsize != -1 && groupsize * s.size(0) != prob_k) + AT_ERROR("k=", prob_k, " not compatible with ", s.size(0), " groups."); + if (workspace.numel() < prob_n / 128 * max_par) + AT_ERROR("workspace must be of size at least ", prob_n / 128 * max_par, "."); + int dev = A.get_device(); + int err = marlin_cuda( + A.data_ptr(), + B.data_ptr(), + C.data_ptr(), + s.data_ptr(), + prob_m, prob_n, prob_k, + workspace.data_ptr(), + groupsize, + dev, + at::cuda::getCurrentCUDAStream(dev), + thread_k, + thread_n, + sms, + max_par + ); + if (err == ERR_PROB_SHAPE) { + AT_ERROR( + "Problem (m=", prob_m, ", n=", prob_n, ", k=", prob_k, ")", + " not compatible with thread_k=", thread_k, ", thread_n=", thread_n, "." + ); + } else if (err == ERR_KERN_SHAPE) { + AT_ERROR( + "No kernel implementation for thread_k=", thread_k, ", thread_n=", thread_n, ", groupsize=", groupsize, "." + ); + } +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("mul", &mul, "Marlin FP16xINT4 matmul."); + m.def("gptq_repack", &gptq_repack, "Repack GPTQ checkpoints for Marlin."); +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda_kernel.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda_kernel.cu new file mode 100644 index 0000000000000000000000000000000000000000..59a02b539016aed406783bda3c0e5d0ba2d59643 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda_kernel.cu @@ -0,0 +1,855 @@ +/* + * Copyright (C) Marlin.2024 Elias Frantar (elias.frantar@ist.ac.at) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef MARLIN_CUDA_KERNEL_CUH +#define MARLIN_CUDA_KERNEL_CUH + + +#include +#include +#include +#include + +#include "marlin_cuda_kernel.cuh" + +constexpr int ceildiv(int a, int b) { + return (a + b - 1) / b; +} + +// Instances of `Vec` are used to organize groups of >>registers<<, as needed for instance as inputs to tensor core +// operations. Consequently, all corresponding index accesses must be compile-time constants, which is why we +// extensively use `#pragma unroll` throughout the kernel code to guarantee this. +template +struct Vec { + T elems[n]; + __device__ T& operator[](int i) { + return elems[i]; + } +}; + +using I4 = Vec; + +// Matrix fragments for tensor core instructions; their precise layout is documented here: +// https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#matrix-fragments-for-mma-m16n8k16-with-floating-point-type +using FragA = Vec; +using FragB = Vec; +using FragC = Vec; +using FragS = Vec; // quantization scales + +// Predicated asynchronous global->shared copy; used for inputs A where we apply predication to handle batchsizes that +// are not multiples of 16. +__device__ inline void cp_async4_pred(void* smem_ptr, const void* glob_ptr, bool pred = true) { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 800 + const int BYTES = 16; + uint32_t smem = static_cast(__cvta_generic_to_shared(smem_ptr)); + asm volatile( + "{\n" + " .reg .pred p;\n" + " setp.ne.b32 p, %0, 0;\n" + " @p cp.async.cg.shared.global [%1], [%2], %3;\n" + "}\n" :: "r"((int) pred), "r"(smem), "l"(glob_ptr), "n"(BYTES) + ); +#else + assert(0); +#endif +} + +// Asynchronous global->shared copy with a chache hint indicating that the values may be evicted immediately; used for +// quantized weights B, which are only accessed precisely once and should thus not pollute the L2 cache which we need +// for inputs A and outputs C. +__device__ inline void cp_async4_stream(void* smem_ptr, const void* glob_ptr) { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 800 + const int BYTES = 16; + uint32_t smem = static_cast(__cvta_generic_to_shared(smem_ptr)); + asm volatile( + "{\n" + " .reg .b64 p;\n" + " createpolicy.fractional.L2::evict_first.b64 p, 1.0;" + " cp.async.cg.shared.global.L2::cache_hint [%0], [%1], %2, p;\n" + "}\n" :: "r"(smem), "l"(glob_ptr), "n"(BYTES) + ); +#else + assert(0); +#endif +} + +// Async copy fence. +__device__ inline void cp_async_fence() { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 800 + asm volatile("cp.async.commit_group;\n" ::); +#else + assert(0); +#endif +} + +// Wait until at most `n` async copy stages are still pending. +template +__device__ inline void cp_async_wait() { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 800 + asm volatile("cp.async.wait_group %0;\n" :: "n"(n)); +#else + assert(0); +#endif +} + +// m16n8k16 tensor core mma instruction with fp16 inputs and fp32 output/accumulation. +__device__ inline void mma(const FragA& a_frag, const FragB& frag_b, FragC& frag_c) { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 800 + const uint32_t* a = reinterpret_cast(&a_frag); + const uint32_t* b = reinterpret_cast(&frag_b); + float* c = reinterpret_cast(&frag_c); + asm volatile( + "mma.sync.aligned.m16n8k16.row.col.f32.f16.f16.f32 " + "{%0,%1,%2,%3}, {%4,%5,%6,%7}, {%8,%9}, {%10,%11,%12,%13};\n" + : "=f"(c[0]), "=f"(c[1]), "=f"(c[2]), "=f"(c[3]) + : "r"(a[0]), "r"(a[1]), "r"(a[2]), "r"(a[3]), "r"(b[0]), "r"(b[1]), + "f"(c[0]), "f"(c[1]), "f"(c[2]), "f"(c[3]) + ); +#else + assert(0); +#endif +} + +// Instruction for loading a full 16x16 matrix fragment of operand A from shared memory, directly in tensor core layout. +__device__ inline void ldsm4(FragA& frag_a, const void* smem_ptr) { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 800 + uint32_t* a = reinterpret_cast(&frag_a); + uint32_t smem = static_cast(__cvta_generic_to_shared(smem_ptr)); + asm volatile( + "ldmatrix.sync.aligned.m8n8.x4.shared.b16 {%0,%1,%2,%3}, [%4];\n" + : "=r"(a[0]), "=r"(a[1]), "=r"(a[2]), "=r"(a[3]) : "r"(smem) + ); +#else + assert(0); +#endif +} + +// Lookup-table based 3-input logical operation; explicitly used for dequantization as the compiler does not seem to +// automatically recognize it in all cases. +template +__device__ inline int lop3(int a, int b, int c) { + int res; + asm volatile( + "lop3.b32 %0, %1, %2, %3, %4;\n" + : "=r"(res) : "r"(a), "r"(b), "r"(c), "n"(lut) + ); + return res; +} + +// Efficiently dequantize an int32 value into a full B-fragment of 4 fp16 values. +// We mostly follow the strategy in the link below, with some small changes: +// https://github.com/NVIDIA/FasterTransformer/blob/main/src/fastertransformer/cutlass_extensions/include/cutlass_extensions/interleaved_numeric_conversion.h +__device__ inline FragB dequant(int q) { + const int LO = 0x000f000f; + const int HI = 0x00f000f0; + const int EX = 0x64006400; + // Guarantee that the `(a & b) | c` operations are LOP3s. + int lo = lop3<(0xf0 & 0xcc) | 0xaa>(q, LO, EX); + int hi = lop3<(0xf0 & 0xcc) | 0xaa>(q, HI, EX); + // We want signed int4 outputs, hence we fuse the `-8` symmetric zero point directly into `SUB` and `ADD`. + const int SUB = 0x64086408; + const int MUL = 0x2c002c00; + const int ADD = 0xd480d480; + FragB frag_b; + frag_b[0] = __hsub2( + *reinterpret_cast(&lo), + *reinterpret_cast(&SUB) + ); + frag_b[1] = __hfma2( + *reinterpret_cast(&hi), + *reinterpret_cast(&MUL), *reinterpret_cast(&ADD) + ); + return frag_b; +} + +// Multiply dequantized values by the corresponding quantization scale; used only for grouped quantization. +__device__ inline void scale(FragB& frag_b, FragS& frag_s, int i) { + half2 s = __half2half2(reinterpret_cast<__half*>(&frag_s)[i]); + frag_b[0] = __hmul2(frag_b[0], s); + frag_b[1] = __hmul2(frag_b[1], s); +} + +// Wait until barrier reaches `count`, then lock for current threadblock. +__device__ inline void barrier_acquire(int* lock, int count) { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 800 + if (threadIdx.x == 0) { + int state = -1; + do + // Guarantee that subsequent writes by this threadblock will be visible globally. + asm volatile ("ld.global.acquire.gpu.b32 %0, [%1];\n" : "=r"(state) : "l"(lock)); + while (state != count); + } + __syncthreads(); +#else + assert(0); +#endif +} + +// Release barrier and increment visitation count. +__device__ inline void barrier_release(int* lock, bool reset = false) { +#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 800 + __syncthreads(); + if (threadIdx.x == 0) { + if (reset) { + lock[0] = 0; + return; + } + int val = 1; + // Make sure that all writes since acquiring this barrier are visible globally, while releasing the barrier. + asm volatile ("fence.acq_rel.gpu;\n"); + asm volatile ("red.relaxed.gpu.global.add.s32 [%0], %1;\n" : : "l"(lock), "r"(val)); + } +#else + assert(0); +#endif +} + + +template < + const int threads, // number of threads in a threadblock + const int thread_m_blocks, // number of 16x16 blocks in the m dimension (batchsize) of the threadblock + const int thread_n_blocks, // same for n dimension (output) + const int thread_k_blocks, // same for k dimension (reduction) + const int stages, // number of stages for the async global->shared fetch pipeline + const int group_blocks = -1 // number of consecutive 16x16 blocks with a separate quantization scale +> +__global__ void Marlin( + const int4* __restrict__ A, // fp16 input matrix of shape mxk + const int4* __restrict__ B, // 4bit quantized weight matrix of shape kxn + int4* __restrict__ C, // fp16 output buffer of shape mxn + const int4* __restrict__ s, // fp16 quantization scales of shape (k/groupsize)xn + int prob_m, // batch dimension m + int prob_n, // output dimension n + int prob_k, // reduction dimension k + int* locks // extra global storage for barrier synchronization +) { + // Each threadblock processes one "stripe" of the B matrix with (roughly) the same size, which might involve multiple + // column "slices" (of width 16 * `thread_n_blocks`). Stripes are defined as shown in the 3x3 matrix 5 SM example: + // 0 1 3 + // 0 2 3 + // 1 2 4 + // While this kind of partitioning makes things somewhat more complicated, it ensures good utilization of all SMs + // for many kinds of shape and GPU configurations, while requiring as few slow global cross-threadblock reductions as + // possible. + + // For larger GEMMs we run multiple batchsize 64 versions in parallel for a better partitioning with less reductions + int parallel = 1; + if (prob_m > 16 * thread_m_blocks) { + parallel = prob_m / (16 * thread_m_blocks); + prob_m = 16 * thread_m_blocks; + } + + int k_tiles = prob_k / 16 / thread_k_blocks; + int n_tiles = prob_n / 16 / thread_n_blocks; + int iters = ceildiv(k_tiles * n_tiles * parallel, gridDim.x); + // Ensure that the number of tiles in each stripe is a multiple of the groupsize; this avoids an annoying special case + // where a stripe starts in the middle of group. + if (group_blocks != -1) + iters = (group_blocks / thread_k_blocks) * ceildiv(iters, (group_blocks / thread_k_blocks)); + + int slice_row = (iters * blockIdx.x) % k_tiles; + int slice_col_par = (iters * blockIdx.x) / k_tiles; + int slice_col = slice_col_par; + int slice_iters; // number of threadblock tiles in the current slice + int slice_count = 0; // total number of active threadblocks in the current slice + int slice_idx; // index of threadblock in current slice; numbered bottom to top + + // We can easily implement parallel problem execution by just remapping indices and advancing global pointers + if (slice_col_par >= n_tiles) { + A += (slice_col_par / n_tiles) * 16 * thread_m_blocks * prob_k / 8; + C += (slice_col_par / n_tiles) * 16 * thread_m_blocks * prob_n / 8; + locks += (slice_col_par / n_tiles) * n_tiles; + slice_col = slice_col_par % n_tiles; + } + + // Compute all information about the current slice which is required for synchronization. + auto init_slice = [&] () { + slice_iters = iters * (blockIdx.x + 1) - (k_tiles * slice_col_par + slice_row); + if (slice_iters < 0 || slice_col_par >= n_tiles * parallel) + slice_iters = 0; + if (slice_iters == 0) + return; + if (slice_row + slice_iters > k_tiles) + slice_iters = k_tiles - slice_row; + slice_count = 1; + slice_idx = 0; + int col_first = iters * ceildiv(k_tiles * slice_col_par, iters); + if (col_first <= k_tiles * (slice_col_par + 1)) { + int col_off = col_first - k_tiles * slice_col_par; + slice_count = ceildiv(k_tiles - col_off, iters); + if (col_off > 0) + slice_count++; + int delta_first = iters * blockIdx.x - col_first; + if (delta_first < 0 || (col_off == 0 && delta_first == 0)) + slice_idx = slice_count - 1; + else { + slice_idx = slice_count - 1 - delta_first / iters; + if (col_off > 0) + slice_idx--; + } + } + if (slice_col == n_tiles) { + A += 16 * thread_m_blocks * prob_k / 8; + C += 16 * thread_m_blocks * prob_n / 8; + locks += n_tiles; + slice_col = 0; + } + }; + init_slice(); + + int a_gl_stride = prob_k / 8; // stride of the A matrix in global memory + // We typically use `constexpr` to indicate that this value is a compile-time constant + constexpr int a_sh_stride = 16 * thread_k_blocks / 8; // stride of an A matrix tile in shared memory + constexpr int a_gl_rd_delta_o = 16 * thread_k_blocks / 8; // delta between subsequent A tiles in global memory + int a_gl_rd_delta_i = a_gl_stride * (threads / a_gl_rd_delta_o); // between subsequent accesses within a tile + constexpr int a_sh_wr_delta = a_sh_stride * (threads / a_gl_rd_delta_o); // between shared memory writes + constexpr int a_sh_rd_delta_o = 2 * ((threads / 32) / (thread_n_blocks / 4)); // between shared memory tile reads + constexpr int a_sh_rd_delta_i = a_sh_stride * 16; // within a shared memory tile + constexpr int a_sh_stage = a_sh_stride * (16 * thread_m_blocks); // overall size of a tile + constexpr int a_sh_wr_iters = ceildiv(a_sh_stage, a_sh_wr_delta); // number of shared write iterations for a tile + + int b_gl_stride = 16 * prob_n / 32; + constexpr int b_sh_stride = 32 * thread_n_blocks / 4; + int b_gl_rd_delta_o = b_gl_stride * thread_k_blocks; + int b_gl_rd_delta_i = b_gl_stride * (threads / b_sh_stride); + constexpr int b_sh_wr_delta = threads; + constexpr int b_sh_rd_delta = threads; + constexpr int b_sh_stage = b_sh_stride * thread_k_blocks; + constexpr int b_sh_wr_iters = b_sh_stage / b_sh_wr_delta; + + int s_gl_stride = prob_n / 8; + constexpr int s_sh_stride = 16 * thread_n_blocks / 8; + constexpr int s_sh_stage = s_sh_stride; + int s_gl_rd_delta = s_gl_stride; + + // Global A read index of current thread. + int a_gl_rd = a_gl_stride * (threadIdx.x / a_gl_rd_delta_o) + (threadIdx.x % a_gl_rd_delta_o); + a_gl_rd += a_gl_rd_delta_o * slice_row; + // Shared write index of current thread. + int a_sh_wr = a_sh_stride * (threadIdx.x / a_gl_rd_delta_o) + (threadIdx.x % a_gl_rd_delta_o); + // Shared read index. + int a_sh_rd = a_sh_stride * ((threadIdx.x % 32) % 16) + (threadIdx.x % 32) / 16; + a_sh_rd += 2 * ((threadIdx.x / 32) / (thread_n_blocks / 4)); + + int b_gl_rd = b_gl_stride * (threadIdx.x / b_sh_stride) + (threadIdx.x % b_sh_stride); + b_gl_rd += b_sh_stride * slice_col; + b_gl_rd += b_gl_rd_delta_o * slice_row; + int b_sh_wr = threadIdx.x; + int b_sh_rd = threadIdx.x; + + int s_gl_rd = s_gl_stride * ((thread_k_blocks * slice_row) / group_blocks) + s_sh_stride * slice_col + threadIdx.x; + int s_sh_wr = threadIdx.x; + int s_sh_rd; + // We use a different scale layout for grouped and column-wise quantization as we scale a `half2` tile in column-major + // layout in the former and in row-major in the latter case. + if (group_blocks != -1) + s_sh_rd = 8 * ((threadIdx.x / 32) % (thread_n_blocks / 4)) + (threadIdx.x % 32) / 4; + else + s_sh_rd = 8 * ((threadIdx.x / 32) % (thread_n_blocks / 4)) + (threadIdx.x % 32) % 4; + + // Precompute which thread should not read memory in which iterations; this is needed if there are more threads than + // required for a certain tilesize or when the batchsize is not a multiple of 16. + bool a_sh_wr_pred[a_sh_wr_iters]; + #pragma unroll + for (int i = 0; i < a_sh_wr_iters; i++) + a_sh_wr_pred[i] = a_sh_wr_delta * i + a_sh_wr < a_sh_stride * prob_m; + bool s_sh_wr_pred = threadIdx.x < s_sh_stride; + + // To ensure that writing and reading A tiles to/from shared memory, the latter in fragment format, is fully bank + // conflict free, we need to use a rather fancy XOR-based layout. The key here is that neither reads nor writes of + // the 16-byte `int4` blocks of 8 consecutive threads involve the same shared memory banks. Further, it seems (based + // on NSight-Compute) that each warp must also write a consecutive memory segment? + auto transform_a = [&] (int i) { + int row = i / a_gl_rd_delta_o; + return a_gl_rd_delta_o * row + (i % a_gl_rd_delta_o) ^ row; + }; + // Since the computation of this remapping is non-trivial and, due to our main loop unrolls, all shared memory + // accesses are static, we simply precompute both transformed reads and writes. + int a_sh_wr_trans[a_sh_wr_iters]; + #pragma unroll + for (int i = 0; i < a_sh_wr_iters; i++) + a_sh_wr_trans[i] = transform_a(a_sh_wr_delta * i + a_sh_wr); + int a_sh_rd_trans[b_sh_wr_iters][thread_m_blocks]; + #pragma unroll + for (int i = 0; i < b_sh_wr_iters; i++) { + #pragma unroll + for (int j = 0; j < thread_m_blocks; j++) + a_sh_rd_trans[i][j] = transform_a(a_sh_rd_delta_o * i + a_sh_rd_delta_i * j + a_sh_rd); + } + + // Since B-accesses have non-constant stride they have to be computed at runtime; we break dependicies between + // subsequent accesses with a tile by maintining multiple pointers (we have enough registers), a tiny optimization. + const int4* B_ptr[b_sh_wr_iters]; + #pragma unroll + for (int i = 0; i < b_sh_wr_iters; i++) + B_ptr[i] = B + b_gl_rd_delta_i * i + b_gl_rd; + + extern __shared__ int4 sh[]; + // Shared memory storage for global fetch pipelines. + int4* sh_a = sh; + int4* sh_b = sh_a + (stages * a_sh_stage); + int4* sh_s = sh_b + (stages * b_sh_stage); + // Register storage for double buffer of shared memory reads. + FragA frag_a[2][thread_m_blocks]; + I4 frag_b_quant[2]; + FragC frag_c[thread_m_blocks][4][2]; + FragS frag_s[2][4]; + + // Zero accumulators. + auto zero_accums = [&] () { + #pragma unroll + for (int i = 0; i < thread_m_blocks * 4 * 2 * 4; i++) + reinterpret_cast(frag_c)[i] = 0; + }; + + // Asynchronously fetch the next A, B and s tile from global to the next shared memory pipeline location. + auto fetch_to_shared = [&] (int pipe, int a_off, bool pred = true) { + if (pred) { + int4* sh_a_stage = sh_a + a_sh_stage * pipe; + #pragma unroll + for (int i = 0; i < a_sh_wr_iters; i++) { + cp_async4_pred( + &sh_a_stage[a_sh_wr_trans[i]], + &A[a_gl_rd_delta_i * i + a_gl_rd + a_gl_rd_delta_o * a_off], + a_sh_wr_pred[i] + ); + } + int4* sh_b_stage = sh_b + b_sh_stage * pipe; + #pragma unroll + for (int i = 0; i < b_sh_wr_iters; i++) { + cp_async4_stream(&sh_b_stage[b_sh_wr_delta * i + b_sh_wr], B_ptr[i]); + B_ptr[i] += b_gl_rd_delta_o; + } + // Only fetch scales if this tile starts a new group + if (group_blocks != -1 && pipe % (group_blocks / thread_k_blocks) == 0) { + int4* sh_s_stage = sh_s + s_sh_stage * pipe; + if (s_sh_wr_pred) + cp_async4_stream(&sh_s_stage[s_sh_wr], &s[s_gl_rd]); + s_gl_rd += s_gl_rd_delta; + } + } + // Insert a fence even when we are winding down the pipeline to ensure that waiting is also correct at this point. + cp_async_fence(); + }; + + // Wait until the next thread tile has been loaded to shared memory. + auto wait_for_stage = [&] () { + // We only have `stages - 2` active fetches since we are double buffering and can only issue the next fetch when + // it is guaranteed that the previous shared memory load is fully complete (as it may otherwise be overwritten). + cp_async_wait(); + __syncthreads(); + }; + + // Load the next sub-tile from the current location in the shared memory pipe into the current register buffer. + auto fetch_to_registers = [&] (int k, int pipe) { + // It may seem inefficient that we reload the groups for every sub-tile; however, this does not seem to be a + // significant bottleneck, while some theoretically better attempts have lead to bad instruction ordering by the + // compiler and correspondingly a noticable drop in performance. + if (group_blocks != -1) { + int4* sh_s_stage = sh_s + s_sh_stage * ((group_blocks / thread_k_blocks) * (pipe / (group_blocks / thread_k_blocks))); + reinterpret_cast(&frag_s[k % 2])[0] = sh_s_stage[s_sh_rd]; + } + int4* sh_a_stage = sh_a + a_sh_stage * pipe; + #pragma unroll + for (int i = 0; i < thread_m_blocks; i++) + ldsm4(frag_a[k % 2][i], &sh_a_stage[a_sh_rd_trans[k % b_sh_wr_iters][i]]); + int4* sh_b_stage = sh_b + b_sh_stage * pipe; + frag_b_quant[k % 2] = *reinterpret_cast(&sh_b_stage[b_sh_rd_delta * (k % b_sh_wr_iters) + b_sh_rd]); + }; + + // Execute the actual tensor core matmul of a sub-tile. + auto matmul = [&] (int k) { + // We have the m dimension as the inner loop in order to encourage overlapping dequantization and matmul operations. + #pragma unroll + for (int j = 0; j < 4; j++) { + int b_quant = frag_b_quant[k % 2][j]; + int b_quant_shift = b_quant >> 8; + FragB frag_b0 = dequant(b_quant); + // If there are no groups, we can just scale the final output once and can avoid doing so for each weight. + if (group_blocks != -1) + scale(frag_b0, frag_s[k % 2][j], 0); + FragB frag_b1 = dequant(b_quant_shift); + if (group_blocks != -1) + scale(frag_b1, frag_s[k % 2][j], 1); + #pragma unroll + for (int i = 0; i < thread_m_blocks; i++) { + mma(frag_a[k % 2][i], frag_b0, frag_c[i][j][0]); + mma(frag_a[k % 2][i], frag_b1, frag_c[i][j][1]); + } + } + }; + + // Since we slice across the k dimension of a tile in order to increase the number of warps while keeping the n + // dimension of a tile reasonable, we have multiple warps that accumulate their partial sums of the same output + // location; which we have to reduce over in the end. We do in shared memory. + auto thread_block_reduce = [&] () { + constexpr int red_off = threads / b_sh_stride / 2; + if (red_off >= 1) { + int red_idx = threadIdx.x / b_sh_stride; + constexpr int red_sh_stride = b_sh_stride * 4 * 2; + constexpr int red_sh_delta = b_sh_stride; + int red_sh_rd = red_sh_stride * (threadIdx.x / b_sh_stride) + (threadIdx.x % b_sh_stride); + + // Parallel logarithmic shared memory reduction. We make sure to avoid any unnecessary read or write iterations, + // e.g., for two warps we write only once by warp 1 and read only once by warp 0. + + #pragma unroll + for (int m_block = 0; m_block < thread_m_blocks; m_block++) { + #pragma unroll + for (int i = red_off; i > 0; i /= 2) { + if (i <= red_idx && red_idx < 2 * i) { + #pragma unroll + for (int j = 0; j < 4 * 2; j++) { + int red_sh_wr = red_sh_delta * j + (red_sh_rd - red_sh_stride * i); + if (i < red_off) { + float* c_rd = reinterpret_cast(&sh[red_sh_delta * j + red_sh_rd]); + float* c_wr = reinterpret_cast(&sh[red_sh_wr]); + #pragma unroll + for (int k = 0; k < 4; k++) + reinterpret_cast(frag_c)[4 * 2 * m_block + j][k] += c_rd[k] + c_wr[k]; + } + sh[red_sh_wr] = reinterpret_cast(&frag_c)[4 * 2 * m_block + j]; + } + } + __syncthreads(); + } + if (red_idx == 0) { + #pragma unroll + for (int i = 0; i < 4 * 2; i++) { + float* c_rd = reinterpret_cast(&sh[red_sh_delta * i + red_sh_rd]); + #pragma unroll + for (int j = 0; j < 4; j++) + reinterpret_cast(frag_c)[4 * 2 * m_block + i][j] += c_rd[j]; + } + } + __syncthreads(); + } + } + }; + + // Since multiple threadblocks may process parts of the same column slice, we finally have to globally reduce over + // the results. As the striped partioning minimizes the number of such reductions and our outputs are usually rather + // small, we perform this reduction serially in L2 cache. + auto global_reduce = [&] (bool first = false, bool last = false) { + // We are very careful here to reduce directly in the output buffer to maximize L2 cache utilization in this step. + // To do this, we write out results in FP16 (but still reduce with FP32 compute). + constexpr int active_threads = 32 * thread_n_blocks / 4; + if (threadIdx.x < active_threads) { + int c_gl_stride = prob_n / 8; + int c_gl_wr_delta_o = 8 * c_gl_stride; + int c_gl_wr_delta_i = 4 * (active_threads / 32); + int c_gl_wr = c_gl_stride * ((threadIdx.x % 32) / 4) + 4 * (threadIdx.x / 32) + threadIdx.x % 4; + c_gl_wr += (2 * thread_n_blocks) * slice_col; + constexpr int c_sh_wr_delta = active_threads; + int c_sh_wr = threadIdx.x; + + int row = (threadIdx.x % 32) / 4; + + if (!first) { + // Interestingly, doing direct global accesses here really seems to mess up the compiler and lead to slowdowns, + // hence we also use async-copies even though these fetches are not actually asynchronous. + #pragma unroll + for (int i = 0; i < thread_m_blocks * 4; i++) { + cp_async4_pred( + &sh[c_sh_wr + c_sh_wr_delta * i], + &C[c_gl_wr + c_gl_wr_delta_o * (i / 2) + c_gl_wr_delta_i * (i % 2)], + i < (thread_m_blocks - 1) * 4 || 8 * (i / 2) + row < prob_m + ); + } + cp_async_fence(); + cp_async_wait<0>(); + } + + #pragma unroll + for (int i = 0; i < thread_m_blocks * 4; i++) { + if (i < (thread_m_blocks - 1) * 4 || 8 * (i / 2) + row < prob_m) { + if (!first) { + int4 c_red = sh[c_sh_wr + i * c_sh_wr_delta]; + #pragma unroll + for (int j = 0; j < 2 * 4; j++) { + reinterpret_cast(&frag_c)[4 * 2 * 4 * (i / 4) + 4 * j + (i % 4)] += __half2float( + reinterpret_cast<__half*>(&c_red)[j] + ); + } + } + if (!last) { + int4 c; + #pragma unroll + for (int j = 0; j < 2 * 4; j++) { + reinterpret_cast<__half*>(&c)[j] = __float2half( + reinterpret_cast(&frag_c)[4 * 2 * 4 * (i / 4) + 4 * j + (i % 4)] + ); + } + C[c_gl_wr + c_gl_wr_delta_o * (i / 2) + c_gl_wr_delta_i * (i % 2)] = c; + } + } + } + } + }; + + // Write out the reduce final result in the correct layout. We only actually reshuffle matrix fragments in this step, + // the reduction above is performed in fragment layout. + auto write_result = [&] () { + int c_gl_stride = prob_n / 8; + constexpr int c_sh_stride = 2 * thread_n_blocks + 1; + int c_gl_wr_delta = c_gl_stride * (threads / (2 * thread_n_blocks)); + constexpr int c_sh_rd_delta = c_sh_stride * (threads / (2 * thread_n_blocks)); + + int c_gl_wr = c_gl_stride * (threadIdx.x / (2 * thread_n_blocks)) + (threadIdx.x % (2 * thread_n_blocks)); + c_gl_wr += (2 * thread_n_blocks) * slice_col; + int c_sh_wr = (4 * c_sh_stride) * ((threadIdx.x % 32) / 4) + (threadIdx.x % 32) % 4; + c_sh_wr += 32 * (threadIdx.x / 32); + int c_sh_rd = c_sh_stride * (threadIdx.x / (2 * thread_n_blocks)) + (threadIdx.x % (2 * thread_n_blocks)); + + int c_gl_wr_end = c_gl_stride * prob_m; + + // We first reorder in shared memory to guarantee the most efficient final global write patterns + auto write = [&] (int idx, float c0, float c1, FragS& s) { + half2 res = __halves2half2(__float2half(c0), __float2half(c1)); + if (group_blocks == -1) // for per-column quantization we finally apply the scale here + res = __hmul2(res, s[0]); + ((half2*) sh)[idx] = res; + }; + if (threadIdx.x / 32 < thread_n_blocks / 4) { + #pragma unroll + for (int i = 0; i < thread_m_blocks; i++) { + #pragma unroll + for (int j = 0; j < 4; j++) { + int wr = c_sh_wr + 8 * j; + write(wr + (4 * c_sh_stride) * 0 + 0, frag_c[i][j][0][0], frag_c[i][j][0][1], frag_s[j / 2][2 * (j % 2) + 0]); + write(wr + (4 * c_sh_stride) * 8 + 0, frag_c[i][j][0][2], frag_c[i][j][0][3], frag_s[j / 2][2 * (j % 2) + 0]); + write(wr + (4 * c_sh_stride) * 0 + 4, frag_c[i][j][1][0], frag_c[i][j][1][1], frag_s[j / 2][2 * (j % 2) + 1]); + write(wr + (4 * c_sh_stride) * 8 + 4, frag_c[i][j][1][2], frag_c[i][j][1][3], frag_s[j / 2][2 * (j % 2) + 1]); + } + c_sh_wr += 16 * (4 * c_sh_stride); + } + } + __syncthreads(); + + #pragma unroll + for (int i = 0; i < ceildiv(16 * thread_m_blocks, threads / (2 * thread_n_blocks)); i++) { + if (c_gl_wr < c_gl_wr_end) { + C[c_gl_wr] = sh[c_sh_rd]; + c_gl_wr += c_gl_wr_delta; + c_sh_rd += c_sh_rd_delta; + } + } + }; + + // Start global fetch and register load pipelines. + auto start_pipes = [&] () { + #pragma unroll + for (int i = 0; i < stages - 1; i++) + fetch_to_shared(i, i, i < slice_iters); + zero_accums(); + wait_for_stage(); + fetch_to_registers(0, 0); + a_gl_rd += a_gl_rd_delta_o * (stages - 1); + }; + start_pipes(); + + // Main loop. + while (slice_iters) { + // We unroll over both the global fetch and the register load pipeline to ensure all shared memory accesses are + // static. Note that both pipelines have even length meaning that the next iteration will always start at index 0. + #pragma unroll + for (int pipe = 0; pipe < stages;) { + #pragma unroll + for (int k = 0; k < b_sh_wr_iters; k++) { + fetch_to_registers(k + 1, pipe % stages); + if (k == b_sh_wr_iters - 2) { + fetch_to_shared((pipe + stages - 1) % stages, pipe, slice_iters >= stages); + pipe++; + wait_for_stage(); + } + matmul(k); + } + slice_iters--; + if (slice_iters == 0) + break; + } + a_gl_rd += a_gl_rd_delta_o * stages; + + // Process results and, if necessary, proceed to the next column slice. While this pattern may not be the most + // readable, other ways of writing the loop seemed to noticeably worse performance after compliation. + if (slice_iters == 0) { + cp_async_wait<0>(); + bool last = slice_idx == slice_count - 1; + // For per-column scales, we only fetch them here in the final step before write-out + if (group_blocks == -1 && last) { + if (s_sh_wr_pred) + cp_async4_stream(&sh_s[s_sh_wr], &s[s_gl_rd]); + cp_async_fence(); + } + thread_block_reduce(); + if (group_blocks == -1 && last) { + cp_async_wait<0>(); + __syncthreads(); + if (threadIdx.x / 32 < thread_n_blocks / 4) { + reinterpret_cast(&frag_s)[0] = sh_s[s_sh_rd + 0]; + reinterpret_cast(&frag_s)[1] = sh_s[s_sh_rd + 4]; + } + } + if (slice_count > 1) { // only globally reduce if there is more than one block in a slice + barrier_acquire(&locks[slice_col], slice_idx); + global_reduce(slice_idx == 0, last); + barrier_release(&locks[slice_col], last); + } + if (last) // only the last block in a slice actually writes the result + write_result(); + slice_row = 0; + slice_col_par++; + slice_col++; + init_slice(); + if (slice_iters) { + a_gl_rd = a_gl_stride * (threadIdx.x / a_gl_rd_delta_o) + (threadIdx.x % a_gl_rd_delta_o); + #pragma unroll + for (int i = 0; i < b_sh_wr_iters; i++) + B_ptr[i] += b_sh_stride - b_gl_rd_delta_o * k_tiles; + if (slice_col == 0) { + #pragma unroll + for (int i = 0; i < b_sh_wr_iters; i++) + B_ptr[i] -= b_gl_stride; + } + s_gl_rd = s_sh_stride * slice_col + threadIdx.x; + start_pipes(); + } + } + } +} + + +// 8 warps are a good choice since every SM has 4 schedulers and having more than 1 warp per schedule allows some more +// latency hiding. At the same time, we want relatively few warps to have many registers per warp and small tiles. +const int THREADS = 256; +const int STAGES = 4; // 4 pipeline stages fit into shared memory +const int SHARED_MEM = 96 * 1024; // max shared memory on compute capability 8.6 (< 8.0) + +#define CALL_IF(THREAD_M_BLOCKS, THREAD_N_BLOCKS, THREAD_K_BLOCKS, GROUP_BLOCKS) \ + else if ( \ + thread_m_blocks == THREAD_M_BLOCKS && thread_n_blocks == THREAD_N_BLOCKS && thread_k_blocks == THREAD_K_BLOCKS && \ + group_blocks == GROUP_BLOCKS \ + ) { \ + cudaFuncSetAttribute( \ + Marlin, \ + cudaFuncAttributeMaxDynamicSharedMemorySize, \ + SHARED_MEM \ + ); \ + Marlin< \ + THREADS, THREAD_M_BLOCKS, THREAD_N_BLOCKS, THREAD_K_BLOCKS, STAGES, GROUP_BLOCKS \ + ><<>>( \ + A_ptr, B_ptr, C_ptr, s_ptr, \ + prob_m, prob_n, prob_k, \ + locks \ + ); \ + } + +const int ERR_PROB_SHAPE = 1; +const int ERR_KERN_SHAPE = 2; + +int marlin_cuda( + const void* A, + const void* B, + void* C, + void* s, + int prob_m, + int prob_n, + int prob_k, + void* workspace, + int groupsize = -1, + int dev = 0, + cudaStream_t stream = 0, + int thread_k = -1, + int thread_n = -1, + int sms = -1, + int max_par = 16 +) { + int tot_m = prob_m; + int tot_m_blocks = ceildiv(tot_m, 16); + int pad = 16 * tot_m_blocks - tot_m; + + if (sms == -1) + cudaDeviceGetAttribute(&sms, cudaDevAttrMultiProcessorCount, dev); + if (thread_k == -1 || thread_n == -1) { + if (prob_m <= 16) { + // For small batchizes, better partioning is slightly more important than better compute utilization + thread_k = 128; + thread_n = 128; + } else { + thread_k = 64; + thread_n = 256; + } + } + + int thread_k_blocks = thread_k / 16; + int thread_n_blocks = thread_n / 16; + int group_blocks = (groupsize == -1) ? -1 : groupsize / 16; + int blocks = sms; + + if (prob_n % thread_n != 0 || prob_k % thread_k != 0 || (group_blocks != -1 && prob_k % group_blocks != 0)) + return ERR_PROB_SHAPE; + if (prob_m == 0 || prob_n == 0 || prob_k == 0) + return 0; + + const int4* A_ptr = (const int4*) A; + const int4* B_ptr = (const int4*) B; + int4* C_ptr = (int4*) C; + const int4* s_ptr = (const int4*) s; + + int cols = prob_n / thread_n; + int* locks = (int*) workspace; + + int ret = 0; + for (int i = 0; i < tot_m_blocks; i += 4) { + int thread_m_blocks = tot_m_blocks - i; + prob_m = tot_m - 16 * i; + int par = 1; + if (thread_m_blocks > 4) { + // Note that parallel > 1 currently only works for inputs without any padding + par = (16 * thread_m_blocks - pad) / 64; + if (par > max_par) + par = max_par; + prob_m = 64 * par; + i += 4 * (par - 1); + thread_m_blocks = 4; + } + + // For compilation speed, we only define the kernel configurations that have seemed useful (in terms of performance) + // in our testing, however many more are, in principle, possible. + if (false) {} + CALL_IF(1, 8, 8, -1) + CALL_IF(1, 8, 8, 8) + CALL_IF(1, 16, 4, -1) + CALL_IF(1, 16, 4, 8) + CALL_IF(2, 16, 4, -1) + CALL_IF(2, 16, 4, 8) + CALL_IF(3, 16, 4, -1) + CALL_IF(3, 16, 4, 8) + CALL_IF(4, 16, 4, -1) + CALL_IF(4, 16, 4, 8) + else + ret = ERR_KERN_SHAPE; + + A_ptr += 16 * thread_m_blocks * (prob_k / 8) * par; + C_ptr += 16 * thread_m_blocks * (prob_n / 8) * par; + } + + return ret; +} + + +#endif diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda_kernel.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda_kernel.cuh new file mode 100644 index 0000000000000000000000000000000000000000..b119b79c6eb5779490d6278a428bcbfd853b31d6 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_cuda_kernel.cuh @@ -0,0 +1,20 @@ +#include +#include + +int marlin_cuda( + const void* A, + const void* B, + void* C, + void* s, + int prob_m, + int prob_n, + int prob_k, + void* workspace, + int groupsize, + int dev, + cudaStream_t stream, + int thread_k, + int thread_n, + int sms, + int max_par +); diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_repack.cu b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_repack.cu new file mode 100644 index 0000000000000000000000000000000000000000..0d534cc5c7ac9112fd90f3211add0aae8cde1104 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_repack.cu @@ -0,0 +1,93 @@ +#include +#include +#include +#include + +#include "marlin_repack.cuh" + +__global__ void gptq_repack_kernel( + uint32_t* in, + uint32_t* out, + int m, + int n +) { + uint32_t row = blockIdx.x * 2; + uint32_t col = blockIdx.y * 64; + uint32_t t = threadIdx.x; + + // marlin packs 4 16x16 blocks one time; + const int pad_len = 18; + __shared__ uint8_t block[4][16][pad_len]; + + // unpack + int block_idx = t / 8; + int block_offset = t % 8; + for (int offset = block_offset; offset < 16; offset += 8) { + uint32_t v1 = in[row * n + col + block_idx * 16 + offset]; + uint32_t v2 = in[(row + 1) * n + col + block_idx * 16 + offset]; +#pragma unroll + for (int i = 0; i < 8; i += 1) { + block[block_idx][i][offset] = v1 & 0xf; + v1 >>= 4; + block[block_idx][i + 8][offset] = v2 & 0xf; + v2 >>= 4; + } + } + + // repack + // ref: _get_perms @ https://github.com/IST-DASLab/marlin/blob/master/marlin/__init__.py + uint32_t srow = (t % 4) * 2; + uint32_t scol = t / 4; + + uint32_t idx[8][2]; + idx[0][0] = srow; idx[0][1] = scol; + idx[1][0] = srow + 8; idx[1][1] = scol; + idx[2][0] = srow; idx[2][1] = scol + 8; + idx[3][0] = srow + 8; idx[3][1] = scol + 8; + + idx[4][0] = srow + 1; idx[4][1] = scol; + idx[5][0] = srow + 9; idx[5][1] = scol; + idx[6][0] = srow + 1; idx[6][1] = scol + 8; + idx[7][0] = srow + 9; idx[7][1] = scol + 8; + +#pragma unroll + for (int i = 0; i < 4; i += 1) { + uint32_t v[8]; +#pragma unroll + for (int j = 0; j < 8; ++j) { + v[j] = block[i][idx[j][0]][idx[j][1]]; + } + + uint32_t pack = (v[7] << 28) | (v[6] << 24) | (v[5] << 20) | (v[4] << 16) | + (v[3] << 12) | (v[2] << 8) | (v[1] << 4) | v[0]; + + out[blockIdx.x * n * 2 + blockIdx.y * 128 + t * 4 + i] = pack; + } +} + +torch::Tensor gptq_repack( + torch::Tensor W +) { + int m = W.sizes()[0]; + int n = W.sizes()[1]; + + assert(W.is_contiguous()); + assert(W.dtype() == at::kInt); + assert(m % 2 == 0); + assert(n % 64 == 0); + auto result = at::empty( + {m / 2, n * 2}, at::TensorOptions().dtype(at::kInt).device(W.device())); + + const at::cuda::OptionalCUDAGuard device_guard(device_of(W)); + const dim3 threads(32); + // marlin packs 16 x 64 block and gptq packs 8 x 1 + const dim3 blocks(m / 2, n / 64); + cudaStream_t stream = at::cuda::getCurrentCUDAStream().stream(); + gptq_repack_kernel<<>>( + (uint32_t*)W.data_ptr(), + (uint32_t*)result.data_ptr(), + m, + n + ); + return result; +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_repack.cuh b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_repack.cuh new file mode 100644 index 0000000000000000000000000000000000000000..8b438e4fe1005d887b59fec7176e4f3d5118e1d2 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/marlin/marlin_repack.cuh @@ -0,0 +1,12 @@ +#include + +__global__ void gptq_repack_kernel( + uint32_t* in, + uint32_t* out, + int m, + int n +); + +torch::Tensor gptq_repack( + torch::Tensor W +); \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/qigen/generate.py b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/qigen/generate.py new file mode 100644 index 0000000000000000000000000000000000000000..f7ca5c4f33976c3492e5239e12bde351ec516c0f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/qigen/generate.py @@ -0,0 +1,1699 @@ +import argparse +import subprocess +import time + +import numpy as np +import pandas as pd +import template +from gekko import GEKKO + + +def mem_model(N, M, T, mu, tu, bits, l1, p, gs, verbose=False): + m = GEKKO() # create GEKKO model + # cinfergen if bits==3: + # tu = tu*3 + B = m.Const(value=bits) + TP = m.Const(value=T // p) + k = m.Var(1, integer=True, lb=1) + z = m.Var(1, integer=True, lb=1) + w = m.Var(1, integer=True, lb=1) + y = m.Var(1, integer=True, lb=1) + v = m.Var(1, integer=True, lb=1) + mb = m.Var(mu, integer=True, lb=1) + if gs != -1: + gg = m.Var(1, integer=True, lb=1) + tb = m.Var(tu, integer=True, lb=1, ub=int(T / p)) + L = m.Var(integer=True, lb=0, ub=l1) + m.Equation(L == 32 * mb * N + B * mb * tb + 32 * tb * N) + m.Equation(mb * k == M) + if gs != -1: + m.Equation(gs * gg == mb) + # m.Equation(tb * z == T) + m.Equation(tb * z == TP) + m.Equation(mu * w == mb) + m.Equation(tu * y == tb) + # m.Equation(tb * v == tt) + m.Maximize(L) + m.options.SOLVER = 1 + m.solver_options = [ + "minlp_maximum_iterations 1000", # minlp iterations with integer solution + "minlp_max_iter_with_int_sol 10", # treat minlp as nlp + "minlp_as_nlp 0", # nlp sub-problem max iterations + "nlp_maximum_iterations 100", # 1 = depth first, 2 = breadth first + "minlp_branch_method 2", # maximum deviation from whole number + "minlp_integer_tol 0.00", # covergence tolerance + "minlp_gap_tol 0.01", + ] + try: + m.solve(disp=False) + except: + try: + m.solver_options = [ + "minlp_maximum_iterations 1000", # minlp iterations with integer solution + "minlp_max_iter_with_int_sol 10", # treat minlp as nlp + "minlp_as_nlp 0", # nlp sub-problem max iterations + "nlp_maximum_iterations 100", # 1 = depth first, 2 = breadth first + "minlp_branch_method 1", # maximum deviation from whole number + "minlp_integer_tol 0.00", # covergence tolerance + "minlp_gap_tol 0.01", + ] + m.solve(disp=False) + except: + # mytb = T//p + mytb = tu + if gs != -1: + mymb = gs + while 32 * (mymb + gs) * N + bits * (mymb + gs) * mytb + 32 * mytb * N < l1: + mymb += gs + while M % mymb != 0: + mymb -= gs + if verbose: + print("Failed to solve, using heuristic. mb = ", mymb, "tb = ", mytb) + return (int(mymb), int(mytb)) + else: + mymb = mu + while 32 * (mymb + mu) * N + bits * (mymb + mu) * mytb + 32 * mytb * N < l1: + mymb += mu + while M % mymb != 0: + mymb -= mu + if verbose: + print("Failed to solve, using heuristic. mb = ", mymb, "tb = ", mytb) + return (int(mymb), int(mytb)) + + if verbose: + print("mb = ", int(mb.value[0]), "tb = ", int(tb.value[0])) + return (int(mb.value[0]), int(tb.value[0])) + + +def macros(): + return "#include\n#include\n#include\n#include\n\n#define mymin(a,b) ((a)<(b)?(a):(b))\n#define mymax(a,b) ((a)>(b)?(a):(b))\n" + + +def print_parameters(bits, n, m, t, nb, mb, tb, mu, nu, tu, unroll, p, gs=-1): + res = "" + res += "void print_parameters(){\n" + res += f' std::cout << {bits} << "bits," << {n} << "," << {m} << "," << {t} << "," << {nb} << "," << {mb} << "," << {tb} << "," << {nu} << "," << {mu} << "," << {tu} << "," << {unroll} << "," << {p} << "," << {gs} << ",";\n' + res += "}\n" + return res + + +def print_parameters_module(bits, mu, nu, tu, unroll, p, gs=-1): + res = "" + res += "void print_parameters(){\n" + res += "std::ofstream outfile;\n" + res += 'outfile.open("./autogptq_extension/qigen/tmp.csv", std::ios_base::app);\n' + res += f'outfile << {bits} << "," << {nu} << "," << {mu} << "," << {tu} << "," << {unroll} << "," << {p} << "," << {gs} << ",";\n' + res += "}\n" + return res + + +def pack_in(n, m, nb, mb): + res = "" + res += "inline void pack_input(float* A, float* B){\n" + res += " // copy the full matrix A in blocked format into B\n" + res += " uint64_t idx = 0;\n" + res += f" const int N = {n};\n" + res += f" const int M = {m};\n" + res += f" const int nb = {nb};\n" + res += f" const int mb = {mb};\n" + res += " for(int i = 0; i < N; i+=nb){ \n \ + for(int j = 0; j < M; j+=mb){\n \ + for(int jj = j; jj < mymin(j+mb, M); jj++){\n \ + for(int ii = i; ii < mymin(i+nb, N); ii++){\n \ + B[idx] = A[ii*M+jj];\n \ + idx++;\n \ + }\n \ + }\n \ + }\n \ + }\n \ + }\n" + return res + + +def pack_out(n, t, nb, tb): + res = "" + res += "inline void pack_output(float* A, float* B){\n" + res += " // copy the full matrix A in blocked format into B\n" + res += " uint64_t idx = 0;\n" + res += f" const int N = {n};\n" + res += f" const int M = {t};\n" + res += f" const int nb = {nb};\n" + res += f" const int mb = {tb};\n" + res += " for(int i = 0; i < N; i+=nb){ \n \ + for(int j = 0; j < M; j+=mb){\n \ + for(int ii = i; ii < mymin(i+nb, N); ii++){\n \ + for(int jj = j; jj < mymin(j+mb, M); jj++){\n \ + B[idx] = A[ii*M+jj];\n \ + idx++;\n \ + }\n \ + }\n \ + }\n \ + }\n \ + }\n" + return res + + +def pack_qw(m, t, mb, tb, tb1, bits=4, cutoff=-1): + packed = 32 // bits + res = "" + if cutoff == -1: + cutoff = 65 + if bits == 3: + res += "inline void pack_qw_inner(int* A, int* B, int cutoff){\n" + res += " // copy the full matrix A in blocked format into B\n" + res += " uint64_t idx = 0;\n" + res += f" const int N = {m // 32 * 3};\n" + res += f" const int M = {t};\n" + res += f" const int nb = {mb // 32 * 3};\n" + res += f"int mb = {int(tb)};\n" + res += " for(int j = 0, tid = 0; j < M; j+=mb, tid++){\n" + # res += "if(tid==cutoff){\n " + # res += f" mb = {tb1};\n" + # res += "}\n" + res += " for(int i = 0; i < N; i+=nb){\n \ + for(int ii = i; ii < mymin(i+nb, N); ii+=3){\n \ + for(int jj = j; jj < mymin(j+mb, M); jj+=8){\n \ + for(int iii = ii; iii < ii + 3; iii++){\n \ + for(int jjj = jj; jjj < jj + 8; jjj++){\n \ + B[idx] = A[iii*M+jjj];\n \ + idx++;\n \ + }\n \ + }\n \ + }\n \ + }\n \ + }\n \ + }\n \ + }\n" + res += "inline void pack_qw(int* A, int* B){\n" + res += f" pack_qw_inner(A, B, {cutoff});\n" + res += "}\n" + return res + else: + # in case i do this for python i can just add the n,m,nb,mb as function parameters + res += "inline void pack_qw_inner(int* A, int* B, int cutoff){\n" + res += " // copy the full matrix A in blocked format into B\n" + res += " uint64_t idx = 0;\n" + res += f" const int N = {m // packed};\n" + res += f" const int M = {t};\n" + res += f" const int nb = {mb // packed};\n" + res += f"int mb = {int(tb)};\n" + res += " for(int j = 0, tid = 0; j < M; j+=mb, tid++){\n" + # res += "if(tid==cutoff){\n " + # res += f" mb = {tb1};\n" + # res += "}\n" + res += " for(int i = 0; i < N; i+=nb){\n \ + for(int ii = i; ii < mymin(i+nb, N); ii++){\n \ + for(int jj = j; jj < mymin(j+mb, M); jj++){\n \ + B[idx] = A[ii*M+jj];\n \ + idx++;\n \ + }\n \ + }\n \ + }\n" + res += "}\n" + res += "}\n" + res += "inline void pack_qw(int* A, int* B){\n" + res += f" pack_qw_inner(A, B, {cutoff});\n" + res += "}\n" + return res + + +def block_gs(nu_iter, mu, tu, rho, packed, unroll, bits): + res = "" + i = 0 + # unroll = 4 # number of bcasts and unpacks + if bits == 3: + for j in range(0, tu, 8): + res += f"__m256i w0_{j} = _mm256_loadu_si256((__m256i*)&W[base_W + j*m/{packed}*3 + k*mb*tb/{packed}*3 + k3*tb/{packed}*3 + jw+{j*3}]);\n" + res += f"__m256i w1_{j} = _mm256_loadu_si256((__m256i*)&W[base_W + j*m/{packed}*3 + k*mb*tb/{packed}*3 + k3*tb/{packed}*3 + jw+{j*3}+8]);\n" + res += f"__m256i w2_{j} = _mm256_loadu_si256((__m256i*)&W[base_W + j*m/{packed}*3 + k*mb*tb/{packed}*3 + k3*tb/{packed}*3 + jw+{j*3}+16]);\n" + + u = 0 + first_off = 3 + second_off = 2 + wid = 0 + shift = 0 + while u < 32: + if u == 10: + res += f"__m256 v{i}_{u} = _mm256_set1_ps(input[(i*om+k)*mb*nb + (k3+{u})*nb + i1+{i}]);\n" + + for j in range(0, tu, 8): + res += f"__m256i ws{j}_10 = _mm256_srli_epi32(w0_{j}, {bits*10});\n" + res += f"__m256i temp0_{j} = _mm256_slli_epi32(w1_{j}, 2);\n" + res += f"temp0_{j} = _mm256_and_si256(temp0_{j}, mask);\n" + res += f"ws{j}_10 = _mm256_or_si256(ws{j}_10, temp0_{j});\n" + + res += f"__m256i wsa{j}_{u} = _mm256_and_si256(ws{j}_{u}, mask);\n" + + res += f"__m256 l{j}_{u} = _mm256_cvtepi32_ps(wsa{j}_{u});\n" + + res += f"acc{i}_{j} = _mm256_fmadd_ps(v{i}_{u}, l{j}_{u}, acc{i}_{j});\n" + + wid = wid + 1 + u = u + 1 + + elif u == 21: + res += f"__m256 v{i}_{u} = _mm256_set1_ps(input[(i*om+k)*mb*nb + (k3+{u})*nb + i1+{i}]);\n" + + for j in range(0, tu, 8): + res += f"__m256i ws{j}_{u} = _mm256_srli_epi32(w1_{j}, 31);\n" + res += f"__m256i temp1_{j} = _mm256_slli_epi32(w2_{j}, 1);\n" + res += f"temp1_{j} = _mm256_and_si256(temp1_{j}, mask);\n" + res += f"ws{j}_{u} = _mm256_or_si256(ws{j}_{u}, temp1_{j});\n" + + res += f"__m256i wsa{j}_{u} = _mm256_and_si256(ws{j}_{u}, mask);\n" + + res += f"__m256 l{j}_{u} = _mm256_cvtepi32_ps(wsa{j}_{u});\n" + + res += f"acc{i}_{j} = _mm256_fmadd_ps(v{i}_{u}, l{j}_{u}, acc{i}_{j});\n" + + wid = wid + 1 + u = u + 1 + + for k in range(u, u + second_off): + res += f"__m256 v{i}_{k} = _mm256_set1_ps(input[(i*om+k)*mb*nb + (k3+{k})*nb + i1+{i}]);\n" + + for k in range(u, u + second_off): + for j in range(0, tu, 8): + res += f"__m256i ws{j}_{k} = _mm256_srli_epi32(w{wid}_{j}, {bits*k-wid*32-shift});\n" + + for j in range(0, tu, 8): + res += f"__m256i wsa{j}_{k} = _mm256_and_si256(ws{j}_{k}, mask);\n" + + for j in range(0, tu, 8): + res += f"__m256 l{j}_{k} = _mm256_cvtepi32_ps(wsa{j}_{k});\n" + + for j in range(0, tu, 8): + res += f"acc{i}_{j} = _mm256_fmadd_ps(v{i}_{k}, l{j}_{k}, acc{i}_{j});\n" + + u = u + 2 + + return res + + else: + for j in range(0, tu, 8): + res += f"__m256i w{j} = _mm256_loadu_si256((__m256i*)&W[base_W + j*m/{packed} + k*mb*tb/{packed} + k3*tb/{packed} + j1+{j}]);\n" + + for u in range(packed - unroll, -1, -unroll): + for k in range(u + unroll - 1, u - 1, -1): + res += f"__m256 v{i}_{k} = _mm256_set1_ps(input[(i*om+k)*mb*nb + (k3+{k})*nb + i1+{i}]);\n" + + for k in range(u, u + unroll): + for j in range(0, tu, 8): + res += f"__m256i ws{j}_{k} = _mm256_srli_epi32(w{j}, {bits*k});\n" + + for j in range(0, tu, 8): + res += f"__m256i wsa{j}_{k}= _mm256_and_si256(ws{j}_{k}, mask);\n" + + for j in range(0, tu, 8): + res += f"__m256 l{j}_{k} = _mm256_cvtepi32_ps(wsa{j}_{k});\n" + + for j in range(0, tu, 8): + res += f"acc{i}_{j} = _mm256_fmadd_ps(v{i}_{k}, l{j}_{k}, acc{i}_{j});\n" + + return res + + +def block(nu_iter, mu, tu, rho, packed, unroll, bits): + res = "" + i = 0 + # unroll = 4 # number of bcasts and unpacks + if bits == 3: + for j in range(0, tu, 8): + res += f"__m256i w0_{j} = _mm256_loadu_si256((__m256i*)&W[base_W + j*m/{packed}*3 + k*mb*tb/{packed}*3 + k2*tb/{packed}*3 + jw+{j*3}]);\n" + res += f"__m256i w1_{j} = _mm256_loadu_si256((__m256i*)&W[base_W + j*m/{packed}*3 + k*mb*tb/{packed}*3 + k2*tb/{packed}*3 + jw+{j*3}+8]);\n" + res += f"__m256i w2_{j} = _mm256_loadu_si256((__m256i*)&W[base_W + j*m/{packed}*3 + k*mb*tb/{packed}*3 + k2*tb/{packed}*3 + jw+{j*3}+16]);\n" + + u = 0 + first_off = 3 + second_off = 2 + wid = 0 + shift = 0 + while u < 32: + if u == 10: + res += f"__m256 v{i}_{u} = _mm256_set1_ps(input[(i*om+k)*mb*nb + (k2+{u})*nb + i1+{i}]);\n" + + for j in range(0, tu, 8): + res += f"__m256i ws{j}_10 = _mm256_srli_epi32(w0_{j}, {bits*10});\n" + res += f"__m256i temp0_{j} = _mm256_slli_epi32(w1_{j}, 2);\n" + res += f"temp0_{j} = _mm256_and_si256(temp0_{j}, mask);\n" + res += f"ws{j}_10 = _mm256_or_si256(ws{j}_10, temp0_{j});\n" + + res += f"__m256i wsa{j}_{u} = _mm256_and_si256(ws{j}_{u}, mask);\n" + + res += f"__m256 l{j}_{u} = _mm256_cvtepi32_ps(wsa{j}_{u});\n" + + res += f"acc{i}_{j} = _mm256_fmadd_ps(v{i}_{u}, l{j}_{u}, acc{i}_{j});\n" + + wid = wid + 1 + u = u + 1 + + elif u == 21: + res += f"__m256 v{i}_{u} = _mm256_set1_ps(input[(i*om+k)*mb*nb + (k2+{u})*nb + i1+{i}]);\n" + + for j in range(0, tu, 8): + res += f"__m256i ws{j}_{u} = _mm256_srli_epi32(w1_{j}, 31);\n" + res += f"__m256i temp1_{j} = _mm256_slli_epi32(w2_{j}, 1);\n" + res += f"temp1_{j} = _mm256_and_si256(temp1_{j}, mask);\n" + res += f"ws{j}_{u} = _mm256_or_si256(ws{j}_{u}, temp1_{j});\n" + + res += f"__m256i wsa{j}_{u} = _mm256_and_si256(ws{j}_{u}, mask);\n" + + res += f"__m256 l{j}_{u} = _mm256_cvtepi32_ps(wsa{j}_{u});\n" + + res += f"acc{i}_{j} = _mm256_fmadd_ps(v{i}_{u}, l{j}_{u}, acc{i}_{j});\n" + + wid = wid + 1 + u = u + 1 + + for k in range(u, u + second_off): + res += f"__m256 v{i}_{k} = _mm256_set1_ps(input[(i*om+k)*mb*nb + (k2+{k})*nb + i1+{i}]);\n" + + for k in range(u, u + second_off): + for j in range(0, tu, 8): + res += f"__m256i ws{j}_{k} = _mm256_srli_epi32(w{wid}_{j}, {bits*k-wid*32-shift});\n" + + for j in range(0, tu, 8): + res += f"__m256i wsa{j}_{k} = _mm256_and_si256(ws{j}_{k}, mask);\n" + + for j in range(0, tu, 8): + res += f"__m256 l{j}_{k} = _mm256_cvtepi32_ps(wsa{j}_{k});\n" + + for j in range(0, tu, 8): + res += f"acc{i}_{j} = _mm256_fmadd_ps(v{i}_{k}, l{j}_{k}, acc{i}_{j});\n" + + u = u + 2 + + return res + + else: + for j in range(0, tu, 8): + res += f"__m256i w{j} = _mm256_loadu_si256((__m256i*)&W[base_W + j*m/{packed} + k*mb*tb/{packed} + k2*tb/{packed} + j1+{j}]);\n" + + for u in range(packed - unroll, -1, -unroll): + for k in range(u + unroll - 1, u - 1, -1): + res += f"__m256 v{i}_{k} = _mm256_set1_ps(input[(i*om+k)*mb*nb + (k2+{k})*nb + i1+{i}]);\n" + + for k in range(u, u + unroll): + for j in range(0, tu, 8): + res += f"__m256i ws{j}_{k} = _mm256_srli_epi32(w{j}, {bits*k});\n" + + for j in range(0, tu, 8): + res += f"__m256i wsa{j}_{k}= _mm256_and_si256(ws{j}_{k}, mask);\n" + + for j in range(0, tu, 8): + res += f"__m256 l{j}_{k} = _mm256_cvtepi32_ps(wsa{j}_{k});\n" + + for j in range(0, tu, 8): + res += f"acc{i}_{j} = _mm256_fmadd_ps(v{i}_{k}, l{j}_{k}, acc{i}_{j});\n" + + return res + + +def accumulators_f(nu, tu, gs=False): + accumulators = "" + for i in range(nu): + for j in range(0, tu, 8): + if gs: + accumulators += f"__m256 acc{i}_{j} = _mm256_setzero_ps();\n" + else: + accumulators += ( + f"__m256 acc{i}_{j} = _mm256_loadu_ps(&output[base_output + j + (i1+{i})*t + j1+{j}]);\n" + ) + return accumulators + + +def stores_f(nu, tu, gs=False): + store = "" + if gs: + for i in range(nu): + for j in range(0, tu, 8): + store += f"__m256 o{i}_{j} = _mm256_loadu_ps(&output[base_output + j + (i1+{i})*t + j1+{j}]);\n" + + for i in range(nu): + for j in range(0, tu, 8): + store += f"__m256 s{i}_{j} = _mm256_loadu_ps(&scales[(k*mb+k1)/gs * t + base_output + j + j1+{j}]);\n" + + for i in range(nu): + for j in range(0, tu, 8): + store += f"__m256 f{i}_{j} = _mm256_fmadd_ps(acc{i}_{j}, s{i}_{j}, o{i}_{j});\n" + + for i in range(nu): + for j in range(0, tu, 8): + store += f"_mm256_storeu_ps(&output[base_output + j + (i1+{i})*t + j1+{j}], f{i}_{j});\n" + else: + for i in range(nu): + for j in range(0, tu, 8): + store += f"_mm256_storeu_ps(&output[base_output + j + (i1+{i})*t + j1+{j}], acc{i}_{j});\n" + return store + + +def qforward( + nu, + mu, + tu, + p, + unroll, + bits, + n=0, + m=0, + t=0, + nb=0, + mb=0, + tb=0, + tt=0, + cutoff=-1, + gs=False, + gs_val=-1, + module=True, +): + assert module or (gs and gs_val != -1) or (not gs and gs_val == -1) + if cutoff == -1: + cutoff = p + 1 + # packed = 32 // bits + if bits == 3: + packed = 32 + loopguard = packed + else: + packed = 32 // bits + loopguard = packed + # compute the parameters from the model + + accumulators = accumulators_f(nu, tu, gs) + store = stores_f(nu, tu, gs) + + ugemm = "" + if gs: + ugemm += "int j1 = 0;\n" + if bits == 3: + ugemm += "int jw = 0;\n" + ugemm += f"for(; j1 < tb-tu+1; j1+=tu, jw+={tu*3})" + ugemm += "{\n" + else: + ugemm += "for(; j1 < tb-tu+1; j1+=tu) {\n" + ugemm += "for(int k1 = 0; k1 < mb; k1+=gs) {\n" + ugemm += accumulators + ugemm += f"for(int k2 = k1; k2 < k1+gs; k2+={loopguard})\n" + ugemm += "{\n" + ugemm += block(nu, mu, tu, 16, packed, unroll, bits) + ugemm += "}\n" + ugemm += store + ugemm += "}\n" + ugemm += "}\n" + else: + ugemm += "int j1 = 0;\n" + if bits == 3: + ugemm += "int jw = 0;\n" + ugemm += f"for(; j1 < tb-tu+1; j1+=tu, jw+={tu*3})" + ugemm += "{\n" + else: + ugemm += "for(; j1 < tb-tu+1; j1+=tu) {\n" + ugemm += accumulators + ugemm += "for(int k1 = 0; k1 < mb; k1+=mu) {\n" + ugemm += f"for(int k2 = k1; k2 < k1+mu; k2+={loopguard})" + ugemm += "{\n" + ugemm += block(nu, mu, tu, 16, packed, unroll, bits) + ugemm += "}\n" + ugemm += "}\n" + ugemm += store + ugemm += "}\n" + + res = "" + res += "inline\n" + if gs: + res += f"void q{bits}gemm_gs(const float* __restrict__ input, \n" + else: + res += f"void q{bits}gemm(const float* __restrict__ input, \n" + res += "const int* __restrict__ W, \n" + res += "const float* __restrict__ scales, \n" + res += "const float* __restrict__ zeros, \n" + res += "const float* __restrict__ bias, \n " + res += "const float* __restrict__ sums, \n " + res += "float* __restrict__ output,\n\ +const int n,\n\ +const int m,\n\ +const int t,\n\ +const int nb,\n\ +const int mb,\n\ +const int tb,\n\ +int ogtt,\n" + if gs: + res += "const int gs,\n" + res += "const int cutoff){\n" + + res += f"#pragma omp parallel num_threads({p})\n" + res += "{\n" + res += "int tid;\n" + res += f"const int mu = {mu};\n" + res += f"const int nu = {nu};\n" + res += f"const int tu = {tu};\n" + res += "const int on = n / nb;\n" + res += "const int om = m / mb;\n" + + mask = (2**bits) - 1 + res += f"const __m256i mask = _mm256_set1_epi32({mask});\n" + if bits == 3: + res += "const __m256i mask4 = _mm256_set1_epi32(4);\n" + res += "const __m256i mask6 = _mm256_set1_epi32(6);\n" + res += "tid = omp_get_thread_num();\n" + + res += "int tt = ogtt;\n" + res += "if(tid >= cutoff){\n" + res += "tt -= tb;\n" + res += "}\n" + res += "const int base_output = tid >= cutoff ?\n \ +(tid-cutoff)*tt + (tt+tb)*cutoff: \n \ +tid*tt;\n" # is this >= cutoff or > cutoff? + if bits != 3: + res += f"const int base_W = tid >= cutoff ?\n \ +((tid-cutoff)*tt + (tt+tb)*cutoff)*m/{packed}: \n \ +tid*tt*m/{packed};\n" + else: + res += f"const int base_W = tid >= cutoff ?\n \ +((tid-cutoff)*tt + (tt+tb)*cutoff)*m/{packed}*3: \n \ +tid*tt*m/{packed}*3;\n" + + res += "for(int j = 0; j < tt; j+=tb){\n" + res += "for(int i = 0; i < on; i++) {\n" + res += "for(int k = 0; k < om; k++) {\n" + res += "for(int i1 = 0; i1 < nb; i1+=nu) {\n" + res += ugemm + res += "}\n" + res += "}\n" + res += "}\n" + res += "}\n" + res += "#pragma omp barrier\n" + # res += "#pragma omp for\n" + if gs: + res += "const int ngs = m/gs;\n" + res += "for (int i = 0; i < n; i++) {\n" + res += f"for (int j = 0; j < tt; j+={tu})" + res += "{\n" + for i in range(0, tu, 8): + res += f"__m256 acc{i} = _mm256_setzero_ps();\n" + res += "for (int i1 = 0; i1 < ngs; i1++){\n" + res += "__m256 r = _mm256_set1_ps(sums[i*ngs + i1]);\n" + for i in range(0, tu, 8): + res += f"__m256 z{i} = _mm256_loadu_ps(&zeros[base_output + i1* t + j + {i}]);\n" + # if not module: + if bits != 3 or not module: + for i in range(0, tu, 8): + res += f"__m256 s{i} = _mm256_loadu_ps(&scales[base_output + i1 * t + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 zs{i} = _mm256_mul_ps(z{i}, s{i});\n" + for i in range(0, tu, 8): + # if module: + if bits == 3 and module: + res += f"acc{i} = _mm256_fmadd_ps(z{i}, r, acc{i});\n" + else: + res += f"acc{i} = _mm256_fmadd_ps(zs{i}, r, acc{i});\n" + res += "}\n" + for i in range(0, tu, 8): + res += f"__m256 o{i} = _mm256_loadu_ps(&output[i*t + base_output + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 b{i} = _mm256_loadu_ps(&bias[base_output + j + {i}]);\n" + for i in range(0, tu, 8): + if module: + res += f"__m256 o1{i} = _mm256_sub_ps(o{i}, acc{i});\n" + else: + res += f"__m256 o1{i} = _mm256_add_ps(o{i}, acc{i});\n" + for i in range(0, tu, 8): + res += f"__m256 o2{i} = _mm256_add_ps(o1{i}, b{i});\n" + for i in range(0, tu, 8): + res += f"_mm256_storeu_ps(&output[i*t + base_output + j + {i}], o2{i});\n" + res += "}\n" + res += "}\n" + res += "}\n" + res += "}\n" + else: + res += "for (int i = 0; i < n; i++) {\n" + res += "__m256 r = _mm256_set1_ps(sums[i]);\n" + res += f"for (int j = 0; j < tt; j+={tu})" + res += "{\n" + for i in range(0, tu, 8): + res += f"__m256 o{i} = _mm256_loadu_ps(&output[i*t + base_output + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 z{i} = _mm256_loadu_ps(&zeros[base_output + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 b{i} = _mm256_loadu_ps(&bias[base_output + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 s{i} = _mm256_loadu_ps(&scales[base_output + j + {i}]);\n" + if bits == 3 and module: + for i in range(0, tu, 8): + res += f"__m256 os{i} = _mm256_mul_ps(o{i}, s{i});\n" + for i in range(0, tu, 8): + if module: + if bits == 3: + res += f"__m256 zr{i} = _mm256_fnmadd_ps(z{i}, r, os{i});\n" + else: + res += f"__m256 zr{i} = _mm256_fnmadd_ps(z{i}, r, o{i});\n" + else: + res += f"__m256 zr{i} = _mm256_fmadd_ps(z{i}, r, o{i});\n" + for i in range(0, tu, 8): + # j res += f"__m256 o2{i} = _mm256_mul_ps(zr{i}, s{i});\n" + if bits == 3 and module: + res += f"__m256 o2{i} = _mm256_add_ps(zr{i}, b{i});\n" + else: + res += f"__m256 o2{i} = _mm256_fmadd_ps(zr{i}, s{i}, b{i});\n" + for i in range(0, tu, 8): + res += f"_mm256_storeu_ps(&output[i*t + base_output + j + {i}], o2{i});\n" + res += "}\n" + res += "}\n" + res += "}\n" + res += "}\n" + + # wrapper for qgemm if we call from cpp + if module: + if gs: + res += f"inline void forward{bits}_gs_cpu(\n" + else: + res += f"inline void forward{bits}_cpu(\n" + res += "torch::Tensor in, torch::Tensor weight, torch::Tensor out,\n" + res += "torch::Tensor bias, torch::Tensor scales, torch::Tensor zeros, torch::Tensor sums,\n" + if gs: + res += "int N, int M, int T, int nb, int mb, int tb, int tt, int groupsize, int cutoff){\n" + else: + res += "int N, int M, int T, int nb, int mb, int tb, int tt, int cutoff){\n" + res += "int* W = weight.data_ptr();\n" + res += "float* input = in.data_ptr();\n" + res += "float* b = bias.data_ptr();\n" + res += "float* s = scales.data_ptr();\n" + res += "float* z = zeros.data_ptr();\n" + res += "float* r = sums.data_ptr();\n" + res += "float* O = out.data_ptr();\n" + res += "\n" + if gs: + res += f"q{bits}gemm_gs(input, W, s, z, b, r, O, N, M, T, nb, mb, tb, tt, groupsize, cutoff);\n" + else: + res += f"q{bits}gemm(input, W, s, z, b, r, O, N, M, T, nb, mb, tb, tt, cutoff);\n" + res += "}\n" + else: + res += "inline void qforward(const float* __restrict__ input, \n \ +const int* __restrict__ W, \n\ +const float* __restrict__ scales, \n\ +const float* __restrict__ zeros, \n\ +const float* __restrict__ bias, \n\ +const float* __restrict__ sums, \n\ +float* __restrict__ output, \n\ +int n, \n \ +int m, \n \ +int t) {\n" + if gs: + res += f"q{bits}gemm_gs(input, W, scales, zeros, bias, sums, output, n, m, t, {nb}, {mb}, {tb}, {tt}, {gs_val}, {cutoff});\n" + else: + res += f"q{bits}gemm(input, W, scales, zeros, bias, sums, output, n, m, t, {nb}, {mb}, {tb}, {tt}, {cutoff});\n" + res += "}\n" + return res + + +def gen_model(n, m, t, bits, p, gs): + # get parameters + if bits == 3: + packed = 32 + unroll = 3 + nu = 1 # args.n + mu = 32 + tu = 32 + else: + packed = 32 // bits + unroll = 2 + nu = 1 # args.n + mu = 16 + tu = 32 + + # compute the parameters from the model + + nb = n # it's always small for transformers + + mb, tb = mem_model(n, m, t, mu, tu, bits, l1, p, gs) + + split = np.ones(p) + split = split * tb + while np.sum(split) < t: + split = split + tb + + idx = p - 1 + while np.sum(split) > t: + split[idx] = split[idx] - tb + idx = idx - 1 + + assert np.sum(split) == t + + split = split.astype(int) + tt = int(split[0]) + + if split[0] == split[-1]: + cutoff = int(p + 1) + else: + cutoff = int(idx + 1) + + if gs == -1: + code = qforward( + nu, + mu, + tu, + p, + unroll, + n=n, + m=m, + t=t, + nb=nb, + mb=mb, + tb=tb, + tt=tt, + bits=bits, + cutoff=cutoff, + module=False, + ) + else: + code = qforward( + nu, + mu, + tu, + p, + unroll, + n=n, + m=m, + t=t, + nb=nb, + mb=mb, + tb=tb, + tt=tt, + bits=bits, + cutoff=cutoff, + gs=True, + gs_val=gs, + module=False, + ) + code += pack_in(n, m, nb, mb) + # code += pack_qw(m, t, mb, tb, tb, bits=bits)#, cutoff=cutoff) + code += pack_qw(m, t, mb, tb, tu, bits=bits) + code += pack_out(n, t, nb, tb) + code += print_parameters(bits, n, m, t, nb, mb, tb, mu, nu, tu, unroll, p) + + with open("./autogptq_extension/qigen/forward.h", "w") as f: + f.write(macros()) + f.write(code) + + +def gen_and_compile(n, m, t, nb, mb, tb, nu, mu, tu, p, unroll, bits=4, gs=-1, module=False): + split = np.ones(p) + split = split * tb + while np.sum(split) < t: + split = split + tb + + idx = p - 1 + while np.sum(split) > t: + split[idx] = split[idx] - tb + idx = idx - 1 + + assert np.sum(split) == t + + split = split.astype(int) + tt = int(split[0]) + + if split[0] == split[-1]: + cutoff = int(p + 1) + else: + cutoff = int(idx + 1) + + if gs == -1: + code = qforward( + nu, + mu, + tu, + p, + unroll, + n=n, + m=m, + t=t, + nb=nb, + mb=mb, + tb=tb, + tt=tt, + bits=bits, + cutoff=cutoff, + module=False, + ) + else: + code = qforward( + nu, + mu, + tu, + p, + unroll, + n=n, + m=m, + t=t, + nb=nb, + mb=mb, + tb=tb, + tt=tt, + bits=bits, + cutoff=cutoff, + gs=True, + gs_val=gs, + module=False, + ) + code += pack_in(n, m, nb, mb) + code += pack_qw(m, t, mb, tb, tu, bits=bits) + code += pack_out(n, t, nb, tb) + if module: + code += print_parameters_module(bits, mu, nu, tu, unroll, p, gs=gs) + else: + code += print_parameters(bits, n, m, t, nb, mb, tb, mu, nu, tu, unroll, p, gs=gs) + + # write the code to a file called forward.h + with open("./autogptq_extension/qigen/forward.h", "w") as f: + f.write(macros()) + f.write(code) + + # g++ mmm_test.cpp -O3 -ftree-vectorize -mfma -mavx -mavx2 -fno-signaling-nans -fno-trapping-math -fopenmp -o mmm_test + start = time.time() + if not module: + subprocess.check_output( + [ + "g++", + "-O3", + "-o", + "./autogptq_extension/qigen/mmm_test", + "./autogptq_extension/qigen/mmm_test.cpp", + "-mavx", + "-mfma", + "-mavx2", + "-ftree-vectorize", + "-fno-signaling-nans", + "-fno-trapping-math", + "-march=native", + "-fopenmp", + ] + ) + subprocess.check_output( + [ + "./autogptq_extension/qigen/mmm_test", + f"{n}", + f"{m}", + f"{t}", + f"{bits}", + f"{gs}", + ] + ) + else: + subprocess.check_output( + [ + "g++", + "-O3", + "-o", + "./autogptq_extension/qigen/mmm", + "./autogptq_extension/qigen/mmm.cpp", + "-mavx", + "-mfma", + "-mavx2", + "-ftree-vectorize", + "-fno-signaling-nans", + "-fno-trapping-math", + "-march=native", + "-fopenmp", + ] + ) + subprocess.check_output( + [ + "./autogptq_extension/qigen/mmm", + f"{n}", + f"{m}", + f"{t}", + f"{bits}", + f"{gs}", + ] + ) + + end = time.time() - start + return end + + +def grid(): + tt = 64 + for p in [32]: + # for n in [1, 10]: + for n in [1]: + for m in [4096]: + for t in [4096]: + # for mb in range(1,m): + # for mb in range(32,512,32): + # for mb in [64, 128, 256, 512, 1024, 2048]: + for mb in [512, 1024, 2048]: + if m % mb == 0: + # for tb in range(8,t,8): + # for tb in range(32,512,32): + # for tb in [16, 32, 64]:#, 128, 192, 256]: + # for tb in [32]:#, 128, 192, 256]: + for tb in [128, 256]: + if t % tb == 0: + # for mu in range(32,mb,32): + for mu in [16, 32]: + if mb % mu == 0: + # for tu in range(8,tb,8): + # for tu in [16, 32]: + for tu in [16, 32, 64, 128]: + if tb % tu == 0: + for gs in [-1, 128, 64, 32, 16]: + # for bits in [2, 3, 4]: + for bits in [4, 3, 2]: + if bits == 3: + for u in [5]: + gen_and_compile( + n, + m, + t, + n, + mb, + tb, + 1, + mu, + tu, + p, + u, + bits=bits, + gs=gs, + ) + else: + for u in [1, 2, 4, 8]: + gen_and_compile( + n, + m, + t, + n, + mb, + tb, + 1, + mu, + tu, + p, + u, + bits=bits, + gs=gs, + ) + + +def forward_module_gs(nu, mu, tu, p, unroll, bits): + # packed = 32 // bits + if bits == 3: + packed = 32 + loopguard = packed + else: + packed = 32 // bits + loopguard = packed + # compute the parameters from the model + + accumulators = "" + for i in range(nu): + for j in range(0, tu, 8): + accumulators += f"__m256 acc{i}_{j} = _mm256_setzero_ps();\n" + + store = "" + for i in range(nu): + for j in range(0, tu, 8): + store += f"__m256 o{i}_{j} = _mm256_loadu_ps(&output[base_output + j + (i1+{i})*t + j1+{j}]);\n" + + for i in range(nu): + for j in range(0, tu, 8): + store += f"__m256 s{i}_{j} = _mm256_loadu_ps(&scales[(k*mb+k1)/gs * t + base_output + j + j1+{j}]);\n" + + for i in range(nu): + for j in range(0, tu, 8): + store += f"__m256 f{i}_{j} = _mm256_fmadd_ps(acc{i}_{j}, s{i}_{j}, o{i}_{j});\n" + + for i in range(nu): + for j in range(0, tu, 8): + store += f"_mm256_storeu_ps(&output[base_output + j + (i1+{i})*t + j1+{j}], f{i}_{j});\n" + + ugemm = "" + if bits == 3: + ugemm += "int j1 = 0;\n" + ugemm += "int jw = 0;\n" + ugemm += f"for(; j1 < tb-tu+1; j1+=tu, jw+={tu*3})" + ugemm += "{\n" + else: + ugemm += "int j1 = 0;\n" + ugemm += "for(; j1 < tb-tu+1; j1+=tu) {\n" + ugemm += "for(int k1 = 0; k1 < mb; k1+=gs) {\n" + ugemm += accumulators + ugemm += f"for(int k2 = k1; k2 < k1+gs; k2+={loopguard})\n" + ugemm += "{\n" + ugemm += block(nu, mu, tu, 16, packed, unroll, bits) + ugemm += "}\n" + ugemm += store + ugemm += "}\n" + ugemm += "}\n" + + res = "" + res += "inline\n" + res += f"void q{bits}gemm_gs(const float* __restrict__ input, \n" + res += " const int* __restrict__ W, \n \ + const float* __restrict__ scales, \n" + res += "const float* __restrict__ zeros, \n" + res += " const float* __restrict__ bias, \n " + res += " const float* __restrict__ sums,\n" + res += " float* __restrict__ output,\n \ + const int n,\n \ + const int m,\n \ + const int t,\n \ + const int nb,\n \ + const int mb,\n \ + const int tb,\n \ + int ogtt,\n \ + const int gs,\n\ + const int cutoff){\n" + + res += f"#pragma omp parallel num_threads({p})\n" + res += "{\n" + res += " int tid;\n" + res += f" const int mu = {mu};\n" + res += f" const int nu = {nu};\n" + res += f" const int tu = {tu};\n" + res += " const int on = n / nb;\n" + res += " const int om = m / mb;\n" + + mask = (2**bits) - 1 + res += f"const __m256i mask = _mm256_set1_epi32({mask});\n" + if bits == 3: + res += "const __m256i mask4 = _mm256_set1_epi32(4);\n" + res += "const __m256i mask6 = _mm256_set1_epi32(6);\n" + res += "tid = omp_get_thread_num();\n" + + res += "int tt = ogtt;\n" + res += "if(tid >= cutoff){\n" + res += "tt -= tb;\n" + res += "}\n" + res += "const int base_output = tid >= cutoff ?\n \ +(tid-cutoff)*tt + (tt+tb)*cutoff: \n \ +tid*tt;\n" # is this >= cutoff or > cutoff? + if bits != 3: + res += f"const int base_W = tid >= cutoff ?\n \ +((tid-cutoff)*tt + (tt+tb)*cutoff)*m/{packed}: \n \ +tid*tt*m/{packed};\n" + else: + res += f"const int base_W = tid >= cutoff ?\n \ +((tid-cutoff)*tt + (tt+tb)*cutoff)*m/{packed}*3: \n \ +tid*tt*m/{packed}*3;\n" + + res += "for(int j = 0; j < tt; j+=tb){\n" + res += "for(int i = 0; i < on; i++) {\n" + res += "for(int k = 0; k < om; k++) {\n" + res += "for(int i1 = 0; i1 < nb; i1+=nu) {\n" + res += ugemm + res += "}\n" + res += "}\n" + res += "}\n" + res += "}\n" + res += "const int ngs = m/gs;\n" + res += "#pragma omp barrier\n" + # res += "#pragma omp for collapse(2)\n" + res += "for (int i = 0; i < n; i++) {\n" + # res += f" for (int j = 0; j < t; j+={tu})" + res += f"for (int j = 0; j < tt; j+={tu})" + res += "{\n" + # for i in range(0,tu,8): + # res += f"__m256 o{i} = _mm256_loadu_ps(&output[i*t + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 acc{i} = _mm256_setzero_ps();\n" + res += "for (int i1 = 0; i1 < ngs; i1++){\n" + res += "__m256 r = _mm256_set1_ps(sums[i*ngs + i1]);\n" + for i in range(0, tu, 8): + # res += f"__m256 z{i} = _mm256_loadu_ps(&zeros[i1 * t + j + {i}]);\n" + res += f"__m256 z{i} = _mm256_loadu_ps(&zeros[base_output + i1* t + j + {i}]);\n" + # for i in range(0,tu,8): + # res += f"__m256 s{i} = _mm256_loadu_ps(&scales[i1 * t + j + {i}]);\n" + # for i in range(0,tu,8): + # res += f"__m256 zr{i} = _mm256_mul_ps(z{i}, r);\n" + # for i in range(0,tu,8): + # res += f"acc{i} = _mm256_fmadd_ps(zr{i}, s{i}, acc{i});\n" + for i in range(0, tu, 8): + res += f"acc{i} = _mm256_fmadd_ps(z{i}, r, acc{i});\n" + # for i in range(0,tu,8): + # res += f"__m256 zr{i} = _mm256_mul_ps(z{i}, r);\n" + # for i in range(0,tu,8): + # res += f"o{i} = _mm256_fnmadd_ps(zr{i}, s{i}, o{i});\n" + res += "}\n" + for i in range(0, tu, 8): + # res += f"__m256 o{i} = _mm256_loadu_ps(&output[i*t + j + {i}]);\n" + res += f"__m256 o{i} = _mm256_loadu_ps(&output[i*t + base_output + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 o1{i} = _mm256_sub_ps(o{i}, acc{i});\n" + for i in range(0, tu, 8): + # res += f"_mm256_storeu_ps(&output[i*t + j + {i}], o1{i});\n" + res += f"_mm256_storeu_ps(&output[i*t + base_output + j + {i}], o1{i});\n" + res += " }\n" + res += "}\n" + res += "}\n" + res += "}\n" + + # wrapper for qgemm if we call from cpp + res += f"inline void forward{bits}_gs_cpu(\n" + res += "torch::Tensor in, torch::Tensor weight, torch::Tensor out,\n" + res += "torch::Tensor bias, torch::Tensor scales, torch::Tensor zeros, torch::Tensor sums,\n" + res += "int N, int M, int T, int nb, int mb, int tb, int tt, int groupsize, int cutoff){\n" + res += "int* W = weight.data_ptr();\n" + res += "float* input = in.data_ptr();\n" + res += "float* b = bias.data_ptr();\n" + res += "float* s = scales.data_ptr();\n" + # res += "int* z = zeros.data_ptr();\n" + res += "float* z = zeros.data_ptr();\n" + res += "float* r = sums.data_ptr();\n" + res += "float* O = out.data_ptr();\n" + res += "\n" + res += f"q{bits}gemm_gs(input, W, s, z, b, r, O, N, M, T, nb, mb, tb, tt, groupsize, cutoff);\n" + res += "}\n" + return res + + +def forward_module(nu, mu, tu, p, unroll, bits): + # packed = 32 // bits + if bits == 3: + packed = 32 + loopguard = packed + else: + packed = 32 // bits + loopguard = packed + # compute the parameters from the model + + accumulators = "" + for i in range(nu): + for j in range(0, tu, 8): + accumulators += f"__m256 acc{i}_{j} = _mm256_loadu_ps(&output[base_output + j + (i1+{i})*t + j1+{j}]);\n" + + store = "" + for i in range(nu): + for j in range(0, tu, 8): + store += f"_mm256_storeu_ps(&output[base_output + j + (i1+{i})*t + j1+{j}], acc{i}_{j});\n" + + ugemm = "" + if bits == 3: + ugemm += "int jw = 0;\n" + ugemm += f"for(; j1 < tb-tu+1; j1+=tu, jw+={tu*3})" + ugemm += "{\n" + else: + ugemm += "for(; j1 < tb-tu+1; j1+=tu) {\n" + ugemm += accumulators + ugemm += "for(int k1 = 0; k1 < mb; k1+=mu) {\n" + ugemm += f"for(int k2 = k1; k2 < k1+mu; k2+={loopguard})" + ugemm += "{\n" + ugemm += block(nu, mu, tu, 16, packed, unroll, bits) + ugemm += "}\n" + ugemm += "}\n" + ugemm += store + ugemm += "}\n" + + res = "" + res += "inline\n" + res += f"void q{bits}gemm(const float* __restrict__ input, \n" + res += "const int* __restrict__ W, \n" + res += "const float* __restrict__ scales, \n" + # res += "const int* __restrict__ zeros, \n" + res += "const float* __restrict__ zeros, \n" + res += "const float* __restrict__ bias, \n " + res += "const float* __restrict__ sums," + res += "float* __restrict__ output,\n \ +const int n,\n \ +const int m,\n \ +const int t,\n \ +const int nb,\n \ +const int mb,\n \ +const int tb,\n \ +int ogtt,\n \ +const int cutoff){\n" + + res += f"#pragma omp parallel num_threads({p})\n" + res += "{\n" + res += "int tid, nthreads;\n" + res += f"const int mu = {mu};\n" + res += f"const int nu = {nu};\n" + res += f"const int tu = {tu};\n" + res += "const int on = n / nb;\n" + res += "const int om = m / mb;\n" + + mask = (2**bits) - 1 + res += f"const __m256i mask = _mm256_set1_epi32({mask});\n" + if bits == 3: + res += "const __m256i mask4 = _mm256_set1_epi32(4);\n" + res += "const __m256i mask6 = _mm256_set1_epi32(6);\n" + res += "tid = omp_get_thread_num();\n" + # res += " std::cout << \"thread \" << tid << \" started\" << std::endl;\n" + res += "nthreads = omp_get_num_threads();\n" + + res += "int tt = ogtt;\n" + res += "if(tid >= cutoff){\n" + res += "tt -= tb;\n" + res += "}\n" + res += "const int base_output = tid >= cutoff ?\n \ +(tid-cutoff)*tt + (tt+tb)*cutoff: \n \ +tid*tt;\n" # is this >= cutoff or > cutoff? + if bits != 3: + res += f"const int base_W = tid >= cutoff ?\n \ +((tid-cutoff)*tt + (tt+tb)*cutoff)*m/{packed}: \n \ +tid*tt*m/{packed};\n" + else: + res += f"const int base_W = tid >= cutoff ?\n \ +((tid-cutoff)*tt + (tt+tb)*cutoff)*m/{packed}*3: \n \ +tid*tt*m/{packed}*3;\n" + + res += "for(int j = 0; j < tt; j+=tb){\n" + res += "for(int i = 0; i < on; i++) {\n" + res += "for(int k = 0; k < om; k++) {\n" + res += "for(int i1 = 0; i1 < nb; i1+=nu) {\n" + res += "int j1 = 0;\n" + res += ugemm + res += "}\n" + res += "}\n" + res += "}\n" + res += "}\n" + # res += "#pragma omp barrier\n" + # res += "#pragma omp for\n" + res += "for (int i = 0; i < n; i++) {\n" + res += "__m256 r = _mm256_set1_ps(sums[i]);\n" + # res += f"for (int j = 0; j < t; j+={tu})" + res += f"for (int j = 0; j < tt; j+={tu})" + res += "{\n" + for i in range(0, tu, 8): + # res += f"__m256 o{i} = _mm256_loadu_ps(&output[i*t + j + {i}]);\n" + res += f"__m256 o{i} = _mm256_loadu_ps(&output[i*t + base_output + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 z{i} = _mm256_loadu_ps(&zeros[base_output + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 s{i} = _mm256_loadu_ps(&scales[base_output + j + {i}]);\n" + for i in range(0, tu, 8): + res += f"__m256 zr{i} = _mm256_fnmadd_ps(z{i}, r, o{i});\n" + for i in range(0, tu, 8): + res += f"__m256 o2{i} = _mm256_mul_ps(zr{i}, s{i});\n" + for i in range(0, tu, 8): + res += f"_mm256_storeu_ps(&output[i*t + base_output + j + {i}], o2{i});\n" + res += "}\n" + res += "}\n" + res += "}\n" + res += "}\n" + + # wrapper for qgemm if we call from cpp + res += f"inline void forward{bits}_cpu(\n" + res += "torch::Tensor in, torch::Tensor weight, torch::Tensor out,\n" + res += "torch::Tensor bias, torch::Tensor scales, torch::Tensor zeros, torch::Tensor sums,\n" + res += "int N, int M, int T, int nb, int mb, int tb, int tt, int cutoff){\n" + res += "int* W = weight.data_ptr();\n" + res += "float* input = in.data_ptr();\n" + res += "float* b = bias.data_ptr();\n" + res += "float* s = scales.data_ptr();\n" + # res += "int* z = zeros.data_ptr();\n" + res += "float* z = zeros.data_ptr();\n" + res += "float* r = sums.data_ptr();\n" + res += "float* O = out.data_ptr();\n" + res += "\n" + res += f"q{bits}gemm(input, W, s, z, b, r, O, N, M, T, nb, mb, tb, tt, cutoff);\n" + res += "}\n" + return res + + +def unpack_zeros(bits): + res = "" + res += f"void unpack_zeros{bits}_cpu(const int* zv, float* ov, int n, int m)" + packed = 32 // bits + mask = (2**bits) - 1 + res += "{\nconst __m256i ones = _mm256_set1_epi32(1);\n" + res += f"const __m256i mask = _mm256_set1_epi32({mask});\n" + if bits == 4: + res += "const __m256i shift = _mm256_set_epi32(28,24,20,16,12,8,4,0);\n" + elif bits == 3: + pass + elif bits == 2: + res += "const __m256i shift0 = _mm256_set_epi32(30,28,26,24,22,20,18,16);\n" + res += "const __m256i shift1 = _mm256_set_epi32(14,12,10,8,6,4,2,0);\n" + else: + print("ERROR") + res += "for(int i = 0; i < n; i++){\n" + if bits == 4: + res += "for(int j = 0; j < m; j+=8){\n" + res += "__m256i z = _mm256_set1_epi32(zv[i*m/8 + j/8]);\n" + res += "__m256i z0 = _mm256_srlv_epi32(z, shift);\n" + res += "__m256i z1 = _mm256_and_si256(z0, mask);\n" + res += "__m256i z2 = _mm256_add_epi32(z1, ones);\n" + res += "__m256 z3 = _mm256_cvtepi32_ps(z2);\n" + res += "_mm256_storeu_ps(&ov[i*m +j], z3);\n" + elif bits == 2: + res += f"for (int j = 0; j < m; j+={packed})" + res += "{\n" + res += f"for (int k = 0; k < {packed}; k++)" + res += "{\n" + res += f"ov[i*m + j+k] = (((zv[j/{packed}] >> ({bits}*k)) & {mask})+1);\n" + res += "}\n" + # res += "for(int j = 0; j < m; j+=16){\n" + # res += "__m256i z = _mm256_set1_epi32(zv[i*m/16 + j/16]);\n" + # res += "__m256i z00 = _mm256_srlv_epi32(z, shift0);\n" + # res += "__m256i z01 = _mm256_srlv_epi32(z, shift1);\n" + # res += "__m256i z10 = _mm256_and_si256(z00, mask);\n" + # res += "__m256i z11 = _mm256_and_si256(z01, mask);\n" + # res += "__m256i z20 = _mm256_add_epi32(z10, ones);\n" + # res += "__m256i z21 = _mm256_add_epi32(z11, ones);\n" + # res += "__m256 z30 = _mm256_cvtepi32_ps(z20);\n" + # res += "__m256 z31 = _mm256_cvtepi32_ps(z21);\n" + # res += "_mm256_storeu_ps(&ov[i*m +j], z30);\n" + # res += "_mm256_storeu_ps(&ov[i*m +j+8], z31);\n" + elif bits == 3: + # pass + res += "for(int j = 0; j < m; j+=32){\n" + res += 'std::cout<<"not yet implemented"<> {29 - i*3}) & 7) + 1;\n" + # for i in range(10): + # res += f"ov[i*m + j + {i}] = z0{i} * sv[i*m + j + {i}];\n" + # res += "unsigned int t0 = ((z0<<1 & 6) | (z1>>31)) + 1;\n" + # res += "ov[i*m + j + 10] = t0 * sv[i*m + j + 10];\n" + # for i in range(10): + # res += f"unsigned int z1{i} = ((z1 >> {28 - i*3}) & 7) + 1;\n" + # for i in range(10): + # res += f"ov[i*m + j + {11 + i}] = z1{i} * sv[i*m + j + {11 + i}];\n" + # res += "unsigned int t1 = ((z1<<2 & 6) | (z2>>30)) + 1;\n" + # res += "ov[i*m + j + 21] = t1 * sv[i*m + j + 21];\n" + # for i in range(10): + # res += f"unsigned int z2{i} = ((z2 >> {27 - i*3}) & 7) + 1;\n" + # for i in range(10): + # res += f"ov[i*m + j + {22 + i}] = z2{i} * sv[i*m + j + {22 + i}];\n" + + res += "}\n" + res += "}\n" + res += "}\n" + + # write the pybind interface + res += f"void unpack_zeros{bits}(torch::Tensor zeros, torch::Tensor out, int N, int M)" + res += "{\nint* Z = zeros.data_ptr();\n" + res += "float* O = out.data_ptr();\n" + res += f"unpack_zeros{bits}_cpu(Z, O, N, M);\n" + res += "}\n" + + return res + + +def gen_module(r, p, bits_list=[2, 3, 4]): + code = "" + for bits in bits_list: + if bits == 3: + unroll = 3 + nu = 1 # args.n + mu = 32 + tu = 32 + else: + unroll = 2 + nu = 1 # args.n + mu = 16 + # mu = 32 + tu = 32 + + code += qforward(nu, mu, tu, p, unroll, bits=bits, module=True, gs=False) + code += qforward(nu, mu, tu, p, unroll, bits=bits, module=True, gs=True) + code += pack_qw_module(bits) + code += unpack_zeros(bits) + + with open("./autogptq_extension/qigen/backend.cpp", "w") as f: + f.write(template.includes()) + f.write(template.quant_scalar()) + f.write(compute_reduction(p)) + f.write(unquantize_sim(p)) + f.write(code) + f.write(template.module(bits_list)) + + +def compute_reduction(p): + res = "" + res += "void compute_reduction_cpu(const float* in, float* out, int n, int m, int gs){\n" + res += f"#pragma omp parallel num_threads({p})\n" + res += "{\n" + res += "#pragma omp for collapse(2)\n" + res += "for(int i = 0; i < n; i++){\n" + res += "for(int j0 = 0; j0 < m; j0+=gs){\n" + res += "__m256 acc = _mm256_setzero_ps();\n" + res += "for(int j1 = j0; j1 < j0+gs; j1+=8){\n" + res += "__m256 x = _mm256_loadu_ps(&in[i*m + j1]);\n" + res += "acc = _mm256_add_ps(acc, x);\n" + res += "}\n" + # compute simd add reduction + res += "const __m128 hiQuad = _mm256_extractf128_ps(acc, 1);\n" + res += "const __m128 loQuad = _mm256_castps256_ps128(acc);\n" + res += "const __m128 sumQuad = _mm_add_ps(loQuad, hiQuad);\n" + res += "const __m128 hiDual = _mm_movehl_ps(sumQuad, sumQuad);\n" + res += "const __m128 sumDual = _mm_add_ps(sumQuad, hiDual);\n" + res += "const __m128 hi = _mm_shuffle_ps(sumDual, sumDual, 0x1);\n" + res += "const __m128 sum = _mm_add_ss(hi, sumDual);\n" + res += "out[(i*m + j0)/gs] = _mm_cvtss_f32(sum);\n" + res += "}\n" + res += "}\n" + res += "}\n" + res += "}\n" + + # write the pybind interface + res += "void compute_reduction(torch::Tensor in, torch::Tensor out, int N, int M, int gs)" + res += "{\nfloat* I = in.data_ptr();\n" + res += "float* O = out.data_ptr();\n" + res += "compute_reduction_cpu(I, O, N, M, gs);\n" + res += "}\n" + + return res + + +def unquantize_sim(p): + res = "" + res += "void unquantize_sim_cpu(const int* in, float* out, float* s, float* z, int n, int m, int bits, int gs){\n" + res += f"#pragma omp parallel num_threads({p})\n" + res += "{\n" + res += "int packed = 32/bits;\n" + res += "int mask = (1< +#include "forward.h" +#include +#include +#include +#include +#include + +#define mymin(a,b) ((a)<(b)?(a):(b)) +#define mymax(a,b) ((a)>(b)?(a):(b)) + +void print_matrix(std::string name, float* A, int N, int M){ + std::cout<> 2; + int temp11 = ((int)((A[(i1+11)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 1; + int temp12 = ((int)((A[(i1+12)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 4; + int temp13 = ((int)((A[(i1+13)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 7; + int temp14 = ((int)((A[(i1+14)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 10; + int temp15 = ((int)((A[(i1+15)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 13; + int temp16 = ((int)((A[(i1+16)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 16; + int temp17 = ((int)((A[(i1+17)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 19; + int temp18 = ((int)((A[(i1+18)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 22; + int temp19 = ((int)((A[(i1+19)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 25; + int temp20 = ((int)((A[(i1+20)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 28; + int temp21_0 = ((int)((A[(i1+21)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 31; + int temp21_1 = ((int)((A[(i1+21)*m+j] - zeros[row*m+j])/scales[row*m+j])) >> 1; + int temp22 = ((int)((A[(i1+22)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 2; + int temp23 = ((int)((A[(i1+23)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 5; + int temp24 = ((int)((A[(i1+24)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 8; + int temp25 = ((int)((A[(i1+25)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 11; + int temp26 = ((int)((A[(i1+26)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 14; + int temp27 = ((int)((A[(i1+27)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 17; + int temp28 = ((int)((A[(i1+28)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 20; + int temp29 = ((int)((A[(i1+29)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 23; + int temp30 = ((int)((A[(i1+30)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 26; + int temp31 = ((int)((A[(i1+31)*m+j] - zeros[row*m+j])/scales[row*m+j])) << 29; + + int acc0 = 0, acc1 = 0, acc2 = 0; + + acc0 |= temp0; + acc0 |= temp1; + acc0 |= temp2; + acc0 |= temp3; + acc0 |= temp4; + acc0 |= temp5; + acc0 |= temp6; + acc0 |= temp7; + acc0 |= temp8; + acc0 |= temp9; + acc0 |= temp10_0; + + acc1 |= temp10_1; + acc1 |= temp11; + acc1 |= temp12; + acc1 |= temp13; + acc1 |= temp14; + acc1 |= temp15; + acc1 |= temp16; + acc1 |= temp17; + acc1 |= temp18; + acc1 |= temp19; + acc1 |= temp20; + acc1 |= temp21_0; + + acc2 |= temp21_1; + acc2 |= temp22; + acc2 |= temp23; + acc2 |= temp24; + acc2 |= temp25; + acc2 |= temp26; + acc2 |= temp27; + acc2 |= temp28; + acc2 |= temp29; + acc2 |= temp30; + acc2 |= temp31; + + BQ[(3*i1/32)*m+j] = acc0; + BQ[(3*i1/32+1)*m+j] = acc1; + BQ[(3*i1/32+2)*m+j] = acc2; + } + + }else{ + for (int i1 = i0; i1 < i0+gs; i1+=packed){ + uint32_t acc = 0; + for (int i2 = i1; i2 < i1+packed; i2++){ + int temp = (A[i2*m+j] - zeros[row*m+j])/scales[row*m+j]; + acc = acc | (temp << (bits*(i2-i1))); + } + BQ[(i1/packed)*m+j] = acc; + } + } + } + } + +} + +int main(int argc, char *argv[]){ + // read n m t from args + if(argc == 0){std::cout << "Parameters not given\n"; return 0;} + int n = atoi(argv[1]); + int m = atoi(argv[2]); + int t = atoi(argv[3]); + int bits = atoi(argv[4]); + int gs = atoi(argv[5]); + int ng; + if(gs == -1){ + ng = 1; + }else{ + ng = m/gs; + } + float* A = new float[n*m]; + float* AB = new float[n*m]; + float* B = new float[m*t]; + float* BQS = new float[m*t]; + float* scales = new float[t*ng]; + float* zeros = new float[t*ng]; + int* BQ = new int[m*t/8]; + int* BQB = new int[m*t/8]; + float* sums = new float[n*ng]; + float* bias = new float[t]; + float* C = new float[n*t]; + float* CB = new float[n*t]; + float* C2 = new float[n*t]; + srand(1); + for (int i = 0; i < n*m; i++){ + A[i] = (float)rand() / RAND_MAX; + } + for (int i = 0; i < t*m; i++){ + B[i] = (float)rand() / RAND_MAX; + } + for (int i = 0; i < t; i++){ + bias[i] = (float)rand() / RAND_MAX; + } + for (int i = 0; i < n*t; i++){ + C[i] = 0.0; + C2[i] = 0.0; + } + quantize_sim(B,BQS,scales,zeros,m,t,bits,gs); + quantize(B,BQ,scales,zeros,m,t,bits,gs); + + quantize_sim(B,BQS,scales,zeros,m,t,bits,gs); + quantize(B,BQ,scales,zeros,m,t,bits,gs); + oracle_mmadd(A, BQS, bias, C, n, m, t); + pack_input(A,AB); + pack_qw(BQ,BQB); + pack_output(C,CB); + + compute_reduction(A,sums,n,m,gs); + qforward(AB,BQB,scales,zeros,bias,sums,C2,n,m,t); + + float norm = 0.0; + for (int i = 0; i < n*t; i++){ + norm += (C[i] - C2[i]) * (C[i] - C2[i]); + } + if(norm / (n*t) < 0.0001){ + int iter = 30; + for(int _ = 0; _ < iter; _++){ + qforward(AB,BQB,scales,zeros,bias,sums,C2,n,m,t); + } + + int num_runs = 15; + std::vector runs(num_runs); + for(int r = 0; r < num_runs; r++){ + auto start = std::chrono::high_resolution_clock::now(); + for(int _ = 0; _ < iter; _++){ + qforward(AB,BQB,scales,zeros,bias,sums,C2,n,m,t); + } + auto end = std::chrono::high_resolution_clock::now(); + runs[r] = std::chrono::duration_cast(end - start).count(); + + } + + std::sort(runs.begin(), runs.end()); + + float cycles_final = runs[num_runs/2 + 1] / iter; + + std::ofstream outfile; + outfile.open("./autogptq_extension/qigen/tmp.csv", std::ios_base::app); + + print_parameters(); + outfile << cycles_final << std::endl; + }else{ + float cycles_final = int(10e12); + + std::ofstream outfile; + outfile.open("./autogptq_extension/qigen/tmp.csv", std::ios_base::app); + + print_parameters(); + outfile << cycles_final << std::endl; + } + + return 0; +} + diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/qigen/template.py b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/qigen/template.py new file mode 100644 index 0000000000000000000000000000000000000000..40550c95669a8d3c49c82e799282f85c1c01b480 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/qigen/template.py @@ -0,0 +1,78 @@ +def includes(): + out = " \ +#include \n \ +#include \n \ +#include \n \ +#include \n \ +#include \n \ +\n \ +#define mymin(a,b) ((a)<(b)?(a):(b))\n \ +#define mymax(a,b) ((a)>(b)?(a):(b))\n \ +" + return out + + +def module(bits_list=[4, 2]): + out = "PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {\n" + for bits in bits_list: + out += ' m.def("forward{}", &forward{}_cpu);\n'.format(bits, bits) + + for bits in bits_list: + out += ' m.def("unpack_zeros{}", &unpack_zeros{});\n'.format(bits, bits) + + for bits in bits_list: + out += ' m.def("forward_gs{}", &forward{}_gs_cpu);\n'.format(bits, bits) + + for bits in bits_list: + out += ' m.def("pack{}", &pack{}_w_cpu);\n'.format(bits, bits) + + out += 'm.def("compute_reduction_cpp", &compute_reduction);\n' + out += 'm.def("unquantize_sim", &unquantize_sim);\n' + + # if oracle: + # out += ' m.def("forward4_oracle", &forward4_oracle_cpu);\n' + + out += 'm.def("quant_scalar_scaled", &quant_scalar_cpu);\n' + + out += "}\n" + return out + + +def quant_scalar(): + out = " \ +void quantize_scalar(float* A, int* BQ, float* scales, float* zeros, int n, int m, int bits){ \n \ + //find scales and zeros arrays \n \ + //quantize \n \ + int pack = 32/bits;\n \ + for (int j = 0; j < m; j++){\n \ + for (int i = 0; i < n; i+=pack){\n \ + uint32_t acc = 0;\n \ + for (int ii = i; ii < i+pack; ii++){\n \ + float ftemp = std::round((A[ii*m+j] + zeros[j])/scales[j]);\n \ + int temp = (int)ftemp;\n \ + acc = acc | (temp << (bits*(ii-i)));\n \ + }\n \ + BQ[(i/pack)*m+j] = acc;\n \ + //BQ[0] = acc;\n \ + }\n \ + }\n \ +}\n \ +\n \ +void quant_scalar_cpu(\n \ + torch::Tensor in, torch::Tensor out, \n \ + torch::Tensor scales, torch::Tensor zeros, int bits\n \ +) {\n \ +\n \ + int N = in.size(0);\n \ + int M = in.size(1);\n \ +\n \ + float* input = in.data_ptr(); \n \ + float* s = scales.data_ptr();\n \ + float* z = zeros.data_ptr();\n \ + int* O = out.data_ptr();\n \ + \n \ + quantize_scalar(input, O, s, z, N, M, bits);\n \ +\n \ +}\n" + + return out diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/.ninja_log b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/.ninja_log new file mode 100644 index 0000000000000000000000000000000000000000..b0bb2e8183d3d24568ce2c3a6d11f34bd028715f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/.ninja_log @@ -0,0 +1,2 @@ +# ninja log v5 +0 45731 1750482543910962118 /mlx_devbox/users/chenxinrong.23/playground/chenxr/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/cuda_64/autogptq_cuda_64.o 7390e6fdbf8d0d7f diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_buffers.o b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_buffers.o new file mode 100644 index 0000000000000000000000000000000000000000..0665fb09672a289fc62da8dd36095502c11ef006 Binary files /dev/null and b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_buffers.o differ diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_func/column_remap.o b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_func/column_remap.o new file mode 100644 index 0000000000000000000000000000000000000000..5f112e5ecd8584bede1aca396d2d79210700f9df Binary files /dev/null and b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_func/column_remap.o differ diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_func/q4_matrix.o b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_func/q4_matrix.o new file mode 100644 index 0000000000000000000000000000000000000000..d5c98b94ecef9e1d9871473575b4a557a3b98ad4 Binary files /dev/null and b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllama/cuda_func/q4_matrix.o differ diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllamav2/cuda/q_matrix.o b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllamav2/cuda/q_matrix.o new file mode 100644 index 0000000000000000000000000000000000000000..dc5a2c78673d574e308ab1c91481216c1041e10d Binary files /dev/null and b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/exllamav2/cuda/q_matrix.o differ diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/build.ninja b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/build.ninja new file mode 100644 index 0000000000000000000000000000000000000000..cf9f5fd1c6692fb2aebb9a3d2e630937c345da1c --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/build.ninja @@ -0,0 +1,38 @@ +ninja_required_version = 1.3 +cxx = g++ +nvcc = /usr/local/cuda/bin/nvcc + +cflags = -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -I/usr/local/lib/python3.11/dist-packages/torch/include -I/usr/local/lib/python3.11/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/cuda/include -I/mlx_devbox/users/chenxinrong.23/playground/chenxr/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_cuda -I/usr/include/python3.11 -I/usr/include/python3.11 -c +post_cflags = -std=c++20 -DTORCH_API_INCLUDE_EXTENSION_H '-DPYBIND11_COMPILER_TYPE="_gcc"' '-DPYBIND11_STDLIB="_libstdcpp"' '-DPYBIND11_BUILD_ABI="_cxxabi1016"' -DTORCH_EXTENSION_NAME=autogptq_cuda_64 -D_GLIBCXX_USE_CXX11_ABI=1 +cuda_cflags = -I/usr/local/lib/python3.11/dist-packages/torch/include -I/usr/local/lib/python3.11/dist-packages/torch/include/torch/csrc/api/include -I/usr/local/cuda/include -I/mlx_devbox/users/chenxinrong.23/playground/chenxr/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_cuda -I/usr/include/python3.11 -I/usr/include/python3.11 -c +cuda_post_cflags = -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_BFLOAT16_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options ''"'"'-fPIC'"'"'' -std=c++20 -DTORCH_API_INCLUDE_EXTENSION_H '-DPYBIND11_COMPILER_TYPE="_gcc"' '-DPYBIND11_STDLIB="_libstdcpp"' '-DPYBIND11_BUILD_ABI="_cxxabi1016"' -DTORCH_EXTENSION_NAME=autogptq_cuda_64 -D_GLIBCXX_USE_CXX11_ABI=1 -gencode=arch=compute_70,code=compute_70 -gencode=arch=compute_70,code=sm_70 -ccbin g++ +cuda_dlink_post_cflags = +sycl_dlink_post_cflags = +ldflags = + +rule compile + command = $cxx -MMD -MF $out.d $cflags -c $in -o $out $post_cflags + depfile = $out.d + deps = gcc + +rule cuda_compile + depfile = $out.d + deps = gcc + command = $nvcc --generate-dependencies-with-compile --dependency-output $out.d $cuda_cflags -c $in -o $out $cuda_post_cflags + + + + + + + +build /mlx_devbox/users/chenxinrong.23/playground/chenxr/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/cuda_64/autogptq_cuda_64.o: compile /mlx_devbox/users/chenxinrong.23/playground/chenxr/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_64/autogptq_cuda_64.cpp +build /mlx_devbox/users/chenxinrong.23/playground/chenxr/lm-quant-toolkit/.deps/AutoGPTQ/build/temp.linux-x86_64-cpython-311/autogptq_extension/cuda_64/autogptq_cuda_kernel_64.o: cuda_compile /mlx_devbox/users/chenxinrong.23/playground/chenxr/lm-quant-toolkit/.deps/AutoGPTQ/autogptq_extension/cuda_64/autogptq_cuda_kernel_64.cu + + + + + + + + diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/docs/INSTALLATION.md b/lm-quant-toolkit/.deps/AutoGPTQ/docs/INSTALLATION.md new file mode 100644 index 0000000000000000000000000000000000000000..3dd7472380e36d16c332dd69022e3ce3c303b6a8 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/docs/INSTALLATION.md @@ -0,0 +1,20 @@ +# Installation + +On Linux and Windows, AutoGPTQ can be installed through pre-built wheels for specific PyTorch versions: + +| AutoGPTQ version | CUDA/ROCm version | Installation | Built against PyTorch | +|------------------|-------------------|------------------------------------------------------------------------------------------------------------|-----------------------| +| latest (0.7.1) | CUDA 11.8 | `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/` | 2.2.1+cu118 | +| latest (0.7.1) | CUDA 12.1 | `pip install auto-gptq` | 2.2.1+cu121 | +| latest (0.7.1) | ROCm 5.7 | `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm571/` | 2.2.1+rocm5.7 | +| 0.7.0 | CUDA 11.8 | `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/` | 2.2.0+cu118 | +| 0.7.0 | CUDA 12.1 | `pip install auto-gptq` | 2.2.0+cu121 | +| 0.7.0 | ROCm 5.7 | `pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm571/` | 2.2.0+rocm5.7 | +| 0.6.0 | CUDA 11.8 | `pip install auto-gptq==0.6.0 --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/` | 2.1.1+cu118 | +| 0.6.0 | CUDA 12.1 | `pip install auto-gptq==0.6.0` | 2.1.1+cu121 | +| 0.6.0 | ROCm 5.6 | `pip install auto-gptq==0.6.0 --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm561/` | 2.1.1+rocm5.6 | +| 0.5.1 | CUDA 11.8 | `pip install auto-gptq==0.5.1 --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu118/` | 2.1.0+cu118 | +| 0.5.1 | CUDA 12.1 | `pip install auto-gptq==0.5.1` | 2.1.0+cu121 | +| 0.5.1 | ROCm 5.6 | `pip install auto-gptq==0.5.1 --extra-index-url https://huggingface.github.io/autogptq-index/whl/rocm561/` | 2.1.0+rocm5.6 | + +AutoGPTQ is not available on macOS. \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/docs/NEWS_OR_UPDATE.md b/lm-quant-toolkit/.deps/AutoGPTQ/docs/NEWS_OR_UPDATE.md new file mode 100644 index 0000000000000000000000000000000000000000..b69a5c52cf342edfc1e3f2437ee631eecaba155c --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/docs/NEWS_OR_UPDATE.md @@ -0,0 +1,20 @@ +##
News or Update
+ +- 2024-02-15 - (News) - AutoGPTQ 0.7.0 is released, with [Marlin](https://github.com/IST-DASLab/marlin) int4*fp16 matrix multiplication kernel support. +- 2023-08-23 - (News) - 🤗 Transformers, optimum and peft have integrated `auto-gptq`, so now running and training GPTQ models can be more available to everyone! See [this blog](https://huggingface.co/blog/gptq-integration) and it's resources for more details! +- 2023-08-21 - (News) - Team of Qwen officially released 4bit quantized version of Qwen-7B based on `auto-gptq`, and provided [a detailed benchmark results](https://huggingface.co/Qwen/Qwen-7B-Chat-Int4#%E9%87%8F%E5%8C%96-quantization) +- 2023-08-06 - (Update) - Support exllama's q4 CUDA kernel to have at least 1.3x speed up for int4 quantized models when doing inference. +- 2023-08-04 - (Update) - Support RoCm so that AMD GPU users can use auto-gptq with CUDA extensions. +- 2023-07-26 - (Update) - An elegant [PPL benchmark script](examples/benchmark/perplexity.py) to get results that can be fairly compared with other libraries such as `llama.cpp`. +- 2023-06-05 - (Update) - Integrate with 🤗 peft to use gptq quantized model to train adapters, support LoRA, AdaLoRA, AdaptionPrompt, etc. +- 2023-05-30 - (Update) - support download/upload quantized model from/to 🤗 Hub. +- 2023-05-27 - (Update) - Support quantization and inference for `gpt_bigcode`, `codegen` and `RefineWeb/RefineWebModel`(falcon) model types. +- 2023-05-04 - (Update) - Support using faster cuda kernel when `not desc_act or group_size == -1` +- 2023-04-29 - (Update) - Support loading quantized model from arbitrary quantize_config and model_basename. +- 2023-04-28 - (Update) - Support CPU offload and quantize/inference on multiple devices, support `gpt2` type models. +- 2023-04-26 - (Update) - Using `triton` to speed up inference is now supported. +- 2023-04-25 - (News&Update) - [MOSS](https://github.com/OpenLMLab/MOSS) is an open-source tool-augmented conversational language model from Fudan University, quantization is now supported in AutoGPTQ. +- 2023-04-23 - (Update) - Support evaluation on multiple (down-stream) tasks such as: language-modeling, text-classification, text-summarization. +- 2023-04-22 - (News) - qwopqwop200's [AutoGPTQ-triton](https://github.com/qwopqwop200/AutoGPTQ-triton) provides faster speed to integrate with quantized model, for everyone who can access to triton, try and enjoy yourself! +- 2023-04-20 - (News) - AutoGPTQ is automatically compatible with Stability-AI's newly released `gpt_neox` type model family [StableLM](https://github.com/Stability-AI/StableLM). +- 2023-04-16 - (Update) - Support quantization and inference for `bloom`, `gpt_neox`, `gptj`, `llama` and `opt`. \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/docs/tutorial/01-Quick-Start.md b/lm-quant-toolkit/.deps/AutoGPTQ/docs/tutorial/01-Quick-Start.md new file mode 100644 index 0000000000000000000000000000000000000000..001aa239207ad1123a12c0df903f60e040d52446 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/docs/tutorial/01-Quick-Start.md @@ -0,0 +1,94 @@ +# Quick Start + +Welcome to the tutorial of AutoGPTQ, in this chapter, you will learn quick install `auto-gptq` from pypi and the basic usages of this library. + +## Quick Installation + +Start from v0.0.4, one can install `auto-gptq` directly from pypi using `pip`: +```shell +pip install auto-gptq +``` + +AutoGPTQ supports using `triton` to speedup inference, but it currently **only supports Linux**. To integrate triton, using: +```shell +pip install auto-gptq[triton] +``` + +For some people who want to try the newly supported `llama` type models in 🤗 Transformers but not update it to the latest version, using: +```shell +pip install auto-gptq[llama] +``` + +By default, CUDA extension will be built at installation if CUDA and pytorch are already installed. + +To disable building CUDA extension, you can use the following commands: + +For Linux +```shell +BUILD_CUDA_EXT=0 pip install auto-gptq +``` +For Windows +```shell +set BUILD_CUDA_EXT=0 && pip install auto-gptq +``` + +## Basic Usage +*The full script of basic usage demonstrated here is `examples/quantization/basic_usage.py`* + +The two main classes currently used in AutoGPTQ are `AutoGPTQForCausalLM` and `BaseQuantizeConfig`. +```python +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +``` +### Quantize a pretrained model +To quantize a model, you need to load pretrained model and tokenizer first, for example: +```python +from transformers import AutoTokenizer + +pretrained_model_name = "facebook/opt-125m" +quantize_config = BaseQuantizeConfig(bits=4, group_size=128) +model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_name, quantize_config) +tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name) +``` +This will download `opt-125m` from 🤗 Hub and cache it to local disk, then load into **CPU memory**. + +*In later tutorial, you will learn advanced model loading strategies such as CPU offload and load model into multiple devices.* + +Then, prepare examples(a list of dict with only two keys, 'input_ids' and 'attention_mask') to guide quantization. Here we use only one text to simplify the code, but you should be noticed that the more examples used, the better(most likely) the quantized model. +```python +examples = [ + tokenizer( + "auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm." + ) +] +``` +After all recipes are prepared, we can now start to quantize the pretrained model. +```python +model.quantize(examples) +``` +Finally, we can save the quantized model: +```python +quantized_model_dir = "opt-125m-4bit-128g" +model.save_quantized(quantized_model_dir) +``` +By default, the saved file type is `.bin`, you can also set `use_safetensors=True` to save a `.safetensors` model file. The format of model file base name saved using this method is: `gptq_model-{bits}bit-{group_size}g`. + +Pretrained model's config and the quantize config will also be saved with file names `config.json` and `quantize_config.json`, respectively. + +### Load quantized model and do inference +Instead of `.from_pretrained`, you should use `.from_quantized` to load a quantized model. +```python +device = "cuda:0" +model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device=device) +``` +This will first read and load `quantize_config.json` in `opt-125m-4bit-128g` directory, then based on the values of `bits` and `group_size` in it, load `gptq_model-4bit-128g.bin` model file into the first visible GPU. + +Then you can initialize 🤗 Transformers' `TextGenerationPipeline` and do inference. +```python +from transformers import TextGenerationPipeline + +pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer, device=device) +print(pipeline("auto-gptq is")[0]["generated_text"]) +``` + +## Conclusion +Congrats! You learned how to quickly install `auto-gptq` and integrate with it. In the next chapter, you will learn the advanced loading strategies for pretrained or quantized model and some best practices on different situations. \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/docs/tutorial/02-Advanced-Model-Loading-and-Best-Practice.md b/lm-quant-toolkit/.deps/AutoGPTQ/docs/tutorial/02-Advanced-Model-Loading-and-Best-Practice.md new file mode 100644 index 0000000000000000000000000000000000000000..439ac9121d3159831bf87e3571a6c333b5cf4c75 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/docs/tutorial/02-Advanced-Model-Loading-and-Best-Practice.md @@ -0,0 +1,74 @@ +# Advanced Model Loading and Best Practice +Welcome to the tutorial of AutoGPTQ, in this chapter, you will learn advanced model loading and best practice in `auto-gptq`. + +## Arguments Introduction +In previous chapter, you learned how to load model into CPU or single GPU with the two basic apis: +- `.from_pretrained`: by default, load the whole pretrained model into CPU. +- `.from_quantized`: by default, `auto_gptq` will automatically find the suitable way to load the quantized model. + - if there is only single GPU and model can fit into it, will load the whole model into that GPU; + - if there are multiple GPUs and model can fit into them, will evenly split model and load into those GPUs; + - if model can't fit into GPU(s), will use CPU offloading. + +However, the default settings above may not meet many users' demands, for they want to have more control of model loading. + +Luckily, in AutoGPTQ, we provide some advanced arguments that users can tweak to manually config model loading strategy: +- `low_cpu_mem_usage`: `bool` type argument, defaults to False, can be used both in `.from_pretrained` and `.from_quantized`, one can enable it when there is a limitation of CPU memory(by default model will be initialized in CPU) or want to load model faster. +- `max_memory`: an optional `List[Dict[Union[str, int], str]]` type argument, can be used both in `.from_pretrained` and `.from_quantized`. +- `device_map`: an optional `Union[str, Dict[str, Union[int, str]]]` type argument, currently only be supported in `.from_quantized`. + +Before `auto-gptq`'s existence, there are many users have already used other popular tools such as [GPTQ-for-LLaMa](https://github.com/qwopqwop200/GPTQ-for-LLaMa) to quantize their model and saved with different name without `quantize_config.json` file introduced in previous chapter. + +To address this, two more arguments were introduced in `.from_quantized` so that users can load quantized model with arbitrary names. +- `quantize_config`: an optional `BaseQuantizeConfig` type argument, can be used to match model file and initialize model incase `quantize_config.json` not in the directory where model is saved. +- `model_basename`: an optional `str` type argument, if specified, will be used to match model instead of using the file name format introduced in previous chapter. + +## Multiple Devices Model Loading + +### max_memory +With this argument, you can specify how much memory for CPU and GPUs to use at most. + +That means, by specify the maximum CPU memory used at model loading, you can load some model weights to CPU and picked into GPU only when they're required to be used, and back CPU again after that. This is called "CPU offload", a very useful strategy that used when there is no room left for quantization or inference if you keep the whole model in GPU(s). + +Assume you have multiple GPUs, for each of them, you can also specify maximum memory that used to load model, separately. And by this, quantization and inference will be executed across devices. + +To better understanding, below are some examples. + +```python +max_memory = {0: "20GIB"} +``` +In this case, only first GPU (even if you have more GPUs) will be used to load model, and an error will be raised if the model requires memory over 20GB. + +```python +max_memory = {0: "20GIB", 1: "20GIB"} +``` +In this case, you can load model that smaller than 40GB into two GPUs, and the model will be split evenly. + +```python +max_memory = {0: "10GIB", 1: "30GIB"} +``` +In this case, you can also load model that smaller than 40GB into two GPUs, but the first GPU will use 10GB at most, which means if the model larger than 20GB, all model weights except the first 10GB will be loaded into the second GPU. + +```python +max_memory = {0: "20GIB", "cpu": "20GIB"} +``` +In this case, you can also load model that smaller than 40GB but the rest 20GB will be kept in CPU memory, only be collected into GPU when needed. + +### device_map +So far, only `.from_quantized` supports this argument. + +You can provide a string to this argument to use pre-set model loading strategies. Current valid values are `["auto", "balanced", "balanced_low_0", "sequential"]` + +In the simplest way, you can set `device_map='auto'` and let 🤗 Accelerate handle the device map computation. For more details of this argument, you can reference to [this document](https://huggingface.co/docs/accelerate/main/en/usage_guides/big_modeling#designing-a-device-map). + +## Best Practice + +### At Quantization +It's always recommended to first consider loading the whole model into GPU(s) for it can save the time spend on transferring module's weights between CPU and GPU. + +However, not everyone have large GPU memory. Roughly speaking, always specify the maximum memory CPU will be used to load model, then, for each GPU, you can preserve memory that can fit in 1\~2(2\~3 for the first GPU incase CPU offload used) model layers for examples' tensors and calculations in quantization, and load model weights using all others left. By this, all you need to do is a simple math based on the number of GPUs you have, the size of model weights file(s) and the number of model layers. + +### At Inference +For inference, following this principle: always using single GPU if you can, otherwise multiple GPUs, CPU offload is the last one to consider. + +## Conclusion +Congrats! You learned the advanced strategies to load model using `.from_pretrained` and `.from_quantized` in `auto-gptq` with some best practice advices. In the next chapter, you will learn how to quickly customize an AutoGPTQ model and use it to quantize and inference. diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/README.md b/lm-quant-toolkit/.deps/AutoGPTQ/examples/README.md new file mode 100644 index 0000000000000000000000000000000000000000..010d94e1c1789236c13fdf884c2629e49c0afbce --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/README.md @@ -0,0 +1,113 @@ +# Examples + +To run example scripts in this folder, one must first install `auto_gptq` as described in [this](../README.md) + +## Quantization +> Commands in this chapter should be run under `quantization` folder. + +### Basic Usage +To Execute `basic_usage.py`, using command like this: +```shell +python basic_usage.py +``` + +This script also showcases how to download/upload quantized model from/to 🤗 Hub, to enable those features, you can uncomment the commented codes. + +To Execute `basic_usage_wikitext2.py`, using command like this: +```shell +python basic_usage_wikitext2.py +``` +> Note: There is about 0.6 ppl degrade on opt-125m model using AutoGPTQ, compared to GPTQ-for-LLaMa. + +### Quantize with Alpaca +To Execute `quant_with_alpaca.py`, using command like this: +```shell +python quant_with_alpaca.py --pretrained_model_dir "facebook/opt-125m" --per_gpu_max_memory 4 --quant_batch_size 16 +``` + +Use `--help` flag to see detailed descriptions for more command arguments. + +The alpaca dataset used in here is a cleaned version provided by **gururise** in [AlpacaDataCleaned](https://github.com/gururise/AlpacaDataCleaned) + +## Evaluation +> Commands in this chapter should be run under `evaluation` folder. + +### Language Modeling Task +`run_language_modeling_task.py` script gives an example of using `LanguageModelingTask` to evaluate model's performance on language modeling task before and after quantization using `tatsu-lab/alpaca` dataset. + +To execute this script, using command like this: +```shell +CUDA_VISIBLE_DEVICES=0 python run_language_modeling_task.py --base_model_dir PATH/TO/BASE/MODEL/DIR --quantized_model_dir PATH/TO/QUANTIZED/MODEL/DIR +``` + +Use `--help` flag to see detailed descriptions for more command arguments. + +### Sequence Classification Task +`run_sequence_classification_task.py` script gives an example of using `SequenceClassificationTask` to evaluate model's performance on sequence classification task before and after quantization using `cardiffnlp/tweet_sentiment_multilingual` dataset. + +To execute this script, using command like this: +```shell +CUDA_VISIBLE_DEVICES=0 python run_sequence_classification_task.py --base_model_dir PATH/TO/BASE/MODEL/DIR --quantized_model_dir PATH/TO/QUANTIZED/MODEL/DIR +``` + +Use `--help` flag to see detailed descriptions for more command arguments. + +### Text Summarization Task +`run_text_summarization_task.py` script gives an example of using `TextSummarizationTask` to evaluate model's performance on text summarization task before and after quantization using `samsum` dataset. + +To execute this script, using command like this: +```shell +CUDA_VISIBLE_DEVICES=0 python run_text_summarization_task.py --base_model_dir PATH/TO/BASE/MODEL/DIR --quantized_model_dir PATH/TO/QUANTIZED/MODEL/DIR +``` + +Use `--help` flag to see detailed descriptions for more command arguments. + +## Benchmark +> Commands in this chapter should be run under `benchmark` folder. + +### Generation Speed +`generation_speed.py` script gives an example of how to benchmark the generations speed of pretrained and quantized models that `auto_gptq` supports, this benchmarks model generation speed in tokens/s metric. + +To execute this script, using command like this: +```shell +CUDA_VISIBLE_DEVICES=0 python generation_speed.py --model_name_or_path PATH/TO/MODEL/DIR +``` + +Use `--help` flag to see detailed descriptions for more command arguments. + +## PEFT +> Commands in this chapter should be run under `peft` folder. + +### Lora +`peft_lora_clm_instruction_tuning.py` script gives an example of instruction tuning gptq quantized model's lora adapter using tools in `auto_gptq.utils.peft_utils` and `🤗 peft` on alpaca dataset. + +To execute this script, using command like this: +```shell +CUDA_VISIBLE_DEVICES=0 python peft_lora_clm_instruction_tuning.py --model_name_or_path PATH/TO/MODEL/DIR +``` + +Use `--help` flag to see detailed descriptions for more command arguments. + +### AdaLora +`peft_adalora_clm_instruction_tuning.py` script gives an example of instruction tuning gptq quantized model's adalora adapter using tools in `auto_gptq.utils.peft_utils` and `🤗 peft` on alpaca dataset. + +To execute this script, using command like this: +```shell +CUDA_VISIBLE_DEVICES=0 python peft_adalora_clm_instruction_tuning.py --model_name_or_path PATH/TO/MODEL/DIR +``` + +Use `--help` flag to see detailed descriptions for more command arguments. + + +### AdaptionPrompt +`peft_adaption_prompt_clm_instruction_tuning.py` script gives an example of instruction tuning gptq quantized model's adaption_prompt adapter(llama-adapter) using tools in `auto_gptq.utils.peft_utils` and `🤗 peft` on alpaca dataset. + +To execute this script, using command like this: +```shell +CUDA_VISIBLE_DEVICES=0 python peft_adaption_prompt_clm_instruction_tuning.py --model_name_or_path PATH/TO/MODEL/DIR +``` + +Use `--help` flag to see detailed descriptions for more command arguments. + +If you want to try models other than llama, you can install peft from source using [this branch](https://github.com/PanQiWei/peft/tree/multi_modal_adaption_prompt), see [here](https://github.com/PanQiWei/peft/blob/a5f8f74f07591efe5eb3d08cb1b31b981e84a069/src/peft/tuners/adaption_prompt.py#L235) +to check what other models are also supported, and with this branch installed, you can also use `ADAPTION_PROMPT_V2` peft type (llama-adapter-v2) by simply replace `AdaptionPromptConfig` with `AdaptionPromptV2Config` in the script. \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/benchmark/generation_speed.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/benchmark/generation_speed.py new file mode 100644 index 0000000000000000000000000000000000000000..f59e547a02a01d070470052cde86e40330c099cd --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/benchmark/generation_speed.py @@ -0,0 +1,326 @@ +import json +import logging +import random +import time +from argparse import ArgumentParser +from itertools import chain +from typing import Dict, List, Optional + +import torch +from datasets import Dataset +from tqdm import tqdm +from transformers import AutoTokenizer, GenerationConfig +from transformers.generation.logits_process import LogitsProcessor + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig + + +logger = logging.getLogger(__name__) + +random.seed(0) + + +class CustomizedMinNewTokensLogitsProcessor(LogitsProcessor): + def __init__( + self, + min_new_tokens: int = None, + eos_token_id: int = None, + ): + self.eos_token_id = eos_token_id + self.min_new_tokens = min_new_tokens or 0 + self.current_step = 0 + + def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor: + self.current_step += 1 + + if self._skip_process(): + return scores + + if any(each is not None for each in [self.eos_token_id]): + banned_mask = torch.zeros_like(scores).to(scores.device) + if self.eos_token_id and self.current_step <= self.min_new_tokens: + banned_mask = self._fill_banned_mask(input_ids, banned_mask, {1: [[self.eos_token_id]]}) + scores = scores.masked_fill(banned_mask.bool(), -float("inf")) + + return scores + + def _skip_process(self): + if self.current_step > self.min_new_tokens: + return True + return False + + @staticmethod + def _fill_banned_mask( + input_ids: torch.LongTensor, + banned_mask: torch.Tensor, + len2words_ids: Dict[int, List[List[int]]], + ): + for token_len, token_ids in len2words_ids.items(): + if token_len == 1: + banned_mask[..., list(chain(*token_ids))] = 1 + elif input_ids.shape[-1] < token_len - 1: + continue + else: + token_ids = torch.LongTensor(token_ids).to(input_ids.device) + hit_masks = torch.all( + token_ids[..., :-1].unsqueeze(0).repeat(input_ids.shape[0], 1, 1) + == input_ids[..., -(token_ids.shape[-1] - 1) :].unsqueeze(1), + dim=-1, + ) + for idx in range(hit_masks.shape[0]): + selected_token_ids = torch.masked_select(token_ids[..., -1], hit_masks[idx]) + if len(selected_token_ids): + banned_mask[idx, selected_token_ids] = 1 + return banned_mask + + +def load_data(data_path, tokenizer, n_samples, max_new_tokens): + with open(data_path, "r", encoding="utf-8") as f: + raw_data = json.load(f) + + raw_data = random.sample(raw_data, k=min(n_samples, len(raw_data))) + + def dummy_gen(): + return raw_data + + def tokenize(examples): + instructions = examples["instruction"] + inputs = examples["input"] + outputs = examples["output"] + + prompts = [] + texts = [] + input_ids = [] + attention_mask = [] + for istr, inp, opt in zip(instructions, inputs, outputs): + if inp: + prompt = f"Instruction:\n{istr}\nInput:\n{inp}\nOutput:\n" + text = prompt + opt + else: + prompt = f"Instruction:\n{istr}\nOutput:\n" + text = prompt + opt + if len(tokenizer(prompt)["input_ids"]) >= tokenizer.model_max_length - max_new_tokens: + continue + + tokenized_data = tokenizer(text) + + input_ids.append(tokenized_data["input_ids"][: tokenizer.model_max_length]) + attention_mask.append(tokenized_data["attention_mask"][: tokenizer.model_max_length]) + prompts.append(prompt) + texts.append(text) + + return { + "input_ids": input_ids, + "attention_mask": attention_mask, + "prompt": prompts, + } + + dataset = Dataset.from_generator(dummy_gen) + + dataset = dataset.map( + tokenize, + batched=True, + batch_size=len(dataset), + num_proc=1, + keep_in_memory=True, + load_from_cache_file=False, + remove_columns=["instruction", "input"], + ) + + dataset = dataset.to_list() + + for sample in dataset: + sample["input_ids"] = torch.LongTensor(sample["input_ids"]) + sample["attention_mask"] = torch.LongTensor(sample["attention_mask"]) + + return dataset + + +def load_model_tokenizer( + model_name_or_path: str, + tokenizer_name_or_path: Optional[str] = None, + from_pretrained: bool = False, + max_memory: Optional[dict] = None, + model_basename: Optional[str] = None, + quantize_config: Optional[str] = None, + trust_remote_code: bool = False, + use_triton: bool = False, + use_safetensors: bool = True, + use_fast_tokenizer: bool = False, + inject_fused_attention: bool = True, + inject_fused_mlp: bool = True, + disable_exllama: bool = False, +): + tokenizer = AutoTokenizer.from_pretrained( + pretrained_model_name_or_path=tokenizer_name_or_path or model_name_or_path, + use_fast=use_fast_tokenizer, + trust_remote_code=trust_remote_code, + ) + if not tokenizer.pad_token_id: + tokenizer.pad_token_id = tokenizer.eos_token_id + + if from_pretrained: + model = AutoGPTQForCausalLM.from_pretrained( + pretrained_model_name_or_path=model_name_or_path, + quantize_config=BaseQuantizeConfig(), + max_memory=max_memory, + trust_remote_code=trust_remote_code, + ) + else: + model = AutoGPTQForCausalLM.from_quantized( + model_name_or_path, + max_memory=max_memory, + low_cpu_mem_usage=True, + use_triton=use_triton, + inject_fused_attention=inject_fused_attention, + inject_fused_mlp=inject_fused_mlp, + use_cuda_fp16=True, + quantize_config=quantize_config, + model_basename=model_basename, + use_safetensors=use_safetensors, + trust_remote_code=trust_remote_code, + warmup_triton=False, + disable_exllama=disable_exllama, + ) + + return model, tokenizer + + +def benchmark_generation_speed(model, tokenizer, examples, generation_config): + generation_time_list = [] + num_generated_tokens_list = [] + progress_bar = tqdm(examples) + for example in progress_bar: + input_ids = example["input_ids"].to(model.device) + + start = time.time() + outputs_ids = model.generate( + input_ids=input_ids.unsqueeze(0), + generation_config=generation_config, + logits_processor=[ + CustomizedMinNewTokensLogitsProcessor(generation_config.max_new_tokens, tokenizer.eos_token_id) + ], + ) + end = time.time() + + generation_time_list.append(end - start) + num_generated_tokens = 0 + for output_ids in outputs_ids: + num_generated_tokens += len( + [token_id for token_id in output_ids[len(input_ids) :] if token_id != tokenizer.pad_token_id] + ) + num_generated_tokens_list.append(num_generated_tokens) + + progress_bar.set_postfix( + num_tokens=num_generated_tokens_list[-1], + time=generation_time_list[-1], + speed=f"{num_generated_tokens_list[-1] / generation_time_list[-1]:.4f}tokens/s", + ) + + total_tokens = sum(num_generated_tokens_list) + total_seconds = sum(generation_time_list) + logger.info( + f"generated {total_tokens} tokens using {total_seconds} seconds, " + f"generation speed: {total_tokens / total_seconds}tokens/s" + ) + + +def main(): + parser = ArgumentParser() + parser.add_argument("--model_name_or_path", type=str) + parser.add_argument("--tokenizer_name_or_path", type=str, default=None) + parser.add_argument("--from_pretrained", action="store_true") + parser.add_argument("--model_basename", type=str, default=None) + parser.add_argument("--quantize_config_save_dir", type=str, default=None) + parser.add_argument("--trust_remote_code", action="store_true") + parser.add_argument("--use_triton", action="store_true") + parser.add_argument("--use_safetensors", action="store_true") + parser.add_argument("--use_fast_tokenizer", action="store_true") + parser.add_argument("--disable_exllama", action="store_true") + parser.add_argument("--no_inject_fused_attention", action="store_true") + parser.add_argument("--no_inject_fused_mlp", action="store_true") + parser.add_argument("--num_samples", type=int, default=10) + parser.add_argument("--per_gpu_max_memory", type=int, default=None) + parser.add_argument("--cpu_max_memory", type=int, default=None) + parser.add_argument("--max_new_tokens", type=int, default=512) + parser.add_argument("--do_sample", action="store_true") + parser.add_argument("--num_beams", type=int, default=1) + args = parser.parse_args() + + max_memory = {} + if args.per_gpu_max_memory is not None and args.per_gpu_max_memory > 0: + if torch.cuda.is_available(): + max_memory.update({i: f"{args.per_gpu_max_memory}GIB" for i in range(torch.cuda.device_count())}) + if args.cpu_max_memory is not None and args.cpu_max_memory > 0 and max_memory: + max_memory["cpu"] = f"{args.cpu_max_memory}GIB" + if not max_memory: + max_memory = None + + logger.info(f"max_memory: {max_memory}") + + quantize_config = None + if args.quantize_config_save_dir: + quantize_config = BaseQuantizeConfig.from_pretrained(args.quantize_config_save_dir) + + if args.use_safetensors: + logger.warning( + "The command --use_safetensors is deprecated and will be removed in the next release. It is now by default activated." + ) + + logger.info("loading model and tokenizer") + start = time.time() + model, tokenizer = load_model_tokenizer( + model_name_or_path=args.model_name_or_path, + tokenizer_name_or_path=args.tokenizer_name_or_path, + from_pretrained=args.from_pretrained, + max_memory=max_memory, + model_basename=args.model_basename, + quantize_config=quantize_config, + trust_remote_code=args.trust_remote_code, + use_triton=args.use_triton, + use_safetensors=True, + use_fast_tokenizer=args.use_fast_tokenizer, + inject_fused_attention=not args.no_inject_fused_attention, + inject_fused_mlp=not args.no_inject_fused_mlp, + disable_exllama=args.disable_exllama, + ) + end = time.time() + logger.info(f"model and tokenizer loading time: {end - start:.4f}s") + logger.info(f"model quantized: {model.quantized}") + logger.info(f"quantize config: {model.quantize_config.to_dict()}") + logger.info(f"model device map: {model.hf_device_map}") + + if args.use_triton: + logger.info("warmup triton, this may take a while.") + model.warmup_triton() + + logger.info("loading data") + examples = load_data( + "../quantization/dataset/alpaca_data_cleaned.json", + tokenizer, + args.num_samples, + args.max_new_tokens, + ) + + generation_config = GenerationConfig( + num_beams=args.num_beams, + num_return_sequences=args.num_beams, + do_sample=args.do_sample, + min_new_tokens=args.max_new_tokens, + max_new_tokens=args.max_new_tokens, + pad_token_id=tokenizer.pad_token_id, + ) + logger.info(f"generation config: {generation_config.to_dict()}") + + logger.info("benchmark generation speed") + benchmark_generation_speed(model, tokenizer, examples, generation_config) + + +if __name__ == "__main__": + logging.basicConfig( + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", + level=logging.INFO, + datefmt="%Y-%m-%d %H:%M:%S", + ) + + main() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/benchmark/perplexity.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/benchmark/perplexity.py new file mode 100644 index 0000000000000000000000000000000000000000..bb9f7ea32f668b2816e3ea9aa5a05db175f77f37 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/benchmark/perplexity.py @@ -0,0 +1,118 @@ +import argparse +import os + +import torch +from transformers import AutoTokenizer + +from auto_gptq.utils import Perplexity + + +if __name__ == "__main__": + """ + Example usage. + + Default usage with GPT2 model: + python examples/benchmark/perplexity.py + + Specify GPTQ quantized model: + python examples/benchmark/perplexity.py \ + --model_name TheBloke/open-llama-7b-open-instruct-GPTQ \ + --model_basename gptq_model-4bit-128g \ + --is_quantized + + Change your dataset: + python examples/benchmark/perplexity.py --dataset_path tiny_shakespeare + + """ + parser = argparse.ArgumentParser(description="Calculate Perplexity for a model.") + parser.add_argument("--model_name", type=str, default="gpt2", help="Model name.") + parser.add_argument("--model_basename", type=str, default=None, help="Model file's basename.") + parser.add_argument("--n_ctx", type=int, default=512, help="Context size.") + parser.add_argument("--n_batch", type=int, default=512, help="Batch size.") + parser.add_argument("--dataset_path", type=str, default="wikitext", help="Path to the dataset.") + parser.add_argument("--dataset_name", type=str, default=None, help="Name of the dataset.") + parser.add_argument("--split", type=str, default="test", help="Dataset split to use.") + parser.add_argument( + "--text_column", + type=str, + default="text", + help="Column in the dataset containing the text.", + ) + parser.add_argument( + "--per_gpu_max_memory", + type=int, + default=None, + help="Max memory used in each GPU.", + ) + parser.add_argument("--cpu_max_memory", type=int, default=None, help="Mx memory used in CPU.") + parser.add_argument("--is_quantized", action="store_true", help="Is the model GPTQ quantized?") + parser.add_argument( + "--use_safetensors", + action="store_true", + help="Whether to use safetensors model file", + ) + parser.add_argument("--use_fast_tokenizer", action="store_true", help="Wheter to use fast tokenizer") + parser.add_argument("--trust_remote_code", action="store_true", help="Whether to use remote code") + parser.add_argument( + "--disable_exllama", + action="store_true", + help="Whether to use disable exllama kernel", + ) + args = parser.parse_args() + + os.environ["TOKENIZERS_PARALLELISM"] = "false" + + tokenizer = AutoTokenizer.from_pretrained(args.model_name, use_fast=args.use_fast_tokenizer) + if not tokenizer.pad_token_id: + tokenizer.pad_token_id = tokenizer.eos_token_id + + max_memory = {} + if args.per_gpu_max_memory is not None and args.per_gpu_max_memory > 0: + if torch.cuda.is_available(): + max_memory.update({i: f"{args.per_gpu_max_memory}GIB" for i in range(torch.cuda.device_count())}) + if args.cpu_max_memory is not None and args.cpu_max_memory > 0 and max_memory: + max_memory["cpu"] = f"{args.cpu_max_memory}GIB" + if not max_memory: + max_memory = None + + if args.use_safetensors: + print( + "The argument --use_safetensors is deprecrated and will be removed in the next release. It is now the default behavior." + ) + + if args.is_quantized: + from auto_gptq import AutoGPTQForCausalLM + + model = AutoGPTQForCausalLM.from_quantized( + args.model_name, + low_cpu_mem_usage=True, + device_map="auto", + max_memory=max_memory, + model_basename=args.model_basename, + use_safetensors=True, + trust_remote_code=args.trust_remote_code, + inject_fused_mlp=False, + inject_fused_attention=False, + disable_exllama=args.disable_exllama, + ) + else: + from transformers import AutoModelForCausalLM + + model = AutoModelForCausalLM.from_pretrained( + args.model_name, + low_cpu_mem_usage=True, + device_map="auto", + max_memory=max_memory, + torch_dtype=torch.float16, + trust_remote_code=args.trust_remote_code, + ) + + ppl = Perplexity( + model, + tokenizer, + args.dataset_path, + args.dataset_name, + args.split, + args.text_column, + ) + ppl.calculate_perplexity(args.n_ctx, args.n_batch) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_language_modeling_task.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_language_modeling_task.py new file mode 100644 index 0000000000000000000000000000000000000000..5cdbb74e9eda3031d930c1ed032c2994b2807287 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_language_modeling_task.py @@ -0,0 +1,82 @@ +from argparse import ArgumentParser + +import datasets +import torch +from transformers import AutoTokenizer + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +from auto_gptq.eval_tasks import LanguageModelingTask + + +DATASET = "tatsu-lab/alpaca" +WITH_INPUT_TEMPLATE = "Instruction:\n{instruction}\n\nInput:\n{input}\n\nOutput:\n" +WITHOUT_INPUT_TEMPLATE = "Instruction:\n{instruction}\n\nOutput:\n" + + +def ds_refactor_fn(samples): + instruction_data = samples["instruction"] + input_data = samples["input"] + output_data = samples["output"] + + new_samples = {"prompt": [], "output": []} + for instruction_txt, input_txt, output_txt in zip(instruction_data, input_data, output_data): + if input_txt: + prompt = WITH_INPUT_TEMPLATE.format(instruction=instruction_txt, input=input_txt) + else: + prompt = WITHOUT_INPUT_TEMPLATE.format(instruction=instruction_txt) + new_samples["prompt"].append(prompt) + new_samples["output"].append(output_txt) + + return new_samples + + +def main(): + parser = ArgumentParser() + parser.add_argument("--base_model_dir", type=str) + parser.add_argument("--quantized_model_dir", type=str) + parser.add_argument( + "--num_samples", + type=int, + default=100, + help="how many samples will be sampled to evaluation", + ) + parser.add_argument("--sample_max_len", type=int, default=1024, help="max tokens for each sample") + parser.add_argument("--block_max_len", type=int, default=2048, help="max tokens for each data block") + parser.add_argument("--use_triton", action="store_true") + args = parser.parse_args() + + tokenizer = AutoTokenizer.from_pretrained(args.base_model_dir) + + model = AutoGPTQForCausalLM.from_pretrained(args.base_model_dir, BaseQuantizeConfig()) + model.to("cuda:0") + + task = LanguageModelingTask( + model=model, + tokenizer=tokenizer, + data_name_or_path=DATASET, + prompt_col_name="prompt", + label_col_name="output", + **{ + "num_samples": args.num_samples, # how many samples will be sampled to evaluation + "sample_max_len": args.sample_max_len, # max tokens for each sample + "block_max_len": args.block_max_len, # max tokens for each data block + "load_fn": datasets.load_dataset, # function to load dataset + "preprocess_fn": ds_refactor_fn, # function to preprocess dataset + "truncate_prompt": False, # truncate label when sample's length exceed sample_max_len + }, + ) + + print(f"eval result for base model: {task.run()}") + task.model = None + model.cpu() + del model + torch.cuda.empty_cache() + + model = AutoGPTQForCausalLM.from_quantized(args.quantized_model_dir, device="cuda:0", use_triton=args.use_triton) + task.model = model + task.device = model.device + print(f"eval result for quantized model: {task.run()}") + + +if __name__ == "__main__": + main() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_sequence_classification_task.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_sequence_classification_task.py new file mode 100644 index 0000000000000000000000000000000000000000..a7b26f4c74f5ae46379fc659a05fd843d482aa9b --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_sequence_classification_task.py @@ -0,0 +1,81 @@ +from argparse import ArgumentParser +from functools import partial + +import datasets +import torch +from transformers import AutoTokenizer + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +from auto_gptq.eval_tasks import SequenceClassificationTask + + +DATASET = "cardiffnlp/tweet_sentiment_multilingual" +TEMPLATE = "Question:What's the sentiment of the given text? Choices are {labels}.\nText: {text}\nAnswer:" +ID2LABEL = {0: "negative", 1: "neutral", 2: "positive"} +LABELS = list(ID2LABEL.values()) + + +def ds_refactor_fn(samples): + text_data = samples["text"] + label_data = samples["label"] + + new_samples = {"prompt": [], "label": []} + for text, label in zip(text_data, label_data): + prompt = TEMPLATE.format(labels=LABELS, text=text) + new_samples["prompt"].append(prompt) + new_samples["label"].append(ID2LABEL[label]) + + return new_samples + + +def main(): + parser = ArgumentParser() + parser.add_argument("--base_model_dir", type=str) + parser.add_argument("--quantized_model_dir", type=str) + parser.add_argument( + "--num_samples", + type=int, + default=100, + help="how many samples will be sampled to evaluation", + ) + parser.add_argument("--sample_max_len", type=int, default=1024, help="max tokens for each sample") + parser.add_argument("--block_max_len", type=int, default=2048, help="max tokens for each data block") + parser.add_argument("--use_triton", action="store_true") + args = parser.parse_args() + + tokenizer = AutoTokenizer.from_pretrained(args.base_model_dir) + + model = AutoGPTQForCausalLM.from_pretrained(args.base_model_dir, BaseQuantizeConfig()) + model.to("cuda:0") + + task = SequenceClassificationTask( + model=model, + tokenizer=tokenizer, + classes=LABELS, + data_name_or_path=DATASET, + prompt_col_name="prompt", + label_col_name="label", + **{ + "num_samples": args.num_samples, # how many samples will be sampled to evaluation + "sample_max_len": args.sample_max_len, # max tokens for each sample + "block_max_len": args.block_max_len, # max tokens for each data block + "load_fn": partial(datasets.load_dataset, name="english"), # function to load dataset + "preprocess_fn": ds_refactor_fn, # function to preprocess dataset + "truncate_prompt": False, # truncate label when sample's length exceed sample_max_len + }, + ) + + print(f"eval result for base model: {task.run()}") + task.model = None + model.cpu() + del model + torch.cuda.empty_cache() + + model = AutoGPTQForCausalLM.from_quantized(args.quantized_model_dir, device="cuda:0", use_triton=args.use_triton) + task.model = model + task.device = model.device + print(f"eval result for quantized model: {task.run()}") + + +if __name__ == "__main__": + main() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_text_summarization_task.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_text_summarization_task.py new file mode 100644 index 0000000000000000000000000000000000000000..b3e18687c7195cc7d0eadf06c66efbcead980cab --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/evaluation/run_text_summarization_task.py @@ -0,0 +1,79 @@ +import os +from argparse import ArgumentParser + +import datasets +import torch +from transformers import AutoTokenizer, GenerationConfig + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig +from auto_gptq.eval_tasks import TextSummarizationTask + + +os.system("pip install py7zr") + + +DATASET = "samsum" +TEMPLATE = "Instruction: Summarize the conversation into one sentence.\n\nInput:\n{diag}\n\nOutput:\n" + + +def ds_refactor_fn(samples): + dialogues = samples["dialogue"] + + new_samples = {"prompt": [], "summary": samples["summary"]} + for diag in dialogues: + prompt = TEMPLATE.format(diag=diag) + new_samples["prompt"].append(prompt) + + return new_samples + + +def main(): + parser = ArgumentParser() + parser.add_argument("--base_model_dir", type=str) + parser.add_argument("--quantized_model_dir", type=str) + parser.add_argument( + "--num_samples", + type=int, + default=100, + help="how many samples will be sampled to evaluation", + ) + parser.add_argument("--sample_max_len", type=int, default=1024, help="max tokens for each sample") + parser.add_argument("--block_max_len", type=int, default=2048, help="max tokens for each data block") + parser.add_argument("--use_triton", action="store_true") + args = parser.parse_args() + + tokenizer = AutoTokenizer.from_pretrained(args.base_model_dir) + + model = AutoGPTQForCausalLM.from_pretrained(args.base_model_dir, BaseQuantizeConfig()) + model.to("cuda:0") + + task = TextSummarizationTask( + model=model, + tokenizer=tokenizer, + data_name_or_path=DATASET, + prompt_col_name="prompt", + label_col_name="summary", + **{ + "num_samples": args.num_samples, # how many samples will be sampled to evaluation + "sample_max_len": args.sample_max_len, # max tokens for each sample + "block_max_len": args.block_max_len, # max tokens for each data block + "load_fn": datasets.load_dataset, # function to load dataset + "preprocess_fn": ds_refactor_fn, # function to preprocess dataset + "truncate_prompt": False, # truncate label when sample's length exceed sample_max_len + }, + ) + + print(f"eval result for base model: {task.run(generation_config=GenerationConfig(max_new_tokens=32))}") + task.model = None + model.cpu() + del model + torch.cuda.empty_cache() + + model = AutoGPTQForCausalLM.from_quantized(args.quantized_model_dir, device="cuda:0", use_triton=args.use_triton) + task.model = model + task.device = model.device + print(f"eval result for quantized model: {task.run(generation_config=GenerationConfig(max_new_tokens=32))}") + + +if __name__ == "__main__": + main() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_adalora_clm_instruction_tuning.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_adalora_clm_instruction_tuning.py new file mode 100644 index 0000000000000000000000000000000000000000..f43d9b30bf60052f910f7d4297c0947e3b99bfea --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_adalora_clm_instruction_tuning.py @@ -0,0 +1,178 @@ +import json +import os +from argparse import ArgumentParser +from functools import partial + +import torch +from datasets import Dataset +from peft import TaskType +from torch.utils.data import DataLoader +from tqdm import tqdm +from transformers import AutoTokenizer, get_linear_schedule_with_warmup + +from auto_gptq import AutoGPTQForCausalLM, get_gptq_peft_model +from auto_gptq.utils.data_utils import collate_data, make_data_block +from auto_gptq.utils.peft_utils import GPTQAdaLoraConfig + + +parser = ArgumentParser() +parser.add_argument("--model_name_or_path", type=str) +parser.add_argument("--lr", type=float, default=3e-3) +parser.add_argument("--num_epochs", type=int, default=1) +parser.add_argument("--sample_max_length", type=int, default=1024, help="max length of sample") +parser.add_argument( + "--block_max_length", + type=int, + default=1024, + help="max length of data block(bunch of samples)", +) +parser.add_argument("--tokenizer_name_or_path", type=str, default=None) +parser.add_argument("--use_fast_tokenizer", action="store_true") +args = parser.parse_args() + +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +model_name_or_path = args.model_name_or_path +tokenizer_name_or_path = args.tokenizer_name_or_path or model_name_or_path + +lr = args.lr +num_epochs = args.num_epochs + +# creating model +peft_config = GPTQAdaLoraConfig( + init_r=20, + target_r=16, + beta1=0.85, + beta2=0.85, + tinit=200, + tfinal=1000, + deltaT=10, + lora_alpha=32, + lora_dropout=0.1, + task_type=TaskType.CAUSAL_LM, + inference_mode=False, +) + +tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=args.use_fast_tokenizer) +if not tokenizer.pad_token_id: + tokenizer.pad_token_id = tokenizer.eos_token_id + +model = AutoGPTQForCausalLM.from_quantized( + model_name_or_path, + use_triton=True, + warmup_triton=False, + trainable=True, + inject_fused_attention=True, + inject_fused_mlp=False, +) +model.warmup_triton() +device = model.device +model = get_gptq_peft_model(model, peft_config=peft_config, auto_find_all_linears=True, train_mode=True) +model.print_trainable_parameters() + +# loading dataset +WITH_INPUT_TEMPLATE = "### Instruction:\n{instruction}\n\n### Input:\n{input}\n\n### Output:\n" +WITHOUT_INPUT_TEMPLATE = "### Instruction:\n{instruction}\n\n### Output:\n" + + +def ds_refactor_fn(samples): + instruction_data = samples["instruction"] + input_data = samples["input"] + output_data = samples["output"] + + new_samples = {"prompt": [], "output": []} + for instruction_txt, input_txt, output_txt in zip(instruction_data, input_data, output_data): + if input_txt: + prompt = WITH_INPUT_TEMPLATE.format(instruction=instruction_txt, input=input_txt) + else: + prompt = WITHOUT_INPUT_TEMPLATE.format(instruction=instruction_txt) + new_samples["prompt"].append(prompt) + new_samples["output"].append(output_txt) + + return new_samples + + +ds = Dataset.from_generator( + lambda: json.load(open("../quantization/dataset/alpaca_data_cleaned.json", "r", encoding="utf-8")) +) +ds = ds.map( + make_data_block, + batched=True, + batch_size=len(ds), + num_proc=1, + remove_columns=ds.column_names, + keep_in_memory=True, + load_from_cache_file=False, + fn_kwargs={ + "prompt_col_name": "prompt", + "label_col_name": "output", + "tokenizer": tokenizer, + "preprocess_fn": ds_refactor_fn, + "sample_max_len": args.sample_max_length, + "block_max_len": args.block_max_length, + "add_eos_token": True, + "truncate_prompt": False, + "merge_prompt_label": True, + }, +) +ds = ds.train_test_split(test_size=len(ds) // 10) +train_ds, eval_ds = ds["train"], ds["test"] +collate_fn = partial(collate_data, pad_token_id=tokenizer.pad_token_id) +train_dataloader = DataLoader(train_ds, batch_size=1, shuffle=True, collate_fn=partial(collate_fn)) +eval_dataloader = DataLoader(eval_ds, batch_size=1, shuffle=False, collate_fn=collate_fn) + +# optimizer and lr scheduler +optimizer = torch.optim.AdamW(model.parameters(), lr=lr) +lr_scheduler = get_linear_schedule_with_warmup( + optimizer=optimizer, + num_warmup_steps=0, + num_training_steps=(len(train_dataloader) * num_epochs), +) +model.base_model.peft_config["default"].total_step = len(train_dataloader) * num_epochs + +# training and evaluation +with torch.cuda.amp.autocast(): + global_step = 0 + for epoch in range(num_epochs): + model.train() + total_loss = 0 + progress_bar = tqdm(train_dataloader) + for step, batch in enumerate(progress_bar): + batch = {k: v.to(device) for k, v in batch.items()} + outputs = model(**batch) + loss = outputs.loss + total_loss += loss.detach().float() + loss.backward() + optimizer.step() + lr_scheduler.step() + # Update the importance of low-rank matrices + # and allocate the budget accordingly. + model.base_model.update_and_allocate(global_step) + optimizer.zero_grad() + global_step += 1 + + progress_bar.set_postfix(loss=loss.item()) + + model.eval() + eval_loss = 0 + eval_preds = [] + for step, batch in enumerate(tqdm(eval_dataloader)): + batch = {k: v.to(device) for k, v in batch.items()} + with torch.no_grad(): + outputs = model(**batch) + loss = outputs.loss + eval_loss += loss.detach().float() + eval_preds.extend( + tokenizer.batch_decode( + torch.argmax(outputs.logits, -1).detach().cpu().numpy(), + skip_special_tokens=True, + ) + ) + + eval_epoch_loss = eval_loss / len(eval_dataloader) + eval_ppl = torch.exp(eval_epoch_loss) + train_epoch_loss = total_loss / len(train_dataloader) + train_ppl = torch.exp(train_epoch_loss) + print(f"{epoch=}: {train_ppl=} {train_epoch_loss=} {eval_ppl=} {eval_epoch_loss=}") + +model.save_pretrained(os.path.join(model_name_or_path, f"gptq_{peft_config.peft_type.value}_adapter")) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_adaption_prompt_clm_instruction_tuning.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_adaption_prompt_clm_instruction_tuning.py new file mode 100644 index 0000000000000000000000000000000000000000..5ef5173171ff27317d4293401e57557e3bc20d45 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_adaption_prompt_clm_instruction_tuning.py @@ -0,0 +1,167 @@ +import json +import os +from argparse import ArgumentParser +from functools import partial + +import torch +from datasets import Dataset +from peft import AdaptionPromptConfig, TaskType +from torch.utils.data import DataLoader +from tqdm import tqdm +from transformers import AutoTokenizer, get_linear_schedule_with_warmup + +from auto_gptq import AutoGPTQForCausalLM, get_gptq_peft_model +from auto_gptq.utils.data_utils import collate_data, make_data_block + + +parser = ArgumentParser() +parser.add_argument("--model_name_or_path", type=str) +parser.add_argument("--adapter_len", type=int, default=10) +parser.add_argument("--adapter_layers", type=int, default=30) +parser.add_argument("--lr", type=float, default=3e-3) +parser.add_argument("--num_epochs", type=int, default=1) +parser.add_argument("--sample_max_length", type=int, default=1024, help="max length of sample") +parser.add_argument( + "--block_max_length", + type=int, + default=1024, + help="max length of data block(bunch of samples)", +) +parser.add_argument("--tokenizer_name_or_path", type=str, default=None) +parser.add_argument("--use_fast_tokenizer", action="store_true") +args = parser.parse_args() + +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +model_name_or_path = args.model_name_or_path +tokenizer_name_or_path = args.tokenizer_name_or_path or model_name_or_path + +lr = args.lr +num_epochs = args.num_epochs + +# creating model +peft_config = AdaptionPromptConfig( + adapter_len=args.adapter_len, + adapter_layers=args.adapter_layers, + task_type=TaskType.CAUSAL_LM, + inference_mode=False, +) + +tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=args.use_fast_tokenizer) +if not tokenizer.pad_token_id: + tokenizer.pad_token_id = tokenizer.eos_token_id + +model = AutoGPTQForCausalLM.from_quantized( + model_name_or_path, + use_triton=True, + warmup_triton=False, + trainable=True, + inject_fused_attention=False, + inject_fused_mlp=False, +) +model.warmup_triton() +device = model.device +model = get_gptq_peft_model(model, peft_config=peft_config, auto_find_all_linears=True, train_mode=True) +model.print_trainable_parameters() + +# loading dataset +WITH_INPUT_TEMPLATE = "### Instruction:\n{instruction}\n\n### Input:\n{input}\n\n### Output:\n" +WITHOUT_INPUT_TEMPLATE = "### Instruction:\n{instruction}\n\n### Output:\n" + + +def ds_refactor_fn(samples): + instruction_data = samples["instruction"] + input_data = samples["input"] + output_data = samples["output"] + + new_samples = {"prompt": [], "output": []} + for instruction_txt, input_txt, output_txt in zip(instruction_data, input_data, output_data): + if input_txt: + prompt = WITH_INPUT_TEMPLATE.format(instruction=instruction_txt, input=input_txt) + else: + prompt = WITHOUT_INPUT_TEMPLATE.format(instruction=instruction_txt) + new_samples["prompt"].append(prompt) + new_samples["output"].append(output_txt) + + return new_samples + + +ds = Dataset.from_generator( + lambda: json.load(open("../quantization/dataset/alpaca_data_cleaned.json", "r", encoding="utf-8")) +) +ds = ds.map( + make_data_block, + batched=True, + batch_size=len(ds), + num_proc=1, + remove_columns=ds.column_names, + keep_in_memory=True, + load_from_cache_file=False, + fn_kwargs={ + "prompt_col_name": "prompt", + "label_col_name": "output", + "tokenizer": tokenizer, + "preprocess_fn": ds_refactor_fn, + "sample_max_len": args.sample_max_length, + "block_max_len": args.block_max_length, + "add_eos_token": True, + "truncate_prompt": False, + "merge_prompt_label": True, + }, +) +ds = ds.train_test_split(test_size=len(ds) // 10) +train_ds, eval_ds = ds["train"], ds["test"] +collate_fn = partial(collate_data, pad_token_id=tokenizer.pad_token_id) +train_dataloader = DataLoader(train_ds, batch_size=1, shuffle=True, collate_fn=partial(collate_fn)) +eval_dataloader = DataLoader(eval_ds, batch_size=1, shuffle=False, collate_fn=collate_fn) + +# optimizer and lr scheduler +optimizer = torch.optim.AdamW(model.parameters(), lr=lr) +lr_scheduler = get_linear_schedule_with_warmup( + optimizer=optimizer, + num_warmup_steps=0, + num_training_steps=(len(train_dataloader) * num_epochs), +) + +# training and evaluation +with torch.cuda.amp.autocast(): + for epoch in range(num_epochs): + model.train() + total_loss = 0 + progress_bar = tqdm(train_dataloader) + for step, batch in enumerate(progress_bar): + batch = {k: v.to(device) for k, v in batch.items()} + outputs = model(**batch) + loss = outputs.loss + total_loss += loss.detach().float() + loss.backward() + optimizer.step() + lr_scheduler.step() + + optimizer.zero_grad() + + progress_bar.set_postfix(loss=loss.item()) + + model.eval() + eval_loss = 0 + eval_preds = [] + for step, batch in enumerate(tqdm(eval_dataloader)): + batch = {k: v.to(device) for k, v in batch.items()} + with torch.no_grad(): + outputs = model(**batch) + loss = outputs.loss + eval_loss += loss.detach().float() + eval_preds.extend( + tokenizer.batch_decode( + torch.argmax(outputs.logits, -1).detach().cpu().numpy(), + skip_special_tokens=True, + ) + ) + + eval_epoch_loss = eval_loss / len(eval_dataloader) + eval_ppl = torch.exp(eval_epoch_loss) + train_epoch_loss = total_loss / len(train_dataloader) + train_ppl = torch.exp(train_epoch_loss) + print(f"{epoch=}: {train_ppl=} {train_epoch_loss=} {eval_ppl=} {eval_epoch_loss=}") + +model.save_pretrained(os.path.join(model_name_or_path, f"gptq_{peft_config.peft_type.value}_adapter")) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_lora_clm_instruction_tuning.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_lora_clm_instruction_tuning.py new file mode 100644 index 0000000000000000000000000000000000000000..49b81c507639fb2eb2ef361bbf5199e7a7869908 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/peft/peft_lora_clm_instruction_tuning.py @@ -0,0 +1,167 @@ +import json +import os +from argparse import ArgumentParser +from functools import partial + +import torch +from datasets import Dataset +from peft import TaskType +from torch.utils.data import DataLoader +from tqdm import tqdm +from transformers import AutoTokenizer, get_linear_schedule_with_warmup + +from auto_gptq import AutoGPTQForCausalLM, get_gptq_peft_model +from auto_gptq.utils.data_utils import collate_data, make_data_block +from auto_gptq.utils.peft_utils import GPTQLoraConfig + + +parser = ArgumentParser() +parser.add_argument("--model_name_or_path", type=str) +parser.add_argument("--lr", type=float, default=3e-5) +parser.add_argument("--num_epochs", type=int, default=1) +parser.add_argument("--sample_max_length", type=int, default=1024, help="max length of sample") +parser.add_argument( + "--block_max_length", + type=int, + default=1024, + help="max length of data block(bunch of samples)", +) +parser.add_argument("--tokenizer_name_or_path", type=str, default=None) +parser.add_argument("--use_fast_tokenizer", action="store_true") +args = parser.parse_args() + +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +model_name_or_path = args.model_name_or_path +tokenizer_name_or_path = args.tokenizer_name_or_path or model_name_or_path + +lr = args.lr +num_epochs = args.num_epochs + +# creating model +peft_config = GPTQLoraConfig( + r=16, + lora_alpha=32, + lora_dropout=0.1, + task_type=TaskType.CAUSAL_LM, + inference_mode=False, +) + +tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=args.use_fast_tokenizer) +if not tokenizer.pad_token_id: + tokenizer.pad_token_id = tokenizer.eos_token_id + +model = AutoGPTQForCausalLM.from_quantized( + model_name_or_path, + use_triton=True, + warmup_triton=False, + trainable=True, + inject_fused_attention=True, + inject_fused_mlp=False, +) +model.warmup_triton() +device = model.device +model = get_gptq_peft_model(model, peft_config=peft_config, auto_find_all_linears=True, train_mode=True) +model.print_trainable_parameters() + +# loading dataset +WITH_INPUT_TEMPLATE = "### Instruction:\n{instruction}\n\n### Input:\n{input}\n\n### Output:\n" +WITHOUT_INPUT_TEMPLATE = "### Instruction:\n{instruction}\n\n### Output:\n" + + +def ds_refactor_fn(samples): + instruction_data = samples["instruction"] + input_data = samples["input"] + output_data = samples["output"] + + new_samples = {"prompt": [], "output": []} + for instruction_txt, input_txt, output_txt in zip(instruction_data, input_data, output_data): + if input_txt: + prompt = WITH_INPUT_TEMPLATE.format(instruction=instruction_txt, input=input_txt) + else: + prompt = WITHOUT_INPUT_TEMPLATE.format(instruction=instruction_txt) + new_samples["prompt"].append(prompt) + new_samples["output"].append(output_txt) + + return new_samples + + +ds = Dataset.from_generator( + lambda: json.load(open("../quantization/dataset/alpaca_data_cleaned.json", "r", encoding="utf-8")) +) +ds = ds.map( + make_data_block, + batched=True, + batch_size=len(ds), + num_proc=1, + remove_columns=ds.column_names, + keep_in_memory=True, + load_from_cache_file=False, + fn_kwargs={ + "prompt_col_name": "prompt", + "label_col_name": "output", + "tokenizer": tokenizer, + "preprocess_fn": ds_refactor_fn, + "sample_max_len": args.sample_max_length, + "block_max_len": args.block_max_length, + "add_eos_token": True, + "truncate_prompt": False, + "merge_prompt_label": True, + }, +) +ds = ds.train_test_split(test_size=len(ds) // 10) +train_ds, eval_ds = ds["train"], ds["test"] +collate_fn = partial(collate_data, pad_token_id=tokenizer.pad_token_id) +train_dataloader = DataLoader(train_ds, batch_size=1, shuffle=True, collate_fn=partial(collate_fn)) +eval_dataloader = DataLoader(eval_ds, batch_size=1, shuffle=False, collate_fn=collate_fn) + +# optimizer and lr scheduler +optimizer = torch.optim.AdamW(model.parameters(), lr=lr) +lr_scheduler = get_linear_schedule_with_warmup( + optimizer=optimizer, + num_warmup_steps=0, + num_training_steps=(len(train_dataloader) * num_epochs), +) + +# training and evaluation +with torch.cuda.amp.autocast(): + for epoch in range(num_epochs): + model.train() + total_loss = 0 + progress_bar = tqdm(train_dataloader) + for step, batch in enumerate(progress_bar): + batch = {k: v.to(device) for k, v in batch.items()} + outputs = model(**batch) + loss = outputs.loss + total_loss += loss.detach().float() + loss.backward() + optimizer.step() + lr_scheduler.step() + + optimizer.zero_grad() + + progress_bar.set_postfix(loss=loss.item()) + + model.eval() + eval_loss = 0 + eval_preds = [] + for step, batch in enumerate(tqdm(eval_dataloader)): + batch = {k: v.to(device) for k, v in batch.items()} + with torch.no_grad(): + outputs = model(**batch) + loss = outputs.loss + eval_loss += loss.detach().float() + eval_preds.extend( + tokenizer.batch_decode( + torch.argmax(outputs.logits, -1).detach().cpu().numpy(), + skip_special_tokens=True, + ) + ) + + eval_epoch_loss = eval_loss / len(eval_dataloader) + eval_ppl = torch.exp(eval_epoch_loss) + train_epoch_loss = total_loss / len(train_dataloader) + train_ppl = torch.exp(train_epoch_loss) + print(f"{epoch=}: {train_ppl=} {train_epoch_loss=} {eval_ppl=} {eval_epoch_loss=}") + +model.save_pretrained(os.path.join(model_name_or_path, f"gptq_{peft_config.peft_type.value}_adapter")) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage.py new file mode 100644 index 0000000000000000000000000000000000000000..42d7ba18b70b6d148ebf2d12f436aec85977e51c --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage.py @@ -0,0 +1,73 @@ +from transformers import AutoTokenizer, TextGenerationPipeline + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig + + +pretrained_model_dir = "facebook/opt-125m" +quantized_model_dir = "opt-125m-4bit-128g" + + +def main(): + tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=True) + examples = [ + tokenizer( + "auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm." + ) + ] + + quantize_config = BaseQuantizeConfig( + bits=4, # quantize model to 4-bit + group_size=128, # it is recommended to set the value to 128 + desc_act=False, # set to False can significantly speed up inference but the perplexity may slightly bad + ) + + # load un-quantized model, by default, the model will always be loaded into CPU memory + model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config) + + # quantize model, the examples should be list of dict whose keys can only be "input_ids" and "attention_mask" + model.quantize(examples) + + # save quantized model + model.save_quantized(quantized_model_dir) + + # push quantized model to Hugging Face Hub. + # to use use_auth_token=True, Login first via huggingface-cli login. + # or pass explcit token with: use_auth_token="hf_xxxxxxx" + # (uncomment the following three lines to enable this feature) + # repo_id = f"YourUserName/{quantized_model_dir}" + # commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}" + # model.push_to_hub(repo_id, commit_message=commit_message, use_auth_token=True) + + # alternatively you can save and push at the same time + # (uncomment the following three lines to enable this feature) + # repo_id = f"YourUserName/{quantized_model_dir}" + # commit_message = f"AutoGPTQ model for {pretrained_model_dir}: {quantize_config.bits}bits, gr{quantize_config.group_size}, desc_act={quantize_config.desc_act}" + # model.push_to_hub(repo_id, save_dir=quantized_model_dir, use_safetensors=True, commit_message=commit_message, use_auth_token=True) + + # save quantized model using safetensors + model.save_quantized(quantized_model_dir, use_safetensors=True) + + # load quantized model to the first GPU + model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0") + + # download quantized model from Hugging Face Hub and load to the first GPU + # model = AutoGPTQForCausalLM.from_quantized(repo_id, device="cuda:0", use_safetensors=True, use_triton=False) + + # inference with model.generate + print(tokenizer.decode(model.generate(**tokenizer("auto_gptq is", return_tensors="pt").to(model.device))[0])) + + # or you can also use pipeline + pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer) + print(pipeline("auto-gptq is")[0]["generated_text"]) + + +if __name__ == "__main__": + import logging + + logging.basicConfig( + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", + level=logging.INFO, + datefmt="%Y-%m-%d %H:%M:%S", + ) + + main() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage_gpt_xl.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage_gpt_xl.py new file mode 100644 index 0000000000000000000000000000000000000000..b3696fb48301152bf9edb1694a532dfbd9a01e08 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage_gpt_xl.py @@ -0,0 +1,99 @@ +import random + +import numpy as np +import torch +from datasets import load_dataset +from transformers import TextGenerationPipeline + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig + + +pretrained_model_dir = "gpt2-xl" +quantized_model_dir = "gpt2-large-4bit-128g" + + +# os.makedirs(quantized_model_dir, exist_ok=True) +def get_wikitext2(nsamples, seed, seqlen, tokenizer): + # set seed + random.seed(seed) + np.random.seed(seed) + torch.random.manual_seed(seed) + + # load dataset and preprocess + traindata = load_dataset("wikitext", "wikitext-2-raw-v1", split="train") + testdata = load_dataset("wikitext", "wikitext-2-raw-v1", split="test") + trainenc = tokenizer("\n\n".join(traindata["text"]), return_tensors="pt") + testenc = tokenizer("\n\n".join(testdata["text"]), return_tensors="pt") + + traindataset = [] + for _ in range(nsamples): + i = random.randint(0, trainenc.input_ids.shape[1] - seqlen - 1) + j = i + seqlen + inp = trainenc.input_ids[:, i:j] + attention_mask = torch.ones_like(inp) + traindataset.append({"input_ids": inp, "attention_mask": attention_mask}) + return traindataset, testenc + + +def main(): + from transformers import AutoTokenizer + + try: + tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=False) + except Exception: + tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=True) + + # load un-quantized model, the model will always be force loaded into cpu + quantize_config = BaseQuantizeConfig( + bits=4, # quantize model to 4-bit + group_size=128, # it is recommended to set the value to 128 + desc_act=False, # desc_act and groupsize only works on triton + ) + + # get model maximum sequence length + model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config) + model_config = model.config.to_dict() + seq_len_keys = ["max_position_embeddings", "seq_length", "n_positions"] + if any(k in model_config for k in seq_len_keys): + for key in seq_len_keys: + if key in model_config: + model.seqlen = model_config[key] + break + else: + print("can't get model's sequence length from model config, will set to 2048.") + model.seqlen = 2048 + + # load train dataset for quantize + traindataset, testenc = get_wikitext2(128, 0, model.seqlen, tokenizer) + + # quantize model, the examples should be list of dict whose keys contains "input_ids" and "attention_mask" + # with value under torch.LongTensor type. + model.quantize(traindataset, use_triton=False) + + # save quantized model + model.save_quantized(quantized_model_dir) + + # save quantized model using safetensors + model.save_quantized(quantized_model_dir, use_safetensors=True) + + # load quantized model, currently only support cpu or single gpu + model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0", use_triton=False) + + # inference with model.generate + print(tokenizer.decode(model.generate(**tokenizer("test is", return_tensors="pt").to("cuda:0"))[0])) + + # or you can also use pipeline + pipeline = TextGenerationPipeline(model=model, tokenizer=tokenizer, device="cuda:0") + print(pipeline("test is")[0]["generated_text"]) + + +if __name__ == "__main__": + import logging + + logging.basicConfig( + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", + level=logging.INFO, + datefmt="%Y-%m-%d %H:%M:%S", + ) + + main() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage_wikitext2.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage_wikitext2.py new file mode 100644 index 0000000000000000000000000000000000000000..3fc01742d1b50ce8951b19275f93adfa6feae00f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/basic_usage_wikitext2.py @@ -0,0 +1,174 @@ +import numpy as np +import torch +import torch.nn as nn + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig + + +pretrained_model_dir = "facebook/opt-125m" +quantized_model_dir = "opt-125m-4bit-128g" + + +# os.makedirs(quantized_model_dir, exist_ok=True) +def get_wikitext2(nsamples, seed, seqlen, model): + from datasets import load_dataset + + traindata = load_dataset("wikitext", "wikitext-2-raw-v1", split="train") + testdata = load_dataset("wikitext", "wikitext-2-raw-v1", split="test") + + from transformers import AutoTokenizer + + try: + tokenizer = AutoTokenizer.from_pretrained(model, use_fast=False) + except Exception: + tokenizer = AutoTokenizer.from_pretrained(model, use_fast=True) + trainenc = tokenizer("\n\n".join(traindata["text"]), return_tensors="pt") + testenc = tokenizer("\n\n".join(testdata["text"]), return_tensors="pt") + + import random + + random.seed(seed) + np.random.seed(0) + torch.random.manual_seed(0) + + traindataset = [] + for _ in range(nsamples): + i = random.randint(0, trainenc.input_ids.shape[1] - seqlen - 1) + j = i + seqlen + inp = trainenc.input_ids[:, i:j] + attention_mask = torch.ones_like(inp) + traindataset.append({"input_ids": inp, "attention_mask": attention_mask}) + return traindataset, testenc + + +@torch.no_grad() +def opt_eval(model, testenc, dev, seqlen=2048): + print("Evaluating ...") + + testenc = testenc.input_ids + nsamples = testenc.numel() // seqlen + + use_cache = model.config.use_cache + model.config.use_cache = False + layers = model.model.decoder.layers + + model.model.decoder.embed_tokens = model.model.decoder.embed_tokens.to(dev) + model.model.decoder.embed_positions = model.model.decoder.embed_positions.to(dev) + if hasattr(model.model.decoder, "project_out") and model.model.decoder.project_out: + model.model.decoder.project_out = model.model.decoder.project_out.to(dev) + if hasattr(model.model.decoder, "project_in") and model.model.decoder.project_in: + model.model.decoder.project_in = model.model.decoder.project_in.to(dev) + layers[0] = layers[0].to(dev) + + dtype = next(iter(model.parameters())).dtype + inps = torch.zeros((nsamples, seqlen, model.config.hidden_size), dtype=dtype, device=dev) + cache = {"i": 0, "attention_mask": None} + + class Catcher(nn.Module): + def __init__(self, module): + super().__init__() + self.module = module + + def forward(self, inp, **kwargs): + inps[cache["i"]] = inp + cache["i"] += 1 + cache["attention_mask"] = kwargs["attention_mask"] + raise ValueError + + layers[0] = Catcher(layers[0]) + for i in range(nsamples): + batch = testenc[:, (i * seqlen) : ((i + 1) * seqlen)].to(dev) + try: + model(batch) + except ValueError: + pass + layers[0] = layers[0].module + + layers[0] = layers[0].cpu() + model.model.decoder.embed_tokens = model.model.decoder.embed_tokens.cpu() + model.model.decoder.embed_positions = model.model.decoder.embed_positions.cpu() + if hasattr(model.model.decoder, "project_out") and model.model.decoder.project_out: + model.model.decoder.project_out = model.model.decoder.project_out.cpu() + if hasattr(model.model.decoder, "project_in") and model.model.decoder.project_in: + model.model.decoder.project_in = model.model.decoder.project_in.cpu() + torch.cuda.empty_cache() + + outs = torch.zeros_like(inps) + attention_mask = cache["attention_mask"] + + for i in range(len(layers)): + print(i) + layer = layers[i].to(dev) + + for j in range(nsamples): + outs[j] = layer(inps[j].unsqueeze(0), attention_mask=attention_mask)[0] + layers[i] = layer.cpu() + del layer + torch.cuda.empty_cache() + inps, outs = outs, inps + + if model.model.decoder.final_layer_norm is not None: + model.model.decoder.final_layer_norm = model.model.decoder.final_layer_norm.to(dev) + if model.model.decoder.project_out is not None: + model.model.decoder.project_out = model.model.decoder.project_out.to(dev) + model.lm_head = model.lm_head.to(dev) + + testenc = testenc.to(dev) + nlls = [] + for i in range(nsamples): + hidden_states = inps[i].unsqueeze(0) + if model.model.decoder.final_layer_norm is not None: + hidden_states = model.model.decoder.final_layer_norm(hidden_states) + if model.model.decoder.project_out is not None: + hidden_states = model.model.decoder.project_out(hidden_states) + lm_logits = model.lm_head(hidden_states) + shift_logits = lm_logits[:, :-1, :].contiguous() + shift_labels = testenc[:, (i * seqlen) : ((i + 1) * seqlen)][:, 1:] + loss_fct = nn.CrossEntropyLoss() + loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) + neg_log_likelihood = loss.float() * seqlen + nlls.append(neg_log_likelihood) + ppl = torch.exp(torch.stack(nlls).sum() / (nsamples * seqlen)) + print(ppl.item()) + + model.config.use_cache = use_cache + + +def main(): + traindataset, testenc = get_wikitext2(128, 0, 2048, pretrained_model_dir) + + quantize_config = BaseQuantizeConfig( + bits=4, # quantize model to 4-bit + group_size=128, # it is recommended to set the value to 128 + desc_act=False, # desc_act and group size only works on triton + ) + + # load un-quantized model, the model will always be force loaded into cpu + model = AutoGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config) + + # quantize model, the examples should be list of dict whose keys can only be "input_ids" and "attention_mask" + # with value under torch.LongTensor type. + model.quantize(traindataset, use_triton=False) + + # save quantized model + model.save_quantized(quantized_model_dir) + + # save quantized model using safetensors + model.save_quantized(quantized_model_dir, use_safetensors=True) + + # load quantized model, currently only support cpu or single gpu + model = AutoGPTQForCausalLM.from_quantized(quantized_model_dir, device="cuda:0", use_triton=False) + + opt_eval(model.model, testenc, "cuda:0") + + +if __name__ == "__main__": + import logging + + logging.basicConfig( + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", + level=logging.INFO, + datefmt="%Y-%m-%d %H:%M:%S", + ) + + main() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/quant_with_alpaca.py b/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/quant_with_alpaca.py new file mode 100644 index 0000000000000000000000000000000000000000..d2844ae244bb5ba18dc931630992c0ff22703f5a --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/examples/quantization/quant_with_alpaca.py @@ -0,0 +1,216 @@ +import json +import random +import time +from argparse import ArgumentParser + +import torch +from datasets import Dataset +from transformers import AutoTokenizer, TextGenerationPipeline + +from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig + + +def load_data(data_path, tokenizer, n_samples): + with open(data_path, "r", encoding="utf-8") as f: + raw_data = json.load(f) + + raw_data = random.sample(raw_data, k=min(n_samples, len(raw_data))) + + def dummy_gen(): + return raw_data + + def tokenize(examples): + instructions = examples["instruction"] + inputs = examples["input"] + outputs = examples["output"] + + prompts = [] + texts = [] + input_ids = [] + attention_mask = [] + for istr, inp, opt in zip(instructions, inputs, outputs): + if inp: + prompt = f"Instruction:\n{istr}\nInput:\n{inp}\nOutput:\n" + text = prompt + opt + else: + prompt = f"Instruction:\n{istr}\nOutput:\n" + text = prompt + opt + if len(tokenizer(prompt)["input_ids"]) >= tokenizer.model_max_length: + continue + + tokenized_data = tokenizer(text) + + input_ids.append(tokenized_data["input_ids"][: tokenizer.model_max_length]) + attention_mask.append(tokenized_data["attention_mask"][: tokenizer.model_max_length]) + prompts.append(prompt) + texts.append(text) + + return { + "input_ids": input_ids, + "attention_mask": attention_mask, + "prompt": prompts, + } + + dataset = Dataset.from_generator(dummy_gen) + + dataset = dataset.map( + tokenize, + batched=True, + batch_size=len(dataset), + num_proc=1, + keep_in_memory=True, + load_from_cache_file=False, + remove_columns=["instruction", "input"], + ) + + dataset = dataset.to_list() + + for sample in dataset: + sample["input_ids"] = torch.LongTensor(sample["input_ids"]) + sample["attention_mask"] = torch.LongTensor(sample["attention_mask"]) + + return dataset + + +def main(): + parser = ArgumentParser() + parser.add_argument("--pretrained_model_dir", type=str) + parser.add_argument("--quantized_model_dir", type=str, default=None) + parser.add_argument("--bits", type=int, default=4, choices=[2, 3, 4, 8]) + parser.add_argument( + "--group_size", + type=int, + default=128, + help="group size, -1 means no grouping or full rank", + ) + parser.add_argument("--desc_act", action="store_true", help="whether to quantize with desc_act") + parser.add_argument( + "--num_samples", + type=int, + default=128, + help="how many samples will be used to quantize model", + ) + parser.add_argument( + "--save_and_reload", + action="store_true", + help="whether save quantized model to disk and reload back", + ) + parser.add_argument("--fast_tokenizer", action="store_true", help="whether use fast tokenizer") + parser.add_argument( + "--use_triton", + action="store_true", + help="whether use triton to speedup at inference", + ) + parser.add_argument( + "--per_gpu_max_memory", + type=int, + default=None, + help="max memory used to load model per gpu", + ) + parser.add_argument( + "--cpu_max_memory", + type=int, + default=None, + help="max memory used to offload model to cpu", + ) + parser.add_argument( + "--quant_batch_size", + type=int, + default=1, + help="examples batch size for quantization", + ) + parser.add_argument( + "--trust_remote_code", + action="store_true", + help="whether to trust remote code when loading model", + ) + args = parser.parse_args() + + max_memory = {} + if args.per_gpu_max_memory is not None and args.per_gpu_max_memory > 0: + if torch.cuda.is_available(): + max_memory.update({i: f"{args.per_gpu_max_memory}GIB" for i in range(torch.cuda.device_count())}) + if args.cpu_max_memory is not None and args.cpu_max_memory > 0 and max_memory: + max_memory["cpu"] = f"{args.cpu_max_memory}GIB" + if not max_memory: + max_memory = None + + tokenizer = AutoTokenizer.from_pretrained( + args.pretrained_model_dir, + use_fast=args.fast_tokenizer, + trust_remote_code=args.trust_remote_code, + ) + model = AutoGPTQForCausalLM.from_pretrained( + args.pretrained_model_dir, + quantize_config=BaseQuantizeConfig(bits=args.bits, group_size=args.group_size, desc_act=args.desc_act), + max_memory=max_memory, + trust_remote_code=args.trust_remote_code, + ) + + examples = load_data("dataset/alpaca_data_cleaned.json", tokenizer, args.num_samples) + examples_for_quant = [ + {"input_ids": example["input_ids"], "attention_mask": example["attention_mask"]} for example in examples + ] + + start = time.time() + model.quantize( + examples_for_quant, + batch_size=args.quant_batch_size, + use_triton=args.use_triton, + autotune_warmup_after_quantized=args.use_triton, + ) + end = time.time() + print(f"quantization took: {end - start: .4f}s") + + if not args.quantized_model_dir: + args.quantized_model_dir = args.pretrained_model_dir + + if args.save_and_reload: + model.save_quantized(args.quantized_model_dir) + del model + if torch.cuda.is_available(): + torch.cuda.empty_cache() + model = AutoGPTQForCausalLM.from_quantized( + args.quantized_model_dir, + device="cuda:0", + use_triton=args.use_triton, + max_memory=max_memory, + inject_fused_mlp=True, + inject_fused_attention=True, + trust_remote_code=args.trust_remote_code, + ) + + pipeline_init_kwargs = {"model": model, "tokenizer": tokenizer} + if not max_memory: + pipeline_init_kwargs["device"] = "cuda:0" + pipeline = TextGenerationPipeline(**pipeline_init_kwargs) + for example in random.sample(examples, k=min(4, len(examples))): + print(f"prompt: {example['prompt']}") + print("-" * 42) + print(f"golden: {example['output']}") + print("-" * 42) + start = time.time() + generated_text = pipeline( + example["prompt"], + return_full_text=False, + num_beams=1, + max_length=len(example["input_ids"]) + + 128, # use this instead of max_new_token to disable UserWarning when integrate with logging + )[0]["generated_text"] + end = time.time() + print(f"quant: {generated_text}") + num_new_tokens = len(tokenizer(generated_text)["input_ids"]) + print(f"generate {num_new_tokens} tokens using {end-start: .4f}s, {num_new_tokens / (end - start)} tokens/s.") + print("=" * 42) + + +if __name__ == "__main__": + import logging + + logging.basicConfig( + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", + level=logging.INFO, + datefmt="%Y-%m-%d %H:%M:%S", + ) + + main() diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/ruff.toml b/lm-quant-toolkit/.deps/AutoGPTQ/ruff.toml new file mode 100644 index 0000000000000000000000000000000000000000..342729672882a9b339524e6c44b82e45be3212c8 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/ruff.toml @@ -0,0 +1,25 @@ +# Never enforce `E501` (line length violations). +ignore = ["C901", "E501", "E741", "W605"] +select = ["C", "E", "F", "I", "W"] +line-length = 119 + +# Ignore import violations in all `__init__.py` files. +[per-file-ignores] +"__init__.py" = ["E402", "F401", "F403", "F811"] + +[isort] +lines-after-imports = 2 +known-first-party = ["auto_gptq"] + +[format] +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +# Like Black, automatically detect the appropriate line ending. +line-ending = "auto" diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/setup.py b/lm-quant-toolkit/.deps/AutoGPTQ/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..e58669586df7d5b46c9109e3ddae6b1a8d30a430 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/setup.py @@ -0,0 +1,282 @@ +import os +import platform +import subprocess +import sys +from pathlib import Path + +from setuptools import find_packages, setup + + +os.environ["CC"] = "g++" +os.environ["CXX"] = "g++" + +common_setup_kwargs = { + "version": "0.8.0.dev0", + "name": "auto_gptq", + "author": "PanQiWei", + "description": "An easy-to-use LLMs quantization package with user-friendly apis, based on GPTQ algorithm.", + "long_description": (Path(__file__).parent / "README.md").read_text(encoding="UTF-8"), + "long_description_content_type": "text/markdown", + "url": "https://github.com/PanQiWei/AutoGPTQ", + "keywords": ["gptq", "quantization", "large-language-models", "transformers"], + "platforms": ["windows", "linux"], + "classifiers": [ + "Environment :: GPU :: NVIDIA CUDA :: 11.7", + "Environment :: GPU :: NVIDIA CUDA :: 11.8", + "Environment :: GPU :: NVIDIA CUDA :: 12", + "License :: OSI Approved :: MIT License", + "Natural Language :: Chinese (Simplified)", + "Natural Language :: English", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: C++", + ], +} + + +PYPI_RELEASE = os.environ.get("PYPI_RELEASE", None) +BUILD_CUDA_EXT = int(os.environ.get("BUILD_CUDA_EXT", "1")) == 1 +DISABLE_QIGEN = int(os.environ.get("DISABLE_QIGEN", "1")) == 1 +COMPILE_MARLIN = int(os.environ.get("COMPILE_MARLIN", "1")) == 1 +UNSUPPORTED_COMPUTE_CAPABILITIES = ["3.5", "3.7", "5.0", "5.2", "5.3"] + + +def detect_local_sm_architectures(): + """ + Detect compute capabilities of one machine's GPUs as PyTorch does. + + Copied from https://github.com/pytorch/pytorch/blob/v2.2.2/torch/utils/cpp_extension.py#L1962-L1976 + """ + arch_list = [] + + for i in range(torch.cuda.device_count()): + capability = torch.cuda.get_device_capability(i) + supported_sm = [int(arch.split("_")[1]) for arch in torch.cuda.get_arch_list() if "sm_" in arch] + max_supported_sm = max((sm // 10, sm % 10) for sm in supported_sm) + # Capability of the device may be higher than what's supported by the user's + # NVCC, causing compilation error. User's NVCC is expected to match the one + # used to build pytorch, so we use the maximum supported capability of pytorch + # to clamp the capability. + capability = min(max_supported_sm, capability) + arch = f"{capability[0]}.{capability[1]}" + if arch not in arch_list: + arch_list.append(arch) + + arch_list = sorted(arch_list) + arch_list[-1] += "+PTX" + return arch_list + + +if BUILD_CUDA_EXT: + try: + import torch + except Exception as e: + print( + f"Building PyTorch CUDA extension requires PyTorch being installed, please install PyTorch first: {e}.\n NOTE: This issue may be raised due to pip build isolation system (ignoring local packages). Please use `--no-build-isolation` when installing with pip, and refer to https://github.com/AutoGPTQ/AutoGPTQ/pull/620 for more details." + ) + sys.exit(1) + + CUDA_VERSION = None + ROCM_VERSION = os.environ.get("ROCM_VERSION", None) + if ROCM_VERSION and not torch.version.hip: + print( + f"Trying to compile auto-gptq for ROCm, but PyTorch {torch.__version__} " + "is installed without ROCm support." + ) + sys.exit(1) + + if not ROCM_VERSION: + default_cuda_version = torch.version.cuda + CUDA_VERSION = "".join(os.environ.get("CUDA_VERSION", default_cuda_version).split(".")) + + if ROCM_VERSION: + common_setup_kwargs["version"] += f"+rocm{ROCM_VERSION}" + else: + if not CUDA_VERSION: + print( + f"Trying to compile auto-gptq for CUDA, but Pytorch {torch.__version__} " + "is installed without CUDA support." + ) + sys.exit(1) + + torch_cuda_arch_list = os.environ.get("TORCH_CUDA_ARCH_LIST", None) + if torch_cuda_arch_list is not None: + torch_cuda_arch_list = torch_cuda_arch_list.replace(" ", ";") + archs = torch_cuda_arch_list.split(";") + + requested_but_unsupported_archs = {arch for arch in archs if arch in UNSUPPORTED_COMPUTE_CAPABILITIES} + if len(requested_but_unsupported_archs) > 0: + raise ValueError( + f"Trying to compile AutoGPTQ for CUDA compute capabilities {torch_cuda_arch_list}, but AutoGPTQ does not support the compute capabilities {requested_but_unsupported_archs} (AutoGPTQ requires Pascal or higher). Please fix your environment variable TORCH_CUDA_ARCH_LIST (Reference: https://github.com/pytorch/pytorch/blob/v2.2.2/setup.py#L135-L139)." + ) + else: + local_arch_list = detect_local_sm_architectures() + local_but_unsupported_archs = { + arch for arch in local_arch_list if arch in UNSUPPORTED_COMPUTE_CAPABILITIES + } + if len(local_but_unsupported_archs) > 0: + raise ValueError( + f"PyTorch detected the compute capabilities {local_arch_list} for the NVIDIA GPUs on the current machine, but AutoGPTQ can not be built for compute capabilities {local_but_unsupported_archs} (AutoGPTQ requires Pascal or higher). Please set the environment variable TORCH_CUDA_ARCH_LIST (Reference: https://github.com/pytorch/pytorch/blob/v2.2.2/setup.py#L135-L139) with your necessary architectures." + ) + + # For the PyPI release, the version is simply x.x.x to comply with PEP 440. + if not PYPI_RELEASE: + common_setup_kwargs["version"] += f"+cu{CUDA_VERSION}" + +requirements = [ + "accelerate>=0.26.0", + "datasets", + "sentencepiece", + "numpy", + "rouge", + "gekko", + "torch>=1.13.0", + "safetensors", + "transformers>=4.31.0", + "peft>=0.5.0", + "tqdm", +] + +extras_require = { + "triton": ["triton==2.0.0"], + "test": ["pytest", "parameterized"], + "quality": ["ruff==0.1.5"], +} + +include_dirs = ["autogptq_cuda"] + +additional_setup_kwargs = {} +if BUILD_CUDA_EXT: + from torch.utils import cpp_extension + + if platform.system() != "Windows" and platform.machine() != "aarch64" and not DISABLE_QIGEN: + print("Generating qigen kernels...") + cores_info = subprocess.run( + "cat /proc/cpuinfo | grep cores | head -1", shell=True, check=True, text=True, stdout=subprocess.PIPE + ).stdout.split(" ") + if (len(cores_info) == 3 and cores_info[1].startswith("cores")) or (len(cores_info) == 2): + p = int(cores_info[-1]) + else: + p = os.cpu_count() + try: + subprocess.check_output( + ["python", "./autogptq_extension/qigen/generate.py", "--module", "--search", "--p", str(p)] + ) + except subprocess.CalledProcessError: + raise Exception("Generating QiGen kernels failed with the error shown above.") + + if not ROCM_VERSION: + from distutils.sysconfig import get_python_lib + + conda_cuda_include_dir = os.path.join(get_python_lib(), "nvidia/cuda_runtime/include") + + print("conda_cuda_include_dir", conda_cuda_include_dir) + if os.path.isdir(conda_cuda_include_dir): + include_dirs.append(conda_cuda_include_dir) + print(f"appending conda cuda include dir {conda_cuda_include_dir}") + extensions = [ + cpp_extension.CUDAExtension( + "autogptq_cuda_64", + [ + "autogptq_extension/cuda_64/autogptq_cuda_64.cpp", + "autogptq_extension/cuda_64/autogptq_cuda_kernel_64.cu", + ], + extra_compile_args=["-std=c++20"], + ), + cpp_extension.CUDAExtension( + "autogptq_cuda_256", + [ + "autogptq_extension/cuda_256/autogptq_cuda_256.cpp", + "autogptq_extension/cuda_256/autogptq_cuda_kernel_256.cu", + ], + extra_compile_args=["-std=c++20"], + ), + ] + + if platform.system() != "Windows": + if platform.machine() != "aarch64" and not DISABLE_QIGEN: + extensions.append( + cpp_extension.CppExtension( + "cQIGen", + ["autogptq_extension/qigen/backend.cpp"], + extra_compile_args=[ + "-O3", + "-mavx", + "-mavx2", + "-mfma", + "-march=native", + "-ffast-math", + "-ftree-vectorize", + "-faligned-new", + "-std=c++20", + "-fopenmp", + "-fno-signaling-nans", + "-fno-trapping-math", + ], + ) + ) + + # Marlin is not ROCm-compatible, CUDA only + if not ROCM_VERSION and COMPILE_MARLIN: + extensions.append( + cpp_extension.CUDAExtension( + "autogptq_marlin_cuda", + [ + "autogptq_extension/marlin/marlin_cuda.cpp", + "autogptq_extension/marlin/marlin_cuda_kernel.cu", + "autogptq_extension/marlin/marlin_repack.cu", + ], + extra_compile_args=["-std=c++20"], + ) + ) + + if os.name == "nt": + # On Windows, fix an error LNK2001: unresolved external symbol cublasHgemm bug in the compilation + cuda_path = os.environ.get("CUDA_PATH", None) + if cuda_path is None: + raise ValueError( + "The environment variable CUDA_PATH must be set to the path to the CUDA install when installing from source on Windows systems." + ) + extra_link_args = ["-L", f"{cuda_path}/lib/x64/cublas.lib"] + else: + extra_link_args = [] + + extensions.append( + cpp_extension.CUDAExtension( + "exllama_kernels", + [ + "autogptq_extension/exllama/exllama_ext.cpp", + "autogptq_extension/exllama/cuda_buffers.cu", + "autogptq_extension/exllama/cuda_func/column_remap.cu", + "autogptq_extension/exllama/cuda_func/q4_matmul.cu", + "autogptq_extension/exllama/cuda_func/q4_matrix.cu", + ], + extra_compile_args=["-std=c++20"], + extra_link_args=extra_link_args, + ) + ) + extensions.append( + cpp_extension.CUDAExtension( + "exllamav2_kernels", + [ + "autogptq_extension/exllamav2/ext.cpp", + "autogptq_extension/exllamav2/cuda/q_matrix.cu", + "autogptq_extension/exllamav2/cuda/q_gemm.cu", + ], + extra_compile_args=["-std=c++20"], + extra_link_args=extra_link_args, + ) + ) + + additional_setup_kwargs = {"ext_modules": extensions, "cmdclass": {"build_ext": cpp_extension.BuildExtension}} +common_setup_kwargs.update(additional_setup_kwargs) +setup( + packages=find_packages(), + install_requires=requirements, + extras_require=extras_require, + include_dirs=include_dirs, + python_requires=">=3.8.0", + **common_setup_kwargs, +) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/__init__.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/bench_autoawq_autogptq.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/bench_autoawq_autogptq.py new file mode 100644 index 0000000000000000000000000000000000000000..f1e908854ab9a5388ab3c172e9d9a466ec564a3f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/bench_autoawq_autogptq.py @@ -0,0 +1,179 @@ +import torch + + +try: + from awq.modules.linear import WQLinear_GEMM, WQLinear_GEMV +except ModuleNotFoundError as e: + raise ModuleNotFoundError( + f"AutoAWQ package (https://github.com/casper-hansen/AutoAWQ) is required to run this benchmark. {e}" + ) + +import numpy as np + +from auto_gptq.modeling._utils import autogptq_post_init +from auto_gptq.nn_modules.qlinear.qlinear_exllamav2 import QuantLinear +from auto_gptq.utils.import_utils import dynamically_import_QuantLinear + + +group_size = 128 +bits = 4 + +# Yi 34B down_proj +k = 20480 +n = 7168 + +device = torch.device("cuda:0") + +linear_class = dynamically_import_QuantLinear(use_triton=False, desc_act=False, group_size=group_size, bits=4) + +linear_gptq = linear_class( + bits=bits, + group_size=group_size, + infeatures=k, + outfeatures=n, + bias=False, +) + +assert isinstance(linear_gptq, QuantLinear) + +linear_gptq = linear_gptq.eval() +linear_gptq = linear_gptq.to(device) + +linear_gptq = autogptq_post_init(linear_gptq, use_act_order=False) + +num_runs = 60 + +lines = [] + +seqlens = [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 12, + 16, + 24, + 32, + 48, + 64, + 80, + 120, + 250, + 512, + 1024, + 2048, + 4000, + 8000, +] + +print(f"in_features={k}, out_features={n}") +for query_length in seqlens: + # batch_size, query_length, hidden_size + inp = torch.rand(1, query_length, k, dtype=torch.float16).to(device) + + torch.cuda.empty_cache() + + # Warmup Exllama v2 + with torch.no_grad(): + res = linear_gptq(inp) + + latencies = [] + torch.cuda.synchronize() + for _ in range(num_runs): + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + torch.cuda.synchronize() + start_event.record() + + res = linear_gptq(inp) + + end_event.record() + torch.cuda.synchronize() + + latency_ms = start_event.elapsed_time(end_event) + latencies.append(latency_ms) + + # print("-------") + # print(f"Latency GPTQ Exllama v2 (query_length={query_length}): {np.mean(latencies):.3f} ms, p10={np.percentile(latencies, 10):.3f}, p90={np.percentile(latencies, 90):.3f}") + + exllamav2_mean_latency = np.mean(latencies) + exllamav2_p10 = np.percentile(latencies, 10) + exllamav2_p90 = np.percentile(latencies, 90) + + torch.cuda.empty_cache() + + total_seqlen = inp.shape[:-1].numel() + if total_seqlen <= 8: + awq_kernel = "GEMV" + linear_awq = WQLinear_GEMV( + w_bit=bits, + group_size=group_size, + in_features=k, + out_features=n, + bias=False, + dev=device, + ) + else: + awq_kernel = "GEMM" + linear_awq = WQLinear_GEMM( + w_bit=bits, + group_size=group_size, + in_features=k, + out_features=n, + bias=False, + dev=device, + ) + + # Warmup AWQ + with torch.no_grad(): + res = linear_awq(inp) + + latencies = [] + torch.cuda.synchronize() + for _ in range(num_runs): + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + torch.cuda.synchronize() + start_event.record() + + res = linear_awq(inp) + + end_event.record() + torch.cuda.synchronize() + + latency_ms = start_event.elapsed_time(end_event) + latencies.append(latency_ms) + + awq_mean_latency = np.mean(latencies) + awq_p10 = np.percentile(latencies, 10) + awq_p90 = np.percentile(latencies, 90) + + exllama_speedup = awq_mean_latency / exllamav2_mean_latency + + # print(f"Latency AWQ (query_length={query_length}, kernel={awq_kernel}): {np.mean(latencies):.3f} ms, p10={np.percentile(latencies, 10):.3f}, p90={np.percentile(latencies, 90):.3f}") + + line = "{},{},{},{},{},{},{},{},{},{},{}".format( + bits, + group_size, + total_seqlen, + awq_kernel, + f"{awq_mean_latency:.3f}", + f"{exllamav2_mean_latency:.3f}", + f"{awq_p10:.3f}", + f"{awq_p90:.3f}", + f"{exllamav2_p10:.3f}", + f"{exllamav2_p90:.3f}", + f"{exllama_speedup:.3f}", + ) + lines.append(line) + + +header = "bits, group_size, total_seqlen, awq_kernel, awq_mean_latency (ms), exllamav2_mean_latency (ms), awq_p10, awq_p90, exllamav2_p10, exllamav2_p90, exllama_speedup" + +print(header) +for line in lines: + print(line) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/pytest.ini b/lm-quant-toolkit/.deps/AutoGPTQ/tests/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..395500b327876db3bad35c2155b0f16884105ab4 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +log_cli=true diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_awq_compatibility_generation.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_awq_compatibility_generation.py new file mode 100644 index 0000000000000000000000000000000000000000..0f5160f1311ffe64c0e66ee655d228f05f7dbe3a --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_awq_compatibility_generation.py @@ -0,0 +1,253 @@ +# ruff: noqa: I001 +import unittest + +import torch +import autogptq_cuda_64 +import autogptq_cuda_256 +from transformers import AutoTokenizer + +from auto_gptq import AutoGPTQForCausalLM +from auto_gptq.nn_modules.qlinear.qlinear_cuda_old import QuantLinear as CudaOldQLinear + + +try: + from awq import AutoAWQForCausalLM +except ModuleNotFoundError as e: + AutoAWQForCausalLM = None + AWQ_EXCEPTION = e + + +class TestAwqCompatibility(unittest.TestCase): + # TODO: test cuda-old fp16. + # TODO: test cuda-old fp32. + # TODO: test exllama v2. + + def test_generation_cuda_old_fp32_pytorch(self): + if AutoAWQForCausalLM is None: + self.skipTest(f"AutoAWQ package (https://github.com/casper-hansen/AutoAWQ) is required to run this test. {AWQ_EXCEPTION}") + + device = torch.device("cuda:0") + quant_path = "TheBloke/Llama-2-7B-Chat-AWQ" + + model_autogptq = AutoGPTQForCausalLM.from_quantized( + quant_path, + device=device, + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + disable_exllama=True, + disable_exllamav2=True, + torch_dtype=torch.float32, + ) + tokenizer = AutoTokenizer.from_pretrained(quant_path) + + prompt = "I am in Paris and I am going to see the" + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + for name, submodule in model_autogptq.named_modules(): + if isinstance(submodule, CudaOldQLinear): + # Just a hack to test the handmade pytorch implementation path. + submodule.autogptq_cuda_available = False + + autogptq_output = model_autogptq.model.generate(**inp, num_beams=1, min_new_tokens=30, max_new_tokens=30) + autogptq_output = tokenizer.decode(autogptq_output[0]) + + model_awq = AutoAWQForCausalLM.from_quantized(quant_path, fuse_layers=False) + + awq_output = model_awq.generate( + **inp, + num_beams=1, + min_new_tokens=30, + max_new_tokens=30, + ) + + awq_output = tokenizer.decode(awq_output[0]) + + self.assertTrue(awq_output == autogptq_output) + + def test_generation_cuda_old_cuda_256(self): + if AutoAWQForCausalLM is None: + self.skipTest(f"AutoAWQ package (https://github.com/casper-hansen/AutoAWQ) is required to run this test. {AWQ_EXCEPTION}") + + device = torch.device("cuda:0") + quant_path = "TheBloke/Llama-2-7B-Chat-AWQ" + + tokenizer = AutoTokenizer.from_pretrained(quant_path) + prompt = "I am in Paris and I am going to see the" + + for torch_dtype in [torch.float16, torch.float32]: + model_autogptq = AutoGPTQForCausalLM.from_quantized( + quant_path, + device=device, + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + disable_exllama=True, + disable_exllamav2=True, + torch_dtype=torch_dtype, + ) + + for name, module in model_autogptq.named_modules(): + if isinstance(module, CudaOldQLinear): + self.assertTrue(module.autogptq_cuda == autogptq_cuda_256) + + if torch_dtype == torch.float32: + self.assertFalse(module.use_cuda_fp16) + else: + self.assertTrue(module.use_cuda_fp16) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + autogptq_output = model_autogptq.model.generate(**inp, num_beams=1, min_new_tokens=30, max_new_tokens=30) + autogptq_output = tokenizer.decode(autogptq_output[0]) + + model_awq = AutoAWQForCausalLM.from_quantized(quant_path, fuse_layers=False) + + awq_output = model_awq.generate( + **inp, + num_beams=1, + min_new_tokens=30, + max_new_tokens=30, + ) + + awq_output = tokenizer.decode(awq_output[0]) + + self.assertTrue(awq_output == autogptq_output) + + def test_generation_cuda_old_cuda_64(self): + if AutoAWQForCausalLM is None: + self.skipTest(f"AutoAWQ package (https://github.com/casper-hansen/AutoAWQ) is required to run this test. {AWQ_EXCEPTION}") + + device = torch.device("cuda:0") + quant_path = "TheBloke/Llama-2-7B-Chat-AWQ" + + tokenizer = AutoTokenizer.from_pretrained(quant_path) + prompt = "I am in Paris and I am going to see the" + + for torch_dtype in [torch.float16, torch.float32]: + model_autogptq = AutoGPTQForCausalLM.from_quantized( + quant_path, + device=device, + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + disable_exllama=True, + disable_exllamav2=True, + torch_dtype=torch_dtype, + ) + + # Force autogptq_cuda_64. + for name, module in model_autogptq.named_modules(): + if isinstance(module, CudaOldQLinear): + if module.autogptq_cuda != autogptq_cuda_64: + module.autogptq_cuda = autogptq_cuda_64 + + if torch_dtype == torch.float32: + self.assertFalse(module.use_cuda_fp16) + else: + self.assertTrue(module.use_cuda_fp16) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + autogptq_output = model_autogptq.model.generate(**inp, num_beams=1, min_new_tokens=30, max_new_tokens=30) + autogptq_output = tokenizer.decode(autogptq_output[0]) + + model_awq = AutoAWQForCausalLM.from_quantized(quant_path, fuse_layers=False) + + awq_output = model_awq.generate( + **inp, + num_beams=1, + min_new_tokens=30, + max_new_tokens=30, + ) + + awq_output = tokenizer.decode(awq_output[0]) + + self.assertTrue(awq_output == autogptq_output) + + def test_generation_exllama(self): + if AutoAWQForCausalLM is None: + self.skipTest(f"AutoAWQ package (https://github.com/casper-hansen/AutoAWQ) is required to run this test. {AWQ_EXCEPTION}") + + device = torch.device("cuda:0") + quant_path = "TheBloke/Llama-2-7B-Chat-AWQ" + + model_autogptq = AutoGPTQForCausalLM.from_quantized( + quant_path, + device=device, + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + disable_exllama=False, + disable_exllamav2=True, + torch_dtype=torch.float16, + ) + tokenizer = AutoTokenizer.from_pretrained(quant_path) + + prompt = "I am in Paris and I am going to see the" + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + for name, submodule in model_autogptq.named_modules(): + if isinstance(submodule, CudaOldQLinear): + # Just a hack to test the handmade pytorch implementation path. + submodule.autogptq_cuda_available = False + + autogptq_output = model_autogptq.model.generate(**inp, num_beams=1, min_new_tokens=30, max_new_tokens=30) + autogptq_output = tokenizer.decode(autogptq_output[0]) + + model_awq = AutoAWQForCausalLM.from_quantized(quant_path, fuse_layers=False) + + awq_output = model_awq.generate( + **inp, + num_beams=1, + min_new_tokens=30, + max_new_tokens=30, + ) + + awq_output = tokenizer.decode(awq_output[0]) + + self.assertTrue(awq_output == autogptq_output) + + def test_generation_exllamav2(self): + if AutoAWQForCausalLM is None: + self.skipTest(f"AutoAWQ package (https://github.com/casper-hansen/AutoAWQ) is required to run this test. {AWQ_EXCEPTION}") + + device = torch.device("cuda:0") + quant_path = "TheBloke/Llama-2-7B-Chat-AWQ" + + model_autogptq = AutoGPTQForCausalLM.from_quantized( + quant_path, + device=device, + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + torch_dtype=torch.float16, + ) + tokenizer = AutoTokenizer.from_pretrained(quant_path) + + prompt = "I am in Paris and I am going to see the" + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + for name, submodule in model_autogptq.named_modules(): + if isinstance(submodule, CudaOldQLinear): + # Just a hack to test the handmade pytorch implementation path. + submodule.autogptq_cuda_available = False + + autogptq_output = model_autogptq.model.generate(**inp, num_beams=1, min_new_tokens=30, max_new_tokens=30) + autogptq_output = tokenizer.decode(autogptq_output[0]) + + model_awq = AutoAWQForCausalLM.from_quantized(quant_path, fuse_layers=False) + + awq_output = model_awq.generate( + **inp, + num_beams=1, + min_new_tokens=30, + max_new_tokens=30, + ) + + awq_output = tokenizer.decode(awq_output[0]) + + self.assertTrue(awq_output == autogptq_output) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_peft_conversion.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_peft_conversion.py new file mode 100644 index 0000000000000000000000000000000000000000..d5a3a209148a6eff7d5a62f2dcb0b4294f15f3f1 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_peft_conversion.py @@ -0,0 +1,111 @@ +import math +from unittest import TestCase + +import torch.cuda.amp +from peft import TaskType +from peft.peft_model import PeftModelForCausalLM +from torch.optim import Adam +from transformers import AutoTokenizer + +from auto_gptq import AutoGPTQForCausalLM +from auto_gptq.utils.peft_utils import ( + GPTQAdaLoraConfig, + GPTQLoraConfig, + GPTQLoraLinear, + GPTQSVDLinear, + get_gptq_peft_model, +) + + +MODEL_NAME = "TheBloke/Wizard-Vicuna-7B-Uncensored-GPTQ" + + +class TestPeftConversion(TestCase): + def check_model_trainable(self, model_lora: PeftModelForCausalLM, tokenizer: AutoTokenizer) -> None: + batch = tokenizer("Hello, world", return_tensors="pt") + batch = {key: value.to(model_lora.device) for key, value in batch.items()} + batch["labels"] = batch["input_ids"] + batch["attention_mask"] = batch["attention_mask"].float() + batch["attention_mask"].requires_grad = True + model_lora.gradient_checkpointing_enable() + optimizer = Adam(model_lora.parameters(), lr=1e-4) + model_lora.train() + losses = [] + for _ in range(30): + optimizer.zero_grad() + with torch.cuda.amp.autocast(): + loss = model_lora(**batch).loss + losses.append(loss.item()) + loss.backward() + optimizer.step() + self.assertTrue(losses[0] > losses[-1]) + self.assertTrue(all(math.isfinite(loss) for loss in losses)) + self.assertTrue(not any(math.isnan(loss) for loss in losses)) + + def test_lora_conversion(self): + model = AutoGPTQForCausalLM.from_quantized( + MODEL_NAME, + use_triton=False, + warmup_triton=False, + trainable=True, + inject_fused_attention=True, + inject_fused_mlp=False, + use_safetensors=True, + ) + peft_config = GPTQLoraConfig( + r=16, + lora_alpha=32, + lora_dropout=0.1, + task_type=TaskType.CAUSAL_LM, + inference_mode=False, + target_modules=["qkv_proj"], + ) + model_lora = get_gptq_peft_model( + model, + peft_config, + adapter_name="test", + auto_find_all_linears=False, + train_mode=True, + ) + linear_layer = model_lora.base_model.model.model.layers[0].self_attn.qkv_proj + self.assertTrue(isinstance(linear_layer, GPTQLoraLinear)) + + tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + self.check_model_trainable(model_lora, tokenizer) + + def test_adalora_conversion(self): + model = AutoGPTQForCausalLM.from_quantized( + MODEL_NAME, + use_triton=False, + warmup_triton=False, + trainable=True, + inject_fused_attention=True, + inject_fused_mlp=False, + use_safetensors=True, + ) + peft_config = GPTQAdaLoraConfig( + init_r=20, + target_r=16, + beta1=0.85, + beta2=0.85, + tinit=200, + tfinal=1000, + deltaT=10, + lora_alpha=32, + lora_dropout=0.1, + task_type=TaskType.CAUSAL_LM, + inference_mode=False, + target_modules=["qkv_proj"], + ) + model_lora = get_gptq_peft_model( + model, + peft_config, + adapter_name="test", + auto_find_all_linears=False, + train_mode=True, + ) + linear_layer = model_lora.base_model.model.model.layers[0].self_attn.qkv_proj + self.assertTrue(isinstance(linear_layer, GPTQSVDLinear)) + + tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + self.check_model_trainable(model_lora, tokenizer) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_q4.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_q4.py new file mode 100644 index 0000000000000000000000000000000000000000..f96e9bd80f994bae20815a8d314d61c0cb5e2497 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_q4.py @@ -0,0 +1,2195 @@ +import unittest + +import torch +from parameterized import parameterized + +from auto_gptq.nn_modules.qlinear.qlinear_exllama import QuantLinear +from auto_gptq.nn_modules.qlinear.qlinear_marlin import QuantLinear as MarlinQuantLinear +from auto_gptq.nn_modules.qlinear.qlinear_tritonv2 import QuantLinear as TritonV2QuantLinear +from auto_gptq.utils.import_utils import dynamically_import_QuantLinear + + +try: + from exllama_kernels import prepare_buffers, set_tuning_params +except ImportError as e: + print(f"[WARNING] Could not load exllama_kernels: {e}") + +from transformers import AutoTokenizer + +from auto_gptq import AutoGPTQForCausalLM, exllama_set_max_input_length +from auto_gptq.modeling._const import EXLLAMA_DEFAULT_MAX_INPUT_LENGTH +from auto_gptq.modeling._utils import autogptq_post_init + + +def get_diff(a, ref): + eps = 1e-6 + return f"Maxdiff: {(a - ref).abs().max()}, Mean relative diff: {((a - ref).abs() / (ref.abs() + eps)).mean()}" + + +CUDA_OLD_REFERENCE = torch.Tensor( + [ + 5.8398, + 6.8555, + 7.2734, + 6.4219, + 6.2070, + 5.8203, + 6.5664, + 6.4219, + 6.2148, + 5.3281, + 5.7578, + 7.5312, + 8.1016, + 6.1133, + 7.2031, + 6.6484, + 6.5156, + 6.0117, + 6.0312, + 6.1914, + 6.2109, + 6.8125, + 5.8125, + 7.1172, + 7.3125, + 6.7305, + 5.9961, + 6.5117, + 6.1914, + 5.9648, + 7.1680, + 6.4766, + 7.2070, + 6.5469, + 6.7734, + 6.4219, + 6.8086, + 7.0469, + 5.9297, + 6.4727, + 6.2539, + 5.9570, + 7.2383, + 5.8945, + 6.0820, + 5.7969, + 7.1094, + 6.2188, + 6.7500, + 7.3555, + 6.2930, + 6.7734, + 5.9219, + 7.4805, + 6.8750, + 6.4102, + 6.5898, + 6.5469, + 7.6016, + 6.7461, + 5.9492, + 7.2227, + 5.8164, + 5.4570, + 6.2930, + 7.3984, + 6.0938, + 7.3984, + 5.9609, + 6.3516, + 6.5664, + 5.7969, + 7.1250, + 6.0781, + 6.7930, + 5.9492, + 6.1641, + 6.5898, + 6.0586, + 6.3359, + 6.7930, + 7.0469, + 6.0664, + 6.3320, + 5.4414, + 6.7617, + 5.1641, + 7.2891, + 6.8516, + 6.5312, + 5.6914, + 7.3711, + 6.8203, + 5.9492, + 7.0781, + 6.3164, + 7.1992, + 7.1133, + 7.4219, + 7.5586, + 7.1836, + 6.9102, + 6.4844, + 6.9805, + 6.1953, + 6.5156, + 5.4844, + 6.6602, + 6.6719, + 7.9844, + 6.4727, + 6.6367, + 6.2227, + 6.4531, + 5.0625, + 6.4609, + 6.7031, + 6.6445, + 6.5234, + 6.8633, + 6.6055, + 5.6055, + 6.4453, + 7.2617, + 6.3945, + 6.6367, + 6.1055, + 7.0664, + 6.0820, + 6.6875, + 6.1445, + 6.8672, + 6.2070, + 6.8828, + 6.1484, + 6.7070, + 6.8516, + 6.2734, + 7.1055, + 7.0586, + 6.9648, + 5.9727, + 6.1016, + 6.8750, + 7.0078, + 7.1523, + 5.7383, + 5.9531, + 6.5508, + 7.5352, + 6.1602, + 6.2578, + 6.3906, + 5.7383, + 6.7031, + 5.7344, + 6.3516, + 5.2852, + 7.5312, + 6.4531, + 6.6406, + 6.2266, + 6.1094, + 5.9102, + 5.7617, + 6.3789, + 7.0508, + 6.3750, + 6.3320, + 6.8555, + 6.7266, + 7.0352, + 7.7695, + 6.3984, + 6.5039, + 6.8320, + 6.1602, + 6.0312, + 6.3828, + 6.9023, + 7.4336, + 7.3711, + 6.1016, + 7.0703, + 6.3281, + 6.8281, + 6.4922, + 5.9453, + 5.1016, + 6.7188, + 6.1406, + 6.6289, + 7.2695, + 6.2070, + 6.7070, + 7.2930, + 7.1836, + 6.3828, + 6.1992, + 6.7070, + 7.8008, + 7.7773, + 5.6602, + 7.0273, + 6.6172, + 6.0898, + 5.3516, + 7.3359, + 5.9727, + 6.0078, + 7.0586, + 6.3086, + 6.8555, + 7.2617, + 7.3477, + 6.3828, + 7.1133, + 6.6328, + 7.3516, + 6.9141, + 7.2031, + 6.9805, + 6.1719, + 6.7812, + 8.3047, + 6.5898, + 6.3633, + 6.2539, + 7.2773, + 6.5938, + 6.4141, + 6.8203, + 6.8906, + 7.8828, + 5.9609, + 6.4180, + 7.3984, + 5.7539, + 7.1758, + 6.6641, + 6.9062, + 6.2578, + 7.5508, + 6.1719, + 6.5742, + 5.9375, + 6.7891, + 6.2109, + 6.5039, + 6.8750, + 6.2031, + 6.8828, + 7.1094, + 5.9570, + 7.2969, + 6.6797, + 6.8828, + 5.5430, + 6.9648, + 5.8398, + 6.5430, + 6.3945, + 6.5664, + 5.8086, + 6.6172, + 7.0586, + 6.8867, + 6.0820, + 5.8125, + 6.7070, + 7.5742, + 6.2578, + 6.1328, + 6.5391, + 5.4531, + 6.8242, + 6.6953, + 6.8008, + 6.3398, + 6.4805, + 7.2266, + 6.3281, + 6.6875, + 6.4688, + 5.9414, + 7.4297, + 5.8711, + 6.0625, + 5.8750, + 6.5664, + 5.8867, + 6.3477, + 6.1133, + 6.9453, + 5.0547, + 6.7812, + 6.4922, + 7.2422, + 5.4688, + 6.2109, + 7.2148, + 6.1758, + 5.9297, + 7.1953, + 5.5195, + 6.3203, + 5.9961, + 7.9297, + 6.2695, + 6.4414, + 6.7266, + 7.1875, + 7.3203, + 5.4062, + 6.0625, + 7.0898, + 5.3828, + 5.6133, + 6.0742, + 6.6836, + 5.7109, + 7.2852, + 7.7539, + 7.5820, + 6.4258, + 5.9336, + 6.3750, + 6.3555, + 7.5469, + 6.2539, + 6.5898, + 6.4102, + 7.0469, + 5.7344, + 7.2031, + 6.7969, + 5.6836, + 7.6523, + 6.9297, + 7.8672, + 6.4766, + 6.3008, + 7.0977, + 6.5430, + 7.0938, + 5.8398, + 6.9883, + 6.5312, + 6.3203, + 6.3594, + 5.4062, + 6.9688, + 5.7930, + 6.3164, + 6.5547, + 7.1992, + 5.8750, + 6.3008, + 6.7930, + 6.0391, + 7.4766, + 6.6094, + 6.5625, + 5.9805, + 6.2422, + 7.2109, + 6.6875, + 5.3047, + 7.6211, + 5.9453, + 6.5625, + 6.1641, + 6.1250, + 6.5977, + 7.7422, + 7.0742, + 5.6875, + 6.2656, + 6.6250, + 6.8945, + 5.7070, + 6.3203, + 5.7500, + 6.2695, + 6.2773, + 6.8516, + 6.4883, + 7.0000, + 6.7578, + 6.1875, + 5.9844, + 5.5703, + 6.7188, + 5.5273, + 5.3438, + 7.2500, + 6.7852, + 6.5195, + 6.8125, + 6.0664, + 6.7852, + 7.0000, + 7.0781, + 6.8477, + 7.2930, + 6.3438, + 7.1523, + 6.3281, + 6.8047, + 7.3203, + 5.3359, + 6.1484, + 6.5586, + 7.3828, + 6.2344, + 7.1523, + 6.4102, + 5.5898, + 7.0195, + 7.1172, + 5.8008, + 6.5742, + 6.2891, + 8.0312, + 6.9023, + 6.5898, + 7.1953, + 6.7266, + 6.0078, + 5.5430, + 6.4766, + 6.4258, + 5.9648, + 8.0859, + 5.0547, + 7.2188, + 7.4375, + 6.5156, + 5.9922, + 6.3281, + 6.2852, + 6.7734, + 6.2461, + 6.9805, + 5.4648, + 5.8867, + 6.8242, + 6.3008, + 6.3281, + 7.3047, + 7.1836, + 6.5195, + 6.6328, + 6.7188, + 5.4336, + 6.5078, + 5.3477, + 5.5508, + 7.3125, + 5.8750, + 6.5195, + 6.2383, + 6.3594, + 6.0898, + 6.4141, + 5.9844, + 6.6250, + 7.7109, + 6.0391, + 7.2344, + 5.9453, + 5.9453, + 7.0586, + 5.6641, + 7.2773, + 6.5195, + 7.2227, + 6.3359, + 5.3203, + 6.4375, + 7.2383, + 6.4023, + 6.2148, + 7.3750, + 5.8164, + 6.2109, + 6.5430, + 5.8164, + 6.1680, + 6.7656, + 6.0820, + 6.1094, + 6.5312, + 6.8906, + 6.8320, + 6.1289, + 6.3125, + 7.6797, + 6.3008, + 6.0000, + 7.3320, + 6.7852, + 6.9297, + 6.6328, + 6.2266, + 5.1602, + 6.2031, + 7.0547, + 5.9492, + 6.0703, + 6.0977, + 6.8086, + 6.0742, + 6.0195, + 7.0625, + 6.5781, + 5.7461, + 6.1562, + 7.0430, + 6.7148, + 6.5312, + 6.5820, + 6.4570, + 7.5508, + 5.6289, + 6.0547, + 6.5000, + 7.3125, + 5.8477, + 5.9297, + 6.2578, + 6.0078, + 5.9922, + 7.3398, + 7.4922, + 7.8906, + 7.5547, + 5.4648, + 6.5156, + 6.3242, + 6.1094, + 6.9219, + 6.7227, + 6.6836, + 7.4023, + 5.9648, + 7.2383, + 6.7695, + 6.6797, + 7.0547, + 6.3047, + 6.4688, + 6.9961, + 6.0391, + 5.9727, + 6.8398, + 6.7422, + 5.7656, + 5.4766, + 6.7852, + 7.0820, + 5.3516, + 7.6523, + 5.1562, + 6.6445, + 6.1211, + 6.2695, + 6.0703, + 6.3594, + 6.4062, + 6.3398, + 5.7578, + 6.5391, + 6.2500, + 6.5742, + 6.5000, + 7.5625, + 7.0117, + 6.5547, + 7.1250, + 6.4453, + 6.6094, + 6.1875, + 6.4219, + 6.6172, + 6.4336, + 6.5703, + 6.1758, + 6.4219, + 6.6016, + 6.7383, + 6.7070, + 6.1328, + 5.5586, + 6.6367, + 6.3789, + 6.2578, + 5.5039, + 6.6172, + 6.4648, + 5.8086, + 7.2031, + 5.8125, + 6.3711, + 7.6758, + 7.1289, + 5.8086, + 6.3008, + 6.2109, + 6.1602, + 6.1797, + 7.2305, + 6.7266, + 6.2422, + 5.6719, + 6.7070, + 6.9414, + 6.8594, + 7.4023, + 7.2109, + 6.0156, + 6.6680, + 6.6172, + 7.1250, + 6.6523, + 6.9531, + 6.7617, + 6.4961, + 6.9414, + 5.7188, + 7.6367, + 6.5469, + 6.2305, + 6.4414, + 7.4648, + 5.9102, + 6.2461, + 6.1367, + 6.8203, + 6.5703, + 6.8867, + 7.0000, + 6.7539, + 6.1719, + 6.5469, + 6.2422, + 5.4297, + 5.7305, + 5.1641, + 6.1875, + 7.0312, + 6.6484, + 6.0234, + 7.4102, + 6.8711, + 6.3086, + 6.3711, + 6.7344, + 6.6992, + 5.9766, + 7.3906, + 7.1875, + 6.4883, + 6.3984, + 7.3438, + 6.9688, + 6.9062, + 6.4375, + 6.7891, + 7.0117, + 6.4883, + 5.7500, + 7.0898, + 7.0742, + 6.7070, + 5.8750, + 6.0469, + 6.6445, + 5.2773, + 6.8984, + 6.1641, + 7.0508, + 7.4609, + 5.0273, + 6.7734, + 6.4531, + 5.7656, + 6.5312, + 7.4648, + 6.1250, + 6.5625, + 7.1367, + 6.0625, + 6.1211, + 6.9766, + 6.6758, + 6.3164, + 6.8828, + 6.8203, + 6.7500, + 6.5352, + 7.3008, + 6.7852, + 6.1914, + 5.0508, + 6.7188, + 7.1172, + 6.8008, + 6.8086, + 5.4883, + 6.9180, + 6.5742, + 6.1719, + 7.0469, + 7.1523, + 5.9492, + 5.8594, + 6.8320, + 6.1719, + 6.2031, + 6.8398, + 7.3008, + 6.6289, + 6.4922, + 6.0000, + 5.4766, + 6.3320, + 6.5117, + 6.2812, + 7.5742, + 6.3516, + 7.0039, + 6.4570, + 7.1523, + 7.6289, + 6.2578, + 7.1875, + 6.4844, + 5.7930, + 6.7070, + 7.5508, + 7.1797, + 6.0430, + 6.8711, + 6.5742, + 7.5781, + 6.4766, + 6.5391, + 6.9453, + 6.1992, + 6.6367, + 6.2812, + 6.0234, + 6.6953, + 7.0312, + 6.2031, + 6.5625, + 6.6719, + 6.1719, + 6.5586, + 5.7031, + 7.4609, + 6.6211, + 7.7227, + 6.9141, + 6.0469, + 6.2500, + 5.3828, + 6.0078, + 5.8164, + 5.8867, + 6.1523, + 6.6523, + 6.6953, + 7.3125, + 6.4844, + 5.9570, + 5.9531, + 6.2109, + 5.5039, + 6.5117, + 6.8203, + 6.6133, + 6.4766, + 5.9297, + 7.1445, + 7.1914, + 6.0117, + 6.8281, + 6.7422, + 6.1328, + 6.9805, + 6.5625, + 6.9180, + 7.1133, + 7.3359, + 5.7617, + 5.8711, + 6.4961, + 6.5859, + 6.2422, + 6.5273, + 6.7461, + 6.6992, + 6.7695, + 6.6289, + 5.9453, + 5.9805, + 7.1172, + 6.6719, + 6.0039, + 7.6875, + 6.7812, + 7.8359, + 6.9531, + 7.4336, + 7.6602, + 6.8164, + 7.3945, + 7.1602, + 6.8789, + 5.0078, + 6.0547, + 6.8086, + 6.7070, + 6.4688, + 6.4492, + 6.6172, + 5.5625, + 6.6914, + 6.4297, + 5.7461, + 5.3359, + 6.8750, + 6.4609, + 7.4062, + 5.2070, + 6.0820, + 6.7383, + 6.5703, + 6.1797, + 6.7070, + 6.5977, + 5.9961, + 6.6328, + 6.9375, + 6.3906, + 6.6484, + 4.9609, + 6.6445, + 6.5898, + 7.1875, + 7.5195, + 6.7969, + 6.1367, + 6.8906, + 7.4297, + 6.3633, + 6.0508, + 6.5000, + 6.4648, + 6.7539, + 6.7109, + 5.8086, + 6.6016, + 7.1133, + 4.8672, + 6.6367, + 6.1641, + 5.1758, + 6.9453, + 6.3242, + 7.0664, + 6.4805, + 6.3516, + 6.7383, + 8.4688, + 6.7305, + 5.9844, + 6.5938, + 7.2969, + 6.5977, + 7.5898, + 6.2969, + 6.8672, + 6.6680, + 7.1289, + 6.6875, + 5.4258, + 8.1875, + 8.0391, + 7.7969, + 6.6445, + 7.0703, + 7.3359, + 6.9805, + 6.6328, + 6.5352, + 6.2422, + 5.5820, + 6.8633, + 6.8047, + 6.5703, + 6.0117, + 6.7539, + 7.1719, + 6.8438, + 7.3633, + 6.6016, + 7.2070, + 6.4727, + 5.8008, + 7.4062, + 7.4805, + 6.6445, + 5.9023, + 6.3984, + 6.9961, + 6.6680, + 6.8242, + 6.7148, + 6.6172, + 6.9727, + 6.8320, + 5.9766, + 6.6133, + 5.5977, + 6.7773, + 7.3906, + 6.9219, + 7.0781, + 6.6914, + 5.7539, + 6.7969, + 6.8008, + 5.8047, + 7.1055, + 6.4961, + 6.0352, + 5.6211, + 7.4414, + 7.0703, + 6.1172, + 6.7461, + 6.4492, + 7.7148, + 6.4258, + 6.0039, + 6.5156, + 7.2188, + 7.4531, + 7.4844, + 7.5938, + 7.4023, + 6.7617, + 6.0078, + 6.3320, + 5.8906, + 7.5977, + 5.6523, + 6.7734, + 6.3008, + 5.2227, + 7.1719, + 7.1289, + 6.6602, + 5.4609, + 7.0312, + 6.0820, + 6.1719, + 6.0000, + 6.5547, + 6.6328, + 7.0547, + 7.0859, + 6.2656, + 5.5234, + 6.0273, + 6.7891, + 7.1875, + 6.9531, + 6.8203, + 6.3516, + 6.1172, + 6.4648, + 6.9180, + 7.3906, + 6.2812, + 5.7109, + 6.1484, + 6.9102, + 6.8711, + 7.0156, + 6.1445, + 5.8867, + 6.3828, + 5.9961, + 6.6914, + 6.7891, + 7.0820, + 6.6719, + 6.9297, + 6.3750, + 6.7578, + 6.4883, + 6.2227, + 6.2305, + 6.0508, + 6.6484, + 5.7578, + 7.2070, + 7.2383, + 6.9375, + 7.2578, + 6.5312, + 6.0312, + 6.7930, + 6.2578, + 7.0625, + 7.2148, + 6.4961, + 7.0703, + 6.4727, + 7.3906, + ] +).to(torch.float16) + + +class TestsQ4Exllama(unittest.TestCase): + def test_exllama(self): + group_size = 128 + + m = 1 + k = 1024 + n = 1024 + device = torch.device("cuda:0") + + linear_class = dynamically_import_QuantLinear( + use_triton=False, + desc_act=False, + group_size=group_size, + bits=4, + disable_exllama=False, + disable_exllamav2=True, + ) + + linear = linear_class( + bits=4, + group_size=group_size, + infeatures=k, + outfeatures=n, + bias=False, + ) + self.assertTrue(isinstance(linear, QuantLinear)) + + torch.manual_seed(42) + + linear.qweight = torch.randint(-100, 100, size=linear.qweight.shape, dtype=torch.int32) + linear.scales = linear.scales + 0.002 + + linear = linear.eval() + linear = linear.to(device) + + linear = autogptq_post_init(linear, use_act_order=False) + + max_inner_outer_dim = max(k, n) + max_dq_buffer_size = linear.infeatures * linear.outfeatures + max_input_len = 2048 + buffers = { + "temp_state": torch.zeros((max_input_len, max_inner_outer_dim), dtype=torch.float16, device=device), + "temp_dq": torch.zeros((1, max_dq_buffer_size), dtype=torch.float16, device=device), + } + + prepare_buffers(device, buffers["temp_state"], buffers["temp_dq"]) + + # Using the default from exllama repo here. + matmul_recons_thd = 8 + matmul_fused_remap = False + matmul_no_half2 = False + set_tuning_params(matmul_recons_thd, matmul_fused_remap, matmul_no_half2) + + inp = torch.rand(1, m, k, dtype=torch.float16).to(device) + + with torch.no_grad(): + res = linear(inp)[0][0] + + reference = CUDA_OLD_REFERENCE.to(device) + + self.assertTrue( + torch.allclose(res, reference, rtol=3e-5, atol=2e-2), + get_diff(res, reference), + ) + + def test_exllama_buffer_size(self): + prompt = "I am in Paris and" * 450 + device = torch.device("cuda:0") + + model_id = "TheBloke/vicuna-13B-1.1-GPTQ-4bit-128g" + revision = "actorder" + model_basename = "vicuna-13B-1.1-GPTQ-4bit-128g.latest" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + revision=revision, + device="cuda:0", + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + model_basename=model_basename, + disable_exllama=False, + disable_exllamav2=True, + ) + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + self.assertTrue( + inp["input_ids"].shape[1] > EXLLAMA_DEFAULT_MAX_INPUT_LENGTH + ) # 2048 is the default max_input_length + + with self.assertRaises(RuntimeError) as cm: + _ = model_q.generate(**inp, num_beams=1, min_new_tokens=3, max_new_tokens=3) + self.assertTrue("temp_state buffer is too small" in str(cm.exception)) + + model_q = exllama_set_max_input_length(model_q, 4096) + + _ = model_q.generate(**inp, num_beams=1, min_new_tokens=3, max_new_tokens=3) + + model_q = exllama_set_max_input_length(model_q, 1034) + + with self.assertRaises(RuntimeError) as cm: + _ = model_q.generate(**inp, num_beams=1, min_new_tokens=3, max_new_tokens=3) + self.assertTrue("temp_state buffer is too small" in str(cm.exception)) + + def test_generation_no_act_order(self): + prompt = "I am in Paris and" + device = torch.device("cuda:0") + + # Reference generated with the cuda-old kernel + reference_output = " I am in Paris and I am going to the Louvre Museum. What time does it open and what is the best way to get there?\nThe Louvre Museum in Paris is open from 9:00 AM to 6:00 PM every day except for Tuesdays. The best way to get" + + model_id = "TheBloke/WizardLM-7B-uncensored-GPTQ" + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + device="cuda:0", + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + disable_exllama=False, + disable_exllamav2=True, + ) + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + res = model_q.generate(**inp, num_beams=1, min_new_tokens=60, max_new_tokens=60) + + predicted_text = tokenizer.decode(res[0]) + + self.assertEqual(predicted_text, reference_output) + + def test_generation_with_act_order(self): + prompt = "I am in Paris and" + device = torch.device("cuda:0") + + # Reference generated with the cuda-old kernel + reference_output = " I am in Paris and it is a beautiful day. I am sitting in a café, drinking coffee and writing this book. I am surrounded by the sights and sounds of the city, and I am filled with a sense of contentment and gratitude.\n\nI am grateful for the opportunity to live and" + + model_id = "TheBloke/vicuna-13B-1.1-GPTQ-4bit-128g" + revision = "actorder" + model_basename = "vicuna-13B-1.1-GPTQ-4bit-128g.latest" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + revision=revision, + device="cuda:0", + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + model_basename=model_basename, + disable_exllama=False, + disable_exllamav2=True, + ) + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + res = model_q.generate(**inp, num_beams=1, min_new_tokens=60, max_new_tokens=60) + + predicted_text = tokenizer.decode(res[0]) + + self.assertEqual(predicted_text, reference_output) + + def test_multigpu(self): + # TODO + pass + + +class TestsQ4CUDA(unittest.TestCase): + REFERENCE_OLD_HALF = torch.Tensor( + [ + 1.5332, + 2.1250, + 1.7910, + 1.8008, + 1.9688, + 1.3262, + 1.7627, + 1.8164, + 1.9307, + 1.8574, + 1.5449, + 1.5293, + 1.6074, + 1.5566, + 1.8545, + 1.6582, + 1.8838, + 2.0215, + 1.8525, + 1.2920, + 1.9561, + 2.2617, + 1.7891, + 2.2656, + 1.6543, + 2.0566, + 1.4756, + 1.1826, + 1.8174, + 2.1191, + 1.6641, + 2.0586, + 1.6182, + 1.7627, + 1.7920, + 1.4424, + 2.0723, + 1.6865, + 1.2979, + 2.0840, + 1.6729, + 1.9648, + 2.1602, + 1.6006, + 1.2773, + 2.2129, + 1.8057, + 1.7285, + 1.6621, + 1.6475, + 1.4805, + 1.7959, + 1.5010, + 0.8643, + 2.6680, + 2.0918, + 1.8555, + 1.9795, + 1.3271, + 1.8359, + 1.6338, + 1.9766, + 1.7881, + 1.6025, + 1.7637, + 1.7012, + 1.7852, + 1.5674, + 0.8091, + 1.7188, + 1.6123, + 1.8525, + 1.4434, + 1.9590, + 1.5801, + 1.4209, + 1.7178, + 1.8408, + 2.4141, + 1.9658, + 1.4922, + 2.1992, + 1.9473, + 1.8047, + 1.2979, + 1.6396, + 1.6221, + 1.5020, + 1.9941, + 1.7725, + 1.6064, + 1.5449, + 1.8418, + 1.2656, + 1.4824, + 1.7734, + 2.0098, + 1.7197, + 1.7686, + 1.4160, + 1.7275, + 2.1738, + 1.9609, + 1.7686, + 1.6396, + 2.1465, + 1.2188, + 1.2002, + 2.1113, + 1.7227, + 1.5811, + 1.7607, + 2.2773, + 1.8945, + 1.4111, + 1.5801, + 1.7744, + 2.0684, + 2.1621, + 1.8027, + 1.1045, + 1.9648, + 2.2402, + 2.0742, + 1.3330, + 1.5840, + 2.1465, + 2.0176, + 1.5068, + 1.9834, + 1.7725, + 1.5527, + 1.7803, + 1.7744, + 1.5312, + 1.2695, + 1.9209, + 2.0469, + 1.6777, + 2.5215, + 1.8389, + 1.7598, + 1.5498, + 1.6807, + 1.7324, + 1.5938, + 1.9268, + 1.7734, + 1.4463, + 2.0391, + 2.0527, + 2.2129, + 1.6787, + 2.0586, + 1.8975, + 1.5713, + 1.6992, + 1.8770, + 1.7207, + 1.7080, + 1.1611, + 1.8584, + 2.4570, + 1.6016, + 1.4834, + 1.1777, + 1.7969, + 1.8955, + 1.8906, + 1.6738, + 1.7510, + 1.4316, + 1.8340, + 2.2461, + 1.7744, + 2.1934, + 1.4824, + 1.8828, + 1.6387, + 2.4629, + 1.8887, + 1.5137, + 1.4648, + 1.6406, + 1.7188, + 2.2656, + 1.5801, + 2.1484, + 2.0625, + 2.0098, + 1.7549, + 1.1768, + 1.4385, + 2.0723, + 1.6172, + 1.7832, + 1.8301, + 1.6064, + 1.5215, + 1.9297, + 2.3750, + 2.1504, + 1.7070, + 1.1289, + 1.4473, + 1.5674, + 1.6836, + 2.2930, + 1.1221, + 1.5557, + 1.7559, + 1.8281, + 2.0703, + 1.9443, + 2.0684, + 2.2988, + 1.6348, + 2.3379, + 2.4414, + 1.8857, + 2.0039, + 1.4844, + 1.5488, + 1.6514, + 2.3711, + 1.9941, + 2.3066, + 1.4287, + 2.1777, + 1.6445, + 1.6025, + 1.5938, + 1.5508, + 1.9502, + 2.1309, + 1.2666, + 1.1523, + 1.9561, + 1.8584, + 1.9746, + 1.5986, + 1.9688, + 2.1973, + 1.1523, + 2.3281, + 1.2451, + 1.8447, + 2.2051, + 1.5254, + 1.5342, + 2.1016, + 1.6523, + 1.6279, + 1.1680, + 1.3037, + 2.1035, + ] + ).to(torch.float16) + + REFERENCE_OLD_NO_HALF = torch.Tensor( + [ + 1.5332, + 2.1250, + 1.7910, + 1.7998, + 1.9678, + 1.3262, + 1.7617, + 1.8154, + 1.9307, + 1.8574, + 1.5449, + 1.5293, + 1.6074, + 1.5557, + 1.8545, + 1.6582, + 1.8838, + 2.0195, + 1.8525, + 1.2920, + 1.9561, + 2.2617, + 1.7891, + 2.2656, + 1.6543, + 2.0566, + 1.4756, + 1.1826, + 1.8164, + 2.1191, + 1.6641, + 2.0586, + 1.6182, + 1.7617, + 1.7920, + 1.4424, + 2.0723, + 1.6865, + 1.2969, + 2.0840, + 1.6729, + 1.9639, + 2.1602, + 1.5996, + 1.2773, + 2.2129, + 1.8057, + 1.7275, + 1.6621, + 1.6475, + 1.4805, + 1.7949, + 1.5010, + 0.8643, + 2.6680, + 2.0918, + 1.8545, + 1.9795, + 1.3271, + 1.8350, + 1.6338, + 1.9766, + 1.7881, + 1.6025, + 1.7637, + 1.7012, + 1.7842, + 1.5664, + 0.8086, + 1.7188, + 1.6113, + 1.8516, + 1.4434, + 1.9590, + 1.5801, + 1.4209, + 1.7168, + 1.8408, + 2.4141, + 1.9658, + 1.4922, + 2.1973, + 1.9463, + 1.8047, + 1.2979, + 1.6396, + 1.6221, + 1.5010, + 1.9941, + 1.7725, + 1.6064, + 1.5449, + 1.8418, + 1.2656, + 1.4824, + 1.7734, + 2.0098, + 1.7188, + 1.7686, + 1.4160, + 1.7266, + 2.1738, + 1.9600, + 1.7686, + 1.6396, + 2.1465, + 1.2188, + 1.2002, + 2.1113, + 1.7227, + 1.5811, + 1.7598, + 2.2773, + 1.8936, + 1.4102, + 1.5801, + 1.7734, + 2.0684, + 2.1621, + 1.8027, + 1.1045, + 1.9648, + 2.2402, + 2.0742, + 1.3330, + 1.5840, + 2.1465, + 2.0176, + 1.5068, + 1.9834, + 1.7725, + 1.5527, + 1.7793, + 1.7744, + 1.5312, + 1.2695, + 1.9209, + 2.0469, + 1.6777, + 2.5195, + 1.8389, + 1.7598, + 1.5498, + 1.6797, + 1.7324, + 1.5928, + 1.9258, + 1.7734, + 1.4463, + 2.0391, + 2.0508, + 2.2129, + 1.6787, + 2.0586, + 1.8975, + 1.5713, + 1.6992, + 1.8770, + 1.7207, + 1.7070, + 1.1602, + 1.8584, + 2.4570, + 1.6016, + 1.4834, + 1.1777, + 1.7959, + 1.8955, + 1.8906, + 1.6738, + 1.7510, + 1.4316, + 1.8330, + 2.2461, + 1.7744, + 2.1934, + 1.4824, + 1.8828, + 1.6387, + 2.4629, + 1.8887, + 1.5137, + 1.4648, + 1.6406, + 1.7178, + 2.2637, + 1.5801, + 2.1484, + 2.0605, + 2.0098, + 1.7539, + 1.1768, + 1.4375, + 2.0723, + 1.6162, + 1.7832, + 1.8291, + 1.6064, + 1.5215, + 1.9297, + 2.3750, + 2.1504, + 1.7061, + 1.1289, + 1.4473, + 1.5674, + 1.6836, + 2.2930, + 1.1221, + 1.5547, + 1.7559, + 1.8281, + 2.0703, + 1.9443, + 2.0684, + 2.2988, + 1.6348, + 2.3379, + 2.4414, + 1.8857, + 2.0020, + 1.4834, + 1.5488, + 1.6514, + 2.3711, + 1.9941, + 2.3047, + 1.4277, + 2.1777, + 1.6445, + 1.6025, + 1.5938, + 1.5508, + 1.9502, + 2.1309, + 1.2666, + 1.1514, + 1.9551, + 1.8584, + 1.9746, + 1.5986, + 1.9688, + 2.1953, + 1.1514, + 2.3262, + 1.2451, + 1.8447, + 2.2051, + 1.5254, + 1.5342, + 2.1016, + 1.6523, + 1.6279, + 1.1680, + 1.3037, + 2.1035, + ] + ).to(torch.float16) + + @parameterized.expand([(False,), (True,)]) + def test_cuda_old(self, use_half2: bool): + group_size = 128 + + # test the 256 kernel (in_features % 256 == 0 and out_features % 256 == 0) + m = 1 + k = 256 + n = 256 + device = "cuda" + + linear_class = dynamically_import_QuantLinear( + use_triton=False, + desc_act=False, + group_size=group_size, + bits=4, + disable_exllama=True, + disable_exllamav2=True, + ) + + weight_dtype = torch.float16 if use_half2 else torch.float32 + linear = linear_class( + bits=4, + group_size=group_size, + infeatures=k, + outfeatures=n, + bias=False, + weight_dtype=weight_dtype, + ) + + torch.manual_seed(42) + + linear.qweight = torch.randint(-100, 100, size=linear.qweight.shape, dtype=torch.int32) + linear.scales = linear.scales + 0.002 + linear.use_cuda_fp16 = use_half2 + self.assertTrue(linear.autogptq_cuda_available) + + # We cast twice just for the seed. + inp = torch.rand(1, m, k, dtype=torch.float16).to(device).to(weight_dtype) + + linear = linear.eval() + linear = linear.to(device) + + with torch.no_grad(): + res = linear(inp)[0][0] + + if use_half2: + reference = self.REFERENCE_OLD_HALF.to(device).to(weight_dtype) + else: + reference = self.REFERENCE_OLD_NO_HALF.to(device).to(weight_dtype) + + self.assertTrue(torch.allclose(res, reference, rtol=1e-3), get_diff(res, reference)) + + @parameterized.expand( + [ + (torch.float32, "cpu"), + (torch.float32, "cuda:0"), + (torch.float16, "cuda:0"), + ] + ) + def test_generation_with_act_order(self, torch_dtype, device): + prompt = "I am in Paris and" + + # Reference generated with the cuda-old kernel + if device == "cpu": + # CPU implementation is extremely slow. + new_tokens = 2 + reference_output = " I am in Paris and it is" + else: + reference_output = " I am in Paris and it is a beautiful day. I am sitting in a café, drinking coffee and writing this book. I am surrounded by the sights and sounds of the city, and I am filled with a sense of contentment and gratitude.\n\nI am grateful for the opportunity to live and" + new_tokens = 60 + + model_id = "TheBloke/vicuna-13B-1.1-GPTQ-4bit-128g" + revision = "actorder" + model_basename = "vicuna-13B-1.1-GPTQ-4bit-128g.latest" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + revision=revision, + device=device, + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + model_basename=model_basename, + disable_exllama=True, + disable_exllamav2=True, + torch_dtype=torch_dtype, + ) + + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + # This one uses Autocast. + res = model_q.generate(**inp, num_beams=1, min_new_tokens=new_tokens, max_new_tokens=new_tokens) + predicted_text = tokenizer.decode(res[0]) + self.assertEqual(predicted_text, reference_output) + + # This one does not. + res = model_q.model.generate(**inp, num_beams=1, min_new_tokens=new_tokens, max_new_tokens=new_tokens) + predicted_text = tokenizer.decode(res[0]) + self.assertEqual(predicted_text, reference_output) + + @parameterized.expand( + [ + (torch.float32, "cpu"), + (torch.float32, "cuda:0"), + (torch.float16, "cuda:0"), + ] + ) + def test_generation_no_act_order(self, torch_dtype, device): + prompt = "I am in Paris and" + + # Reference generated with the cuda-old kernel + if device == "cpu": + # CPU implementation is extremely slow. + new_tokens = 3 + reference_output = " I am in Paris and I am going" + else: + reference_output = " I am in Paris and I am going to the Louvre Museum. What time does it open and what is the best way to get there?\nThe Louvre Museum in Paris is open from 9:00 AM to 6:00 PM every day except for Tuesdays. The best way to get" + new_tokens = 60 + + model_id = "TheBloke/WizardLM-7B-uncensored-GPTQ" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + device=device, + use_triton=False, + disable_exllama=True, + disable_exllamav2=True, + torch_dtype=torch_dtype, + ) + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + # This one uses Autocast. + res = model_q.generate(**inp, num_beams=1, min_new_tokens=new_tokens, max_new_tokens=new_tokens) + predicted_text = tokenizer.decode(res[0]) + self.assertEqual(predicted_text, reference_output) + + # This one does not. + res = model_q.model.generate(**inp, num_beams=1, min_new_tokens=new_tokens, max_new_tokens=new_tokens) + predicted_text = tokenizer.decode(res[0]) + self.assertEqual(predicted_text, reference_output) + + +class TestsQ4ExllamaV2(unittest.TestCase): + def test_exllamav2(self): + from auto_gptq.nn_modules.qlinear.qlinear_exllamav2 import QuantLinear + + group_size = 128 + + m = 1 + k = 1024 + n = 1024 + device = torch.device("cuda:0") + + linear_class = dynamically_import_QuantLinear(use_triton=False, desc_act=False, group_size=group_size, bits=4) + + linear = linear_class( + bits=4, + group_size=group_size, + infeatures=k, + outfeatures=n, + bias=False, + ) + + self.assertTrue(isinstance(linear, QuantLinear)) + + torch.manual_seed(42) + + linear.qweight = torch.randint(-100, 100, size=linear.qweight.shape, dtype=torch.int32) + linear.scales = linear.scales + 0.002 + + linear = linear.eval() + linear = linear.to(device) + + linear = autogptq_post_init(linear, use_act_order=False) + + inp = torch.rand(1, m, k, dtype=torch.float16).to(device) + + with torch.no_grad(): + res = linear(inp)[0][0] + + reference = CUDA_OLD_REFERENCE.to(device) + + self.assertTrue( + torch.allclose(res, reference, rtol=3e-5, atol=2e-2), + get_diff(res, reference), + ) + + def test_generation_no_act_order(self): + prompt = "I am in Paris and" + device = torch.device("cuda:0") + + # Reference generated with the cuda-old kernel + reference_output = " I am in Paris and I am going to the Louvre Museum. What time does it open and what is the best way to get there?\nThe Louvre Museum in Paris is open from 9:00 AM to 6:00 PM every day except for Tuesdays. The best way to get" + + model_id = "TheBloke/WizardLM-7B-uncensored-GPTQ" + + model_q = AutoGPTQForCausalLM.from_quantized(model_id, device="cuda:0", use_triton=False) + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + res = model_q.generate(**inp, num_beams=1, do_sample=False, min_new_tokens=60, max_new_tokens=60) + + predicted_text = tokenizer.decode(res[0]) + + self.assertEqual(predicted_text, reference_output) + + def test_generation_with_act_order(self): + prompt = "I am in Paris and" + device = torch.device("cuda:0") + + # Reference generated with the cuda-old kernel + reference_output = " I am in Paris and it is a beautiful day. I am sitting in a café, drinking coffee and writing this book. I am surrounded by the sights and sounds of the city, and I am filled with a sense of contentment and gratitude.\n\nI am grateful for the opportunity to live and" + + model_id = "TheBloke/vicuna-13B-1.1-GPTQ-4bit-128g" + revision = "actorder" + model_basename = "vicuna-13B-1.1-GPTQ-4bit-128g.latest" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + revision=revision, + device="cuda:0", + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + model_basename=model_basename, + ) + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + res = model_q.generate(**inp, num_beams=1, min_new_tokens=60, max_new_tokens=60) + + predicted_text = tokenizer.decode(res[0]) + + self.assertEqual(predicted_text, reference_output) + + def test_exllama_v2_buffer_size(self): + # prompt = "I'm in Paris and" * 450 + prompt = "I'm in Paris and" * 500 + device = torch.device("cuda:0") + + model_id = "TheBloke/vicuna-13B-1.1-GPTQ-4bit-128g" + revision = "actorder" + model_basename = "vicuna-13B-1.1-GPTQ-4bit-128g.latest" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + revision=revision, + device="cuda:0", + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + model_basename=model_basename, + ) + + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + self.assertTrue(inp["input_ids"].shape[1] > 2048) # 2048 is the default max_input_length for LLama + + _ = model_q.generate(**inp, num_beams=1, min_new_tokens=3, max_new_tokens=3) + + +class TestsMixtral(unittest.TestCase): + def test_mixtral_generation(self): + prompt = "I am in Paris and" + device = torch.device("cuda:0") + + # Reference generated with the cuda-old kernel + reference_output = """ I am in Paris andpublishedющиеcs performancesension manual offset亡VIDEO Kel RepubliczwDrawlichen LondresPSungspfn CreahooEESlider laughselvesлександTrytpl recallслу Ор coldsubset########serdeacion providestrm thoughts président oktobermulticol../редβ themselvesterraряд conflictscommandMass diagonal選 ptrTY還 Havepliedument relate redu""" + + model_id = "TheBlokeAI/Mixtral-tiny-GPTQ" + model_basename = "model" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + use_safetensors=True, + device="cuda:0", + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + model_basename=model_basename, + ) + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + res = model_q.generate(**inp, num_beams=1, min_new_tokens=60, max_new_tokens=60, do_sample=False) + + predicted_text = tokenizer.decode(res[0]) + + self.assertEqual(predicted_text, reference_output) + + +class TestQ4Marlin(unittest.TestCase): + def test_generation(self): + # Reference generated with the cuda-old kernel and TheBloke/Llama-2-7B-Chat-GPTQ + reference_output = " I am in Paris and I am feeling very sad and lonely. everybody I know is busy and I don't have any friends here. I am staying in a small apartment in the 11th arrondissement and I am feeling very isolated. I miss my friends and family back home and I don'" + + prompt = "I am in Paris and" + device = torch.device("cuda:0") + + model_id = "TheBloke/Llama-2-7B-Chat-GPTQ" + + try: + model_q = AutoGPTQForCausalLM.from_quantized(model_id, device="cuda:0", use_marlin=True) + except ValueError as e: + if torch.version.hip: + self.assertTrue("Can not use Marlin int4*fp16 kernel with AMD ROCm" in e.text) + self.skipTest("Can not run this test on ROCm") + else: + raise e + + has_marlin = False + for _, module in model_q.named_modules(): + if isinstance(module, MarlinQuantLinear): + has_marlin = True + break + self.assertTrue(has_marlin) + + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + res = model_q.generate(**inp, num_beams=1, min_new_tokens=60, max_new_tokens=60) + + predicted_text = tokenizer.decode(res[0]) + + self.assertEqual(predicted_text, reference_output) + + def test_bias(self): + # TheBloke/Llama-2-7B-Chat-GPTQ has bias, but they are all zeros, use a checkpoint which really uses bias. + model_id = "s3nh/starcoderbase-1b-GPTQ" + try: + model_q = AutoGPTQForCausalLM.from_quantized(model_id, device="cuda:0", use_marlin=True) + except ValueError as e: + if torch.version.hip: + self.assertTrue("Can not use Marlin int4*fp16 kernel with AMD ROCm" in e.text) + self.skipTest("Can not run this test on ROCm") + else: + raise e + + for _, param in model_q.named_parameters(): + self.assertTrue(param.device != torch.device("meta")) + + for _, param in model_q.named_buffers(): + self.assertTrue(param.device != torch.device("meta")) + + self.assertTrue(torch.count_nonzero(model_q.model.transformer.h[0].attn.c_proj.bias) > 0) + self.assertTrue(torch.count_nonzero(model_q.model.transformer.h[0].attn.c_attn.bias) > 0) + + tokenizer = AutoTokenizer.from_pretrained("Xenova/starcoderbase-1b") + + prompt = "Today I am in Paris and" + inp = tokenizer(prompt, return_tensors="pt").to("cuda:0") + + res = model_q.generate(**inp, num_beams=1, min_new_tokens=60, max_new_tokens=60) + + predicted_text = tokenizer.decode(res[0]) + + self.assertTrue(predicted_text.startswith("Today I am in Paris and I am a student of the Master's")) + +class TestsQ4Triton(unittest.TestCase): + def test_generation_no_act_order(self): + prompt = "I am in Paris and" + + reference_output = " I am in Paris and I am going to the Louvre Museum. What time does it open and what is the best way to get there?\nThe Louvre Museum in Paris is open from 9:00 AM to 6:00 PM every day except for Tuesdays. The best way to get" + new_tokens = 60 + + model_id = "TheBloke/WizardLM-7B-uncensored-GPTQ" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + device="cuda:0", + use_triton=False, + disable_exllama=True, + disable_exllamav2=True, + torch_dtype=torch.float16, + use_tritonv2=True, + ) + for _, submodule in model_q.named_modules(): + if isinstance(submodule, TritonV2QuantLinear): + break + else: + raise ValueError("Did not find a tritonv2 linear layer") + + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to("cuda:0") + + # This one uses Autocast. + res = model_q.generate(**inp, num_beams=1, min_new_tokens=new_tokens, max_new_tokens=new_tokens) + predicted_text = tokenizer.decode(res[0]) + self.assertEqual(predicted_text, reference_output) + + # This one does not. + res = model_q.model.generate(**inp, num_beams=1, min_new_tokens=new_tokens, max_new_tokens=new_tokens) + predicted_text = tokenizer.decode(res[0]) + self.assertEqual(predicted_text, reference_output) + + def test_generation_with_act_order(self): + prompt = "I am in Paris and" + device = torch.device("cuda:0") + + # Reference generated with the cuda-old kernel + reference_output = " I am in Paris and it is a beautiful day. I am sitting in a café, drinking coffee and writing this book. I am surrounded by the sights and sounds of the city, and I am filled with a sense of contentment and gratitude.\n\nI am grateful for the opportunity to live and" + + model_id = "TheBloke/vicuna-13B-1.1-GPTQ-4bit-128g" + revision = "actorder" + model_basename = "vicuna-13B-1.1-GPTQ-4bit-128g.latest" + + model_q = AutoGPTQForCausalLM.from_quantized( + model_id, + revision=revision, + device="cuda:0", + use_triton=False, + inject_fused_attention=False, + inject_fused_mlp=False, + model_basename=model_basename, + disable_exllama=True, + disable_exllamav2=True, + use_tritonv2=True, + ) + for _, submodule in model_q.named_modules(): + if isinstance(submodule, TritonV2QuantLinear): + break + else: + raise ValueError("Did not find a tritonv2 linear layer") + + tokenizer = AutoTokenizer.from_pretrained(model_id) + + inp = tokenizer(prompt, return_tensors="pt").to(device) + + res = model_q.generate(**inp, num_beams=1, min_new_tokens=60, max_new_tokens=60) + + predicted_text = tokenizer.decode(res[0]) + + self.assertEqual(predicted_text, reference_output) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_quantization.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_quantization.py new file mode 100644 index 0000000000000000000000000000000000000000..ef35e1aa5540b1e9eb3cb5c7959df3482ed44843 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_quantization.py @@ -0,0 +1,84 @@ +import os +import math + +max_threads = str(min(8, os.cpu_count())) +os.environ['OMP_NUM_THREADS'] = max_threads +os.environ['OPENBLAS_NUM_THREADS'] = max_threads +os.environ['MKL_NUM_THREADS'] = max_threads +os.environ['VECLIB_MAXIMUM_THREADS'] = max_threads +os.environ['NUMEXPR_NUM_THREADS'] = max_threads +os.environ['NUMEXPR_MAX_THREADS'] = max_threads + +import tempfile +import unittest + +import torch.cuda +from parameterized import parameterized +from transformers import AutoTokenizer + +from auto_gptq import AutoGPTQForCausalLM +from auto_gptq.quantization import CHECKPOINT_FORMAT, QUANT_CONFIG_FILENAME, BaseQuantizeConfig + + +class TestQuantization(unittest.TestCase): + @parameterized.expand([(False,), (True,)]) + def test_quantize(self, use_marlin: bool): + pretrained_model_dir = "saibo/llama-1B" + + tokenizer = AutoTokenizer.from_pretrained(pretrained_model_dir, use_fast=True) + examples = [ + tokenizer( + "auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm." + ), + tokenizer( + "Today I am in Paris and it is a wonderful day." + ), + ] + + quantize_config = BaseQuantizeConfig( + bits=4, + group_size=128, + desc_act=False, + checkpoint_format=CHECKPOINT_FORMAT.MARLIN if use_marlin else CHECKPOINT_FORMAT.GPTQ, + ) + + model = AutoGPTQForCausalLM.from_pretrained( + pretrained_model_dir, + quantize_config=quantize_config, + use_flash_attention_2=False, + ) + + model.quantize(examples) + + with tempfile.TemporaryDirectory() as tmpdirname: + model.save_pretrained(tmpdirname) + + model = AutoGPTQForCausalLM.from_quantized(tmpdirname, device="cuda:0", use_marlin=use_marlin) + del model + torch.cuda.empty_cache() + + # test compat: 1) with simple dict type 2) is_marlin_format + compat_quantize_config = { + "bits": 4, + "group_size": 128, + "desc_act": False, + "is_marlin_format": use_marlin, + } + model = AutoGPTQForCausalLM.from_quantized(tmpdirname, device="cuda:0", quantize_config=compat_quantize_config) + assert(isinstance(model.quantize_config, BaseQuantizeConfig)) + + del model + torch.cuda.empty_cache() + + # test checkinpoint_format hint to from_quantized() + os.remove(f"{tmpdirname}/{QUANT_CONFIG_FILENAME}") + + compat_quantize_config = { + "bits": 4, + "group_size": 128, + "desc_act": False, + } + model = AutoGPTQForCausalLM.from_quantized(tmpdirname, device="cuda:0", + quantize_config=compat_quantize_config, + checkpoint_format=CHECKPOINT_FORMAT.MARLIN if use_marlin else None) + assert (isinstance(model.quantize_config, BaseQuantizeConfig)) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_repacking.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_repacking.py new file mode 100644 index 0000000000000000000000000000000000000000..4952ffa6740c9b75800edfdd8d9b9c0190c6cd9f --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_repacking.py @@ -0,0 +1,119 @@ +import copy +import unittest + +import autogptq_marlin_cuda +import torch +import torch.nn as nn + +from auto_gptq.nn_modules.qlinear.qlinear_cuda_old import QuantLinear as CudaOldQuantLinear +from auto_gptq.nn_modules.qlinear.qlinear_marlin import QuantLinear as MarlinQuantLinear +from auto_gptq.nn_modules.qlinear.qlinear_marlin import _get_perms, dequantize_weight + + +def gen_quant4(k, n, groupsize=-1): + maxq = 2 ** 4 - 1 + w = torch.randn((k, n), dtype=torch.half, device="cpu") + + original_w = w.clone() + + if groupsize != -1: + w = w.reshape((-1, groupsize, n)) + w = w.permute(1, 0, 2) + w = w.reshape((groupsize, -1)) + + s = torch.max(torch.abs(w), 0, keepdim=True)[0] + s *= 2 / maxq + + # Quantize. + w = torch.round(w / s).int() + + # Unsigned storage. + w += (maxq + 1) // 2 + w = torch.clamp(w, 0, maxq) + + # Dequantize. + ref = (w - (maxq + 1) // 2).half() * s + + if groupsize != -1: + def reshape(w): + w = w.reshape((groupsize, -1, n)) + w = w.permute(1, 0, 2) + w = w.reshape((k, n)).contiguous() + return w + ref = reshape(ref) + w = reshape(w) + + s = s.reshape((-1, n)).contiguous() + linear = nn.Linear(k, n, bias=False) + linear.weight.data = ref.t() + + return original_w, linear, s + +original_w, linear, s = gen_quant4(64, 128) + +class TestRepacking(unittest.TestCase): + def test_marlin_fast_repacking(self): + k = 2048 + n = 1024 + m = 5 + group_size = 128 + + _, linear, s = gen_quant4(k, n, group_size) + cuda_old_linear = CudaOldQuantLinear(bits=4, group_size=group_size, infeatures=k, outfeatures=n, bias=False) + + zeros = torch.full((k // group_size, n), 8, dtype=torch.int32) + + cuda_old_linear.pack(linear, s.T, zeros.T, g_idx=None) + + # Adapted from utils.marlin_utils.convert_to_marlin + dequantized_weight, dequantized_qzeros = dequantize_weight(cuda_old_linear) + dequantized_weight = dequantized_weight.to(torch.float16) + + self.assertTrue(torch.all(dequantized_qzeros == 8)) + + linear_module = torch.nn.Linear( + in_features=k, + out_features=n, + bias=False, + dtype=torch.float16, + device="cuda", + ) + linear_module.weight.data.copy_(linear.weight.data) # Not using dequantized_weight to avoid approx + + # Create new linear method and copy to model. + marlin_linear = MarlinQuantLinear( + bits=4, + group_size=group_size, + infeatures=k, + outfeatures=n, + bias=False, + trainable=False, + ) + + marlin_linear.pack(linear_module.to("cuda"), scales=copy.deepcopy(cuda_old_linear.scales.data.t()).to("cuda")) + + inp = torch.rand(m, k, dtype=torch.float16, device="cuda") + + cuda_old_linear = cuda_old_linear.to("cuda") + marlin_linear = marlin_linear.to("cuda") + with torch.no_grad(): + res_cuda_old = cuda_old_linear(inp) + res_marlin = marlin_linear(inp) + + reldiff = (res_cuda_old - res_marlin).abs() / (res_cuda_old.abs() + 1e-12) + self.assertTrue(torch.mean(reldiff) < 4e-3) + + weight_repacked = autogptq_marlin_cuda.gptq_repack(cuda_old_linear.qweight) + self.assertTrue(torch.allclose(weight_repacked, marlin_linear.B)) + + _, _scale_perm, _scale_perm_single = _get_perms() + + s = cuda_old_linear.scales.data.clone() + if group_size != k: + s = s.reshape((1, -1)) + s = s.reshape((-1, len(_scale_perm)))[:, _scale_perm] + else: + s = s.reshape((-1, len(_scale_perm_single)))[:, _scale_perm_single] + s = s.reshape((-1, n)).contiguous() + + self.assertTrue(torch.allclose(s, marlin_linear.s)) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_serialization.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_serialization.py new file mode 100644 index 0000000000000000000000000000000000000000..23704180477b9789a6f518daf668337cd1fa8502 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_serialization.py @@ -0,0 +1,70 @@ +import json +import os +import tempfile +import time +import unittest + +from auto_gptq import AutoGPTQForCausalLM +from auto_gptq.quantization import CHECKPOINT_FORMAT, CHECKPOINT_FORMAT_FIELD, QUANT_CONFIG_FILENAME +from auto_gptq.quantization.config import QUANT_METHOD, BaseQuantizeConfig + + +class TestSerialization(unittest.TestCase): + MODEL_ID = "habanoz/TinyLlama-1.1B-Chat-v0.3-GPTQ" + + def setUp(self): + dummy_config = BaseQuantizeConfig( + model_name_or_path=self.MODEL_ID, + quant_method=QUANT_METHOD.GPTQ, + checkpoint_format=CHECKPOINT_FORMAT.MARLIN) + + model_cache_path, is_cached = dummy_config.get_cache_file_path() + + if is_cached: + os.remove(model_cache_path) + + def test_marlin_local_serialization(self): + start = time.time() + model = AutoGPTQForCausalLM.from_quantized(self.MODEL_ID, device="cuda:0", use_marlin=True) + end = time.time() + first_load_time = end - start + + with tempfile.TemporaryDirectory() as tmpdir: + model.save_pretrained(tmpdir) + + self.assertTrue(os.path.isfile(os.path.join(tmpdir, "model.safetensors"))) + model_cache_path, is_cached = model.quantize_config.get_cache_file_path() + self.assertFalse(os.path.isfile(os.path.join(tmpdir, model_cache_path))) + + with open(os.path.join(tmpdir, QUANT_CONFIG_FILENAME), "r") as config_file: + config = json.load(config_file) + + self.assertTrue(config[CHECKPOINT_FORMAT_FIELD] == CHECKPOINT_FORMAT.MARLIN) + + start = time.time() + model = AutoGPTQForCausalLM.from_quantized(tmpdir, device="cuda:0", use_marlin=True) + end = time.time() + second_load_time = end - start + + # Since we use a CUDA kernel to repack weights, the first load time is already small. + self.assertTrue(second_load_time < first_load_time) + + def test_marlin_hf_cache_serialization(self): + start = time.time() + model = AutoGPTQForCausalLM.from_quantized(self.MODEL_ID, device="cuda:0", use_marlin=True) + self.assertTrue(model.quantize_config.checkpoint_format == CHECKPOINT_FORMAT.MARLIN) + end = time.time() + first_load_time = end - start + + model_cache_path, is_cached = model.quantize_config.get_cache_file_path() + self.assertTrue("assets" in model_cache_path) + self.assertTrue(is_cached) + + start = time.time() + model = AutoGPTQForCausalLM.from_quantized(self.MODEL_ID, device="cuda:0", use_marlin=True) + self.assertTrue(model.quantize_config.checkpoint_format == CHECKPOINT_FORMAT.MARLIN) + end = time.time() + second_load_time = end - start + + # Since we use a CUDA kernel to repack weights, the first load time is already small. + self.assertTrue(second_load_time < first_load_time) diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_sharded_loading.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_sharded_loading.py new file mode 100644 index 0000000000000000000000000000000000000000..01fdd065ff27afd25f5d471a265a1cbb77d46625 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_sharded_loading.py @@ -0,0 +1,30 @@ +import unittest + +from transformers import AutoTokenizer + +from auto_gptq import AutoGPTQForCausalLM + + +class TestShardedLoading(unittest.TestCase): + + def test_loading(self): + model_name = "TheBlokeAI/llama-68m-GPTQ-sharded" + + tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True) + + model = AutoGPTQForCausalLM.from_quantized(model_name, device='cuda:0',) + + tokens = model.generate(**tokenizer("1337", return_tensors="pt").to(model.device), max_new_tokens=20)[0] + result = tokenizer.decode(tokens) + + self.assertTrue(result == ' 133777777777777777777777') + + def test_loading_large(self): + tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-7B-Chat-GPTQ-Int4") + + model = AutoGPTQForCausalLM.from_quantized("Qwen/Qwen1.5-7B-Chat-GPTQ-Int4", device='cuda:0') + + tokens = model.generate(**tokenizer("Today I am in Paris and", return_tensors="pt").to(model.device), max_new_tokens=20)[0] + result = tokenizer.decode(tokens) + + self.assertTrue(result == 'Today I am in Paris and I am going to the Louvre Museum. I want to see the Mona Lisa painting, but I') diff --git a/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_triton.py b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_triton.py new file mode 100644 index 0000000000000000000000000000000000000000..17e77c51490036d6e3443ab71f39d436db7e5cc6 --- /dev/null +++ b/lm-quant-toolkit/.deps/AutoGPTQ/tests/test_triton.py @@ -0,0 +1,104 @@ +import os +import unittest + +import torch +import torch.utils.benchmark as benchmark +from transformers import AutoTokenizer + +from auto_gptq import AutoGPTQForCausalLM + + +MODEL_ID = "TheBloke/Llama-7B-GPTQ" +DATASET_ID = "timdettmers/openassistant-guanaco" +LEARNING_RATE = 3e-5 +MAX_SEQ_LEN = 10 +BATCH_SIZE = 5 +NUM_TRAIN_STEPS = 10 + +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +def benchmark_forward( + fn, + *inputs, + repeats="auto", + desc="", + verbose=True, + amp=False, + amp_dtype=torch.float16, + **kwinputs, +): + if verbose: + print(desc, "- Forward pass") + + def amp_wrapper(*inputs, **kwinputs): + with torch.autocast(device_type="cuda", dtype=amp_dtype, enabled=amp): + fn(*inputs, **kwinputs) + + t = benchmark.Timer( + stmt="fn_amp(*inputs, **kwinputs)", + globals={"fn_amp": amp_wrapper, "inputs": inputs, "kwinputs": kwinputs}, + num_threads=torch.get_num_threads(), + ) + if repeats == "auto": + m = t.blocked_autorange() + else: + m = t.timeit(repeats) + if verbose: + print(m) + return t, m + +def get_model_and_tokenizer( + model_id=MODEL_ID, + inject_fused_attention=False, + inject_fused_mlp=False, + **model_kwargs, +): + tokenizer = AutoTokenizer.from_pretrained( + MODEL_ID, + use_fast=True, + ) + if not tokenizer.pad_token_id: + tokenizer.pad_token_id = tokenizer.eos_token_id + + model = AutoGPTQForCausalLM.from_quantized( + model_id, + trainable=True, + inject_fused_attention=inject_fused_attention, + inject_fused_mlp=inject_fused_mlp, + disable_exllamav2=True, + disable_exllama=True, + **model_kwargs, + ) + + model.warmup_triton() + return model, tokenizer + +class TestTriton(unittest.TestCase): + def test_triton_qlinear(self): + ref_model, _ = get_model_and_tokenizer( + model_id=MODEL_ID, + use_triton=True, + inject_fused_attention=False, + inject_fused_mlp=False, + ) + test_model, _ = get_model_and_tokenizer( + model_id=MODEL_ID, + use_tritonv2=True, + inject_fused_attention=False, + inject_fused_mlp=False, + ) + hidden_size = ref_model.model.model.embed_tokens.weight.shape[1] + test_data = torch.randn((1, 2048, hidden_size), dtype=torch.float16).cuda() + + qlinear_ref = ref_model.model.model.layers[0].self_attn.q_proj + qlinear_test = test_model.model.model.layers[0].self_attn.q_proj + + test_out = qlinear_test(test_data) + ref_out = qlinear_ref(test_data) + + self.assertTrue(torch.allclose(test_out, ref_out)) + + _, measure_triton = benchmark_forward(qlinear_ref, test_data, desc="Triton", verbose=True) + _, measure_tritonv2 = benchmark_forward(qlinear_test, test_data, desc="Triton-v2", verbose=True) + + self.assertTrue(measure_tritonv2.mean < measure_triton.mean) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/.github/workflows/ci.yaml b/lm-quant-toolkit/.deps/CLIP_benchmark/.github/workflows/ci.yaml new file mode 100644 index 0000000000000000000000000000000000000000..74b8eb5acca6a0c4e34b1cf853c0efbbb48a50c8 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/.github/workflows/ci.yaml @@ -0,0 +1,33 @@ +name: Continuous integration + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + tests: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.8] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install + run: | + python3 -m venv .env + source .env/bin/activate + make install + make install-dev + - name: Unit tests + run: | + source .env/bin/activate + make test diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/.github/workflows/python-publish.yml b/lm-quant-toolkit/.deps/CLIP_benchmark/.github/workflows/python-publish.yml new file mode 100644 index 0000000000000000000000000000000000000000..f336b13ba685130eff235f414bcecd9594e0d104 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/.github/workflows/python-publish.yml @@ -0,0 +1,37 @@ +name: Release + +on: + push: + branches: + - main +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-ecosystem/action-regex-match@v2 + id: regex-match + with: + text: ${{ github.event.head_commit.message }} + regex: '^Release ([^ ]+)' + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Release + if: ${{ steps.regex-match.outputs.match != '' }} + uses: softprops/action-gh-release@v1 + with: + tag_name: v${{ steps.regex-match.outputs.group1 }} + - name: Build and publish + if: ${{ steps.regex-match.outputs.match != '' }} + env: + TWINE_USERNAME: __token__ + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/.gitignore b/lm-quant-toolkit/.deps/CLIP_benchmark/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..3851cd2e4b4424e83e45a7acf049cbecb6fd6bfe --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/.gitignore @@ -0,0 +1,58 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +.DS_Store + +# C extensions +*.so + +# Distribution / packaging +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +# Sphinx documentation +docs/_build/ +features +root +cifar-100-* +probe_benchmark/data +datasets +downloads +.env diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/AUTHORS.rst b/lm-quant-toolkit/.deps/CLIP_benchmark/AUTHORS.rst new file mode 100644 index 0000000000000000000000000000000000000000..cc6a42524d7845b6271c98357a3cf777d4f56c64 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/AUTHORS.rst @@ -0,0 +1,6 @@ +======= +Credits +======= + +* `Mehdi Cherti `_ +* `Romain Beaumont `_ diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/CONTRIBUTING.rst b/lm-quant-toolkit/.deps/CLIP_benchmark/CONTRIBUTING.rst new file mode 100644 index 0000000000000000000000000000000000000000..f6d4adef48f57bb5cb741cf238a8a512521addf7 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/CONTRIBUTING.rst @@ -0,0 +1,128 @@ +.. highlight:: shell + +============ +Contributing +============ + +Contributions are welcome, and they are greatly appreciated! Every little bit +helps, and credit will always be given. + +You can contribute in many ways: + +Types of Contributions +---------------------- + +Report Bugs +~~~~~~~~~~~ + +Report bugs at https://github.com/LAION-AI/CLIP_benchmark/issues. + +If you are reporting a bug, please include: + +* Your operating system name and version. +* Any details about your local setup that might be helpful in troubleshooting. +* Detailed steps to reproduce the bug. + +Fix Bugs +~~~~~~~~ + +Look through the GitHub issues for bugs. Anything tagged with "bug" and "help +wanted" is open to whoever wants to implement it. + +Implement Features +~~~~~~~~~~~~~~~~~~ + +Look through the GitHub issues for features. Anything tagged with "enhancement" +and "help wanted" is open to whoever wants to implement it. + +Write Documentation +~~~~~~~~~~~~~~~~~~~ + +CLIP Benchmark could always use more documentation, whether as part of the +official CLIP Benchmark docs, in docstrings, or even on the web in blog posts, +articles, and such. + +Submit Feedback +~~~~~~~~~~~~~~~ + +The best way to send feedback is to file an issue at https://github.com/LAION-AI/CLIP_benchmark/issues. + +If you are proposing a feature: + +* Explain in detail how it would work. +* Keep the scope as narrow as possible, to make it easier to implement. +* Remember that this is a volunteer-driven project, and that contributions + are welcome :) + +Get Started! +------------ + +Ready to contribute? Here's how to set up `clip_benchmark` for local development. + +1. Fork the `clip_benchmark` repo on GitHub. +2. Clone your fork locally:: + + $ git clone git@github.com:your_name_here/clip_benchmark.git + +3. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:: + + $ mkvirtualenv clip_benchmark + $ cd clip_benchmark/ + $ python setup.py develop + +4. Create a branch for local development:: + + $ git checkout -b name-of-your-bugfix-or-feature + + Now you can make your changes locally. + +5. When you're done making changes, check that your changes pass flake8 and the + tests, including testing other Python versions with tox:: + + $ flake8 clip_benchmark tests + $ python setup.py test or pytest + $ tox + + To get flake8 and tox, just pip install them into your virtualenv. + +6. Commit your changes and push your branch to GitHub:: + + $ git add . + $ git commit -m "Your detailed description of your changes." + $ git push origin name-of-your-bugfix-or-feature + +7. Submit a pull request through the GitHub website. + +Pull Request Guidelines +----------------------- + +Before you submit a pull request, check that it meets these guidelines: + +1. The pull request should include tests. +2. If the pull request adds functionality, the docs should be updated. Put + your new functionality into a function with a docstring, and add the + feature to the list in README.rst. +3. The pull request should work for Python 3.5, 3.6, 3.7 and 3.8, and for PyPy. Check + https://travis-ci.com/mehdidc/clip_benchmark/pull_requests + and make sure that the tests pass for all supported Python versions. + +Tips +---- + +To run a subset of tests:: + + + $ python -m unittest tests.test_clip_benchmark + +Deploying +--------- + +A reminder for the maintainers on how to deploy. +Make sure all your changes are committed (including an entry in HISTORY.rst). +Then run:: + +$ bump2version patch # possible: major / minor / patch +$ git push +$ git push --tags + +Travis will then deploy to PyPI if tests pass. diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/HISTORY.md b/lm-quant-toolkit/.deps/CLIP_benchmark/HISTORY.md new file mode 100644 index 0000000000000000000000000000000000000000..967cb7db85f0a8e69a2f0d664868070880f7f05c --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/HISTORY.md @@ -0,0 +1,64 @@ +## History + +### 1.6.1 + +* Fix missing sugar crepe example #119 thanks to @samarth4149 + +### 1.6.0 + + +* Fix overwritten zeroshot templates issue (https://github.com/LAION-AI/CLIP_benchmark/issues/109) +* Support new multilingual retrieval datasets: Crossmodal-3600, XTD10, Flickr30k-200, and XTD200 +* Support tuning linear probing on validation set + +### 1.5.0 + +* Custom classnames and templates +* support wds for captioning evaluation +* support imagenet-w +* support babel imagenet +* support chinese flickr30k/8k +* support sugar crepe (compositionality) +* support (optional) sharding evaluation based on rank, for parallel runs +* fix many issues + +### 1.4.0 + +* Fix silent webdataset error-handling +* Added support for wds/voc2007_multilabel +* default to float32 +* add mscoco generative benchmark + +### 1.3.0 + +* update flickr8k results, solve issue #48, thanks to @orchidmajumder +* Evaluate multiple models/datasets/languages using the CLI directly +* Support Japanese CLIP by rinna +* Add arabic imagenet +* updating CuPL prompts with more generated sentences + ensembled with openAI prompts +* put model in eval mode before evaluation +* Webdataset updates +* Make verbose the default + +### 1.2.0 + +* Added support for loading webdatasets + +### 1.1.0 + +* Added better support for multilingual eval +* Added better support for linear probing +* Added support for CuPL prompts + +### 1.0.1 + +* pypi description as markdown + +### 1.0.0 + +* Actual first release on PyPI. + + +### 0.1.0 + +* First release on PyPI. diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/LICENSE b/lm-quant-toolkit/.deps/CLIP_benchmark/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..181293af5b37d1f24a72d3cd24c365f552797a75 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2022, Mehdi Cherti + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/MANIFEST.in b/lm-quant-toolkit/.deps/CLIP_benchmark/MANIFEST.in new file mode 100644 index 0000000000000000000000000000000000000000..3930536164706e5c79fadda7b67e96ae1dd96aaf --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/MANIFEST.in @@ -0,0 +1,12 @@ +include AUTHORS.rst +include CONTRIBUTING.rst +include HISTORY.rst +include LICENSE +include README.rst + +recursive-include tests * +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] + +recursive-include * *.json +recursive-include docs *.rst conf.py Makefile make.bat *.jpg *.png *.gif diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/Makefile b/lm-quant-toolkit/.deps/CLIP_benchmark/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..e13203d00c5cc4f1c822d2ea55fda4dd8af141bf --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/Makefile @@ -0,0 +1,91 @@ +.PHONY: clean clean-build clean-pyc clean-test coverage dist docs help install lint lint/flake8 +.DEFAULT_GOAL := help + +define BROWSER_PYSCRIPT +import os, webbrowser, sys + +from urllib.request import pathname2url + +webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1]))) +endef +export BROWSER_PYSCRIPT + +define PRINT_HELP_PYSCRIPT +import re, sys + +for line in sys.stdin: + match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line) + if match: + target, help = match.groups() + print("%-20s %s" % (target, help)) +endef +export PRINT_HELP_PYSCRIPT + +BROWSER := python -c "$$BROWSER_PYSCRIPT" + +help: + @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) + +clean: clean-build clean-pyc clean-test ## remove all build, test, coverage and Python artifacts + +clean-build: ## remove build artifacts + rm -fr build/ + rm -fr dist/ + rm -fr .eggs/ + find . -name '*.egg-info' -exec rm -fr {} + + find . -name '*.egg' -exec rm -f {} + + +clean-pyc: ## remove Python file artifacts + find . -name '*.pyc' -exec rm -f {} + + find . -name '*.pyo' -exec rm -f {} + + find . -name '*~' -exec rm -f {} + + find . -name '__pycache__' -exec rm -fr {} + + +clean-test: ## remove test and coverage artifacts + rm -fr .tox/ + rm -f .coverage + rm -fr htmlcov/ + rm -fr .pytest_cache + +lint/flake8: ## check style with flake8 + flake8 clip_benchmark tests + +lint: lint/flake8 ## check style + +test-all: ## run tests on every Python version with tox + tox + +coverage: ## check code coverage quickly with the default Python + coverage run --source clip_benchmark setup.py test + coverage report -m + coverage html + $(BROWSER) htmlcov/index.html + +docs: ## generate Sphinx HTML documentation, including API docs + rm -f docs/clip_benchmark.rst + rm -f docs/modules.rst + sphinx-apidoc -o docs/ clip_benchmark + $(MAKE) -C docs clean + $(MAKE) -C docs html + $(BROWSER) docs/_build/html/index.html + +servedocs: docs ## compile the docs watching for changes + watchmedo shell-command -p '*.rst' -c '$(MAKE) -C docs html' -R -D . + +release: dist ## package and upload a release + twine upload dist/* + +dist: clean ## builds source and wheel package + python setup.py sdist + python setup.py bdist_wheel + ls -l dist + +install: ## [Local development] Upgrade pip, install requirements, install package. + python -m pip install -U pip + python -m pip install -e . + +install-dev: ## [Local development] Install test requirements + python -m pip install -r requirements-test.txt + +test: ## [Local development] Run unit tests + python -m pytest -x -s -v tests diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/README.md b/lm-quant-toolkit/.deps/CLIP_benchmark/README.md new file mode 100644 index 0000000000000000000000000000000000000000..41755718c35fe51a8de3cd2a2caa6d70fd8ec03b --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/README.md @@ -0,0 +1,409 @@ +# CLIP Benchmark +[![pypi](https://img.shields.io/pypi/v/clip_benchmark.svg)](https://pypi.python.org/pypi/clip_benchmark) + +The goal of this repo is to evaluate CLIP-like models on a standard set +of datasets on different tasks such as zero-shot classification and zero-shot +retrieval, and captioning. + +Below we show the average rank (1 is the best, lower is better) of different CLIP models, evaluated +on different datasets. + +![benchmark.png](benchmark.png) + +The current detailed results of the benchmark can be seen [here](benchmark/README.md) +or directly in the [notebook](benchmark/results.ipynb). + +## Features + +* Support for zero-shot classification and zero-shot retrieval, linear probing, and captioning. +* Support for [OpenCLIP](https://github.com/mlfoundations/open_clip) pre-trained models, [Japanese CLIP](https://github.com/rinnakk/japanese-clip), and [NLLB CLIP](https://arxiv.org/abs/2309.01859) for general multilingual abilities. +* Support various datasets from [torchvision](https://pytorch.org/vision/stable/datasets.html), [tensorflow datasets](https://www.tensorflow.org/datasets), and [VTAB](https://github.com/google-research/task_adaptation). +* Support for various multilingual datasets for classification and retrieval +* Support for compositionality tasks + +## How to install? + +`pip install clip-benchmark` + +## How to use? + +To evaluate we recommend to create a models.txt like +``` +ViT-B-32,openai +``` + +to get the list of datasets +``` +wget https://raw.githubusercontent.com/LAION-AI/CLIP_benchmark/main/benchmark/webdatasets.txt +``` + +Then to run + +``` +clip_benchmark eval --pretrained_model models.txt \ + --dataset "webdatasets.txt" \ + --dataset_root "https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main" \ + --output "benchmark_{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +Then to get the full table + +``` +clip_benchmark build benchmark_*.json --output benchmark.csv +``` + + +### Command line interface (CLI) + +The easiest way to benchmark the models is using the CLI, `clip_benchmark`. +You can specify the model to use, the dataset and the task to evaluate on. Once it is done, evaluation is performed and +the results are written into a JSON file. + +### Using other models than openclip + +It is possible to use other models than openclip ones. For example japanese-clip is supported + +Here is an example of use + +``` +>>> python3 clip_benchmark/cli.py eval \ + --model_type "ja_clip" \ # flag to use japanese-clip + --pretrained "rinna/japanese-cloob-vit-b-16" \ # now, we have `rinna/japanese-cloob-vit-b-16` or `rinna/japanese-clip-vit-b-16`. + --language "jp" \ + --task "zeroshot_classification" \ + --dataset "imagenet1k" \ + --dataset_root {ROOT_PATH} + +>>> cat result.json +{"dataset": "imagenet1k", "model": "ViT-B-32-quickgelu", "pretrained": "rinna/japanese-cloob-vit-b-16", "task": "zeroshot_classification", "metrics": {"acc1": 0.54636, "acc5": 0.72856, "mean_per_class_recall": 0.54522}, "language": "jp"} +``` + +### How to add other CLIP models + +Please follow these steps: +1. Add a identity file to load model in `clip_benchmark/models` +2. Define a loading function, that returns a tuple (model, transform, tokenizer). Please see `clip_benchmark/models/open_clip.py` as an example. +3. Add the function into `TYPE2FUNC` in `clip_benchmark/models/__init__.py` + +Remarks: +- The new tokenizer/model must enable to do the following things as https://github.com/openai/CLIP#usage + - `tokenizer(texts).to(device)` ... `texts` is a list of string + - `model.encode_text(tokenized_texts)` ... `tokenized_texts` is a output from `tokenizer(texts).to(device)` + - `model.encode_image(images)` ... `images` is a image tensor by the `transform` + + +### CIFAR-10 example + + Here is an example for CIFAR-10 zero-shot classification using OpenCLIP's pre-trained model on LAION-400m: + + `clip_benchmark eval --dataset=cifar10 --task=zeroshot_classification --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + + By default, the dataset is downloaded into `--dataset_root`, which by default is `root`. + +Here is the content of `result.json` after the evaluation is done: + +```json +{ + "dataset": "cifar10", "model": "ViT-B-32-quickgelu", + "pretrained": "laion400m_e32", "task": "zeroshot_classification", + "metrics": {"acc1": 0.9074, "acc5": 0.998} +} +``` + + +### VOC2007 example + +Here is another example with VOC2007, which is a multi-label classification dataset. + + `clip_benchmark eval --dataset=voc2007_multilabel --task=zeroshot_classification --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + +Here is the content of `result.json` after the evaluation is done: + +```json +{"dataset": "voc2007_multilabel", "model": "ViT-B-32-quickgelu", "pretrained": "laion400m_e32", "task": "zeroshot_classification", "metrics": {"mean_average_precision": 0.7627869844436646}} +``` + +Here, we compute the mean average precision or mAP, more details about that metric [here](https://fangdahan.medium.com/calculate-mean-average-precision-map-for-multi-label-classification-b082679d31be) in the context of multi-label classification. + +### VTAB example + +Here is an example on how to run it on [VTAB](https://github.com/google-research/task_adaptation) classification tasks. +First, you need to install VTAB's dedicated package. + +`pip install task_adaptation==0.1` + +Then, you can run it by providing the full dataset name. +Example with `eurosat`: + + `clip_benchmark eval --dataset=vtab/eurosat --task=zeroshot_classification --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + +See [clip_benchmark/datasets/builder.py#L634](clip_benchmark/datasets/builder.py#L634) for the full list of +VTAB dataset collection. + + +### TensorFlow dataset example + +Here is an example on how to run it on [Tensorflow datasets](https://www.tensorflow.org/datasets). +First, you need to install `tfds-nightly` and `timm`. + +`pip install timm tfds-nightly` + + +The name of the dataset follows the template `tfds/`. + +Example with `cifar10`: + + `clip_benchmark eval --dataset=tfds/cifar10 --task=zeroshot_classification --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + + +### COCO captions retrieval example + + Here is an example for COCO captions zero-shot retrieval: + + `clip_benchmark eval --dataset=mscoco_captions --task=zeroshot_retrieval --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + + Note that for using COCO, you also need to install `pycocotools` (e.g., using `pip install pycocotools`). + + +### COCO captions captioning example + + Here is an example for COCO captions captioning task: + + `clip_benchmark eval --dataset=mscoco_captions --task=captioning --model=coca_ViT-L-14 --output=result.json --pretrained mscoco_finetuned_laion2b_s13b_b90k` + + Note that for using COCO, you also need to install `pycocotools` (e.g., using `pip install pycocotools`) and `pycocoevalcap`. + +### Linear probing example + +Full linear probing on train split, evaluate on test split: + +`clip_benchmark eval --dataset=cifar10 --task=linear_probe --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64 --fewshot_lr 0.1 --fewshot_epochs 20 --batch_size 512 --train_split train --test_split test` + + +few-shot (k=5) linear probing on train split, evaluate on test split: + +`clip_benchmark eval --dataset=cifar10 --task=linear_probe --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64 --fewshot_k 5 --fewshot_lr 0.1 --fewshot_epochs 20 --batch_size 512 --train_split train --test_split test` + +Split train into train (90%), val (10%), do linear probing on train split, tune on val split, evaluate on test split: + +`clip_benchmark eval --dataset=cifar10 --task=linear_probe --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64 --fewshot_lr 0.1 --fewshot_epochs 20 --batch_size 512 --train_split train --val_proportion 0.1 --test_split test` + +For other datasets that have an official val split, one can also specify the val split: + +`clip_benchmark eval --dataset=fgvc_aircraft --task=linear_probe --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64 --fewshot_lr 0.1 --fewshot_epochs 20 --batch_size 512 --train_split train --val_split val --test_split test` + +### Multilingual evaluation + +We also provide datasets for evaluating multilingual models (see e.g. https://github.com/mlfoundations/open_clip#vit-b32-xlm-roberta-base, and https://github.com/mlfoundations/open_clip/blob/main/docs/openclip_multilingual_retrieval_results.csv) by specifying `--language`. + +For ImageNet-1k (zero-shot classification): + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=imagenet1k --output=result.json --batch_size=64 --language=`, where `` can be among `zh` (chinese), `it` (italian), `jp` (japanese), `en` (english), `ar` (arabic). +- We also support Babel ImageNet classnames and prompts (https://github.com/gregor-ge/Babel-ImageNet), which can be used as the following: `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=babel_imagenet --output=result.json --batch_size=64 --language=`, +where `` is a two letter string from the [ISO language code list](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes). Supported values for language are: `'ne', 'id', 'de', 'nl', 'af', 'he', 'sq', 'uz', 'kn', 'ku', 'ta', 'lv', 'ko', 'ug', 'br', 'el', 'su', 'kk', 'sk', 'gl', 'om', 'fa', 'jv', 'cs', 'lo', 'hy', 'xh', 'hr', 'so', 'gu', 'am', 'ar', 'sa', 'ca', 'is', 'it', 'sv', 'ga', 'bg', 'vi', 'sd', 'ur', 'km', 'pl', 'hu', 'sr', 'fr', 'hi', 'fy', 'et', 'bs', 'sw', 'az', 'mk', 'es', 'mn', 'ja', 'tl', 'tr', 'gd', 'ro', 'mg', 'mr', 'sl', 'pt', 'lt', 'no', 'yi', 'uk', 'ky', 'ka', 'bn', 'or', 'my', 'en', 'ps', 'fi', 'zh', 'da', 'ml', 'be', 'eo', 'ha', 'eu', 'as', 'te', 'th', 'cy', 'si', 'ru', 'la', 'pa', 'ms'` + +for COCO (zero-shot retrieval): + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=multilingual_mscoco_captions --output=result.json --batch_size=64 --language=`, where `` can be among `es` (spanish), `it` (italian), `jp` (japanese), `ko` (korean), `pl` (polish), `ru` (russian), `tr` (Turkish), `zh` (chinese), `en` (english), `fr` (french), `de` (german). + +For Flickr-30k (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=flickr30k --output=result.json --batch_size=64 --language=`, where `` can be among `en` (english), `zh` (chinese). + +For Flickr-8k (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=flickr8k --output=result.json --batch_size=64 --language=`, where `` can be among `en` (english), `zh` (chinese). + +For [Crossmodal-3600](https://google.github.io/crossmodal-3600/) (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=crossmodal3600 --output=result.json --batch_size=64 --language=`, see supported languages [here](https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/crossmodal3600.py#L9). + +For Flickr30k-200 dataset, which has 1000 captions from Flickr30k dataset translated to 200 languages using [NLLB-3.3B model](https://huggingface.co/facebook/nllb-200-3.3B) (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=flickr30k-200 --output=result.json --batch_size=64 --language=`, see supported languages [here](https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/flickr30k_200.py#L15). + +For XTD200 dataset, which has captions from [XTD10](https://github.com/adobe-research/Cross-lingual-Test-Dataset-XTD10) dataset translated to 200 languages using [NLLB-3.3B model](https://huggingface.co/facebook/nllb-200-3.3B) (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=xtd200 --output=result.json --batch_size=64 --language=`, see supported languages [here](https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/xtd200.py#L15). + + +### Compositionality evaluation + + +For [Sugar Crepe](https://github.com/RAIVNLab/sugar-crepe): + + +`clip_benchmark eval --model ViT-B-32 --pretrained laion400m_e32 --dataset=sugar_crepe/ --output=result.json` + +where `` can be among `add_att`, `add_obj`, `replace_att`, `replace_obj`, `replace_rel`, `swap_att`, `swap_obj`. +To evaluate on all the tasks together, you can do: + +`clip_benchmark eval --model ViT-B-32 --pretrained laion400m_e32 --dataset=sugar_crepe --output=result.json` + +For [winoground](https://huggingface.co/datasets/facebook/winoground/): + +`clip_benchmark eval --model ViT-B-32 --pretrained laion400m_e32 --dataset=winoground --output=result.json` + +NB: `pip install datasets` is required for winoground. + +### Webdataset example + +Here is an example on how to run it on [webdatasets](https://github.com/webdataset/webdataset). +First, you need to install `webdataset`. + +`pip install webdataset` + +#### Creating a webdataset + +You can either convert an already supported CLIP_benchmark dataset to webdataset format, or manually create your own with the same file structure. For already supported datasets use the CLI command `clip_benchmark_export_wds` as in this example: + +``` +$ clip_benchmark_export_wds --dataset cifar10 --plit train --dataset_root DATA_DIR/ --output wds_cifar10/ +$ clip_benchmark_export_wds --dataset cifar10 --split test --dataset_root DATA_DIR/ --output wds_cifar10/ +``` + +which will convert the train and test splits for CIFAR-10 (downloaded to `DATA_DIR/`) and save the webdataset to `wds_cifar10/` (upload to Huggingface Hub must be done manually for now). Retrieval datasets are also supported with the `--retrieval` flag. + +For other datasets, data must be stored with the following file structure: + +``` +root_dir/ + train/ + nshards.txt + 0.tar + 1.tar + ... + test/ + nshards.txt + 0.tar + ... + classnames.txt + zeroshot_classification_templates.txt + dataset_type.txt +``` + +Each split should be contained in its own folder and `nshards.txt` should contain a single integer corresponding to the number of TAR files. The TAR files should follow webdataset format, with an image file (.webp, .png, or .jpg) and a label (.cls) for each example. Classnames and templates are required for zeroshot classification evaluation, with each classname or template on its own line. Dataset type is required for distinguishing zeroshot retrieval evaluation: the file should just contain the text `retrieval`. + +#### Evaluating on a webdataset + +The name of the dataset follows the template `wds/`. Note that the dataset name currently only affects the name in the results output - classnames and templates are loaded directly from the included files. The dataset root directory can be either a local path to the `root_dir` as specified above, or an HTTP URL pointing to a Huggingface Hub dataset file tree. + +Example with `vtab/cifar10` (zero-shot classification): + +- local: `clip_benchmark eval --dataset wds/vtab/cifar10 --dataset_root ROOT_DIR/wds_vtab-cifar10/` +- remote: `clip_benchmark eval --dataset wds/vtab/cifar10 --dataset_root https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main` + +Example with `mscoco_captions` (retrieval): + +- local: `clip_benchmark eval --dataset=wds/mscoco_captions --dataset_root ROOT_DIR/wds_vtab-mscoco_captions/ --task=zeroshot_retrieval` +- remote: `clip_benchmark eval --dataset=wds/mscoco_captions --dataset_root="https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main" --task=zeroshot_retrieval` + + +Example with `mscoco_captions` (captioning): + +- local: `clip_benchmark eval --dataset=wds/mscoco_captions --dataset_root ROOT_DIR/wds_vtab-mscoco_captions/ --task=captioning` +- remote: `clip_benchmark eval --dataset=wds/mscoco_captions --dataset_root="https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main" --task=captioning` + + +All other arguments remain the same as in the other examples. See `https://huggingface.co/clip-benchmark` for a full list of datasets that have already been uploaded to Huggingface. + +## Evaluate mulitple models on multiple datasets + +For the purpose of benchmarking, it is possible to run the CLI with multiple +pre-trained models on multiple datasets. + + +### Pretrained models and datasets list as arguments + +For models, we can provide list of pretrained model names in the form of 'model,pretrained' (so `model` and `pretrained` are comma separated). For datasets, we can provide a list of datasets. For languages, we can provide a list of languages. +Example: + +```bash +clip_benchmark eval --pretrained_model ViT-B-32-quickgelu,laion400m_e32 ViT-L-14,laion400m_e32 \ +--dataset cifar10 cifar100 --dataset_root "clip_benchmark_datasets/{dataset}" --language en jp \ + --output "{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +Note that `--dataset_root` and `--output` can be now in the form of a template that depends on the dataset/model/language/task (for `--output`) and dataset name (for `--dataset_root`). + +Note that If the benchmark fails at some point, it is possible to resume it by skipping already evaluated models using `--skip_existing`. + +### Pretrained models and datasets list as files + +We can also provide a path to files with models (each line is in the form of 'model,pretrained' where `model` and `pretrained` are comma separated) and datasets list (one dataset per line): + +```bash +clip_benchmark eval --pretrained_model benchmark/models.txt \ +--dataset benchmark/datasets.txt --dataset_root "clip_benchmark_datasets/{dataset}" \ + --output "{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +Examples are available in [benchmark/datasets.txt](benchmark/datasets.txt) and [benchmark/models.txt](benchmark/models.txt) + +### Multiple checkpoints from the same model + +It is also common to evaluate multiple checkpoints from the same model: + +```bash +clip_benchmark eval --model ViT-B-32 --pretrained *.pt \ +--dataset benchmark/datasets.txt --dataset_root "clip_benchmark_datasets/{dataset}" \ + --output "{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +### Model and dataset collections + +We can also provide model collection names (`openai`, `openclip_base`, `openclip_multilingual`, `openclip_full` are supported) or dataset collection names (`vtab`, `vtab+`, `retrieval`, `imagenet_robustness` are supported): + +```bash +clip_benchmark eval --pretrained_model openai openclip_base --dataset vtab+ retrieval \ +--dataset_root "clip_benchmark_datasets/{dataset}" --not quiet \ +--output "{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +See [clip_benchmark/models.py#L6](clip_benchmark/models.py#L6) and [clip_benchmark/datasets/builder.py#L634](clip_benchmark/datasets/builder.py#L634) for more information +about the collections. + +### Custom templates / prompts / classnames + +It is also possible to use custom prompts by providing a custom template file and/or a custom classname file. +For instance: + +`clip_benchmark eval --dataset "imagenet1k" --model ViT-B-32 --pretrained laion400m_e32 --custom_template_file --custom_classname_file ` + +The template file can be either in the usual format https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/en_zeroshot_classification_templates.json or in the CuPL format https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/cupl_prompts.json to have class-specific prompts. In the case of the CuPL format, the classnames file will not be used, thus one only needs to provide the template file `--custom_template_file`. + +For instance, the prompts from the CuPL paper https://arxiv.org/abs/2209.03320 for ImagetNet-1k can be used this way : + +`clip_benchmark eval --dataset "imagenet1k" --model ViT-B-32 --pretrained laion400m_e32 --custom_template_file cupl_prompts.json` + +### Development + +For development, you can also do this: + +```bash +git clone https://github.com/LAION-AI/CLIP_benchmark +cd CLIP_benchmark +python setup.py install +``` + +## Credits + +- Thanks to [OpenCLIP](https://github.com/mlfoundations/open_clip) authors, zero-shot accuracy code is adapted from there and pre-trained models are used in the command line interface. +- Thanks to [SLIP](https://github.com/facebookresearch/SLIP) authors, some zero-shot templates and classnames are from there. +- Thanks to [Wise-ft](https://github.com/mlfoundations/wise-ft) authors, Imagenet robustness datasets code is adapted from there +- Thanks to [LiT](https://arxiv.org/abs/2111.07991.pdf) authors, some zero-shot templates and classnames of VTAB datasets are from there. +- Thanks to [Sugar Crepe](https://github.com/RAIVNLab/sugar-crepe) authors for compositionality tasks evaluation on COCO +- Thanks to [Babel ImageNet](https://github.com/gregor-ge/Babel-ImageNet) authors for multilingual evaluation of ImageNet-1k zero-shot classification. +- Thanks to [ImageNet-W](https://github.com/facebookresearch/Whac-A-Mole) authors for ImageNet-W evaluation +- Thanks to [CuPL](https://github.com/sarahpratt/CuPL) for CuPL prompts. +- Thanks to [PyCOCOevalcap](https://github.com/salaniz/pycocoevalcap) and [@gpucce](https://github.com/gpucce) for COCO captions image captioning evaluation. +- Thanks to [@li-xirong](https://github.com/li-xirong/cross-lingual-cap) for chinese Flickr-30k/FLickr-8k. +- Thanks to [Chinese CLIP](https://github.com/OFA-Sys/Chinese-CLIP) authors for chinese ImageNet-1k classnames/prompts (zero-shot classification). +- Thanks to [@rinnakk](https://github.com/rinnakk/japanese-clip) and [@mkshing](https://github.com/mkshing) for japanese ImageNet-1k classnames/prompts (zero-shot classification) and japanese CLIP support. +- Thanks to [@KhalidAlt](https://github.com/KhalidAlt) for arabic ImageNet-1k classnames/prompts (zero-shot classification). +- Thanks to [@djghosh13](https://github.com/djghosh13) for WebDataset support. +- Thanks to [@FreddeFrallan](https://github.com/FreddeFrallan) for for multilingual COCO. +- Thanks to [@mitchellnw](https://github.com/mitchellnw) for linear probing support. +- Thanks to [@teasgen](https://github.com/teasgen) for support of validation set and tuning linear probing similar to OpenAI's CLIP. +- Thanks to [@visheratin](https://github.com/visheratin) for multilingual retrieval datasets support from . +- This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [audreyr/cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage) project template. Thanks to the author. diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark.png b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark.png new file mode 100644 index 0000000000000000000000000000000000000000..63e1aba39792ee38c7db1b0920a236e2d7c8ffcb Binary files /dev/null and b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark.png differ diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/README.md b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/README.md new file mode 100644 index 0000000000000000000000000000000000000000..36d22420e30bb9d5ed0d2dc68d3c3762c79991cf --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/README.md @@ -0,0 +1,56 @@ +# Benchmark + +the benchmark results are available in [benchmark.csv](benchmark.csv). +You can visualize the results in the [notebook](results.ipynb) + +# How to reproduce the CLIP benchmark results + + +## Webdataset evaluation: VTAB+ and retrieval datasets (MSCOCO, Flickr8k, Flickr30k) + +```bash +clip_benchmark eval --pretrained_model openai openclip_base \ + --dataset "webdatasets.txt" \ + --dataset_root "https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main" \ + --output "benchmark_{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +Once the evaluation finishes, you can construct a CSV with all the results: + +```bash +clip_benchmark build benchmark_*.json --output benchmark.csv +``` + +*Notes:* Pascal VOC 2007 multilabel is not yet included in the webdataset test suite. Multilingual support with webdataset is in progress. + +## Alternative: Local download + +```bash +clip_benchmark eval --pretrained_model openai openclip_base --dataset vtab+ retrieval \ +--dataset_root "clip_benchmark_datasets/{dataset}" \ +--output "benchmark_{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` +(Change `--dataset_root` accordingly) + +## Multilingual ImageNet benchmark + +To run the multilingual ImageNet benchmark, use: + +```bash +clip_benchmark eval --pretrained_model openclip_multilingual openclip_base openai --dataset imagenet1k --language cn it jp en ar\ +--dataset_root "clip_benchmark_datasets/{dataset}" \ +--output "multilingual_{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` +(Change `--dataset_root` accordingly) + +## Multilingual MS-COCO benchmark + +To run the multilingual MS-COCO benchmark, use: + +```bash +clip_benchmark eval --pretrained_model openclip_multilingual openclip_base openai --dataset multilingual_mscoco_captions --language es it ko pl ru tr zh en \ +--dataset_root "clip_benchmark_datasets/{dataset}" \ +--output "multilingual_{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +(Change `--dataset_root` accordingly) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/benchmark.csv b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/benchmark.csv new file mode 100644 index 0000000000000000000000000000000000000000..d02a4f45aa6ea7e9c29fe888319a69024251c3d1 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/benchmark.csv @@ -0,0 +1,508 @@ +acc1,acc5,mean_per_class_recall,dataset,model,pretrained,task,mean_average_precision,image_retrieval_recall@5,text_retrieval_recall@5,model_fullname +0.0232340494791666,0.1152615017361111,0.0242046402834269,vtab/dsprites_label_orientation,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.4460852605182502,0.9469211479520758,0.3940612716631316,fer2013,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.7738666666666667,0.9362666666666668,0.7345750490593081,imagenet-a,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.4457446808510638,0.7585106382978724,0.449468085106383,vtab/dtd,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.7521562425290105,0.9608106368501388,0.7512820500659019,sun397,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +,,,voc2007_multilabel,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,0.796263575553894,,,ViT-B-32 laion2b_s34b_b79k +0.7557,0.9386,0.7554000000000001,vtab/cifar100,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.665,0.89844,0.66506,imagenet1k,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.1889597536837475,0.819793270288102,0.1681683759314615,vtab/dmlab,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.4955,0.8497,0.5259367109048434,mnist,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.5175536361103371,0.9651713569239344,0.5055924943171644,fer2013,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.6246666789267521,0.91313422954558,0.6346910684418603,sun397,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.9070591441809758,0.995366584900518,0.9070894162634328,vtab/pets,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.5609659540775931,0.8069675376088677,0.5169427663206733,gtsrb,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.0313720703125,0.1469997829861111,0.0320098582855241,vtab/dsprites_label_x_position,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.3628226797787339,0.6565765212046711,0.4033487053539641,vtab/svhn,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.4362628661916072,0.7091844813935075,0.370358797280688,gtsrb,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.5535494775660725,0.9136447449293178,0.5591738787984386,vtab/svhn,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.4417465274038979,0.7008721869279638,0.4272611771980346,objectnet,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.7174074074074074,0.9561111111111112,0.7202760268647987,vtab/eurosat,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.501821060965954,0.7586698337292161,0.4394378810250903,gtsrb,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.9321340964840557,0.9978195693649496,0.9313974108097984,vtab/pets,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.4934283452098179,0.7430720506730008,0.4353727539920664,gtsrb,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.8522353714661407,0.963346482577252,0.944284654839904,vtab/caltech101,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +,,,flickr30k,ViT-B-32-quickgelu,laion400m_e32,zeroshot_retrieval,,0.8546000123023987,0.9409999847412108,ViT-B-32-quickgelu laion400m_e32 +0.1178600823045267,0.5817283950617284,0.1208963734895024,vtab/smallnorb_label_elevation,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.76664,0.9485,0.76656,imagenet1k,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.7679,0.9386,0.7581398074696393,mnist,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.2883263009845288,,0.3645688070267072,vtab/kitti_closest_vehicle_distance,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.1854185418541854,0.4452445244524452,0.1875846702317291,fgvc_aircraft,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.0197618272569444,0.1133355034722222,0.0176459217575104,vtab/dsprites_label_orientation,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +,,,flickr8k,ViT-B-16-plus-240,laion400m_e32,zeroshot_retrieval,,0.873199999332428,0.9549999833106995,ViT-B-16-plus-240 laion400m_e32 +0.551063829787234,0.8356382978723405,0.5499999999999999,vtab/dtd,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.8391,0.9729,0.8388,vtab/cifar100,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.482037037037037,0.935,0.493913656654034,vtab/eurosat,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.6828752642706131,0.8578630671653927,0.6628139602370955,vtab/flowers,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.5844813935075218,0.820744259699129,0.5442606899522975,gtsrb,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.50628662109375,,0.5062329426609509,vtab/pcam,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.6932,0.8887,0.6785851251044699,imagenet-r,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.2304230423042304,0.5295529552955296,0.2319696969696969,fgvc_aircraft,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.605010986328125,,0.605165824864527,vtab/pcam,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +,,,flickr8k,ViT-B-16,laion400m_e32,zeroshot_retrieval,,0.8575999736785889,0.9409999847412109,ViT-B-16 laion400m_e32 +0.7835420393559929,0.9242153195641568,0.7862863094545812,vtab/flowers,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.9467,0.999,0.9466,vtab/cifar10,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.6961,0.9086,0.6957000000000001,imagenetv2,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.4345209817893903,0.707680126682502,0.400638686800972,gtsrb,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.0317789713541666,0.147705078125,0.0324921668671336,vtab/dsprites_label_x_position,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.7871,0.9505,0.7775130720394369,mnist,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.63334,0.88778,0.63284,imagenet1k,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.6031914893617021,0.8867021276595745,0.6042553191489363,vtab/dtd,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.985875,0.99975,0.9864999999999998,stl10,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.2636018957345971,0.5149289099526067,0.2629857819905213,country211,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.5132978723404256,0.7787234042553192,0.5095744680851063,vtab/dtd,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.4342160768689946,1.0,0.2167811161586062,vtab/diabetic_retinopathy,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.5512,0.8156,0.5509,imagenetv2,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.7105220361034315,0.8590014636526264,0.6857234783638442,vtab/flowers,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.6867793368519779,0.9372344925244128,0.6845985471139586,sun397,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.5016666666666667,0.959074074074074,0.511474800858698,vtab/eurosat,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.8468,0.9733,0.8471000000000001,vtab/cifar100,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +,,,voc2007_multilabel,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,0.801436722278595,,,ViT-H-14 laion2b_s32b_b79k +0.9172,0.9975,0.9172,vtab/cifar10,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.6981352410026298,0.9398183055335896,0.6849982147927691,sun397,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.77972,0.95216,0.77952,imagenet1k,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.029541015625,0.1558973524305555,0.0292117961574083,vtab/dsprites_label_x_position,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.5,0.7502771179730799,0.4499584478173962,gtsrb,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.7590333333333333,0.9128666666666668,0.7444515544684158,imagenet-r,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.4690721649484536,0.931178601281694,0.4334946917742944,fer2013,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.485626220703125,,0.4856418903784925,vtab/pcam,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.9438539111474517,0.9986372308530936,0.9434557685576204,vtab/pets,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +,,,flickr8k,ViT-L-14,laion400m_e32,zeroshot_retrieval,,0.8984000086784363,0.9649999737739563,ViT-L-14 laion400m_e32 +0.0972839506172839,0.5397530864197531,0.0973286727349915,vtab/smallnorb_label_elevation,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.5159912109375,,0.5157975788193991,vtab/pcam,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.7824519230769231,0.9688835470085472,0.8629106820310023,voc2007,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.0293918185763888,0.150390625,0.0306791200330755,vtab/dsprites_label_x_position,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.5710666666666666,0.8348,0.5639196371233688,imagenet-a,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.6408566721581549,,0.6410094956864107,renderedsst2,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.1134156378600823,0.5579423868312757,0.1146512139135114,vtab/smallnorb_label_elevation,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.1590499230261711,0.8403782713877281,0.1701282125753662,vtab/dmlab,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +,,,voc2007_multilabel,ViT-B-32,laion2b_e16,zeroshot_classification,0.7927550077438354,,,ViT-B-32 laion2b_e16 +,,,mscoco_captions,ViT-B-16,laion400m_e32,zeroshot_retrieval,,0.6364254355430603,0.7961999773979187,ViT-B-16 laion400m_e32 +0.758985200845666,0.8894129126687266,0.7455642498757189,vtab/flowers,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,voc2007_multilabel,ViT-B-32,openai,zeroshot_classification,0.7601363658905029,,,ViT-B-32 openai +0.6968,0.9081,0.6974,imagenetv2,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.8893431452711911,0.9940038157536112,0.884512216368383,vtab/pets,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.7021,0.9244,0.703,vtab/cifar100,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.5072222222222222,0.9255555555555556,0.489609055911575,vtab/eurosat,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.7067545304777595,,0.7068315384169996,renderedsst2,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.665743087897188,0.8816640138340309,0.6655023529411764,imagenet_sketch,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.5155555555555555,0.9201851851851852,0.526225901185735,vtab/eurosat,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +,,,flickr30k,ViT-B-32,openai,zeroshot_retrieval,,0.8338000178337097,0.9490000009536744,ViT-B-32 openai +0.1593333333333333,0.9299333333333332,0.1673057808855792,vtab/clevr_closest_object_distance,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.7464,0.9285,0.7471,vtab/cifar100,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +,,,mscoco_captions,ViT-L-14,laion400m_e32,zeroshot_retrieval,,0.6805678009986877,0.8216000199317932,ViT-L-14 laion400m_e32 +0.9307713273371492,0.9980921231943308,0.9330900923082088,vtab/pets,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.6188,0.8745,0.6202000000000001,imagenetv2,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.4230383776454636,0.7030792509186661,0.4230898039215686,imagenet_sketch,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.7910657051282052,0.9600026709401708,0.8052125971178338,voc2007,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.1674950516824279,0.8040906091928745,0.1782001238774596,vtab/dmlab,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.8310322156476002,0.9529914529914528,0.903296243135675,vtab/caltech101,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.1094650205761317,0.5571193415637861,0.1098932195729559,vtab/smallnorb_label_elevation,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.5716,0.8386,0.5721,imagenetv2,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.1080658436213991,0.5204115226337449,0.108510287776451,vtab/smallnorb_label_elevation,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.8982,0.9963,0.8995000000000001,vtab/cifar10,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.9381302807304442,0.9986372308530936,0.9372081115891412,vtab/pets,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.5819,0.8386,0.5815,imagenetv2,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.6666666666666666,0.941904761904762,0.6759805529181834,vtab/resisc45,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,voc2007_multilabel,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,0.7846916913986206,,,ViT-B-16-plus-240 laion400m_e32 +0.5363831083338246,0.7926467409459804,0.53684,imagenet_sketch,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.7930605646063923,0.986693197363512,0.79277195221544,cars,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.6457990115321252,,0.6459400874297956,renderedsst2,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.6445715707001617,0.9434149981345604,0.6469166001999892,cars,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.503753662109375,,0.5035515136049098,vtab/pcam,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.5706822372464659,0.9138752304855562,0.5886888789913961,vtab/svhn,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.7761084401709402,0.9418402777777778,0.8508423918048074,voc2007,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.1884360189573459,0.4163507109004739,0.1883412322274882,country211,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.97075,0.999375,0.971875,stl10,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.1508247195953375,0.8088849791071036,0.1720986035113953,vtab/dmlab,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.2629716428404031,1.0,0.2194476579174435,vtab/diabetic_retinopathy,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.4630454824830977,0.817340196681008,0.4869931863892911,vtab/svhn,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,mscoco_captions,ViT-B-32,laion2b_e16,zeroshot_retrieval,,0.6467413306236267,0.7950000166893005,ViT-B-32 laion2b_e16 +0.270042194092827,,0.3517916468296155,vtab/kitti_closest_vehicle_distance,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.7082,0.9169,0.709,imagenetv2,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.6352380952380953,0.9225396825396824,0.6419889996880412,vtab/resisc45,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.5404255319148936,0.8398936170212766,0.5367021276595745,vtab/dtd,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.2236286919831223,,0.3717030717825018,vtab/kitti_closest_vehicle_distance,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.5850793650793651,0.910952380952381,0.5919202546199539,vtab/resisc45,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.7567441239316239,0.9461805555555556,0.7914514618991711,voc2007,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.3319333333333333,0.9534,0.3193231509666999,vtab/clevr_count_all,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.5661724327292696,,0.5658672775172254,renderedsst2,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.2686357243319268,,0.3735376764204429,vtab/kitti_closest_vehicle_distance,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.1856168902573125,0.82608313173521,0.1925396140565279,vtab/dmlab,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.8504273504273504,0.9681130834976988,0.9394300669046936,vtab/caltech101,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.7768934212162666,0.983957219251337,0.777448930592225,cars,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.3048171481253841,0.7613706207744315,0.3503741918499782,vtab/svhn,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.96575,0.999375,0.966625,stl10,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.6219482421875,,0.6220625731388706,vtab/pcam,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +,,,flickr30k,ViT-L-14,laion400m_e32,zeroshot_retrieval,,0.9082000255584716,0.977999985218048,ViT-L-14 laion400m_e32 +0.72734,0.9293,0.72694,imagenet1k,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.7766666666666666,0.9304333333333332,0.7605432098970494,imagenet-r,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.6137,0.8644,0.6146999999999999,imagenetv2,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.2877333333333333,0.9075333333333332,0.2821869879006831,vtab/clevr_count_all,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.6190740740740741,0.962037037037037,0.6309344676440423,vtab/eurosat,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.0313313802083333,0.1560872395833333,0.031335128135504,vtab/dsprites_label_x_position,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.1149794238683127,0.5761316872427984,0.115904554765943,vtab/smallnorb_label_elevation,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.7760611481541714,0.9046999512115792,0.7813275676765017,vtab/flowers,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.8865,0.9695666666666668,0.8748158307459671,imagenet-r,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +,,,mscoco_captions,ViT-H-14,laion2b_s32b_b79k,zeroshot_retrieval,,0.734306275844574,0.8604000210762024,ViT-H-14 laion2b_s32b_b79k +0.7524,0.9418,0.7528999999999999,vtab/cifar100,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.2618666666666667,0.5721333333333334,0.2839019082932269,imagenet-a,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.9345852505907224,0.9988807362268376,0.9351484667320789,cars,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.4286709389802173,0.898300362217888,0.392124222029496,fer2013,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.68352,0.91864,0.68396,imagenet1k,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.1123456790123456,0.5467489711934156,0.1133381228564946,vtab/smallnorb_label_elevation,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.4932893159621922,0.7566861207726621,0.4940521568627451,imagenet_sketch,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.5009752020061299,0.932153803287824,0.449919123283142,fer2013,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.7549,0.946,0.7545,imagenet1k,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.0346001519097222,0.1698269314236111,0.0339338982697889,vtab/dsprites_label_x_position,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.71777753849467,0.9007214385700442,0.7007187288769688,objectnet,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.7294,0.9415,0.7332910901261492,mnist,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.0342746310763888,0.1416965060763889,0.034365141983162,vtab/dsprites_label_orientation,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.210639793766112,1.0,0.2335698910327324,vtab/diabetic_retinopathy,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.8392504930966469,0.9510190664036818,0.9090841082001052,vtab/caltech101,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.2841068917018284,,0.4076831334000694,vtab/kitti_closest_vehicle_distance,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.6813829787234043,0.925531914893617,0.6829787234042553,vtab/dtd,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.6909,0.91432,0.69156,imagenet1k,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.2424666666666666,0.7876,0.2312503165591237,vtab/clevr_count_all,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.67002,0.90424,0.67026,imagenet1k,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +,,,flickr30k,ViT-B-16,laion400m_e32,zeroshot_retrieval,,0.881600022315979,0.9679999947547911,ViT-B-16 laion400m_e32 +0.8787,0.9709333333333332,0.8651131734542029,imagenet-r,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.62918,0.87652,0.6289,imagenet1k,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.5469522240527183,,0.5464163192635053,renderedsst2,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.4425531914893617,0.7638297872340426,0.4430851063829787,vtab/dtd,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.5149133196941962,0.7512652094325402,0.5017005288059357,objectnet,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.4855,0.8418,0.4575381785680641,mnist,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.6550016151609777,0.8503284160654678,0.6433184742666794,objectnet,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.7744,0.9471,0.7737999999999998,vtab/cifar100,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.7920656634746922,0.9787339883099117,0.7926165075935756,cars,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.2081575246132208,,0.1791674645508319,vtab/kitti_closest_vehicle_distance,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.0260687934027777,0.1259223090277778,0.0268337475785376,vtab/dsprites_label_orientation,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.6922,0.9403,0.6883700135057857,mnist,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.1143209876543209,0.5373662551440329,0.1138628810502107,vtab/smallnorb_label_elevation,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.6769,0.9012,0.6781,imagenetv2,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.7683627136752137,0.952590811965812,0.8035754023986389,voc2007,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.8504273504273504,0.953155818540434,0.9440706929933655,vtab/caltech101,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.6434889751181566,0.9243614027989776,0.6527406670624641,sun397,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.3311163895486936,0.7250989707046714,0.3196447660118034,gtsrb,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.6521841655367565,0.8748649020416986,0.6524090196078433,imagenet_sketch,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.1469194312796208,0.3500473933649289,0.1470142180094787,country211,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.96875,0.99975,0.9695,stl10,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.6908043501669,0.8805319263486594,0.6736647184602601,objectnet,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.984375,0.999875,0.9849999999999998,stl10,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.5544309249488533,0.7926671691611931,0.5363732822578842,objectnet,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.7555422008547008,0.9489182692307692,0.830992972154603,voc2007,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.5293285385839769,0.78944369117098,0.5286741176470588,imagenet_sketch,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.7889957264957265,0.9573317307692308,0.8054447759101763,voc2007,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.675285506739982,0.9369310554094562,0.6824513086557495,sun397,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.111275720164609,0.5548971193415638,0.1102182875784799,vtab/smallnorb_label_elevation,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +,,,flickr8k,ViT-B-32,laion2b_e16,zeroshot_retrieval,,0.8574000000953674,0.9319999814033508,ViT-B-32 laion2b_e16 +0.5989555292344136,0.8103262625174976,0.586320244179702,objectnet,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +,,,mscoco_captions,ViT-g-14,laion2b_s12b_b42k,zeroshot_retrieval,,0.7239903807640076,0.853600025177002,ViT-g-14 laion2b_s12b_b42k +0.7101,0.9209,0.7106999999999999,vtab/cifar100,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.189873417721519,,0.2568338943834677,vtab/kitti_closest_vehicle_distance,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +,,,mscoco_captions,ViT-B-32,laion2b_s34b_b79k,zeroshot_retrieval,,0.654218316078186,0.7982000112533569,ViT-B-32 laion2b_s34b_b79k +0.1186008230452674,0.560082304526749,0.1176434679315522,vtab/smallnorb_label_elevation,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.5634266886326195,,0.5635892536622082,renderedsst2,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +,,,flickr8k,ViT-L-14,laion2b_s32b_b82k,zeroshot_retrieval,,0.9147999882698059,0.9670000076293945,ViT-L-14 laion2b_s32b_b82k +0.0237358940972222,0.1186116536458333,0.0218059467808842,vtab/dsprites_label_orientation,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.1316147176001874,1.0,0.230780955782727,vtab/diabetic_retinopathy,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.8599676657132197,0.9912946150976246,0.8615494787047302,cars,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.5569148936170213,0.8361702127659575,0.5563829787234043,vtab/dtd,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +,,,flickr30k,ViT-B-32,laion2b_s34b_b79k,zeroshot_retrieval,,0.8835999965667725,0.9629999995231628,ViT-B-32 laion2b_s34b_b79k +0.0715256620576517,1.0,0.2196341124982623,vtab/diabetic_retinopathy,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.5699,0.8279,0.5675693520579019,mnist,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.5940803382663847,0.917174480785972,0.5967107342155968,cars,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.98275,1.0,0.982875,stl10,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.4199524940617577,0.6838479809976247,0.393417229364651,gtsrb,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.0633231778767283,1.0,0.2107285863733837,vtab/diabetic_retinopathy,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.9497,0.9963,0.9497,vtab/cifar10,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.76548,0.95168,0.7656000000000001,imagenet1k,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.2742616033755274,,0.405770386325608,vtab/kitti_closest_vehicle_distance,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.2380126552613077,1.0,0.233320813717688,vtab/diabetic_retinopathy,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.2307582938388625,0.4708056872037914,0.2308530805687204,country211,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.2633333333333333,0.574,0.2790514196577626,imagenet-a,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +,,,voc2007_multilabel,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,0.7621888518333435,,,ViT-B-32-quickgelu laion400m_e32 +0.199,0.7285333333333334,0.1948019376127608,vtab/clevr_count_all,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.5376190476190477,0.8671428571428571,0.5417275836816031,vtab/resisc45,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.0302191840277777,0.1466335720486111,0.0300817149220147,vtab/dsprites_label_x_position,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +,,,flickr8k,ViT-g-14,laion2b_s12b_b42k,zeroshot_retrieval,,0.9175999760627747,0.9739999771118164,ViT-g-14 laion2b_s12b_b42k +0.157994281944139,0.8222564328128437,0.1661260800820199,vtab/dmlab,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.1812322274881516,0.4011374407582938,0.181563981042654,country211,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.9272,0.9988,0.9272000000000002,vtab/cifar10,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.9401,0.9992,0.9405,vtab/cifar10,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.7331380360909304,1.0,0.206266837915639,vtab/diabetic_retinopathy,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.2587904360056259,,0.3397102822066769,vtab/kitti_closest_vehicle_distance,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.2166666666666666,0.5310666666666667,0.2348332752565157,imagenet-a,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.99375,1.0,0.993625,stl10,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.087368174361378,1.0,0.2520359622114083,vtab/diabetic_retinopathy,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.1236939151813153,0.6480485556238476,0.1332639799678708,vtab/svhn,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.5782537067545305,,0.5785203520352036,renderedsst2,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.0588477366255144,0.268395061728395,0.0601925439678357,vtab/smallnorb_label_azimuth,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.6367,0.9218,0.6276012948452819,mnist,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.0313856336805555,0.1553955078125,0.0307666564982354,vtab/dsprites_label_x_position,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.9569,0.9963,0.9572,vtab/cifar10,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.4973871733966746,0.7704671417260491,0.4655936453259506,gtsrb,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.5853968253968254,0.896984126984127,0.5932699170625959,vtab/resisc45,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.1419837255333186,0.8292060699362217,0.16573619863836,vtab/dmlab,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.612762451171875,,0.6128028129314551,vtab/pcam,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.1945898394545854,0.8513305476138113,0.1635130198328585,vtab/dmlab,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.7259778950659286,0.9500616069294004,0.7127784763377728,sun397,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.4661333333333333,0.7688,0.4728184257301568,imagenet-a,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.6371428571428571,0.9277777777777778,0.6463008933552572,vtab/resisc45,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.1111111111111111,,0.2722929936305732,vtab/kitti_closest_vehicle_distance,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.6105248678496336,0.8503998899565721,0.6103113725490197,imagenet_sketch,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.8732624693376942,0.9926410466067048,0.8695864391489154,vtab/pets,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.1486,0.9095333333333332,0.1443124682607226,vtab/clevr_closest_object_distance,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.0243462456597222,0.1128879123263889,0.0249444752915047,vtab/dsprites_label_orientation,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.596238872840889,0.8439741397944546,0.5964254901960785,imagenet_sketch,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.6276595744680851,0.9069148936170212,0.6324468085106383,vtab/dtd,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,voc2007_multilabel,ViT-B-16,openai,zeroshot_classification,0.788827121257782,,,ViT-B-16 openai +,,,flickr30k,ViT-L-14,openai,zeroshot_retrieval,,0.8715999722480774,0.9739999771118164,ViT-L-14 openai +0.2505250525052505,0.6012601260126013,0.2483244206773618,fgvc_aircraft,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.5559259259259259,0.8868518518518519,0.5469811732579133,vtab/eurosat,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.9427636958299264,0.9983646770237122,0.9434000102313552,vtab/pets,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.1746174617461746,0.45004500450045,0.1753386809269162,fgvc_aircraft,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +,,,flickr30k,ViT-B-16,openai,zeroshot_retrieval,,0.855400025844574,0.9629999995231628,ViT-B-16 openai +0.8934314527119106,0.9956391387298992,0.8906060208128682,vtab/pets,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.6266666666666667,0.9611111111111112,0.6380077170682305,vtab/eurosat,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.5596,0.8341,0.5602,imagenetv2,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.481439996855902,0.763229774607479,0.4822572549019607,imagenet_sketch,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.2450666666666666,0.8254,0.1666666666666666,vtab/clevr_closest_object_distance,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +,,,flickr30k,ViT-H-14,laion2b_s32b_b79k,zeroshot_retrieval,,0.9409999847412108,0.9929999709129332,ViT-H-14 laion2b_s32b_b79k +,,,voc2007_multilabel,ViT-L-14,openai,zeroshot_classification,0.7903817892074585,,,ViT-L-14 openai +0.4267205349679576,0.9361939258846476,0.3989364402674789,fer2013,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.6960663515824705,0.9390183349577946,0.6804128851625355,sun397,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.3318666666666666,0.6664,0.3409181030776702,imagenet-a,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.9083,0.9944,0.9082,vtab/cifar10,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +,,,voc2007_multilabel,ViT-L-14-336,openai,zeroshot_classification,0.8035513162612915,,,ViT-L-14-336 openai +0.5922666666666667,0.8565333333333334,0.5810468077571583,imagenet-a,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.6730158730158731,0.938095238095238,0.6781338184038964,vtab/resisc45,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.7354112959925005,1.0,0.1999235670840696,vtab/diabetic_retinopathy,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +,,,flickr30k,ViT-B-16-plus-240,laion400m_e32,zeroshot_retrieval,,0.8894000053405762,0.9710000157356262,ViT-B-16-plus-240 laion400m_e32 +,,,flickr8k,ViT-B-32,openai,zeroshot_retrieval,,0.805400013923645,0.9139999747276306,ViT-B-32 openai +0.5897858319604613,,0.5895015488390944,renderedsst2,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.5388,0.8212,0.5362716338708938,imagenet-a,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,mscoco_captions,ViT-B-16,openai,zeroshot_retrieval,,0.5836865305900574,0.7681999802589417,ViT-B-16 openai +,,,flickr8k,ViT-B-32,laion2b_s34b_b79k,zeroshot_retrieval,,0.8629999756813049,0.9409999847412109,ViT-B-32 laion2b_s34b_b79k +0.99425,0.999875,0.9945,stl10,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.5612707437000615,0.8849492931776275,0.5565312569182044,vtab/svhn,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.1097119341563786,0.5409053497942387,0.1081320376350696,vtab/smallnorb_label_elevation,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.805221688034188,0.9551282051282052,0.8491537874687232,voc2007,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,flickr8k,ViT-L-14-336,openai,zeroshot_retrieval,,0.8795999884605408,0.9390000104904175,ViT-L-14-336 openai +0.1716,0.9095333333333332,0.1619443104834767,vtab/clevr_closest_object_distance,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.1573333333333333,0.6964666666666667,0.1495026928557915,vtab/clevr_count_all,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +,,,mscoco_captions,ViT-B-16-plus-240,laion400m_e32,zeroshot_retrieval,,0.6620951890945435,0.8101999759674072,ViT-B-16-plus-240 laion400m_e32 +0.8336,0.9666,0.8325000000000001,vtab/cifar100,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.0984362139917695,0.5293827160493827,0.0977694426163014,vtab/smallnorb_label_elevation,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +,,,voc2007_multilabel,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,0.8066232800483704,,,ViT-g-14 laion2b_s12b_b42k +0.6087301587301587,0.9147619047619048,0.6152225643499313,vtab/resisc45,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.0550617283950617,0.2645267489711934,0.055379474051494,vtab/smallnorb_label_azimuth,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.1676666666666666,0.8819333333333333,0.1954414937508546,vtab/clevr_closest_object_distance,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.0200330946180555,0.1053195529513889,0.0222572574909185,vtab/dsprites_label_orientation,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.5526123046875,,0.5526478181769814,vtab/pcam,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,mscoco_captions,ViT-L-14,openai,zeroshot_retrieval,,0.6108356714248657,0.7918000221252441,ViT-L-14 openai +,,,mscoco_captions,ViT-B-32-quickgelu,laion400m_e32,zeroshot_retrieval,,0.6084766387939453,0.7675999999046326,ViT-B-32-quickgelu laion400m_e32 +0.7537811026183119,0.8923402179216132,0.7256696912813558,vtab/flowers,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.1659634317862166,,0.3247233185334074,vtab/kitti_closest_vehicle_distance,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.0193684895833333,0.1180826822916666,0.0197744129948227,vtab/dsprites_label_orientation,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.9037884982284,0.9970019078768056,0.9039815014388496,vtab/pets,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.3742,0.7294,0.3706020613065869,mnist,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.6746527403897922,0.8668030580381177,0.6650572756513145,objectnet,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.765625,0.959869123931624,0.8071517771314477,voc2007,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.546031746031746,0.902063492063492,0.5542849348347576,vtab/resisc45,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.0427924262152777,0.1601019965277778,0.0430371102717507,vtab/dsprites_label_x_position,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.6957142857142857,0.9571428571428572,0.706242238089474,vtab/resisc45,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.6514814814814814,0.9551851851851852,0.6638062361650154,vtab/eurosat,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.8475333333333334,0.9550666666666666,0.8331685531673508,imagenet-r,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.1902,0.9085333333333332,0.1387289271305892,vtab/clevr_closest_object_distance,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.3852181929932391,0.7822295636140135,0.379296565517112,vtab/svhn,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.3182464454976303,0.5937914691943128,0.3175829383886256,country211,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.6659,0.9224,0.6665327286676481,mnist,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.6327693607655879,0.8639588123170037,0.6325447058823529,imagenet_sketch,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.2279620853080568,0.486303317535545,0.2282938388625592,country211,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.764,0.9231,0.7589335620721703,mnist,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.0268283420138888,0.1092258029513889,0.025387675404758,vtab/dsprites_label_orientation,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.3693369336933693,0.744974497449745,0.3649286987522281,fgvc_aircraft,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.4102258758451137,0.8022818070067609,0.4216815643098484,vtab/svhn,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.743319785938908,0.9583279695459478,0.7348385903018446,sun397,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,flickr8k,ViT-H-14,laion2b_s32b_b79k,zeroshot_retrieval,,0.9277999997138977,0.9729999899864197,ViT-H-14 laion2b_s32b_b79k +0.5487,0.8411,0.5430718178404617,mnist,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.7171428571428572,0.958095238095238,0.7258469461953507,vtab/resisc45,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.3454976303317535,0.6221800947867299,0.3445971563981042,country211,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.9645,0.999375,0.965125,stl10,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.779,0.9289333333333334,0.7643246651538985,imagenet-r,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.1633333333333333,0.7125333333333334,0.1575975877364315,vtab/clevr_count_all,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.8683565004088307,0.9934587080948488,0.8661667839491306,vtab/pets,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.647962962962963,0.9805555555555556,0.6445566610022502,vtab/eurosat,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.6929582045861116,0.8668076109936576,0.6668176645957112,vtab/flowers,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.6630346397788258,0.8573751829565783,0.6645264657992297,vtab/flowers,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.1772666666666666,0.7803333333333333,0.2270014558851883,vtab/clevr_closest_object_distance,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.2784,0.8929333333333334,0.2563239722391655,vtab/clevr_count_all,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.8328402366863905,0.94543063773833,0.9085289082247568,vtab/caltech101,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.2786954517516902,0.7308312845728334,0.2795999671407248,vtab/svhn,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.035400390625,0.1624348958333333,0.0364155761076967,vtab/dsprites_label_x_position,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.2699554722287321,1.0,0.2211405088000341,vtab/diabetic_retinopathy,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.0259874131944444,0.1214463975694444,0.0262399607702056,vtab/dsprites_label_orientation,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.819197896120973,0.9465811965811964,0.8786521640800292,vtab/caltech101,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.4896907216494845,0.9721370855391472,0.4887152232577444,fer2013,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +,,,voc2007_multilabel,ViT-L-14,laion400m_e32,zeroshot_classification,0.7847012877464294,,,ViT-L-14 laion400m_e32 +0.8020816392909416,0.9253537160513904,0.7985485908748879,vtab/flowers,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.5163895486935867,0.7605700712589074,0.4472134621454642,gtsrb,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.5255354200988468,,0.5258471570841294,renderedsst2,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.2242797448867385,0.8738508906971629,0.1816019549723685,vtab/dmlab,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.5442040519562185,0.8052231327005837,0.5451807843137254,imagenet_sketch,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.545867919921875,,0.5459467330999297,vtab/pcam,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.697049639280715,0.877516959190266,0.6846202591899297,objectnet,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.0558847736625514,0.2832098765432099,0.0522661133926831,vtab/smallnorb_label_azimuth,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.2352,0.7871333333333334,0.2199570643185355,vtab/clevr_count_all,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.8039,0.9392333333333334,0.7907448605291261,imagenet-r,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.2292545710267229,,0.3081761474014508,vtab/kitti_closest_vehicle_distance,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.04559670781893,0.274320987654321,0.0456436809466583,vtab/smallnorb_label_azimuth,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.585723876953125,,0.5857677281000415,vtab/pcam,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.8932,0.9735333333333334,0.8804663010091829,imagenet-r,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.3677333333333333,0.7024,0.3814206048810433,imagenet-a,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.378037803780378,0.8028802880288028,0.3781639928698752,fgvc_aircraft,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.5430851063829787,0.8356382978723405,0.5473404255319149,vtab/dtd,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.9261285909712722,0.9976371098122124,0.9261518670531818,cars,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.6904,0.9518,0.6833555055021581,mnist,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.6174603174603175,0.921904761904762,0.624279367877562,vtab/resisc45,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.537057676232934,0.9492894956812482,0.5338791359180816,fer2013,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +,,,voc2007_multilabel,ViT-B-16,laion400m_e32,zeroshot_classification,0.7843208312988281,,,ViT-B-16 laion400m_e32 +0.4582056283087211,0.9531903037057676,0.4167779537443768,fer2013,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.1594666666666666,0.8705333333333334,0.1702024394180443,vtab/clevr_closest_object_distance,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.955,0.9995,0.955375,stl10,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.7640666666666667,0.9159,0.7521727338627011,imagenet-r,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.8328402366863905,0.952827087442472,0.9177765781998192,vtab/caltech101,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.53631591796875,,0.53614377703907,vtab/pcam,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.0517695473251028,0.2697942386831276,0.0537673960190341,vtab/smallnorb_label_azimuth,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.6453,0.888,0.6451,vtab/cifar100,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +,,,flickr30k,ViT-B-32,laion2b_e16,zeroshot_retrieval,,0.8812000155448914,0.9639999866485596,ViT-B-32 laion2b_e16 +0.4393776246365888,0.684612899752342,0.4268760394558317,objectnet,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +,,,flickr30k,ViT-g-14,laion2b_s12b_b42k,zeroshot_retrieval,,0.9348000288009644,0.99099999666214,ViT-g-14 laion2b_s12b_b42k +0.381760909649662,0.7632913337430854,0.4057750407393451,vtab/svhn,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.5006666666666667,0.8033333333333333,0.4832835476168289,imagenet-a,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.9705,0.9994,0.9711,vtab/cifar10,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.4800780161604904,0.9711618835330176,0.4909158276198425,fer2013,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +,,,mscoco_captions,ViT-L-14-336,openai,zeroshot_retrieval,,0.615513801574707,0.8101999759674072,ViT-L-14-336 openai +0.7068,0.9062666666666668,0.6753602288814418,imagenet-a,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.9078,0.9977,0.9083,vtab/cifar10,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.3860633066994468,0.8061232329440688,0.3685311302620919,vtab/svhn,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.7160513904699951,0.8744511302650837,0.6998995164388323,vtab/flowers,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.1971197119711971,0.5022502250225023,0.197344028520499,fgvc_aircraft,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.6033343577135832,0.8973570989551322,0.5683458085959752,vtab/svhn,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.4899860019381932,0.7341983417680629,0.4820376550831692,objectnet,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.7626201923076923,0.9526575854700856,0.815718996924191,voc2007,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.1462728551336146,,0.1818997858588953,vtab/kitti_closest_vehicle_distance,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.6787234042553192,0.923936170212766,0.6813829787234043,vtab/dtd,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.1721574664614031,0.8585001099626127,0.1577427840925754,vtab/dmlab,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.7916734428362335,0.9193364774760124,0.7931691849985836,vtab/flowers,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.0549794238683127,0.2670781893004115,0.0559609415916413,vtab/smallnorb_label_azimuth,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.7843883547008547,0.9570646367521368,0.835061321772101,voc2007,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.6177777777777778,0.957037037037037,0.6299267597724122,vtab/eurosat,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.543701171875,,0.5435553179465629,vtab/pcam,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.0315348307291666,0.1596544053819444,0.0323590170008084,vtab/dsprites_label_x_position,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.5796296296296296,0.9525925925925924,0.5888803943202612,vtab/eurosat,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.9185064050149904,0.9956391387298992,0.9161666963118203,vtab/pets,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.5381177990739744,0.7715085603531818,0.5274232792623416,objectnet,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +,,,flickr30k,ViT-L-14,laion2b_s32b_b82k,zeroshot_retrieval,,0.929199993610382,0.9869999885559082,ViT-L-14 laion2b_s32b_b82k +0.8368362144011939,0.987439373212287,0.8375394945435981,cars,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +,,,flickr8k,ViT-B-32-quickgelu,laion400m_e32,zeroshot_retrieval,,0.8303999900817871,0.9169999957084656,ViT-B-32-quickgelu laion400m_e32 +0.9742,0.9994,0.9742999999999998,vtab/cifar10,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.613015873015873,0.91,0.6150226494017114,vtab/resisc45,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.1901913349461183,0.8472839234660215,0.1733383864929211,vtab/dmlab,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.1979333333333333,0.8076,0.1820160989597282,vtab/clevr_count_all,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +,,,voc2007_multilabel,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,0.8199208974838257,,,ViT-L-14 laion2b_s32b_b82k +0.1674,0.8695333333333334,0.1827530663763387,vtab/clevr_closest_object_distance,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.1715165876777251,0.4024170616113744,0.1707582938388625,country211,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.75202,0.94252,0.7526400000000001,imagenet1k,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.8923412373943854,0.9967293540474244,0.8919759072052595,vtab/pets,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.487670937870141,0.7249919241951115,0.4750858280106649,objectnet,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.8959084690958836,0.9960203954732,0.8961635505798664,cars,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.7832532051282052,0.9692174145299144,0.864352156405908,voc2007,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.5031481481481481,0.92,0.5110567650187513,vtab/eurosat,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.161,0.9128666666666668,0.1739135544326629,vtab/clevr_closest_object_distance,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.8441736102474816,0.9912946150976246,0.8456794155511405,cars,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.7372,0.9338,0.7372000000000001,vtab/cifar100,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.7136119694259229,0.8591640917222313,0.691284904068223,vtab/flowers,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.1485814822960193,0.8129316032548933,0.1482313831309264,vtab/dmlab,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.6112026359143328,,0.6113264286955011,renderedsst2,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.5370675453047776,,0.5373060332349024,renderedsst2,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +,,,mscoco_captions,ViT-B-32,openai,zeroshot_retrieval,,0.5584565997123718,0.748199999332428,ViT-B-32 openai +,,,flickr8k,ViT-B-16,openai,zeroshot_retrieval,,0.8285999894142151,0.9139999747276306,ViT-B-16 openai +0.8379355687047995,0.9518408941485864,0.9328934325841473,vtab/caltech101,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.0307752821180555,0.1437852647569444,0.0304426618193977,vtab/dsprites_label_orientation,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.841715976331361,0.940828402366864,0.9341112975275198,vtab/caltech101,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.0311008029513888,0.1568060980902778,0.0321637232587243,vtab/dsprites_label_x_position,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +,,,flickr30k,ViT-L-14-336,openai,zeroshot_retrieval,,0.8889999985694885,0.9810000061988832,ViT-L-14-336 openai +0.5961406197803062,0.8388060288077973,0.5956784313725489,imagenet_sketch,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.4657286152131513,0.9445528002229032,0.4812190866355833,fer2013,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.0562962962962962,0.274156378600823,0.0567608380809354,vtab/smallnorb_label_azimuth,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.1583333333333333,0.8006,0.1676244908434004,vtab/clevr_closest_object_distance,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.7326224513709867,1.0,0.2068672210509669,vtab/diabetic_retinopathy,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.8911666666666667,0.9757333333333332,0.8776131879598171,imagenet-r,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.988625,0.999875,0.988625,stl10,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.6865218750574692,0.9403608143148756,0.6921311150610732,sun397,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.5509033203125,,0.5508520491113902,vtab/pcam,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.1606666666666666,0.9079333333333334,0.1772310296867651,vtab/clevr_closest_object_distance,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.5574468085106383,0.8648936170212767,0.5622340425531915,vtab/dtd,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.2315333333333333,0.805,0.2332901934437162,vtab/clevr_count_all,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.0298394097222222,0.1414794921875,0.0308127750442299,vtab/dsprites_label_x_position,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.0623868312757201,0.2708641975308642,0.0631906837062103,vtab/smallnorb_label_azimuth,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.4774310392867094,0.9402340484814712,0.4649079545536754,fer2013,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.5230010414824422,0.7913694511584036,0.5233670588235293,imagenet_sketch,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.7341666666666666,0.9035,0.7214778957504825,imagenet-r,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.8353057199211046,0.9546351084812624,0.9005042720791782,vtab/caltech101,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.3109333333333333,0.8006,0.3066391557930237,vtab/clevr_count_all,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.6985172981878089,,0.6986603265589717,renderedsst2,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.1087242798353909,0.540164609053498,0.1086253991970707,vtab/smallnorb_label_elevation,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.9351,0.998,0.936,vtab/cifar10,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +,,,flickr8k,ViT-L-14,openai,zeroshot_retrieval,,0.8633999824523926,0.9409999847412109,ViT-L-14 openai +0.65528,0.894,0.6563199999999999,imagenet1k,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.5930807248764415,,0.5925413265010712,renderedsst2,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.1650710900473933,0.3788625592417061,0.164218009478673,country211,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.168016801680168,0.4119411941194119,0.1658110516934046,fgvc_aircraft,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.0303819444444444,0.1311170789930555,0.0332405586865836,vtab/dsprites_label_orientation,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.3171317131713171,0.7827782778277828,0.3170053475935828,fgvc_aircraft,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.6691,0.8925,0.6685000000000001,vtab/cifar100,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.0516872427983539,0.2725925925925926,0.0526600212836742,vtab/smallnorb_label_azimuth,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.6559,0.8854,0.6541,imagenetv2,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.5569148936170213,0.8558510638297873,0.5542553191489361,vtab/dtd,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.1663981042654028,0.3825118483412322,0.1670142180094786,country211,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.7074,0.9179,0.7075,imagenetv2,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.3137333333333333,0.6410666666666667,0.3236449813371542,imagenet-a,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.0454320987654321,0.2672427983539094,0.0450240211431134,vtab/smallnorb_label_azimuth,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.8741,0.9655666666666668,0.8599962924086103,imagenet-r,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.4275427542754275,0.8361836183618362,0.4260962566844919,fgvc_aircraft,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +,,,mscoco_captions,ViT-L-14,laion2b_s32b_b82k,zeroshot_retrieval,,0.7107957005500793,0.8399999737739563,ViT-L-14 laion2b_s32b_b82k +0.5958,0.8547,0.5955999999999999,imagenetv2,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.7540228405391985,0.9617025580668296,0.7523924485563404,sun397,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.2418241824182418,0.6054605460546054,0.2405525846702317,fgvc_aircraft,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.0590123456790123,0.279835390946502,0.0603763349553147,vtab/smallnorb_label_azimuth,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 +0.7613,0.9289,0.7611,vtab/cifar100,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.9277453053102848,0.9983832856609874,0.9288577913034778,cars,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.0257297092013888,0.1208224826388889,0.0259727501505128,vtab/dsprites_label_orientation,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.8254437869822485,0.954963839579224,0.908884143116176,vtab/caltech101,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.980125,0.999875,0.980875,stl10,ViT-L-14,laion400m_e32,zeroshot_classification,,,,ViT-L-14 laion400m_e32 +0.2463246324632463,0.5724572457245725,0.2460249554367201,fgvc_aircraft,ViT-B-32,laion2b_s34b_b79k,zeroshot_classification,,,,ViT-B-32 laion2b_s34b_b79k +0.8102964743589743,0.9655448717948718,0.8579252085748035,voc2007,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.2044,0.7866666666666666,0.2151124081246672,vtab/clevr_count_all,ViT-B-16,openai,zeroshot_classification,,,,ViT-B-16 openai +0.2872511848341232,0.542085308056872,0.2880094786729857,country211,ViT-g-14,laion2b_s12b_b42k,zeroshot_classification,,,,ViT-g-14 laion2b_s12b_b42k +0.06,0.288312757201646,0.0630119225348046,vtab/smallnorb_label_azimuth,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.9664,0.9987,0.9665,vtab/cifar10,ViT-L-14,laion2b_s32b_b82k,zeroshot_classification,,,,ViT-L-14 laion2b_s32b_b82k +0.1895333333333333,0.7248666666666667,0.1870254885776544,vtab/clevr_count_all,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.8415619947767691,0.9900509886829996,0.8435641961196442,cars,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.337965783923131,1.0,0.2591163084325771,vtab/diabetic_retinopathy,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.1582,0.8814666666666666,0.1812267071156741,vtab/clevr_closest_object_distance,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.0475720164609053,0.2691358024691358,0.0457953163680852,vtab/smallnorb_label_azimuth,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.3651623119556611,0.7007917656373713,0.3512103003164681,gtsrb,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.1592258632065097,0.8009676709918627,0.1713416703583154,vtab/dmlab,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.4948535233570863,0.7578780680918448,0.4319824074083427,gtsrb,ViT-B-16-plus-240,laion400m_e32,zeroshot_classification,,,,ViT-B-16-plus-240 laion400m_e32 +0.3294329432943294,0.7836783678367837,0.3317290552584671,fgvc_aircraft,ViT-L-14-336,openai,zeroshot_classification,,,,ViT-L-14-336 openai +0.684701252367729,0.9328576420177648,0.6783238400960281,sun397,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.6885672467067816,0.8466417303626605,0.6732279033655394,vtab/flowers,ViT-B-32,laion2b_e16,zeroshot_classification,,,,ViT-B-32 laion2b_e16 +0.8385930309007232,0.9539776462853384,0.9334530557615972,vtab/caltech101,ViT-L-14,openai,zeroshot_classification,,,,ViT-L-14 openai +0.6696489324530592,0.9273222134358275,0.6609448269493161,sun397,ViT-B-32-quickgelu,laion400m_e32,zeroshot_classification,,,,ViT-B-32-quickgelu laion400m_e32 +0.3000947867298578,0.556872037914692,0.2994312796208531,country211,ViT-H-14,laion2b_s32b_b79k,zeroshot_classification,,,,ViT-H-14 laion2b_s32b_b79k +0.409445528002229,0.9413485650599052,0.3587300457745208,fer2013,ViT-B-32,openai,zeroshot_classification,,,,ViT-B-32 openai +0.96975,0.999875,0.96975,stl10,ViT-B-16,laion400m_e32,zeroshot_classification,,,,ViT-B-16 laion400m_e32 diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/dataset_type.csv b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/dataset_type.csv new file mode 100644 index 0000000000000000000000000000000000000000..6b7c64bcb38698ae5c288b171d1ab0ee63d1d694 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/dataset_type.csv @@ -0,0 +1,42 @@ +dataset,type +imagenet1k,natural +imagenetv2,natural +imagenet-r,natural +imagenet_sketch,specialized +objectnet,natural +imagenet-a,natural +imagenet-o,natural +vtab/cifar10,natural +vtab/cifar100,natural +mnist,specialized +vtab/flowers,natural +cars,natural +vtab/svhn,natural +fer2013,natural +renderedsst2,specialized +vtab/pets,natural +vtab/caltech101,natural +voc2007_multilabel,natural +voc2007,natural +sun397,natural +fgvc_aircraft,natural +country211,natural +vtab/dtd,natural +gtsrb,natural +stl10,natural +vtab/diabetic_retinopathy,specialized +vtab/eurosat,specialized +vtab/resisc45,specialized +vtab/pcam,specialized +vtab/clevr_count_all,structured +vtab/clevr_closest_object_distance,structured +vtab/dsprites_label_orientation,structured +vtab/dsprites_label_x_position,structured +vtab/dsprites_label_y_position,structured +vtab/smallnorb_label_elevation,structured +vtab/smallnorb_label_azimuth,structured +vtab/dmlab,structured +vtab/kitti_closest_vehicle_distance,structured +mscoco_captions,retrieval +flickr8k,retrieval +flickr30k,retrieval diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/datasets.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/datasets.txt new file mode 100644 index 0000000000000000000000000000000000000000..8db41a87de1b4a2d9764d6527c4589d3ae3bfe7b --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/datasets.txt @@ -0,0 +1,39 @@ +mscoco_captions +flickr8k +flickr30k +imagenet1k +imagenetv2 +imagenet_sketch +imagenet-a +imagenet-r +objectnet +fer2013 +voc2007 +voc2007_multilabel +sun397 +cars +fgvc_aircraft +mnist +stl10 +gtsrb +country211 +renderedsst2 +vtab/caltech101 +vtab/cifar10 +vtab/cifar100 +vtab/clevr_count_all +vtab/clevr_closest_object_distance +vtab/diabetic_retinopathy +vtab/dmlab +vtab/dsprites_label_orientation +vtab/dsprites_label_x_position +vtab/dtd +vtab/eurosat +vtab/kitti_closest_vehicle_distance +vtab/flowers +vtab/pets +vtab/pcam +vtab/resisc45 +vtab/smallnorb_label_azimuth +vtab/smallnorb_label_elevation +vtab/svhn diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/datasets_multilingual.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/datasets_multilingual.txt new file mode 100644 index 0000000000000000000000000000000000000000..62e48dafb35abb7ca4273880be5e4811fb4063b5 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/datasets_multilingual.txt @@ -0,0 +1,13 @@ +multilingual_mscoco_captions,es +multilingual_mscoco_captions,it +multilingual_mscoco_captions,ko +multilingual_mscoco_captions,pl +multilingual_mscoco_captions,ru +multilingual_mscoco_captions,tr +multilingual_mscoco_captions,zh +multilingual_mscoco_captions,en +imagenet1k,zh +imagenet1k,it +imagenet1k,jp +imagenet1k,en +imagenet1k,ar diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/models.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/models.txt new file mode 100644 index 0000000000000000000000000000000000000000..ecbac4afa84cce3715f69d04c1cc3a3decc9ce5b --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/models.txt @@ -0,0 +1,13 @@ +ViT-B-32,openai +ViT-B-16,openai +ViT-L-14,openai +ViT-L-14-336,openai +ViT-B-32-quickgelu,laion400m_e32 +ViT-B-32,laion2b_e16 +ViT-B-32,laion2b_s34b_b79k +ViT-B-16,laion400m_e32 +ViT-B-16-plus-240,laion400m_e32 +ViT-L-14,laion400m_e32 +ViT-L-14,laion2b_s32b_b82k +ViT-H-14,laion2b_s32b_b79k +ViT-g-14,laion2b_s12b_b42k diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/results.ipynb b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/results.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1c9e5c482c1443aaa52296e6fbe3644e07cb1588 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/results.ipynb @@ -0,0 +1,4893 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "b3edae65-ec1c-4318-b825-1ea20cea1f3c", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "%matplotlib inline\n", + "pd.options.display.float_format = '{:.3f}'.format\n", + "def extract_arch(model):\n", + " vit, size, patch_size, *rest = model.split(\"-\")\n", + " return vit+\"-\"+size+\"-\"+patch_size\n", + "plt.rcParams['figure.dpi'] = 200" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "62911961-311b-43dc-acf4-7af886be969d", + "metadata": {}, + "outputs": [], + "source": [ + "dataset_type = pd.read_csv(\"dataset_type.csv\").set_index(\"dataset\")[\"type\"].to_dict()\n", + "df = pd.read_csv(\"benchmark.csv\")\n", + "vtab_plus = list(map(lambda s:s.strip(), open(\"datasets.txt\").readlines()))\n", + "df = df[df.dataset.isin(vtab_plus)]\n", + "df.loc[:, \"dataset_type\"] = df.dataset.apply(lambda d:dataset_type[d])\n", + "df.loc[:, \"model_arch\"] = df.model.apply(extract_arch)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "84305a59", + "metadata": {}, + "outputs": [], + "source": [ + "df_retrieval = df[df[\"dataset_type\"] == \"retrieval\"]\n", + "df = df[df[\"dataset_type\"] != \"retrieval\"]\n", + "df = df.drop([\"image_retrieval_recall@5\", \"text_retrieval_recall@5\"], axis=1)\n", + "dataset_type = {k:v for k,v in dataset_type.items() if v != \"retrieval\"}" + ] + }, + { + "cell_type": "markdown", + "id": "5a550373-8f81-4465-98e4-1c4e9e0f4e5a", + "metadata": {}, + "source": [ + "# Accuracy of all models on all datasets" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c9373820-7e48-480a-b2e9-6bec50b3dc63", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAB9IAAAb7CAYAAABV0eoFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzdd1zV5fvH8fcRRQQ0B7gHaq7cuTJNMQ1XuTE3kCtz/NIcmZVkWZlZljNNxZwl7tTUVExz4Mok/TpI3BM1cDHP7w/i00E4hyGIyuv5eJxH9zmfe1yfc47l93ud+7pNZrNZAAAAAAAAAAAAAAAgTrbMDgAAAAAAAAAAAAAAgMcJiXQAAAAAAAAAAAAAACyQSAcAAAAAAAAAAAAAwAKJdAAAAAAAAAAAAAAALJBIBwAAAAAAAAAAAADAAol0AAAAAAAAAAAAAAAskEgHAAAAAAAAAAAAAMACiXQAAAAAAAAAAAAAACyQSAcAAAAAAAAAAAAAwAKJdAAAAAAAAAAAAAAALJBIBwAAAAAAAAAAAADAAol0AAAAAAAAAAAAAAAskEgHAAAAAAAAAAAAAMACiXQAAAAAAAAAAAAAACyQSAcAAAAAAAAAAAAAwAKJdAAAAAAAAAAAAAAALGTP7ACQ8UwmU05JVf99ek1STCaGAwAAAAAAAAAAAADpyU6S67/tI2azOeJhJySRnjVUlbQvs4MAAAAAAAAAAAAAgAxWR9L+h52E0u4AAAAAAAAAAAAAAFhgR3rWcC2+ERgYqCJFimRmLAAAAAAAAAAAAACQbi5duqS6devGP71mq29KkUjPGowz0YsUKaLixYtnZiwAAAAAAAAAAAAAkFFiku+SPEq7AwAAAAAAAAAAAABggUQ6AAAAAAAAAAAAAAAWSKQDAAAAAAAAAAAAAGCBRDoAAAAAAAAAAAAAABZIpAMAAAAAAAAAAAAAYIFEOgAAAAAAAAAAAAAAFkikAwAAAAAAAAAAAABggUQ6AAAAAAAAAAAAAAAWSKQDAAAAAAAAAAAAAGCBRDoAAAAAAAAAAAAAABayZ3YAAAAAAAAAAICEYmNjdfv2bYWFhSkyMlIxMTGZHRIAAECGsLOzk729vfLkySNnZ2dly/Z47AUnkQ4AAAAAAAAAj5Hw8HBduHBBZrM5s0MBAADIcNHR0YqIiFB4eLhMJpOKFSum3LlzZ3ZYJNIBAAAAAAAA4HGRVBLdZDLJzs4uE6MCAADIODExMcbffcxmsy5cuPBYJNNJpAMAAAAAAADAYyA2NjZBEt3Z2Vn58+eXo6OjTCZTJkcHAACQMcxms+7evasbN27o9u3bRjK9fPnymVrm/fEoMA8AAAAAAAAAWVz8/3EsxSXRixcvLicnJ5LoAADgqWYymeTk5KTixYvL2dlZUlxy/fbt25kaF4l0AAAAAAAAAHgMhIWFGe38+fOTQAcAAFmKyWRS/vz5jeeWfzfKDCTSAQAAAAAAAOAxEBkZKSnu/0R2dHTM5GgAAAAePcsjbeL/bpRZSKQDAAAAAAAAwGMgJiZGkmRnZ8dudAAAkCWZTCbZ2dlJ+u/vRpmFRDoAAAAAAAAAAAAAABZIpAMAAAAAAAAAAAAAYIFEOgAAAAAAAAAAAAAAFkikAwAAAAAAAAAAAABggUQ6AAAAAAAAAAAAAAAWSKQDAAAAAAAAAACkgp+fn0wmk0wmk0JCQjJkDW9vb5lMJrm5uaX73DExMfrmm29Ut25d5cmTx7iXdu3apes6yd2Dm5ubTCaTvL2903VdAEgP2TM7AAAAAAAAAAAAADw6Xbt21bJlyzI7DAB4rJFIBwAAAAAAAAAAyCJ27dplJNFbt26tt99+W4UKFZLJZFKePHkyOToAeHyQSAcAAAAAAAAAAMgifv31V0mSnZ2dFi9eTPIcAKzgjHQAAAAAAAAAAIAs4sKFC5KkQoUKkUQHABtIpAMAAAAAAAAAAGQRERERkqQcOXJkciQA8HgjkQ4AAAAAAAAAADKMr6+vTCaTTCaTJCksLEy+vr6qWrWqnJ2dVahQIbVq1Uq7du1KMO7q1at6//33VblyZTk5OalAgQJq27atDh06ZHO92NhYLVy4UK1atVLhwoVlb28vV1dXNWnSRNOnT1dkZGSyMd+8eVPvvvuuKlasqFy5cqlgwYJq1qyZcbZ4SkVHR2vOnDlq1aqVihYtqpw5c8rFxUWNGjXS5MmTdf/+/VTN9zDiP4P58+dLks6cOWO8Zvn5SIk/M2sCAgKMfgEBAekab1Jz//TTT2ratKlcXV2VK1cuVahQQSNHjtSNGzdszrVnzx69//77cnd3N74TefLk0XPPPacBAwbo6NGjNsd7e3vLZDLJzc1NknT58mUNHz5c5cuXl6Ojo4oVK6bOnTvrr7/+SjAuJCREQ4YMUfny5ZUrVy4VKlRI3bt3V3BwcIreg8DAQPXt21fly5eXs7OznJycVLFiRQ0cOFAnT55M0RwA0o4z0gEAAAAAAAAAwCNx7tw5NWvWTCdOnDBeu3PnjjZs2KBNmzZpyZIl8vT01J9//qlWrVoZZcgl6e7du1qzZo02btyo9evX6+WXX040/40bN9SmTRv9/vvvCV6/fv26AgICFBAQoKlTp2rDhg0qVapUkjEePXpUzZo106VLl4zX7t+/ry1btmjLli1644039NJLLyV7r8HBwWrTpk2iJG1oaKh27NihHTt2aPr06Vq3bp3KlSuX7HxZWUxMjLp3767FixcneP3EiROaOHGiVq5cqR07dqhw4cKJxvr5+cnHxyfR61FRUTp27JiOHTum2bNn69tvv9Vbb72VbCyHDx9WixYtdPnyZeO1e/fuadmyZVq3bp02btyohg0bauvWrerQoYP++ecfo9/9+/e1ePFibdiwQTt27FDlypWTXCM6OlpDhgzRjBkzEl07fvy4jh8/rtmzZ2vatGnq27dvsjEDSBt2pAMAAAAAAAAAgEfC09NT58+f1+jRo7V9+3bt27dPX3/9tfLkyaOYmBj17t1bp0+f1quvvqp79+5p/Pjx2rlzp/bu3auPPvpI9vb2ioiIkI+PT6Kd5TExMXr11VeNJHrjxo21bNky7d+/X2vWrFG7du0kSceOHVPTpk11+/btRPH9888/at68uZFEf/3117V+/Xrt379fixcvVu3atTV37lxNnz7d5n1eunRJDRo00NGjR5U7d26988472rBhgw4ePKht27Zp9OjRcnR01MmTJ9WiRYsEydaMcuTIER05ckRt27aVJBUtWtR4Lf7xuPrwww+1ePFitWvXTitWrNCBAwe0fv16tW7dWpJ06tQpDR06NMmx0dHRypcvn7y8vDR37lzt2LFDBw8e1M8//6xx48bJxcVFMTExGjRokLZu3Wozjrt376p9+/aKjIzUp59+qt9//1179uyRr6+v7O3tdffuXfXs2VOnTp1S+/btlTt3bn3zzTfas2ePdu7cqaFDh8pkMunmzZvq3bu31XV69+5tJNFbtmyphQsXKjAwUPv27dPs2bNVuXJlRUVFqV+/flq7dm0a31UAyTKbzTye8oek4pLMksznzp0zAwAAAAAAAHj8nDhxwnz06FHziRMnMjsUIF2NHTvW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SuJL0tSpU/Xiiy9q6dKlunDhgiIjI3Xx4kUtXLjQKJOfnL179xoVBGbMmJHi+4iMjFRgYKAkqX79+jYrEMR/dhEREdq3b1+Cazt27EjULymFCxdW+fLlJUk7d+60Gdu5c+dUp04dffTRRwoKCtKdO3d09epVbdiwQY0aNdKyZcskSX/++aeef/55jR8/XkePHtXdu3d148YNrVmzRvXr19fWrVttrpMW0dHReuutt1SvXj19//33OnnypO7cuaO7d+/q+PHjmj59uipXrqzZs2eneY2rV68asbu4uKhAgQJpmic1/w54WmXNuwYAAAAAAAAAZGmdO3c2SkgnV949/rqjo6M6deqU4bFlhC+//NJot2nTJhMjibNnzx6jXb9+fQUGBqp58+bKnTu3ypUrp6JFi8rV1VV9+vTRmTNn0m3du3fvytPTU//884/effdd/fbbb9q7d6++/fZbo5T5N998o6+++ird1kyNK1euyMfHR5GRkSpYsKDGjRunTZs26eDBg9q1a5cWLlyofv36JSqhnd6ioqK0e/duSVLBggVtlvq+deuW/u///k9SXHlvWyXjH2S5a7pixYo2+1peT81u65SKjo5Wvnz55OXlpblz52rHjh06ePCgfv75Z40bN04uLi6KiYnRoEGD0pxgXbdunby9vRURESFnZ2eNHTtWO3bs0O7duzVp0iRjjffeey/ZpPbGjRs1ZMgQVa5cWXPnztW+ffv022+/aejQocqWLZvu3r2rnj17KjIy0uocUVFR6tu3r2JjYzVixIhkPwNLJ0+eNH5g9DCfXVq+A+fOndOdO3es9vP09NT58+c1evRobd++Xfv27dPXX3+tPHnyKCYmRr1799bp06f16quv6t69exo/frx27typvXv36qOPPpK9vb0iIiKMP4vpqXfv3sZn27JlSy1cuFCBgYHat2+fZs+ercqVKysqKkr9+vXT2rVrUzxvRESETp8+rdmzZ+vFF1/UzZs3Jcn4s5kW27dvN9qp+W48TbJndgAAACDtWi//75eJ6zr2zcRIAAAAAAB4suTJk0dt27bV0qVLdeDAAR07dkyVKlVK1O/o0aM6ePCgJKldu3bKnTv3ow41xYKCghI8j4yMVEhIiBYuXKiVK1dKkjp16qRWrVplRngJWJbI3rNnj4YMGWIk5eLduHFDc+bM0fLly7V69Wo1atTo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On78uPz9/bV+/XpJcRUfvvnmm0Q/kgkNDVWzZs107tw5SdI777yjihUrJvpviKV8+fI99NEaT6In85sGAAAAAFnYtRkLjbbrgB6ZGAkAAMDTw8HBQZ6enpo9e7bxmqen5yM9L/phWSvfa+n111/XnDlzHnotWztlJ0yYkOC5l5dXkol0Sfrxxx/VsWNHbdq0SevWrdO6desS9alTp47WrFkjBweHhwtacbt8/f391bJlS3322WfGLldLQ4YM0bBhw9I0/wcffKCAgADt2bNHu3btMkpfx2vcuLGmTp1q87OKiorS+vXrjWRYUgYOHGjs0k6tVatWGTuEw8LC1LJly2THbNu2LUNLPo8fP15Xr17V3LlzdejQoSTPKe/du7c++eSTDFnfyclJP/zwg9q1a6f79+9r+vTpCSo4SJK7u7umTp36UOeWt27dWvPmzVP//v11+/ZtjR07NkEJfEmys7PTxx9/nOYfSjxq/fv318WLF/Xxxx8rODhYb7zxRqI+rVq1slnO3s7OTqtWrVKrVq20b98+LV++PFHlBnt7e02dOjVF39fH2Zw5c1SoUCFNmjRJ169f1/jx4zV+/Pgk+zo5OcnOzi7R67dv39bChQu1cOHCJEbFyZcvn6ZMmaLu3bsnunbkyBGdPHnSeP7FF1/oiy++sBm3l5dXoh9QZQUk0gEAAAAAAADgCVV8kPXEBFLPy8srQSL9SS/rbjKZ5OzsrBIlSqh+/frq1auXGjVqlNlhJeDs7KyNGzdq6dKlmj9/vv744w+FhoYqb968qlGjhrp27apevXolmUxKq9q1a+vgwYP68ssvtW7dOl24cEFOTk6qU6eOhgwZ8lCJOkdHR23dulVff/21li5dqlOnTilHjhyqUKGCvLy89Oabbxq7QJMyefJktWnTRps3b9b+/ft16dIlXbt2TXZ2dipRooRefPFF9enTRw0aNEhzjI+jbNmyac6cOerYsaNmzZqlffv26fr163JxcVGdOnXUv3//DE+gNm/eXPv379fnn3+urVu36tq1a8qbN6+ee+45de/eXb17906Xc629vLzUuHFjTZ48WZs2bdLZs2cVGxurokWL6uWXX9bgwYNT9KOYx8lHH32k5s2ba9q0adqxY4euXLmivHnzqnr16vLx8VHXrl2TncPFxUW7du3S7NmztXjxYh07dkx37txR0aJF1bRp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WiM93b59W506ddKzzz6rjh07qm7duipWrJhy5syp69evKzAwUHPmzElQRn3ChAmJ5tm5c6datGihpk2bqnnz5qpWrZoKFCig6OhonTlzRps2bdKCBQuMBLCPj4+aNm2aZEwfffSR1q1bp7Nnz6pnz576/fff1aFDB+XJk0dHjhzRhAkT9L///U+SNGDAANWpUyfV9+3q6qqJEydq4MCBunjxomrXrq13331XL774omJiYvTrr79q4sSJun37tkwmk2bNmmXslE9K7dq1tXbtWjVo0EBDhw5VuXLldPXqVc2fP9/4MUDx4sX1wQcfJBrbtWtXbdy4UfPnz9eBAwf03HPPqX///mrcuLFcXV11584dBQcHa8eOHVqxYoVu3LiRIT9c6dy5s9577z1FRETI29tbf/zxh5o1a6Y8efLor7/+0pQpU3TgwAE1aNBAv//+e7qvD+DJRSIdAAAAALKo1stnG+11HftmYiQAAACZz8HBQZ6enpo9+7+/I3l6eipXrlyZGFXq+fj4JNunVKlSqU6kX79+3ebcI0aMSPB87NixmZpIj3fq1KkkE+SW6tevr4ULF6po0aJJXo+JidGmTZtsnvVtZ2enYcOG6bPPPrPax9XVVb/88ovatGmjU6dOaerUqZo6dWqifm+88Ya++eYbmzHb8tZbb+nWrVv64IMPdPXqVQ0bNixRn5w5c2rWrFlq1aqVzbkGDhyo7du3y8/PT126dEl0vUiRItq4caOeeeaZJMfPmTNHhQoV0qRJk3T9+nWNHz9e48ePT7Kvk5OT7OzsUnCHqVO8eHHNmDFDffr00b179/TZZ58l+pxef/119e3b12aZewBZD4l04Ak3ZlkLoz3e85dMjAQAAAAAAACPWpM+6zI7hKeKl5dXgkQ6Zd2fXCVLltTevXu1bds2bd++XadPn9aVK1cUHh4uZ2dnlSxZUrVr15anp6eaN28uk8mU5DzDhg3T888/r61btyowMFCXLl3SlStXFBsbq7x586pixYpq3LixevXqlaLz1StVqqQ//vhDM2bMkL+/v06ePKnbt2+rYMGCatCggfr3768mTZo89P2/9957evXVVzV16lRt3bpVFy9eVLZs2VSyZEl5eHjo7bfflpubW4rmmjdvnjw8PDRr1iwdOXJEt2/fVqlSpdSuXTu9++67ypcvn9WxdnZ2mjBhgnr37q1Z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PRotW7ZEjRo1UKpUKRgYGKBatWpwcHDAvHnzcOfOHYXl6ouKl5cXDhw4AEdHR1SqVAl6enowNzfHuHHj8Pfff6NDhw5FNnetWrVw4cIF/Prrr2jQoAFKly6NsmXLon379vDz80NgYGC+D0LcunUL586dAwB07twZlStXVimGadOmYdKkSWjZsiUqV64MXV1dVKhQAd9++y3mzp2Lf/75R+0keg4zMzMcPnwYFhYWyMrKwrBhw+Dn51eoMenLxBXpRERERERERERERJ+pOQPzrvok9dnY2Mjdszo/ql6jbEWqOtQZT537lMfc3FxjYyni6ekJT09PjYyV32elo6ODiRMnYuLEiQr7+Pr6wtfXV+H5gnweWlpaGDJkCIYMGZJv3w95eXkpXRmew9bWVmEsmvpM5c0xduxYje2DrkzFihXh6uoKV1dXla8tX748nJyc4OTkpPb8mvzufzhOly5d0KVLF42MnZ8Pv08mJiaYM2cO5syZo9Z4derUKdTnYmNjAxsbG7WvB/L/HQWyvwNXr14t1Dz05WMinYiIiIiIiL4oPQP/K82oJ1QrxkiIiIiIiIiI6HPF0u5EREREREREREREREREREQymEgnIiIiIiIiIiIiIiIiIiKSwdLuRERERERERERERERE9FG9ePEC8fHxal3buHFjDUfzecrMzMSNGzfUurZWrVowNDTUcEREXxYm0omIiIiIiIiIiIiIiOijCg4OxtChQ9W6ViqVajiaz1NCQgIsLCzUuvbYsWOwtbXVbEBEXxiWdiciIiIiIiIiIiIiIiIiIpLBRDoRERERERERERERERF9VJ6enpBKpWq9KJu5ubnanyFXoxPlj4l0IiIiIiIiIiIiIiIiIiIiGUykExERERERERERERERERERyWAinYiIiIiIiIiIiIiIiIiISAYT6URERERERERERERERERERDJ0ijsAIiIiIiIiIip5Fgc9yfV+Ut/KxRQJERERERERUV5ckU5ERERERERERERERERERCSDiXQAgiB8JQjCQkEQYgVBeC0IwnNBEM4LgvCzIAilNTRHQ0EQlguCcE0QhFRBEDIEQUgSBOGYIAg/CoJQRhPzEBERERERERERERERERFR4ZT40u6CIDgC8AdQVuZwaQAt/32NEAShu1QqvVuIOX4CMA95P+/yAGz/fX0vCEIvqVR6Vd15iIiI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X+US9KNHj0bZsmURGRmJe/fuISkpCUZGRqhZsyYcHR0xYsQI1KxZU+17BLJ/B0NCQtCjRw8cPXoUM2bMgI6ODqZNm1aocenLxkQ6ERERUQlwbP1/+1J1HBFWjJEQEdGnLGmVn9iuMLZwe4ESEdHHsa/P3OIO4YtiY2OjcJ9eZVS9JiIiQuU5PsZYBaGrq4v27dsXOiH/MeP29fVVuqoaAIYMGaJ0L3QvLy+lyfR79+4VKJaePXuiZ8+eBeory9PTE56envn2Mzc3V/h9tLW1Vev7XZA5XFxc4OLiUuix81OuXDn069cP/fr1U/laY2Nj9OrVC7169SqCyP6T33clx4ffmW+//Rbbt28vmqA+IO/7NHXqVLnbMBSEsbEx3rx5o3Y8FhYWBaqooUxBPncDAwMcOXKkUPNQycJEOhEREREREREpJftAFjS7LSkRERERERHRJ0mruAMgIiIiIiIiIiIiIiIiIiL6lDCRTkREREREREREREREREREJIOl3Ukl03d2FdtzBh4oxkiIiIiIiIiIiIiIiOhz8vr1a8TFxal1bb169aCry32GACAmJkat66pXr45y5cppNhiiLxgT6USUx+MFj8W2ln4xBkJEREREREREREREX4yoqCh07NhRrWvj4uJgbm6u2YA+UxYWFmpd5+PjA09PT80GQ/QFY2l3IiIiIiIiIiIiIiIiIiIiGVyRTvQZ8t3k8N+b0nwehoiIvjxJq/yKOwQiIiIiIiIi0jBbW1tIpdLiDuOzx8+Q6ONgIp2IiIiI1LI46InYntS3cjFGQkRExWX6zq7/vdG1LL5AiIiIiIiIiDSMS1mJiIiIiIiIiIiIiIiIiIhkcEU6ERERfVESl50U25W+a1uMkRARERERERERERHR54qJdCKiEuzYekex3XFEWDFGQkRERERERERERERE9OlgaXciIiIiIiIiIiIiIiIiIiIZTKQTERERERERERERERERERHJYCKdiIiIiIiIiIiIiIiIiIhIBhPpREREREREREREREREREREMphIJyIiIiIiIiIiIiIiIiIikqFT3AEQEREREREREcl6vOCx2K4yuUoxRkJEREREREQlFRPpREREVOIlrfIT2xXGDinGSIiIiIiIiIiIiIjoU8BEOn1Ui4OeiO1JfSsXYyRERERERERERERERERERPIxkU5yHVvvKLY7jggr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IiIiIiIiIiIiKnJRUVHo2LGjWtfGxcXB3NxcswERESnBPdKJiIiIiIiIiIiIiIiIiIhkcEU6ERERERERERERERERFTlbW1tIpdLiDoOIqEC4Ip2IiIiIiIiIiIiIiIiIiEgGE+lEREREREREREREREREREQyWNqdiIiINCJ+xbD/3ugXXxxERERERERERERERIXFFelEREREREREREREREREREQyuCKdiIiIiIiIiIiI6DN1KyVebNcxqV6MkRARERF9WbginYiIiIiIiIiIiIiIiIiISAZXpBMRACDCL0ls1yvGOIiIiIiIiIiIiIiIiIiKGxPpRERERERERERERMUkaZWf2M6oWwNaVSuK71OTbolt4wp1PmpcRERERCUdS7sTERERERERERERERERERHJYCKdiIiIiIiIiIiIiIiIiIhIBhPpREREREREREREREREREREMrhHOhEREZEapu/sKrbnDDxQjJEQERERERERERERkaZxRToREREREREREREREREREZEMJtKJiIiIiIiIiIiIiApBEAQIggAvL6/iDoXoo/H19RW/+/fu3SvucIiINI6JdPrkJC47Kb6IiIiIiIiIiIiINGn06NFi8u/YsWMqXXvkyBHx2gkTJijtm9OvMK+CJCdtbW0VXq+rq4sKFSqgQ4cOWLBgAVJSUlS6X0ViY2OxYsUKeHh4wNLSEtWrV4e+vj4MDQ1Ru3ZtODs7IyQkBFKpVOk4Dx48wKpVq+Ds7Ix69erB0NAQ+vr6qF69Onr37o2AgABIJBKNxExERKQq7pFORERERERERFTEZB8Wr/Rd22KMhIi+NJOORMm8i1LY73O0Z0DfIhnX3d0da9euBQBs2bIFHTt2LPC1fn5+YtvNzU3jsWmaRCJBcnIyjh8/juPHj2Px4sUIDg7Gt99+W6hx58yZA39/f7nn4uLiEBcXhx07dqBDhw7YvXs3TE1N8/SbMWMG/vjjD7nJ9oSEBCQkJCA0NBSLFy/Grl278NVXXxUqZiIiIlUxkU5EREREREREREREJYaNjQ2+/vpr3LlzB4GBgVi5ciUMDAzyve7t27fYtWsXAKBevXqwtrYWz8lLBl+7dk3hWEOHDkV0dHS+/apVq5ZvXMrmzMjIwN27d7FlyxaEhoYiMTERjo6OuHHjBsqXL6/S2LJ0dHRgbW0NGxsbWFhYoHLlyqhQ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IiIiIiIiIiIiIiIiIiKSwUQ6ERERERERERERERERERGRDO6RTkREREREREREREREpMS9e/eKOwQiIvrIuCKdiIiIiIiIiIiIiIiIiIhIBlekExER0Wcpwi9JbNcrxjiIiIiIiIiIiIiI6MvDFelEREREREREREREREREREQymEgnIiIiIiIiIiIiIiIiIiKSwUQ6ERERERERERERERERERGRDO6RTkREREREJULSKr9c7yuMHVJMkRDRxxS/YpjYrj5hYzFGQkRERERERJ8TrkgnIiIiIiIiIiIiIiIiIiKSwRXp9EWQXV3ElUVUnKbv7Cq25ww8UIyREBERERERERERERERkbqYSCdSw+KgJ2J7Ut/KxRgJERERERERfaoeL3gstrX0izEQIiIqUgnPb4rtaqZ1izESIiIi0iSWdiciIiIiIiIiIiIiIiIiIpLBRDoREREREREREREREREREZEMlnYnKgF6BgaJbT2hWjFGQkREJYFsGVuApWyJiIiIiIiIiIjo88NEOhEREVEhdQ/+VWzv6zO3GCMhIiIiIiIiIiIiIk1gaXciIiIiIiIiIiIiokKoblYP1c3qwcvLq7hDoX/Z2tpCEATY2toW2RyCIEAQhBLxc4+IiBDvNyIiorjD+WwV53fGy8tLnP9L4enpCUEQYG5uXtyh0BeKiXQSxa8YJr6IKFvSKj/xRUSkKYuDnogvIiIiIiIi+rhGjx4tJpOOHTum0rVHjhwRr50wYYLSvjn98ntVMdUTXx+eu3fvXoHiykkaF2WCTCKR4NKlS1izZg1GjBiBJk2aQEdHR+VYFfH29s51776+vhqJm4B3794hJCQEEydOhLW1NUxNTaGrqwtTU1O0bt0aXl5eePz4cf4DfabCwsLg5eUFR0dHNGjQAOXLl4euri5MTExgZWWFn376CTdu3FA6hlQqxcmTJzFjxgzY2dmhSpUq0NPTg7GxMRo1aoRx48bhypUrH+mOPg3379/H1KlTYWVlhXLlyonfqTZt2mD27NlISkpSev2DBw+watUqODs7o169ejA0NIS+vj6qV6+O3r17IyAgABKJ5CPdDZF8LO1ORERERERERERE9JmaevSRzLtHCvt9+s7nObKrf6simcnd3R1r164FAGzZsgUdO3Ys8LV+fv8ttnBzc9N4bJ+yOXPmFNkq2kePHmHatGlFMnZJd/Xq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I0aMwIkTJ+Dv74/x48fjwoULYnn6Bw8ewM/PD0FBQQCAKVOmwMHBAer466+/xIcxnJycVLp24cKF+OWXXwAA3bt3R2BgoPjgFJEqmBUlIiIiokKL8EsSX0RERERERJ8L2TLtilalyx5nWffCu337trhadeXKlcWW3JKXRJc1dOhQNG/eHAAQHBys8vgrV64EAJQvXx4rVqwQk+iyfv/9d3Gl7bp165TuJT1x4sRcSfQcpqamGDp0KIDsldsvX75UKc709HSMGDEC79+/BwDMnTs332sqVaqEJUuWyD23dOlSVKhQAQDg7e2tUiyKPHnyBEB2ifAPk+iyypYtq1YJcDMzMwQEBODAgQMoW7asWjFOmTIFDx48AACMHz8e1apVy/eatWvXyl1F7+bmhm7dugHI/u49fvxYrZiU6dGjR64keo4yZcpg7dq1AICsrCy5K861tbXh5+eH7du3o2nTpli/fj169eqFli1bon///ggKCkLHjh1x8OBBzJs3T634zp07Jz6YUL16dYwbN67A1/76669iEt3FxQXBwcFMopPamEgnIiIiIiIiIiIiohLJwcFB3MfZ398fUqk013mpVAp/f38AQJUqVWBvb//RY/zSjBkzBu/evcPAgQPFEurFTSqV4smTJ7h58yZiYmLEV9WqVQEgz77k+Xn06JFYktrJyUlhFQNtbW0xCZ6SkiJWPpBn8ODBCs9ZWVmJbWX7VsszYcIEREdHAwA8PDzQq1evfK9xcnJSuPLbyMhIXD18/fp1jSSBc35Hr1+/jvPnz6s9TrVq1XDt2jVcu3YNly5dwt69ezFhwgS8efMG48aNw/z58/P8DSgIf39/rFixAgDQoEEDzJkzJ99rLCwscv3cPjRs2DAAgEQiQUREhMox5SfneydPq1at0KhRIwDA4cOH5fb5559/sHXr1v9n776jorq2MIB/lyYKKogdVOwVS7DEEkVFUbAr2AELEGPJs2tMFKPGEnvvYMGKBRW7AvZeUWwoKqg0CwhKnfcHmesgM8PMAILy/daalTNzzz1n3ym85O179sHdu3flHr948SI2b96s0ecfHh6OXr16ITk5GYIgYNOmTUorDUilpqbi119/xezZswEAv/32G7y8vKCrq6t2DERSLO1ORERERERERESUVj5qvgABAABJREFUxyzc9ybd8zHdS+dSJEQ/Nm1tbfTr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SIwcOVJhH09PT6Wl8lV5P7S0tDBgwACNEnfu7u5KV4ZLWVlZKYwlu95TeXMMGzYs2/ZBV6ZkyZLo168f+vXrp/a5xYsXh4ODAxwcHDSePzu/+1+PY2NjAxsbm2wZOzNff5+MjY0xa9YszJo1S6PxLC0txX3I1ZVdf7My+40Cad+BO3fuZMt8lP9oZd6FiIiIiIiIiIiIiIiIiIgo/2AinYiIiIiIiIiIiIiIiIiISAZLu1Oe8Hrea7GtpZ+LgRARERERERFlgf/WSLFdPRfjICIiIiIioqxhIp2IiIhylOem9l+eFGIxHCIiIiIiIiKi/OT9+/cIDQ3V6Nw6depkczTfp6SkJDx8+FCjcytWrAgDA4Nsjogof2AinYiIiIiIiIiIiIiIiHLE/v37MWjQII3OlUgk2RzN9yksLAwWFhYanevn5wcrK6vsDYgon+CyMCIiIiIiIiIiIiIiIiIiIhlckU5ERERERERERERE9A09eRcntg2hl4uREOU8Z2dnODs753YY3zVzc3OuzifKBUykE1GeMGV3B7E9y/5oLkZCRJR7Xs97Lba19HMxECIiIiIiIiIiIqJ8jol00pjt/j/E9uFu/+RiJERERERERERERERERERE2Yd7pBMREREREREREREREREREcnginQiIiIiUqqz9z6xrSeY5mIkRERERERERERERN8GV6QTERERERERERERERERERHJYCKdiIiIiIiIiIiIiIiIiIhIBhPpREREREREREREREREREREMphIJyIiIiIiIiIiIiIiIiIiksFEOhERERERERERERERERERkQwm0omIiIiIiIiIiIiIiIiIiGQwkU5ERERERERERERERERERCRDJ7cDIPpRhS89J7ZLjWqRi5EQERERERERERERERERkTqYSKdsYbdnndj27emSi5EQfX967rkitptrlc/FSIiIiIiIiIiIiIiIiAhgaXciIiIiIiIiIiIioiwxM6kOM5PqcHd3z+1Q6CshISEQBAGCIMDT0zNH5vD09BTnCAkJyZE58hJnZ2cIggBzc/PcDuW7ldvfGXNzcwiCAGdn528+d06Rvp/8O0zZiYl0IiIiIiIiIiIiIso33NzcxISLn5+fWueeOnVKPHfEiBFK+0r7yXtULWYoPsoU0xMfX/fLq0nZ9+/f48SJE5g1axa6deuGsmXLijFbWVll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qSLm5uZK99QGgPLly2PVqlVK+ygbw9nZWemKY6kSJUpg1qxZmDVrVqZ9vxYSEqJSP09Pzwyl9aWy6z39eo5y5cphyZIlWLJkSbaMr4ggCKhXrx7q1asn7r+urqy+B9n13Zf3nZk0aRImTZqU5bFV8fX36eeff8bOnTuzdQ4rK6tMf3uq/D5Vpco4nTp1QkJCQrbMR/mDVm4HQEREREREREREREREOUu2ZPTPP/+ci5EQERF9H7ginbJdZ+99YltPMM3FSIiIiIiIiIiIiIh+fHFxcYiJiUGZMmXkHr958yZmzJgBALC0tETt2rW/ZXhERETfJSbSiei71HPPFbHdXKt8LkZCRERERERERESUuyIjI1GzZk1069YNHTp0QPXq1VGgQAG8evUKR48exYYNG/Dp0ycIgoCFCxfmdrhERETfBSbSiYiIiIiIiIiIiIi+c58/f8aOHTuwY8cOucf19PSwbt06tGzZ8htHRvTFs2fPEBcXp/Z5xsbGMDVlBVwAiIiIQEREhNrn6enpoVq1ajkQEdGPi4l0IiIiIiIiIiIiIqLvmKmpKXbu3IkjR47g2rVriIiIwLt371CoUCGYm5vD2toaI0eORIUKFXI7VMrnBg0ahICAALXPc3JygqenZ/YH9B1auXIlpk+frvZ5FSpUQEhISPYHRPQDYyKdiIiIiIiIiIiIiOg7pqurCwcHBzg4OOR2KERERD8MJtIp1/hvjRTb1XMxDiIiIiIiIiIiIiIiynn+/v65HcJ3z93dHe7u7rkdBlG+oJXbARAREREREREREREREREREeUlXJFORERERERERESUB/Tcc0VsN9cqn4uREBERERERE+lERERERERERERElGVJEdFiW7ekSS5GQkRERJR1LO1OREREREREREREREREREQkgyvSiYiIiIiIiIgy0dl7X7rneoJpLkVCRERERERE3wJXpBMREREREREREREREREREclgIp2IiIiIiIiIiIiIiIiIiEgGE+lEREREREREREREREREREQyuEc6ERERERERERERERGp5PHbd2K7ajHjXIyEiIgoZ3FFOhERERERERERERERERERkQwm0omIiIiIiIiIiIiIiIiIiGSwtDvlG56b2n95Uoj3kBAREREREREREX0LMZGPxXaRElVzMRIiIiIi1TGRTkREREREREREREQ/pKTwWLGt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55CWSDcAYAngsoJ+rWTa59WZQCKRPBcE4QWA8gAqZ9Jd9niYOvMQERERERERERERERFllxcvXmDOnDkKj9eoUQO+vr4oUKDAN4yK6PuTlJSEhw+V7fysWMWKFWFgYJB5R8ox+TmRvh/A5P/agyAnkS4IghYAx/+evgfgp8E8ewCMBlBKEIRmEonkgoJ+PWTaZzWYh4iIiIiU6Oy9T2zrCaa5GAkRERERERFR3jVkyBAULVoUx44dw5MnTxAZGYlPnz6hWLFiqFevHrp3747BgwdDT08vt0MlyvPCwsJgYWGh0bl+fn6wsrLK3oBILfk2kS6RSK4IgnAWaavShwiCsEkikVz8qttYADX/ay+RSCRJsgcFQXAG4PHf0+kSicRdzlSLAQwDoA9gqSAIrSQSSdxX4wwAYPXfU1+JRJLZfupERERERJQH9dxzRWw31yqfi5EQEREREZEm3N3d4e7untth5Kpy5cph9OjRGD16dG6HQkSUq/JtIv0/vyOtXHtBAMcFQfgHaavOCwLoA8D1v36PACzQZAKJRPJCEISpAOYhrYT8FUEQ5gEIBFAUaSvRf/2vewzSVq8TEeWqKbs7pHs+y/5oLkVCRERERERERERERPR9Mjc3h0Qiye0wSEP5OpEukUhuCoLQG8BWAEUA/COn2yMAdhKJJDYL8/wrCEIxABMB1ALgKadbBIBuEonksabzEBERERERERERERERERFR1mnldgC5TSKRHARQF8AipCXN45G2H/o1pCW+G0gkkifZMM9kAM0BbAEQAiABwAcAVwH8BaCanNLyRERERERERERERERERET0jeXrFelSEonkOYAx/z3UOc8T8leXK+p/EQCT5UREREREP5DO3vvEtp5gmouREBERERERERFRdsn3K9KJiIiIiIiIiIiIiIiIiIhkMZFOREREREREREREREREREQkg4l0IiIiIiIiIiIiIiIiIiIiGdwjnYiIiIiIiIiIiIiI0nn8LlRsVzU2y8VIiIiIcgcT6UREREREREREREREaoiKevTlSQ7VfU18kyi2BSFn5iAiIiLFmEgnIiIiIiIiIiIihabs7iC2Z9kfzcVIiIiIiIi+He6RTkREREREREREREREREREJIOJdCIiIiIiIiIiIiIiIiIiIhks7U75nu3+P9I9P9ztn1yKhIiIiIiIiIiIiIiIiIjyAq5I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EREREREREREREeUCR0dHTJs2DbGxsfDx8UGfPn0yPcf3yEnEfowDANjbZ74avVqtGgAKiM+rGpcQ2wULfUm416hVR2wbpH45v0BS3krSNm3aFKtXr0apatVRvXZt6OjoYOKIkVlOpPv4+GDfvn0oUaIEJk6ciLFjx2ZTxKRISkoKXFxckJKSgmnTpmHDhg0qJdLnz5+PBw8eAADmzZuH8ePHi8eaNm2K1q1bo2XLloiPj8f//vc/nD59OsMYycnJGDFiBFJTU1GkSBGcP38elStXFo936NABw4cPx8qVK3HmzBls3boVjo6O2XDV36f169crLLdubW2NYcOGwcHBAXv37sWFCxfg6+uLzp07p+tnYmKCuXPnYtiwYShcuHC6Y5aWlujbty/69euHXbt24fHjx1i0aBH++uuvHLsmou9JTt7Gk4K0FelPAGzKwuN8DsZIRETZpOeeK+KDiIiIiIiIiCgvGzhwoLif8JYtW1Q6Z8fu/QAAQRBgb98lp0LLs2xsbODm5oba9epl2z7KsbGxGDFiBIC0JK28stSU/ZYsWYLr16+jevXqmDhxokrnJCUlYcmSJQCAmjVryr3hoWnTphgyZAgAwM/PD9evX8/QZ9++/7N352FyVXX+gD8nGyEsiuyyKG4Io6K4SxQYGUQiCrKMCwIiOC4jOIwwCqPDyE8ccWdQUNQEDKgDMSiLCCMEBBlAZFRGkEVFlhCCgEBYE87vj6pU34ROpzvp7up0v+/z9FPnVp177/f0Wl2fOufOzs0335wk+cQnPrFEiL7Y5z//+ayzzjqd9li2vJ+18ePH54gjjuhsX3rppU/p87nPfS5HHHHEU0L05jG+/vWvZ9Kk1goaZ5555kpUDKPLUAbpv2vfzq+1vndFP5J8awhrBOi32084sPMBAAAAwKpriy22yNSpU5MkF1xwwXKXE5939/xcfMkvkiRTX/eqbLbZkkuub7rultl03S1z/H98aZnHuOne+zoftHziE5/I7bffnh122GHYZx3fd999mT59evbdd99svfXWWXPNNTNp0qRstNFGedOb3pRvfvObefzxx/s8RiklpZQ+rx3/5JNPZubMmdl1112z0UYbZdKkSVl//fWz44475utf/3qf5zj66KM750ha1xD//Oc/n2233TZrrbVW1lprrbzqVa/KCSeckIULF/Zr3Lfeems+9alPJUlOPPHETni6PHPmzMn999+fJNl///2Xudz6AQcc0Gn/8Ic/fMrjZ511Vq99m6ZMmZJ99tknSXLdddflpptuekqfpT/3F198cXbfffc885nPzOqrr56tttoqxxxzTBYsWLDEfuedd1523XXXTr+tt946n/3sZ5f7tV4ZDz/8cL7yla9kxx13zIYbbphJkyZlgw02yM4775zp06dn0aJFK3X8NdZYo9N+9NFHV+gY6667bmcp/ltuuWWl6oHRZCiXdr8qyYuTvLSUMq7W+uTydgAAAMam5ooms/Z8VRcr6Z/mtW3HZb0uVgIAwIrab7/98vOf/zwLFy7M9773vRx66KHL7PuD2Wd3gsp37LP7MFU4ul155ZWdIPfEE08c9vO/7GUvy6233vqU++fNm5cLLrggF1xwQU466aScd9552WijjVboHPfee2/e+ta35vLLl1x495577smcOXMyZ86cnHDCCfnJT36SZz3rWX0ea968eXnTm96UX//610vcf/XVV+fqq6/OBRdckLPOOmu51xP/0Ic+lAULFuQ973lPdtxxx36P5ec//3mnvf322y+z3yte8YqsscYaWbBgQS677LJlHmfLLbfs8/O6/fbb5xvf+EaS5LLLLsvzn//8Zfb9j//4jxx55JFLXLP+hhtuyKc+9amcf/75+elPf5o11lgj//RP/9SZVb/Y9ddfnyOPPDKXXnppzjnnnIwfP36Z51kRV199dfbYY4/ccccdS9w/f/78XHjhhbnwwgtz0kkn5cc//nE23HDDFTrH9773vU77hS984QrX+thjjyXJmL4mPSxtKH8arm7fTk7ykiE8DzDK7HrWkZ0PAAAAABgK++yzT1ZfffUky1/e/fQzZydJpkxZPW/b7U1DXlu33HHvjZ2PofTEE0/k4IMPzpNPPpnDDz98pcK/FbVo0aK8+tWvzjHHHJNzzjknV199dS6//PLMnDkzu+yyS5Lk2muvzTve8Y4VPv5b3vKWToi+/fbb54wzzsgvf/nL/PjHP87uu++epBXkvvGNb8xDDz3U5/He/va35/rrr88hhxySCy+8MNdcc01OP/30bLXVVkmSs88+OyeffHKfx/j+97+f8847L+uss06+8IUvDGg8119/fafd19drwoQJneXam/skyUMPPZTbb799ucdY+vGlj9P0k5/8JJ/4xCfymte8Jqeffnp++ctf5vzzz8+b3/zmJMkvfvGL/Md//Ee+/OUv56tf/Wre/OY3Z9asWbnmmmvyox/9KK95zWuSJOeff/5yP38D9dvf/jY77rhj7rjjjmywwQb5t3/7t/z3f/93rr322vz0pz/Nhz/84UyYMCFXXXVV3va2t+WJJ57o97HvueeeXHHFFXnf+96Xz372s0las8rf/e53r1Ctd999d+fz3I2fRxiphnpG+mKvTPK/Q3guAAAAAADot7XXXjtve9vb8v3vfz/XXHNNrr/++k4o2XT972/Ktb+5LkkybZedstaaa+bx1Kf0o/8+//nP57e//W2e85zn5KijjupKDRdddFGvs5xf97rX5d3vfnemT5+eAw88MJdcckl+9rOf5Y1vfOOAjn/SSSfliiuuSNJa/WDGjBmdJdpf/vKXZ7fddstRRx2VY489NrfcckuOOeaYfO5zn1vm8RbPOt9hhx0692277bZ505velK233jrz5s3L17/+9fzDP/xDr/vfd999+ehHP5qkNYN7gw02GNB4brvttiStZcSf/vSn99l3s802y29+85vMnz8/jz32WFZbbbUkye23396ZNb7pppsu9xhLn7s3V111Vfbcc8/84Ac/WGI2+U477ZSpU6fmf/7nf3L88cfniSeeyEc/+tF8+ctf7vTZdttts9NOO2XrrbfOrbfemhNPPDEf+MAH+qyrv2qt2XfffbNgwYJss802+e///u+st96Sq5ntvPPOectb3pJp06blyiuvzKmnntq5xnxvdthhh1xyySW9PvaMZzwjP/zhD5f7tVmWz3/+851VNxYvqw8M7Yz03yY5Osmnk/xpJY5zZpItkjxn5UsCAAAAAICW5nW5lzUr/bQzZnfalnVfeTfffHOOOeaYJMnXvva1zqoAw62vpcKT5L3vfW9e9rKXJVnyut799bWvfS1Jst566+WEE07ohOhNn/70pzuzf08++eTO0tq9+chHPrJEiL7YM57xjLz3ve9NkvzmN7/JX//61173P/zwwzNv3ry89rWvzcEHHzzQ4eTBBx9Mkqy55prL7du8Zndzpv3iY/TnOMs6xtKmTJmSb37zm09Zkn38+PGdNxU8+OCDWX/99XPcccf1uv/++++fpO/P30Cde+65+c1vfpMkOfXUU58Soi+2yy67ZK+99kqSTJ8+fYXO9ZGPfCTXX3993vCGN6zQ/ldeeWW+8pWvJGm9weFDH/rQCh0HRqMhC9JrrYtqrZ+utf57rfXClTjOglrrrbXWp16sBAAAAAAAVtDOO++cjTfeOEly2mmnLXGN5aQ1q/T7P/xRkmSjDTfIjtu/bthrHG0+8IEP5NFHH83ee+/dWUK922qtueuuu3LjjTfmuuuu63w885nPTJKnXJd8ee68887OMtn77LNP1lprrV77jR8/vhOC33ffffnVr361zGP2tWT3y1/+8k77j3/841Mev/TSS/Od73wnEyZMyEknndRrqL88jz76aJJk0qRJy+27eAZ6kjzyyCNPOUZ/jrOsYyzt7/7u7/KMZzyj18de8pKeqw6//e1vz8SJE3vtt80223TavX3+VsSPftT6vbHlllsuUUdvFgfgV199dRYtWrTMftOnT89vf/vb/OY3v8mll16aL33pS3n+85+fr33ta3nf+96XefPmDbjOefPmZa+99srChQtTSskpp5ySKVOmDPg4MFoN5dLuAAAAAAAwYo0fPz7vete78sUvfjF//vOfc8kll2S7rV/cefySy/8nt91xZ5Jkr7e/5SmzXofKE088kZtv+H3jnsc7rYnz18iWW265zFBwIOe46eY/Zs15PbOg5/31T532xs//m5U+x9JmzJiRn/3sZ1l77bU7M2C76dxzz82JJ56YSy+9dInZ0ku75557BnTc6667rtN+9atf3Wff5uPXXXddXvva1/bar6/rVjeD5KXH8dhjj+X9739/aq059NBDlxvqLsvkyZOTJI8//vhyemaJmfXNFQcWH6M/x1nWMZb2ghe8YJmPNZc572+/vr4PBuKXv/xlkuT3v/99v9+48Pjjj+fee+/N+uuv3+vjW2yxxRLbr3/96/PBD34we++9d84555y88pWvzC9+8YvlLpu/2IMPPphp06Z1rlt/7LHH5m//9m/7tS+MFYJ0AAAAAADGrP333z9f/OIXk7SWd9/usz3LP5/eWNb9ncO4rPudc+/Itjtuu8zH//jHP+bZz372Sp5jXl67/VuW+fhF//uLbLr5Zst8fKDm3zM/H/vYx5IkxxxzTGe2dzfUWnPwwQfn29/+dr/69zUjujf33ntvp73hhhv22XejjTbqdb+l9TVLeNy4nsWHl57R/JnPfCa///3vs9lmm+Xoo4/us5a+LJ5V39cy64stWLCg024u4d6cmb+84yzrGEvr7+dlRT9/K+ruu+9eof0efvjhAfWfPHlypk+fnmc961m57bbbcsQRR+T0009f7n6PPvpo3va2t+Waa65Jkhx22GH5+Mc/vkI1w2gmSAcAAAAAYMx68YtfnG222Sa//vWvc+aZZ+bLn/r3rL766nnkkUcy+9zzkyQv+Zut8qK/WfaMYJZv+unT85e//CVPf/rTs+666+b73//+U/pceeWVS7QXz2D+27/922ywwQaDVst3vvOdToj+0pe+NB/96Efz6le/OptsskmmTJnSWXlgv/32y3e/+92nLPk/EMubjbwyx+6Pz33uc0mSnXbaKeecc06vfRaH1gsWLOh8XTbYYIMlZidvuummufLKK7NgwYLcf//9S8ziXtptt92WJFl//fWXWKK9OVN68Szo5R0jSTbbbPDe0DFcFgfy2223XU466aR+77cibzBZb731st122+XCCy/Mj370oyxcuDATJiw7/lu4cGH22WefXHzxxUmSgw46qPNmImBJwxqkl1I2S3JKkprkPbXWO5fTf5Mkp7Y331lrXbG38AAAAAAAwDLsv//+Oeyww/LAAw/k7J+en3123yM/Pv8neaC9zPO793n7sNbzrM2fncfm9ixtXUpPe+KGvV9ve+Dn2DR/vfvGrL3+8zv33XHvjZ32w2Vwr5P82OOtMdx///3Zd999l9v/pJNO6gSQF1988aAG6SeffHKS5LnPfW5+8YtfLHPp8Pvuu2+Fjt9cav2uu+7qs2/zutbLutb3yli8hPr06dMzffr0Pvvec889eec735kk2X777ZcI0rfeeuvMmjUrSXLDDTfkNa95Ta/HWLhwYW655ZYkyVZbbbXEY2uuuWY222yz3Hbbbbnhhhv6rKX5+NLHWRWsu+66mTdvXubPn58XvehFQ36+xcvBP/zww5k/f3423njjXvs9+eSTec973pOzzz47SfL3f//3+cY3vjHk9cGqatzyuwyqvZPskGTi8kL0JKm13pFW2L9Dkn2GtDJgRJo26+TOBwAAAAAMhXe9612dGZynn/FfrdszW7fjx4/PO97+tq7VxuD7v//7vyTJ2972tmWG6LXW/OpXv1qh4zeD0+Ys+95cddVVve430kydOrXTvuSSS5bZ75e//GVnhvt22223zOP8/ve/7/NNBs1z9Hacke5lL3tZkuTGG2/MrbfeOuTnu+OOOzrtvpbC/4d/+IfOqgNvectb8t3vfneJpe2BJQ33T8db0pqNPnt5HRt+mKQkeeuQVAQAAAAAwJi24YYbZuedd06SXDDn4lx3/fW5cM6cJMlOO7w+G22wfherGx0++bFPptba50dzxvT06dM79++www6DWsvChQuT9H096h//+Me5887lzgfs1TOf+czOLOozzjgjD7ZXNljaokWLMmPGjCTJOuusk2233XaFzteX5X3Oa6151rOelSR51rOe1blvTvv7f7EddtghT3va05Ikp5xyyjKXpF88niTZY489nvL47rvv3mvfpocffjj/9V+tN7JsvfXWecELXtDP0Y4cb31rT6R13HHHDem57rjjjlxxxRVJWl/D5rXomw477LB861vfSpK88Y1vzJlnnpmJEycOaW2wqhvuIP3Z7duBvI3rf9u3WwxqJQAAAAAA0Lb//vsnaYWs+/7DwZ2wdd+9h3dZd4be85/fWs7+7LPP7nX59ltuuSUf+tCHVuocH/7wh5Mk8+fPz0c+8pFeg+d///d/z+9+97skycEHH7zE9cRHmkmTJuWQQw5Jklx//fX5whe+8JQ+V1xxRefa89tvv31e+cpXPqXPHnvskec+97lJks9+9rOdZeCbDj/88M7X5fDDDx+0MQynPffcs/NmihNPPLHzeVmW6667rrPc+mI33nhjLrrooj73++tf/5p3vvOdnSX83/Oe9/Ta7+ijj86Xv/zlJMnrXve6/OhHPxrR328wUgzrNdKTLL4ow/0D2Gdx32cOaiUAAAAAAND21re+NU9/+tNz//3353e/b12fee211spuu/xdlysbmN5m+S584J5O+4myKGusMSW777bLgI770EMP5cwzz8y8hxZ07vvzH/7QaZ/zox/mGeuulyRZrSYvftFL8pIXv3RgxQ+T/fbbL4cffnjuuOOOvO51r8sRRxyRv/mbv8mjjz6aiy66KF/5ylfy2GOPZdttt13h5d0/8IEP5LTTTssVV1yRU045Jbfeems+/OEP5znPeU7mzp2b73znO/nhD3+YpHWt9k9+8pODOcQhcfjhh+cHP/hBbrzxxhxxxBG5+eab8453vCOrr756Lr744hx77LFZuHBhVl999XzlK1/p9RgTJ07M8ccfn9122y0PPPBAtttuu/zrv/5rXvWqV+W+++7LySef3LkW+9SpU5cZDI9048ePzw9+8IO87nWvy0MPPZSDDjooZ5xxRt71rndlyy23zMSJE3P33Xfn2muvzTnnnJNf/OIX+ed//ufstttunWPceeedeeMb35htttkmu+++e17+8pdno402yoQJE3LXXXfl8ssvz7e//e3OEvkvetGL8vGPf/wptfznf/5n/v3f/z1Jsskmm+S4447LH//4xz7rX1wjjHXDHaQvSDIpyboD2Gdx38cHvxwAAIChN2fm/CW2t+xSHQAALNvkyZOz99575+STT+7ct+dub87qq0/uYlUD9973vne5fTbfbJMBB+n33HNPn8f+9L8tGeB9/PB/HbFB+qGHHpoLL7wwF1xwQW644YYceOCBSzy++uqr59RTT8255567wkH6+PHjc8455+Stb31rLr/88syZM+cpy6UnyVZbbZWf/OQnfV7XeqRYa621cu6552bXXXfNTTfdlG9+85v55je/uUSftddeO6eddlpe+tKXLvM4u+66a0466aT84z/+Y+bNm5ePfOQjT+nzqle9KrNnz8748eMHexjD5sUvfnEuv/zy7LXXXrnpppvy05/+ND/96U+X2X/ttdfu9f5f//rX+fWvf93nuaZNm5bp06dnjTXWeMpji9+YkLSWgW9e735Z/vjHP+bZz372cvvBaDfcQfqfkqyTZIckfa9H0WPH9u2fh6AeAAAAAIBV1gPveXan/fx1Nu1eIUmeuPsvnXZNzzWhHy1PdNqPl57lrR9rXHh0k2eMjGsg77///ksE6e/ex7Luo9HEiRNz7rnn5sQTT8ypp56a3/3ud6m1ZpNNNslOO+2UQw89NC984Qtz7rnnrtR5nvGMZ+TSSy/N6aefntNOOy3XXntt7r333qy99tp58YtfnL322isHH3xwJk2aNEgjG3rPe97zcu211+ZrX/tazjjjjNx88815/PHHs9lmm2XXXXfNoYce2rnmel8OPvjgvPa1r83xxx+fn/3sZ7nzzjuzxhprZKuttsq73/3uHHTQQZkwYbgjrMH3kpe8JL/73e9y+umnZ/bs2bnmmmsyf/78PPnkk1l33XWz5ZZbZurUqdljjz2y7bbbLrHvdtttl0suuSQXXXRRLrvssvz5z3/OvHnz8vDDD2fttdfOFltskVe/+tV517vele22265LI4TRbbh/C/13km2TfLiUcmKtdW5fnUspmyT5cJLa3hcAAAAAAIbEdtttl8fn9SyD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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(12,8))\n", + "#order = df.sort_values(by=\"dataset_type\").dataset.unique()\n", + "order = list(dataset_type.keys())\n", + "ax = sns.barplot(\n", + " x=\"dataset\", y=\"acc1\", \n", + " data=df,\n", + " order=order,\n", + " hue=\"model_fullname\"\n", + ")\n", + "ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)\n", + "ax" + ] + }, + { + "cell_type": "markdown", + "id": "02e6ee8f-d3a3-48da-8f6b-5e568c947796", + "metadata": {}, + "source": [ + "# Zooming on a specific architecture" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8ab3d735-f6ea-4c80-a076-19777dbc7573", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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0dHRRhK9Ro0aat26terUqSNXV1f9/fffWr9+vSZMmKB79+7pnXfeUd68edWvX79sjjpzOTk5qWnTpqpbt67Kly+vEiVKqECBArp48aL27dunX375RZGRkZowYYLy5cunr7/+OlXjxsbGqm/fvjKbzSpWrJguXbqUxXfyeLD19yve7Nmz9d1330mSfH19k+wzePBgI4levnx5ffDBB3rhhRcUHR2trVu36vvvv9fFixfVsmVL7du3T88991zm3QRgA4l0AAAAAAAAAECO0rNnT3366ae6efOmVq5cqc6dO6d4zYoVK3Tz5k1JqVuNXrVq1WTbnJycUtUvrZIaq2bNmmrfvr18fX01Z84cXb16VdOnT9ewYcPSPc+0adNkb590esHLy0sDBgxQx44dtWzZMu3atUtr165Vy5YtE/QrXLiwvvnmGw0YMED58+dP0Obh4aEuXbqoa9euWrx4sU6ePKlx48bpk08+SXfMiCvD/corr2jUqFFJViVo1KiR2rVrp0aNGunu3bsaOnSounTpkujzeZL98ccfyT67Pj4+euutt1S7dm2dOXNGY8eO1dChQ5OsqPCw+C9+VKpUSW3bttVXX32V2aE/llLz92v79u2S4p6/7t27J2rfv3+/fvnlF0lStWrVtGPHDhUoUMBo9/T0VNu2bfWf//xH165d05AhQ7Rq1apMugPANvZIBwAAAAAAAADkKD169DD26p07d26qronvl1wy6HE3dOhQ43jv3r0ZGiu5RGQ8Ozu7BPPFJ9KsffPNNxo6dGiySVo7OztNnjxZuXPnliQtWbIkAxFDiqtwsHHjRpul/evUqaM333xTUly5982bNz+q8B6JlJ7dwoULG6vw79+/r927d6c4ZlhYmPElj59++sl4ZiEdP35c+/btkyQ1bNgwyS0aZs+ebRx///33CZLo8apWrap33nlHkrR69Wr98ccfWRMw8BAS6QAAAAAAAACAHKVs2bKqV6+eJGnjxo0plmGOjIzUpk2bJEkNGjRQmTJlErSbTCaZTCaNHDkyS+LNDG5ubsbxvXv3snw+61X36Z2vcOHCqlatmiTp9OnTmRJXUm7fvq1ff/1Vffr0UY0aNfTUU0/JwcFBRYsWVYMGDfTdd9/p1q1bNsdwc3OTyWSSn5+fzX6rV69W+/btVapUKeXJk0eFCxdW3bp19fXXX9ucY9asWcZz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6tWrq1q1atkWY2ZwdnbWgAEDJEk3btzQkiVLsnS+IkWKyNPTU1JcSXOz2Wyzv9lsVseOHbVt2zZJcfuZx3/BITMktY/4wx5e0Z+Z41gns9955x0dPXo0VT8bNmxIcb706NGjh0JDQ2UymfT6669r48aNCgsL071792SxWGSxWBLEnJr3BgD+bViRDgAAAAAAAADI0Xx9fTVkyBDduHFDq1atUqdOnbRy5UrduHFD0qNdjS5Jbm5uWZK4tC4FfvTo0QRtWTFf0aJFJcWtqr58+bKxH/3DYmNj1aNHD61evVqS1KlTp1SXPk9JoUKFJElXrlyR2Wy2uSo9fj93k8mUYLV+Un2SYzabde3atQRzS1LhwoWN4zt37qhq1aqpu4Es8OeffyowMFCS9OGHH2r06NFJ9ou/DwDIqViRDgAAAAAAAADI0bp27WokWOPLucf/M34f9X8D61Xh9+/fz/L5IiIijGNnZ+dk+/Xv31+LFi2SJLVo0UJz5841ypJnVHzCOiYmRr///rvNvvv27ZMklS9fPsn90SXp0KFDNlfXHz58WDExMQnmluK+VFCyZElJ0ubNm7N1hfcff/xhHHfu3DnZfvv3738U4QDAY4tEOgAAAAAAAAAgR3N1dZW3t7ckacOGDQoODtbGjRslSd7e3sbe2U+6oKAg47h06dJZOldERIR2794tSSpTpozy58+fZL8hQ4Zo2rRpkqQmTZpoyZIlcnBwyLQ4vLy8jOPp06cn22/37t06duxYomsedvXqVWPlfFJmzJiR5NyS1KpVK0nSmTNnsry0vi3WXwSwtQf7zz///CjCAYDHFqXdAQAAACCH85zgmap+OwfvzOJIAAAAso+vr6/WrVsns9mszp07G8nGR13WPav89ddfmjx5svG6efPm6RrnxIkTCg8PV+PGjZPt8/fff6tLly7GyuwePXok2W/kyJEaN26cJOmll17SypUrlSdPnnTFlZzatWurVq1aCgoK0rRp09SuXTu98sorieLt37+/JClXrlzGXvLJGTJkiF566SW5uromOB8QEKApU6ZIkjw8PFSrVq0E7R988IFmzJih6OhovfHGGypbtqxefPHFZOdZt26dSpUqpWrVqqX6flOjfPnyxvHs2bNVp06dRH1++uknrVixIlPnBYAnDYl0AAAAAAAAAECO16pVKxUsWFDXr183Sl8XKFBArVu3zubIUi84ODjB69jYWF25ckU7duzQjz/+qCtXrkiSunXrpho1aqRrjvPnz6tJkyaqXr262rRpIw8PDxUvXlz29va6ePGidu7cqenTp+vixYuS4sqbDx8+PNE4EyZM0GeffSZJKlmypL799luFhobanLtixYrpWq0+ZcoU1alTRzExMfLx8dHgwYPVsmVLOTs76/fff9fXX3+tM2fOSJLef/99m/uXV69eXceOHZOHh4c+/PBD1a5dW9HR0Vq3bp3GjRtn7MM+adKkRNeWLVtWP//8s3r16qWrV6/K09NTPXr0UIsWLfTMM8/IbDYrPDxc+/bt05IlS3T69GmtXr060xPpL7zwgqpWrarg4GD99NNPun79urp166YSJUooLCxM8+bN05IlS+Tp6amdO/kyLYCci0Q6AAAAAAAAACDHc3R0VIcOHTR16lTjXIcOHZQ3b95sjCpt3N3dU+zTqVMnmyXOU+vw4cM6fPiwzT4+Pj6aOXOmnJycErUtXbrUOI6IiFC9evVSnDM0NFRubm5pjrVGjRpavXq1OnTooBs3bmjs2LEaO3Zson4DBw7UV199leJYgwYN0oABAzRo0KBE7blz5052lbck+fn5KW/evOrXr59u3Lih6dOnJ/t55MqVK8n3LqNMJpPmzp2rxo0b69q1a1q4cKEWLlyYoI+7u7t+++03Pf3005k+PwA8KUikAwAAAAAAAMATiq1XMpevr2+CRPqTXtbdZDLJ2dlZpUuXVt26ddWzZ0/Vr18/Q2N6enoqICBAW7duVWBgoM6dO6fIyEjduXNHBQoUUNmyZVWnTh117dpVnp6p20LoUfD29tapU6c0fvx4rVu3TmfOnFF0dLRcXV318ssv64033khVMl+S+vTpo6pVq2rcuHEKDAxUVFSUihYtqiZNmmjYsGF6/vnnbV7fqVMneXt7a8qUKfrf//6nY8eO6dq1a3JwcFDx4sVVpUoVNWrUSO3bt8+yvexr1KihQ4cO6auvvtL69et1/vx55c+fX88995w6duyogQMHytHRMUvmBoAnBYl0AAAAAAAAAAAUlyS2WCxpvi6t1/j7+6d5jkcxVmo4ODiofv36GU7IP+q4Jalo0aIaPXq0Ro8eneGx/vOf/+jXX39N9/UuLi4aNmyYhg0blqbr3NzcUv28nT171mb7M888o59++slmH1tz+fn5yc/PL1WxAMCTKFd2BwAAAAAAAAAAAAAAwOOEFekAAAAAgFQJqN8gVf0abA/I4kgAAAAAAACyFivSAQAAAAAAAAAAAACwQiIdAAAAAAAAAAAAAAArJNIBAAAAAAAAAAAAALDCHukAAAAAAAAAAAA2nD17NrtDAAA8YqxIBwAAAAAAAAAAAADACol0AAAAAAAAAAAAAACskEgHAAAAAAAAAAAAAMAKiXQAAAAAAAAAAAAAAKyQSAcAAAAAAAAAAAAAwIp9dgcAAAAAPMzjgzmp6ndgTM8sjgQAAAAAAABATsSKdAAAAAAAAAAAAAAArJBIBwAAAAAAAAAAAADACol0AAAAAAAAAAAAAACskEgHAAAAAAAAAAAAAMAKiXQAAAAAAAAAAAAAAKyQSAcAAAAAAAAAAAAAwAqJdAAAAAAAAAAAAAAArJBIBwAAAAAAAAAgA0wmk0wmk0aOHJndoeAJ4O/vbzwz/v7+mTr2rFmzjLHPnj2bqWM/aiNHjjTuJTtl5ecV73G5VwAJ2Wd3AAAAAAAAAACA9Amo3yC7Q8gyDbYHZMm4/fv315QpUyRJW7duVaNGjVJ97ZYtW+Tl5SVJGjhwoCZOnJhs38xIiIWGhsrNzc1mn4YNGyogIOn3yt7eXgULFtTzzz8vHx8f9e3bVy4uLhmOKyQkRFu2bFFQUJCOHj2qS5cuKSoqSnZ2dnJ1dVWtWrXUtWtXtWrVyub7cO7cOa1du1b+/v46dOiQwsPD9eDBAxUpUkQeHh7q3LmzOnToIHt7UhnA427y5MkaOHCg8XrmzJny8/NL8brdu3dr8uTJ2rFjhy5evCgXFxdVr15dfn5+6ty5c6rmNpvNmj59uubPn6+QkBDdunVLJUuWlJeXl9566y09//zz6b2tf43o6GitW7dO+/btU1BQkM6dO6eoqCjdvHlTBQoUUMWKFeXl5aV+/fqpVKlSyY5jNpu1bds2bdy4UXv27NGff/6p69evy8nJSeXKlVPjxo01YMAAPfvss4/w7rIO//YBAAAAAAAAAOQYPXv2NBLpc+fOTVMifd68ecZxjx49Mj22zGY2mxUVFaXt27dr+/btGjt2rFasWKH//Oc/GRp39OjRmj9/fpJtoaGhCg0N1eLFi9WgQQMtW7ZMhQoVStRvxIgR+uKLL2SxWBK1RUREKCIiQqtWrdLYsWO1dOlSPfPMMxmKGUDWOX/+vD788MM0Xzdq1Ch99tlnio2NNc5dvHhRFy9e1IYNG7RgwQItXrxYjo6OyY5x5coV+fj4aO/evQnOnz59WqdPn9asWbM0efJkvf7662mO798kLCxMr732WpJtV69e1e7du7V7926NHTtWkydPVs+ePRP1u3z5sipXrqwrV64kavv777/1+++/6/fff9eECRP07bff6u233870+3jUSKQDAAAAAAAAAHIMT09PPfvsszp9+rSWLFmiSZMmKW/evCled/fuXS1dulSSVLFiRdWpU8doSyoZfPTo0WTH6tWrl/bv359iv5IlS6YYl605Y2JidObMGc2dO1erVq1SZGSkfHx8dPz4cRUpUiRNY1uzt7dXnTp15OnpKXd3dxUvXlxFixbVtWvX9Oeff+qXX35RcHCwAgIC1LJlS+3YsUO5ciXcafb8+fOyWCxycnJS27Zt1aRJE5UvX16Ojo4KCQnRjz/+qKCgIO3fv19eXl46ePCgnJ2d0x3z46Rhw4ZJPjPIuUaOHPlEbw0xaNAg3bhxQ8WKFdOlS5dSdc20adP06aefSpKeffZZ/fe//5W7u7vOnz+vH374Qdu2bdPq1avVp0+fBF9isvbgwQO99tprRhL9tddeU9++fVWoUCHt3btXX3zxhS5duqR+/fqpZMmSatq0aebc8BOqWLFiatSokWrVqqUyZcqoRIkScnBwUEREhNauXav58+fr9u3b8vPzU9GiRdWsWbME10dHRxtJ9Bo1aqh169aqU6eOXF1d9ffff2v9+vWaMGGC7t27p3feeUd58+ZVv379suNWMw2JdAAAAAAAAABAjtKzZ099+umnunnzplauXJmq8sErVqzQzZs3JaVuNXrVqlWTbXNyckpVv7RKaqyaNWuqffv28vX11Zw5c3T16lVNnz5dw4YNS/c806ZNS7bcupeXlwYMGKCOHTtq2bJl2rVrl9auXauWLVsm6Fe4cGF98803GjBggPLnz5+gzcPDQ126dFHXrl21ePFinTx5UuPGjdMnn3yS7pgBZI2VK1dq+fLlKlq0qIYNG6b33nsvxWuuX7+uDz74QJL0zDPPaM+ePQm+3NOiRQu1bdtWq1ev1vz589WvXz/Vr18/0Thz587V9u3bJUlvvvmmJk2aZLTVrl1bzZo1k4eHh27cuKHBgwfr2LFjOXariHLlyunixYvJbrfRtm1b9evXT/Xq1dP9+/f18ccfJ0qkm0wmvfLKKxo1alSSlU0aNWqkdu3aqVGjRrp7966GDh2qLl26JPob/yTJlXIXAAAAAAAAAAD+PXr06GEkE+bOnZuqa+L7mUwmde/ePctiyypDhw41jh8ugZxWKSWi7OzsEswXn+iy9s0332jo0KHJJljs7Ow0efJk5c6dW5K0ZMmSDEQMICvcvHlTgwYNkiR99913SW7jkJSpU6fq+vXrkuL+FjxcISP+99/Ozk6SNGbMmCTHiT/v4uKSZJ/nnnvOKDl/8uRJrVy5MlXx/RvlypUr2SR6vNq1a6tJkyaSpIMHD+rWrVsJ2kuWLKmNGzfa3B6kTp06evPNNyXFlXvfvHlzBiPPXiTSAQAAAAAAAAA5StmyZVWvXj1J0saNG1MsRRwZGalNmzZJkho0aKAyZcokaDeZTDKZTI91aWY3Nzfj+N69e1k+n/Wq+/TOV7hwYVWrVk1S3H7HmSE8PFwDBw5UuXLl5OjoqKefflqtWrUykj0jR440Ps+HnT171mibNWuWzXnc3NxkMpnk5+eXqM3f398Yx9/f3+Y469atU/fu3VWuXDk5OTnpqaeeUpUqVdS5c2ctXbpUd+/eTe2tG8LCwlSpUiWZTCY5Ozsbz7a127dva9SoUXJ3d5eTk5MKFy6sevXqacaMGbJYLKm+B4vFoiVLlqhdu3YqXbq0HB0d5eLiotq1a+vzzz83kqnpkdrfu4YNG8pkMqlhw4bpnisle/bs0ccff6yGDRuqePHiyp07twoUKKDnn39eAwYM0LFjx2xeb+u5s3b27Fm9++67qlKlivLnz698+fKpfPny6t+/v81tIqTE71dQUJC6dOmiUqVKKU+ePCpZsqR69OihkJCQVN/3hx9+qPDwcDVs2DDJPbWTs2LFCklSgQIFkt23u1SpUvLy8pIkbdq0KVFS9+TJk8b72qlTJ+XLly/Jcax/B5ctW5ao/eH3/saNGxo5cqTc3d3l7OwsV1dXNW/eXLt27Upw3aVLl/Txxx+rSpUqxu9I69at9fvvv6f8BmTAvn371LdvX1WoUEHOzs5ycnJSpUqVNHDgQJ08eTLD41v/7Y6Ojk7XGI0aNTKOM+tvd3bJmfULAAAAAAAAAAA5Ws+ePbVjxw6ZzWYtXLhQb7/9drJ9Fy5cKLPZbFz3JDp79qxx/Mwzz2T5fAsXLjSOK1WqlO5x4hM5D++xnh4BAQFq1aqVbty4YZy7cOGCVq9erdWrV+uzzz7L8ByZ5cqVK+rUqZO2bNmSqO3YsWM6duyYfv31V82cOTPJZH1yjh8/rldeeUVhYWFycXHRunXrEq0uDQsLU+PGjXXq1Cnj3J07d7Rz507t3LlTy5cv11tvvZXiXJcvX1bbtm21c+fOBOejo6MVFBSkoKAgTZo0SStXrlSdOnVSfQ+Pm1mzZqlXr16Jzt+/f18hISEKCQnR1KlT9eOPPxorddNjzpw56tevX6Lk5qlTp3Tq1ClNnz5dn3/+ubEC25aJEyfq3XffNf6uSdL58+c1b948LVu2TOvXr0+ylLq1vXv36qefflLu3Ln1008/pfo+YmJitG/fPklS3bp1jaoTSWnQoIE2bNhgPDPWCdodO3Yk6Jec4sWLq0KFCjpx4oQCAwNtxhYWFiYvLy+dOHHCOHf79m2tX79eGzdu1MKFC9WhQwcdOXJEzZs3V0REhNHvzp07WrVqlTZs2KB169apcePGNudKK7PZrLfeeivJ9/r48eM6fvy4pk6dqkmTJqlv377pmuPSpUvaunWrJKlIkSIqXLhwusaxfkYz4293dnqyowcAAAAAAAAAIB06duyovHnzSkq5vHt8e758+dS+ffssjy0rfPfdd8Zxq1atsmSOqKgo7d69W71799ZXX30lKW5Vebdu3dI13qVLl4zVsRlJxktxXyRo2bKlbty4oVy5cumNN97Q5s2bFRQUpOnTp6t8+fL69NNPtXbt2gzNkxnu3LmjRo0aGUl0Dw8P/fLLL9q5c6f279+v5cuX691339XTTz+dpnEPHDigevXqKSwsTCVKlND27dsTJdFjYmLUvHlzI4nerFkzLV++XPv379eKFSvUvHlzrVmzJsX96m/fvq0GDRpo586dyp07t/r376+VK1fq4MGD2rFjh0aPHq3ChQsrMjJSzZo1019//ZWme3mcmM1mubi4yNfXVzNmzNCOHTt08OBBrVmzRqNGjVKRIkX04MEDDRo0yEhSptXatWvl5+en6OhoOTs769NPP9WOHTu0e/duff/998Yc//3vf1NMam/YsEFvvfWWqlSpohkzZigoKEjbt2/Xu+++q1y5cunOnTvq0aOHYmJikh3j/v376tu3r2JjY/XBBx+k6ffz5MmTRgI/peus2x9eKW/9OrXjhIWF6fbt28n269Chg8LDw/Xhhx8qICBAQUFBGjdunAoUKKAHDx6od+/eCg0NVYsWLXT37l2NHj1agYGB2rt3rz777DPlzp1b0dHR6tWrl833Lz169+5tfLbNmjXTvHnztG/fPgUFBWnq1KmqUqWK7t+/r379+mn16tWpHjc6OlqhoaGaOnWqXnrpJV27dk2SbH65LCUBAQHGcUb/dmc3VqQDAAAAAAAAAHKcAgUKqHXr1lq0aJEOHDigkJAQVa5cOVG/Y8eO6eDBg5KkNm3aJLun9+MgODg4weuYmBidPXtW8+bN0/LlyyVJ7du3V/PmzTNtzoYNGyZImlgrVKiQli1bpoIFC6Zr7DFjxhgJt44dO6Y3REnSe++9p5s3b0qS5s2bpy5duhhtL774ojp06KCXX35Z+/fvz9A8meGjjz4yynQPHDhQEyZMSFDy28PDQ23atNHXX39tJL1S4u/vr1atWunmzZt69tlntWnTJpUtWzZRv0mTJhnP0aBBgzRhwoQE87Zu3VqDBw/WxIkTbc43fPhwhYSE6KmnntLmzZv14osvJmivV6+eunXrprp16+rChQv6+OOPU/xCy+OqWbNm6tq1a6LS4i+88IJ8fHz01ltvqX79+jpy5Ig+/fTTNK9Uvn//vvr37y+LxSJnZ2ft2LFDNWrUMNr/85//qF27dsZ7+f7776tDhw6J9h2Pt2fPHjVv3lzLly9PsBr85ZdfVuHChfXxxx/r3LlzWrt2rdq2bZvkGGPGjNHRo0dVrlw5ffTRR2m6n7CwMOO4VKlSNvuWLl06yevSO47FYlF4eLgqVqyYZL9Dhw4pICAgQYWEF198URUqVJCPj49u3rypOnXqyGKxaN++fXr22WeNfrVr11aRIkU0cODAFN+/tFq6dKnmzJkjKW5/+T59+iRof/HFF9W9e3f5+Pho69ateuutt9SsWTPZ2yedBvb390+wuv9h3bp10wcffJCuWC9cuKCZM2dKilvVbmueJwEr0gEAAAAAAAAAOZJ1mfbkknjW5x/3su7u7u4Jfjw8PNSuXTstX75cFSpU0LRp0/Trr78+klgGDx6skJCQFMtDJ2fv3r0aP368pLgkWUZKYl+4cEErV66UJLVo0SJBEj1e/vz5NWXKlHTPkVmuXbtmxFGzZk398MMPye6bnTt3brm6uqY45sqVK9WsWTPdvHlT7u7uCgwMTDKJLkm//PKLJOnpp5/WmDFjkuwzZswYm6vho6KiNG3aNEnSqFGjEiXR45UpU8ZY2f7rr7/qzp07Kd7L46hkyZLJ7s8tSU899ZRGjRolSQoMDNSVK1fSNP7y5cuNEuIfffRRgiR6vDJlyhif1507d4xEZlIcHR01c+bMJEuqv/XWW8Z569Lp1k6dOqXPP/9cUtwXL+Ire6RW/BdaJMnZ2dlmX+v9uh/eIz2zxrH2zjvvJLnNQPPmzVWmTBlJcVsWfPHFFwmS6PF69eolR0dHScm/f+kRX+Gjbdu2iZLo8RwdHY0vuJw9e1b+/v5pnsfNzU3/+9//NG/ePOXJkyfN11ssFr3xxhvGZ/PJJ5+k+fl43JBIBwAAAAAAAADkSN7e3ipRooQkaf78+bJYLAnaLRaL5s+fL0kqUaKEvLy8HnmMmeXEiROaMWOGdu3alanjzpw5U0ePHtWRI0e0fft2jR07VuXLl9ekSZPUu3dvRUZGpnnMyMhItW/fXmazWSaTSbNnz7aZqEzJtm3b9ODBA0lKci/reLVr11aVKlXSPU9m2LZtm5FQfuutt2RnZ5eh8WbPnq127drp3r17qlu3rgICAlS8ePEk+0ZEROj48eOS4ioAxCcEH+bo6KgOHTokO+eGDRt07949Yxxb4r9ocf/+fR04cCDF+3kS3L59W2fPntUff/yh4OBgBQcHy8HBwWg/fPhwmsbbvHmzJMlkMun1119Ptl+HDh301FNPJbgmKa+88oqKFSuWZFv+/PlVvnx5SdKZM2eS7PPGG2/o3r176tChg1599dVU3YO1+GdDks390SUlSObevXs3S8ax1rlz52TbqlWrJinuc0juuc6bN2+K719aRUREGL8bKf0+Va5c2ahEsHv37mT71apVS0ePHtXRo0e1f/9+LVu2TH5+fgoLC1OvXr00ffr0dMX65ZdfatWqVZKkRo0aadCgQeka53FCaXcAAAAAAAAAQI5kZ2enrl276vvvv9e5c+cUEBCghg0bGu3+/v5G+eCuXbtmOKmZWvfv3zcSmkmpWLFigsRcvIe/CBAbG6uoqCgFBgZq1KhR2rVrl7y8vLRw4cJEJYcfLgtvrWzZsglWdD7cZu3ll1/WgAED1KFDB61Zs0a1atXSrl27Uiy9HO/mzZvy8fFReHi4pLjETHKlsENDQ5Pd77hYsWJGsjC+TLoUl0CypXbt2vrjjz9SFWtW+P33343j9K7mj/fDDz/ohx9+kMViUdOmTbVs2TKbX0iwfgY8PDxsjp3cKnNJCcrjx39RJTUuXryY6r6Pm6ioKI0dO1ZLly7VyZMnE/0uPtw3LeI/Fzc3t2QT4FJcMvmFF16Qv7+/zd/nlPasLlSokKSEK77jzZo1S1u2bFGBAgWMihFpZf0FjZT2EY+OjjaOH17Z/PA4yX3xI6VxrFWoUCHZtvgtKooUKSIXF5cU+yX1/qWH9e9Tly5dkqyokRRbv09OTk6qWrWq8drDw0Nt27Y1ysP36dNHERERGjFiRKrjnD9/vlFhws3NTQsWLFCuXE/+eu4n/w4AAAAAAAAAAEgnX19f4/jh8u7ZVdY9IiIiUZl265/4Ms8pyZUrl4oVK6bXXntNgYGBqlChgqKjo+Xn55dob21b8wUFBaUp/vjS0fny5VNYWJiGDh2aquvu3bun1q1bG6svhwwZouHDhyfbv1evXsnGPHnyZKOf9b3aSkRKSlWp9KxknWRNSxI6KePHj5fFYlHRokW1dOnSFFf1p+V9Klq0aLJtly5dSlug/3hSS7sfOHBAlSpV0ldffaUTJ07YTKJLtldEJ+Xq1auSUvdsxlcbiL8mKSk9B/HJz/gqDvEuX76s999/X5L0+eef2yzvb0v+/PmNY1tl1iUl+KLMw+XbM2sca7bem/j3Jb3vX3o9yt+nJk2a6O2335YkffbZZ/rzzz9Tdd3atWvVq1cvWSwWubq6atOmTclWvnjSsCIdAAAAT6xzo9xT1e+ZEUdT7gQAAAAgR3J3d1f16tV1+PBhLVmyRBMnTlTevHl19+5dLV26VJJUvXp1o6zvk8rZ2VkDBgzQu+++qxs3bmjJkiXq27dvls1XpEgReXp6atOmTVq5cqXMZrPs7ZNPSZjNZnXs2FHbtm2TJPXp00fff/99psRindhMbr/xpPo+6dq1a6elS5fq8uXL6t69u3777Tebn0FmiU8g5s6dO03l2lNbteBxEhMTo44dO+rKlStycHDQ4MGD1bp1a1WoUEEuLi5GSfEzZ84Ye2qn9xlL6dnNyNipMW3aNF25ckUFCxZU4cKFtWjRokR99u7dm+A4fpV448aNjS9nWH/O8ZUnkhNfEUSSSpcunaDt4XHiS5rbGsdkMj1xz5l1Qn7+/Pmp/neRrVXztrRu3Vrf/h97dx9mV1Xejf+7yPAeAkHqCy9RHxURm6INamswg8oFCpWC1fKmQUWh2qKCxp/WpzGiooI8ggGqIAYjYkVUxAesiMAEIj5otBosFUEhRBBRVEgQIcn+/TEn4wKSyZnJnDlJzudzXefae59z773uM8mEYb5nrX3KKVm1alW+8pWv5F//9V+Hrb/mmmvyqle9Kg8//HAmT56cK664Ik9/+tNHNfaGSJAOAAAAAEBPO/roo3PiiSfmvvvuy6WXXprDDjssX/va13LfffclGd/Z6MngsridCMTqJZ3r5c6TzgRwq2ctP/DAA7nnnnvWOsN61apVee1rX5uvf/3rSZLDDjssn/rUp9Z5/WuuuaatPlYvVZ0M3n/90YFcbbjZn/UyxatWrRp2zLUtOb8udRh41113PWbp/JH42Mc+lic96Uk588wzc8kll+SII47IF77whbWG6XXwtq5ZsPfcc89aX3vc4x6XZDBkftzjHrfeM+vXppSSpmk69mfRjquuumroXthnnXXWWj+c8ugVIEZi9d/fdpa+v/vuux9xzlhavTz673//+7zmNa9ZZ/0nP/nJfPKTn0ySXH311UNB+u67754JEyZk5cqV65zxXL/+rGc96xGv7bnnno+oe85znrPO6+y2225rvU3Fhmr191My+He+XpK9E+rVJm6//fZha2+44Ya84hWvyIMPPpiJEyfmG9/4xkb/obNHs7Q7AAAAAAA97cgjjxwKF1cv5756u/o+6puCFStWDO0//PDDHR+vXoJ+uOWUjzvuuKHZrX/3d3+Xz33uc2N6b92pU/+8mtm6lqkf7vV6KenhgtHf/va3I74P9mp//dd/PbS/YMGCUV2jNnfu3Lz5zW9Oklx88cV5zWtes9Ylp5/97GcP7df3ZV6T4V5/7nOfO7R/xRVXjKTdEVn95zHcn8WqVavys5/9rGM9/OQnPxnaP/zww9dat66v53BWB6e33XbbsB9wePjhh/PDH/7wEedsiLbYYos8//nPT5Jcf/31w94nfWBgIEmy5ZZbZu+9937Ea/vss89j6tbkV7/6VW6++eYkyfTp00fdd7eM1/fTau3+u/3jH/84L3vZy7Js2bJstdVW+frXv54XvOAFHe9vvAnSAQAA6Ipps+a39QAA6LQnPOEJ2X///ZMk3/zmN3PjjTcOBRb777//JnOv1zokHm5W9lj45S9/meuvvz5J8uQnP/kRIXTtxBNPzKc//ekkg/fnvfjii7P55puPaS8vfvGLM2HChCTJZz/72bXWff/738+NN9641tcnT56cHXbYYah2bb7whS+MrtEM9rp6xuzcuXPH5D7LZ511Vo499tgkyRe/+MXMnDlzjbO4d9111+y+++5Jki996Ut58MEH13i9Bx98MF/60pfWOt7LX/7yoT/Dj3/844/4AMdYWj1bf7g/i8svvzx/+MMfOjJ+8sgPp6ztntSrVq3KOeecM+ox9ttvvySDq0Z85jOfWWvdxRdfPPReV58zlubMmZOmaYZ9zJs3b6h+3rx5Q8/vu+++j7jWIYcckiS577778pWvfGWN4y1dujRXXnllksF/Gx79b8juu+8+NEv9oosuWuvX//zzzx/aP/TQQ0fyljcIT3/604dm3//Hf/xHlixZ0tHx6u/t+kNItZtvvjn7779/fve732XzzTfPl7/85cf8GW8qBOkAAAAAAPS8o48+OslgMHb44YcPBWTjvax7p9x+++05++yzh44PPPDAUV3n5ptvzlVXXTVszR/+8IccccQRQzNNX/va166xbs6cOfn4xz+eJHnhC1+Yr33ta0P3lB5LT3rSk/L3f//3SZJLL700F1100WNqli1bNhQ2D2fGjBlJkq997Wu59dZbH/P6TTfdlNmzZ4+61x122CHHHXdckmTRokV5+9vfvtZl9x9++OF1LsGeDC4H/clPfjLHHHNMkuTCCy/M6173ujWG6avHvvPOOzNr1qw1Xm/WrFm588471zreLrvskte//vVJkh/96Ec57rjjhg3Tf/3rXw99mGIk+vv7kwzei3vhwoWPef2uu+7KW9/61hFfdySe8YxnDO2v7UMa73nPe/KDH/xg1GMceuih2XnnnZMkJ598cn70ox89puaOO+7IO9/5ziTJNttsM/T131C98Y1vzPbbb58kefe7353f/va3j3h95cqVectb3jL0QZLV7+3RVj9/77335l3vetdjXr/11lvz4Q9/OEnytKc9baMM0pPkf//v/51k8EMsr3zlK4e9tcKf/vSnnH322Y/5IMwXvvCFdX6o5KKLLhq6rcb222+fgw8++DE1S5YsyX777Ze77747EyZMyIUXXjjq/55sDNwjHQAAAACAnnfwwQdnhx12yO9///uh5ZonTZo0FMBuDB49m3rVqlX57W9/m2uvvTaf+MQnhsKqo446atj7CQ/nzjvvzEtf+tLstddeOeSQQzJt2rQ88YlPTF9fX371q19l4cKFOe+884bu5/yXf/mXefe73/2Y68ydOzfvf//7kwwGr6ecckp+8YtfDDv2M5/5zFHPVj/ttNPyrW99K/fff3+OPPLIDAwM5FWvelUmTZqUH//4x/nIRz6Sm2++OXvvvfewM5zf8pa35NJLL80f//jH7LvvvpkzZ06e+9znZtmyZbnyyitzxhln5PGPf3z6+vqGDbuG84EPfCDf+ta3snjx4px55pm5/vrrc9xxx2Xq1KnZYostsnTp0lx33XW58MIL88EPfjCve93r1nnNUkrOPffcrFq1KvPmzcvnPve59PX15bzzzkspZajuX/7lXzJv3rzceOONOfPMM/Pzn/88xx13XHbdddcsXbo055xzTi677LI8//nPzw033DB07Uc77bTT8p3vfCc33nhjPvOZz+S73/1ujj322EybNi0TJ04c+j678sorc/nll2fq1Kl54xvfOKKv07HHHpuzzz47K1asyCte8YrMnj07++yzTx566KEsXLgwp512WlasWJFnPOMZHVve/YADDsjjH//4/PrXv8573/ve3H777Tn44IOz00475ZZbbsm5556bb3/725k+ffoaw/52bL755jnnnHPyile8Ivfff3/22WefzJo1Ky996UvT19eX73znO/nIRz4y9KGKj33sY9lpp53G8m2OuR133DEf/ehH80//9E+5/fbb84IXvCDvfe97M3Xq1Nx55505/fTTc/XVVydJjjjiiLz4xS9e43WOPvrofOYzn8nChQtz1lln5Ve/+lXe9KY3ZfLkybnhhhvygQ98IPfdd18222yzzJ07d+gWHhubI444It/85jfz2c9+NosWLcqee+6Z4447Lv39/fmLv/iLLF++PLfeemuuvfbafOUrX8m99977mA+BfepTn8qxxx6bQw45JDNmzMgzn/nMbL/99lm+fHl++tOf5uKLL87ll1+eZPB7+owzzsiOO+74iGv89re/zX777Zc77rgjSfKOd7wje+yxxzpX8thll13G+CsyfjbOvzEAAAAAADCGttpqq7z61a/OueeeO/Tcq1/96my99dZd7Gpk1rYMb+2www7Leeedt95j/ehHP1rjzNjaQQcdlHnz5g0tVV778pe/PLT/y1/+8hH3O16bX/ziF3nKU54y4l6T5ClPeUouvfTSHHzwwbn//vtz9tlnP2KGfpK8733vSzL8UuEHHHBA3vrWt+YTn/hEli5d+pjwd7fddsvXvva19Zqhuc022+Sqq67KP/zDP2TBggVZtGhRW7Pl16WUkk9/+tNZuXJl5s+fn3nz5mXChAk555xzhsLwLbbYIpdddlle8pKX5NZbb83ll18+FK6ttv/+++eEE07Iy1/+8iSD3zuPNnHixAwMDOSoo47Kf/7nf+a///u/8/a3v32tvU2aNGnE7+fZz352TjnllJx44on53e9+lxNOOOERr0+ePDmXXHJJZs+e3bEgfdttt838+fNzyCGH5MEHH1zj36t99903Z5555nrdt3z199Jxxx2XZcuW5X3ve9/Q39fVJkyYkA984AN585vfPOpxxtNxxx2XO++8Mx/4wAdy66235g1veMNjag488MBhl7OfMGFCLrnkkhx44IH53ve+ly9/+cuP+LclGfw7feaZZw79fd1YnXfeeXnCE56Q0047Lb/5zW/yoQ99KB/60IfWWLvtttsO3c6itmzZslxwwQW54IIL1jrO5MmTM3fu3Bx11FGPeW3x4sWP+F465ZRTcsoppwzb99FHH/2I5fU3NoJ0AAAAAICNVP+CgW63sEk5+uijHxGkb+zLupdSMnHixOy2227527/928ycOXNoafLRmj59egYGBnLVVVfluuuuy5IlS3L33XfngQceyKRJk/LUpz41L3jBC3LkkUdm+vTpY/ROxsa+++6bn/zkJ/nwhz+cyy+/PHfddVcmT56cvffeO8cff3wOOOCAzJkzZ53XOeOMM/I3f/M3+eQnP5n/+q//ysMPP5wpU6bk0EMPzTvf+c487nGPW+9ed9pppwwMDOSrX/1qLrzwwnz3u9/NPffck2222Sa77LJL9tprr/zjP/5jXvayl43ouptttlnmzZuXlStX5vOf/3w+/elPZ8KECfn3f//3oTB9ypQp+dGPfpTTTjstX/rSl3Lrrbdmyy23zB577JGZM2fmuOOOy6WXXjp0zdVLdD/ajjvumG984xu56qqrcsEFF+S6667LXXfdlQcffDCTJk3K0572tDz/+c/PQQcdlP33339UX6cTTjghe+65Zz7+8Y/nhhtuyAMPPJCdd945Bx54YN71rndlypQpo7ruSBxwwAH5/ve/n4985CO56qqrcs8992SHHXbInnvumaOOOirHHHPMmNzX+uijj05/f39OP/30XHHFFVmyZElWrVqVnXfeOS95yUty/PHHt/Vhmg3J+9///hxwwAE566yzcu211+buu+/ODjvskL322iuvf/3rc8QRR6zzGjvttFO+853v5Nxzz82FF16Ym266KcuXL8/OO++cl770pXnb296WZz/72ePwbjprwoQJ+ehHP5pjjjkm55xzTq666qrcdtttue+++7LNNttkypQpec5znpP9998/hx566GM+BPb5z38+V155Za6++ur8+Mc/zt1335177rknW2yxRXbaaadMnTo1L3vZy3LkkUdm8uTJXXqXG56ytntrsOkopeya5I5k8D4Zu+66a5c7AmDarPlt1X11u1Pbqjticnuf2j35S+19hs4vYui2sf4emTJ78fq0AxucTeW/I+2+j0Wnbty/wAagMzaV/x7Wfvazn2XFihXp6+t7xH13gfEzZ86coSXn5Sdr98EPfjD/9m//lr6+vtx///1rnJUOMFqj+Zlo6dKl2W233VYf7tY0zdL17WOz9b0AAAAAAAAAvaFpmnzxi19MkjznOc8RogObLEu7AwAA0FMGZvS3VWeFFgAAetFtt92WXXfdNX19a46QZs+enRtvvDHJ4HLjAJsqQToAAAAAAABJkvPPPz/z5s0bus/9zjvvnIcffjg33XRTPvvZz+aaa65Jkuy5555505ve1N1mATpIkA4AAMAGbclJU9uqmzJ7cYc7AQCA3rBkyZJ85CMfWevre+yxRy677LJsueWW49gVbHwefvjh/PSnPx3VuU996lOz7bbbjnFHjIQgHQAAAAAAgCTJMccck+233z7f/OY3c8stt+See+7JH//4x+y4447Za6+9cuihh+YNb3hDtthii263Chu8X/7yl5k6tb0Phz/a1VdfnX333XdsG2JEBOkAAAAAAABJ5syZkzlz5nS7ja7abbfdcsIJJ+SEE07odisAXSVIBwAAAAAAABhjT3nKU9I0TbfbYJQ263YDAAAAAAAAALAhEaQDAAAAAAAAQEWQDgAAAAAAAAAVQToAAAAAAAAAVATpAAAAAAAbgAkTJiRJVq5cmaZputwNAMD4a5omK1euTPLnn426RZAOAAAAALAB2GKLLZIM/gL5gQce6HI3AADj74EHHhj6QOHqn426RZAOAAAAALABmDRp0tD+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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(12,8))\n", + "order = list(dataset_type.keys())\n", + "d = df[df.model_arch==\"ViT-B-32\"]\n", + "ax = sns.barplot(\n", + " x=\"dataset\", y=\"acc1\", \n", + " data=d,\n", + " order=order,\n", + " hue=\"model_fullname\"\n", + ")\n", + "ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)\n", + "ax" + ] + }, + { + "cell_type": "markdown", + "id": "9056c48c-4070-4501-a91a-da050f812217", + "metadata": {}, + "source": [ + "# Accuracy averaged over all models for each dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "809fc438-1f91-4c73-bdc2-e72b72abc11b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(12,8))\n", + "order = list(dataset_type.keys())\n", + "ax = sns.barplot(\n", + " x=\"dataset\", y=\"acc1\", data=df,\n", + " order=order\n", + ")\n", + "ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)\n", + "ax" + ] + }, + { + "cell_type": "markdown", + "id": "5f582a8a-edf7-47fe-8a39-853dc2aa8ec5", + "metadata": {}, + "source": [ + "# Average accuracy on each dataset type for each model" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fa560e49-85d1-48c9-8cb8-93c75efde4ff", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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PJhsv+3btxuxbN++XZL0008/qVmzZnJzc1OuXLlUsWJFjRgxQteuXbMZw969e/XRRx/Jw8NDRYoUkaOjo/LmzavnnntO/fv317Fjx2z2HzNmjBELAAAAAAAAAABARqG0O5BF9OrVSzt37lRMTIyWLl2q//znP8m2Xbp0qWJiYox+eHj79u3TzJkz5ejoqJkzZ2bKHD/++KP69u2ryMjIRO+fOnVKp06d0ty5czV+/HiNHDkyxbHGjh2b5EGJ06dPa/r06Vq4cKF++eUXNWrUKNn+48eP17hx44z7yHKM06dPa8GCBfr44481duxYm3HExsaqe/fuWrJkSaL3T5w4oUmTJmnVqlXauXOnihQpkqSvn5+ffH19k7wfHR2t48eP6/jx45ozZ46+++47vfPOOzbjAAAAAJDY16su2TsEq4Z2SPrfBgAAAACQFbEiHcgiOnfurFy5cklKubx7wnlnZ2d16tQp02N70kVHR6tPnz6Ki4vT8OHDValSpQyfY+3atfLx8VFkZKRcXFw0evRo7dy5U3v27NHkyZPl6uqq2NhYffjhhykm8teuXasxY8aoYsWKmjt3rgIDA7V582b169dP2bJl061bt/Tqq6/qzJkzVvt/8skn+uSTTxQTE6OXXnpJP/zwg/bs2aP9+/dr8eLFql+/vsxms8aNG6epU6fajOWTTz7RkiVL1L59e61cuVIHDhzQunXr1KZNG0nxDwkMGTLEat+YmBjlz59f3t7emjdvnnbu3KmDBw/q119/1bhx44zPZODAgdq6dWsqPmUAAAAAAAAAAICMwYp0IIvImzev2rVrp2XLlunAgQM6fvy4KleunKTdsWPHjLLb7du3V548eR51qE+cSZMm6ejRoypbtqxGjRqV4eNHR0erX79+MpvNcnFx0c6dO1WjRg3j/IsvvqjXX39d9evX18WLFzVs2DB5eXnJ1dXV6nj79+9XrVq1tGPHDrm4uBjvN2vWTA0aNFCvXr0UERGhYcOGafny5Yn6BgYGasKECZKkjz76SOPHj090vnbt2urSpYu8vb21aNEijRo1Sj179lS+fPmsxrJ79259+umnST63li1bqmXLltq4caP8/f313Xffyc3NLVGbVq1aqVu3bnJ2dk70fs2aNdWmTRsNHjxYjRo10p9//qnRo0eradOmVmMAAAAAAAAAAADIaKxIB7IQyzLt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e5Iq/3v8rdlsjrY8aTKZfCTN//flWLPZPMbWnCaTqYqkmv++XG82m8Me4hKypNBpb9o7hExTYuC8TBm3V69emj17tiRp4cKFatKkSar7Llq0yDju2bNnhseW0WJiYnT16lX9/vvv+v333/X111/r559/1osvvvhQ4y5cuDBDV2T/+eef6t69u4KCEu+8EB4ervDwcAUFBcnf319eXl4ZNufTbM6cOerfv79iY2OTnLt8+bI2bNigDRs2aPLkyfL399fzzz+fpvGPHDmib775Jk19zGaz3n77beP3ZoLz589r1apVWrVqlfr27atZs2ax2jsTXbhwQSNHjkxzv3Hjxmns2LGKi4sz3rt06ZIuXbqkDRs2aMmSJfrpp5/k5OSU7Bjh4eFq06aN9u3bl+j94OBgBQcHy8/PTzNmzNCbbz65f++lxrlz59SxY0er565du6Y9e/Zoz549+vrrrzVjxgz16tUrSbuwsDBVrlxZ4eHhSc7dvHlThw4d0qFDhzR16lR9+eWX+s9//pPh1wEAAAAAAAAAD3pqE+n/+o/iy7XnkrTRZDJ9pvhV57kkdZHU9992JyRNzoD5vC2OF2TAeHgCNGjQQOXKlVNwcLD8/f01ffp05cqVK8V+9+7d04oVKyRJFStWVL169YxzZrM5SfujR48mO5avr6/279+fYrvixYunGJetOaOiovTPP/9o4cKFWrNmjS5fvqw2bdro77//lqura5rGtmR5vTly5FDVqlUVExNj81qS8+eff6pJkya6du2aHB0d5evrq1atWqlEiRK6ceOGzpw5oy1btmjnzp3pjheJXb58WbGxsXJ0dNSrr74qT09PVa5cWXny5FFwcLDmzJmjjRs36uTJk2revLkOHjyoEiVKpGrsuLg49enTRzExMSpUqJCuXLmSqn4fffSRkUSvWbOmRowYYfw+/fLLL3Xo0CHNnj1bbm5u+vTTT9N97ZltzJgxj/UWDwMHDtStW7fS9N398MMPGj16tCSpXLly+vDDD1WtWjVduHBB3377rbZt26ZffvlFvXv3TvQwkqXY2Fh17NjRSKJ37NhRffr0UYECBbRv3z59+umnunLlivr27avixYurRYsWGXPBj6lChQqpSZMmqlOnjkqXLq2iRYsqR44cOn/+vNauXavFixfrzp078vHxkZubm1q1apWof2RkpJFEr1Gjhtq1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t3PnziTtrClSpIgqVKggSdq1a5fN2M6dO6c6depo7NixCgoK0p07d3TlyhWtX79ejRo10vLlyyVJf/75p2rVqqUJEybo2LFjunv3rq5du6Y1a9aofv362rp1q8150iMmJkbvvPOO6tWrpx9++EEnT57UnTt3dPfuXf3999+aMWOGqlSpojlz5qR7jitXrhixu7q6qmDBgukaJy1/BgAAAAAAAADAw+L/QgJZROfOnY0S0imVd0847+zsrE6dOmV6bJnhq6++Mo7btm1rx0ji7d271ziuX7++AgIC1KJFC+XJk0fly5dXsWLF5Obmpt69e+vMmTMZNu/du3fl5eWlmzdv6oMPPtDvv/+uffv26bvvvjNKmX/77bf6+uuvM2zOtLh8+bJ8fX0VFRWlQoUKady4cdq4caMOHjyo3bt3a9GiRerbt2+SEtoZLTo6Wnv27JEkFSpUyGap7xs3bug///mPpPjy3rZKxj/IctV0pUqVbLa1PJ+W1dapFRMTo/z588vb21vz5s3Tzp07dfDgQf36668aN26cXF1dFRsbq4EDB6Y7wbp27Vr5+PgoMjJSLi4uGj16tHbu3Kk9e/Zo8uTJxhwffvhhikntDRs2aPDgwapSpYrmzZunwMBA/f777xoyZIiyZcumu3fvqmfPnoqKikp2jOjoaPXp00dxcXEaPnx4it+BpZMnTxoPGD3Md5eee+DcuXO6c+dOsu28vLwUGhqqkSNHaseOHQoMDNQ333yjvHnzKjY2Vm+99ZZOnz6tV199Vffu3dOECRO0a9cu7du3T2PHjpWjo6MiIyON34sZ6a233jK+21atWmnRokUKCAhQYGCg5syZoypVqig6Olp9+/bVL7/8kupxIyMjdfr0ac2ZM0cvvfSSrl+/LknG78302LFjh3GclnsDAAAAAAAAANIju70DABAvb968ateunZYtW6YDBw7o+PHjqly5cpJ2x44d08GDByVJ7du3V548eR51qKkWFBSU6HVUVJRCQkK0aNEirVq1SpLUqVMntW7d2h7hJWJZInvv3r0aPHiwkZRLcO3aNc2dO1crVqzQ6tWr1ahRo4eeNywsTDdu3NDmzZsTjVe3bl29/vrrqlevnkJDQ/Xxxx+rR48eKlSo0EPPmRZr1641EoRbtmxJsm98/fr11b17d3377beZVt5ckmbPnq2rV69KSlwxwJoR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+R6F3r1765lnnpEU//s5PDw80fnY2Fi98847xvYMCdf2oIT3r127phEjRiQ5HxwcrM8//1xS/AM1j2MiXZI++ugjSdL9+/fVsWNHhYWFJds2MjJSM2bM0P379xO9v3TpUuNBi+T89NNP+v777yVJzzzzjNq2bZukzdmzZ9W8eXNdvnxZDg4OWrJkSZb4ewEAAAAAAADA04s90oEsqm3btsqXL59u3LhhlHnOmzevsVr2cRAUFJTodVxcnMLDw7Vz50599913RpKre/fuNvchTg3L1aGSjHLokvTbb78pJCTEeP3ss88mKt+coHPnzlqwYIHWrVunWbNm6dy5c+rbt69Kliyps2fPatasWfrtt98kxZdFHjhw4EPFLMXvG+zs7KxXXnlFQ4YMUevWrZUzZ04FBATos88+04ULFyTF7+mdsBd0amXPnl19+/bVF198oaCgIDVt2lQjRoxQqVKldOnSJS1fvlwLFixQ/fr1tWfPHqtjLF26VK+99ppeeeUVeXp6Gsn5iIgIBQUFadq0aUbJ5v79+6frM/j555/Vp08fmc1m5c2bV99++63CwsJsJvXKlCmTaXtSV6hQQcOGDdMXX3yh/fv3q0GDBnr//fdVrlw5BQcHa+LEiUap8+HDhydKemeUFi1aqFChQrpy5YpGjRqlM2fOqG3btnJ1ddWpU6c0Z84cbdmyRQ0aNNAff/yRrjly5Mih2bNn67XXXlNERIQaNmyo4cOHq1mzZsqePbt2796tL774wij7/tVXX8nV1TUjLzPDFShQQBMnTtTbb7+tM2fOqF69eho1apSqVaumCxcuaMqUKdq2bZskqWvXrmrSpInVcby9vTVv3jz98ccfmj59ui5duqQ+ffoof/78CggI0Pjx43Xr1i1ly5ZNU6dONR68eNx07dpVGzZs0IIFC3TgwAE999xz6tevnxo3biw3NzfduXNHwcHB2rlzp1auXKlr164leZjr+++/V9++fdW+fXs1atRIFStW1DPPPKM7d+7o77//lr+/v9atWycpvuLDt99+m+QhmfDwcDVv3lznzp2TJL333nuqVKlSkr9DLOXPn/+ht9YAAAAAAAAAAFsez//zCzwFnJyc5OXlpTlz5hjveXl5PdL9oh9WcuV7Lb3xxhuaO3fuQ89la6XsxIkTE7329va2mkiXpP/+9796/fXXtXHjRq1du1Zr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TR06dEgbNmzQ3bt3re75HRERoU2bNkmSypUrp6JFi6ZpnubNm2vUqFGSpLlz56pOnTpW2+3Zs0fHjh0z+iTn2rVr+uWXX9ShQwer5+fNm5dobktt27bVzJkz9c8//8jf319eXl5pupaMYvkggK092GfNmvUowgEAwBA67U17h2Cdk70DAAAAAAAAePKxIh3Iory9vSXFJxm7dOliJBsfdVn3zHLmzBnNmDHDeN26dWs7RhPvgw8+kCTduHFD7733ntU2Q4YMUUREhCTp7bffTvMcdevWNZLnP/zwg5GUt3Tz5k3169dPkpQtWzZjL/nkDB061GqJ9x07dmj27NmSpNq1aydJ2g8fPlw5c+Y0riWlFd/r1q3Tn3/+abNNepQvX944XrBggdU2M2fO1M8//5zhcwMAAAAAAAAAAFjDinQgi2rbtq3y5cunGzduGKWv8+bNq3bt2tk5stQLCgpK9DouLk7h4eHauXOnvvvuO4WHh0uSunfvrho1ajzUXH5+foleHz582Dj+7bffFBISYrx+9tln1bBhwyRjdO7cWQsWLNC6des0a9YsnTt3Tn379lXJkiV19uxZzZo1S7/99pskqWbNmho4cGC6Yp09e7bq1aunqKgotWnTRoMGDdJrr70mFxcXHTp0SF988YX++ecfSdKwYcNs7l9evXp1HTt2TLVr19bIkSNVt25dRUZGat26dfrmm2+MfdinT5+epG+ZMmU0a9Ys+fr66tq1a2rQoIF69uypV199VaVKlVJMTIxCQ0MVEBAgf39/BQcH65dfftHzzz+frutOTs2aNVW1alUFBQVp5syZunHjhrp3766iRYvq3LlzWrRokfz9/dWgQQP98ccfGTo3AAAAAAAAAACANSTSgSzKyclJXl5emjNnjvGel5eXcuXKZceo0qZatWoptnnjjTc0d+7ch57L19c32XMTJ05M9Nrb29tqIl2S/vvf/+r111/Xxo0btXbtWq1duzZJmzp16mjNmjVyckpfXdUaNWrol19+kZeXl27duqWvv/5aX3/9dZJ2AwYM0Oeff57iWAMHDlT//v2tJvYdHR21YMEC1atXz2p/Hx8f5cqVS3379tWtW7c0d+7cZL+PbNmyKXfu3Km4wrQxmUxauHChmjZtquvXr2vp0qVaunRpojbVqlXT8uXLVaxYsQyfHwAAAAAAAAAA4EEk0pGh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tm1ky5YNg8FA6dKluXDhgl3jiIiIiIiIiIiIiEjqUGl3kQzC29ubXbt2YTQa8fX15eOPP06wr6+vrzkh+aITu6+a/fv3M3XqVJydnZk6deoLn79q1apWE2rh4eFs3ryZzZs3M23aNDZs2EDBggXtmuP27du0aNGC33//Pc75mzdvEhAQQEBAAJMmTWLjxo3xHtqwFleTJk04evRonPNBQUEEBQWxefNmVq9eTaZM9j3HFRkZaT5ObIyoqCi8vLz47bff4pw/duwYx44dY9GiRWzbto1ChQrZFYs148eP57PPPiM6OjrO+cuXL3P58mUOHTrElClTuH//Pm5ubska+/Hjx+YV5JkyZaJ06dJ2xZiczxDgm2++ifcQRmhoKJMnT2bhwoWsW7eOevXq2RVLYkJDQ3n33XfjJPwfPnxIYGAggYGBrF69Gl9f32RXn7h//z6rV68GoFixYgnGf/v2bQAKFChgczzL9sDAwAQT8wlZtWoVHTt2JDIykipVqrBp0yby58+frDFEREREREREREREJHVpRbpIBtG+fXuyZMkCJF7ePbY9a9astG3bNs1je1U9ffqUXr16ER0dzeeff07ZsmVfeAzPnj2jZs2afPfdd6xfv56goCB+//13Fi1aZF4Fe/jwYXNpaXvGb9asmTmJXr9+fZYvX05wcDBr16417xt98uRJGjVqxIMHD2yO98EHH3Dy5En+/e9/s2XLFg4ePMiSJUsoV64cAOvWrWPmzJl2xQoxScpYif08/ve///Hbb7/h6enJqlWrCA4OZtWqVbz77rvme/Ly8krxKvlYx44dMyfRS5QowdixY9m2bRuHDx9m165dzJkzh65duyYrgf706VMuXrzI0qVLqV27NmfOnAGge/fuZMuWza44k/MZ+vv7M2LECMqUKcPs2bMJCgpi69at9OnTh0yZMnHv3j2aNWuWZqunO3ToQGhoKH379mXr1q0EBQUxe/Zs80MEfn5+DB48ONnj+vn58ejRIyDmYaSESuHHVgC4e/euzfEs20+cOJGsWObOnUu7du2IjIykbt26BAQEKIkuIiIiIiIiIiIikgFoRbpIBpE9e3ZatmzJ0qVLOXjwICdPnjQnHy2dOHGCQ4cOAdCqVSu7k2kvSkhISHqHYLeff/6Z48ePU7JkSb788st0iWH79u1WS0rXrl2bzp07M3fuXD766CMC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FsdJKdceu7I8KWXgE5on1GQy2ap3u8niuHoy5xERkRTq1q0bJpPJrpfEKF68uN2foVaji4iIiIiIiIiIiEhG8kom0k0m0xPg5t9vi9jqazAYcvH/E+mXkjmVZf/ENt617Js/mfOIiIiIiIiIiIiIiIiIiEgqeSUT6X87+fd/3zQYDLZK3Je1ck1S/WFx7JBIX8t2YzLnERERERERERERERERERGRVPIqJ9J3//1fV8DdRr/6Fse/J2cCk8l0Abj499s3Eulu2R6WnHlERERERERERERERERERCT1vMqJ9NUWx92tdTAYDJkA77/f3gF22DHPir//W8BgMNS20e8Di+NddswjIiIiIiIiIiIiIiIiIiKp4JVNpJtMpgP8/4R1D4PBUMtKt0+Bcn8f/5/JZHpq2WgwGLoZDAbT368RCUw1AXjy9/EvBoPB9fkOBoOhC9Dg77f+JpMpsf3URUREREREREREREREREQkjbyyifS/fQw8BhyBzQaD4QuDwfAvg8HQ0GAwTAd++rvfX8BYeyYwmUwXga//fusOHDAYDD4Gg8HdYDC8YzAYJgHz/m6/B/zHznsREREREREREREREREREZFU4JjeAaQnk8l02GAwdAAWAdmBUVa6/QV4mUym+ymY52eDwZAbGAq8xf9PnFu6DrQymUyn7Z1HRERERERERERERERERERS7lVfkY7JZFoHVALGE5M0f0TMfujBxCS+q5pMpjOpMM8XgAewEDgPRAJ3gSDgK6C0yWTam9J5REREREREREREREREREQkZV7pFemxTCbTBWDw36/kXDcP66vLE+q/F1CyXEREREREREREREREREQkA3vlV6SLiIiIiIiIiIiIiIiIiIhYUiJdRERERERERERERERERETEghLpIiIiIiIiIiIiIiIiIiIiFpRIFxERERERERERERERERERsaBEushLyGAwYDAYGDFiRHqHIlZ069YNg8FA8eLF02yO4sWLYzAY6NatW5rNkVGcP3/e/J2fN29eeofzj5We35l58+aZf4bnz59/4fOnhREjRpjvSURERERERERERET+eZRIF0lnffr0MSdbduzYkaxrt23bZr524MCBNvvG9kvJKykJrgYNGiR4vZOTE/ny5aN+/fr89NNPREREJOt+E3Ly5EkmTZqEj48P1apVo0iRIri4uODq6krJkiXp0KED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iIgFrUgXEZFXVoMGDTCZTOkdxj+ePkMRERERERERERERedloRbqIiIiIiIiIiIiIiIiIiIgFJdJFREREREREREREREREREQsKJEuIiIiIiIiIiIiIiIiIiJiQYl0ERERERERERERERERERERC0qki4iIiIiIiIiIiIiIiIiIWFAiXURERERERERERERERERExIIS6SIiIiIiIiIiIiIiIiIiIhaUSBcREREREREREREREREREbGgRLqIiIiIiIiIiIiIiIiIiIgFJdJFREREREREREREREREREQsKJEuIiIiIiIiIiIiIiIiIiJiQYl0ERERERERERERERERERERC0qki4iIiIiIiIiIiIiIiIiIWFAiXeQlZDAYMBgMjBgxIr1DESu6deuGwWCgePHiaTZH8eLFMRgMdOvWLc3myCjOnz9v/s7PmzcvvcMREREREREREREREZGXgBLpIumsT58+5iTgjh07knXttm3bzNcOHDjQZt/Yfil5nT9/PtGYGjRokOD1Tk5O5MuXj/r16/PTTz8RERGRrPtNyMmTJ5k0aRI+Pj5Uq1aNIkWK4OLigqurKyVLlqRDhw6sWbMGk8lkc5yLFy8ydepUOnToQJkyZXB1dcXFxYUiRYrQsmVLfH19MRqNqRKzxDAajWzZsoXPP/+cunXrki9fPpycnMiZMyfVqlXjs88+4+zZs+kd5gtx/fp11q9fz9dff837779P3rx5zb879j4QceDAAfr370+5cuXInj07bm5uvPHGG3h5eTFu3Dhu3LiRujchIiIiIiIiIiIiIvKScEzvAOTl4rViZnqHkGb82/RKk3G9vb2ZMWMGAAsXLqRhw4ZJvnbRokXm465du6Z6bKnNaDRy8+ZNdu7cyc6dOxk3bhyrV6/mX//6V4rGHTlyJIsXL7baFhoaSmhoKMuWLaN+/fqsXLmS3Llzx+v39ddf8/3331tNtoeFhREWFsbatWsZN24cK1as4PXXX09RzAI3btygXLly3Lp1K17b3bt3OXz4MIcPH2bixIn89NNPfPzxx+kQ5YtToECBVBsrMjKSgQMHMnv27Hjf6XPnznHu3Dk2bNhAyZIladWqVarNKyIiIiIiIiIiIiLyslAiXSSdeXh48MYbb3D27Fn8/PyYPHkyWbJkSfS6x48fs2LFCgDKlClDzZo1zW3WksHHjx9PcKzu3bsT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unWcvs+XhbdUokQJcyLQWpulunXr0q9fP9q1a8f69eupXr06e/bsoUiRIgmOb+n+/ft4eXlx+fJlICa5+8477yTp2pT4/fff+eWXX9i6dWuclcbPu3nzZrLGPXfuHI8ePQJiSsXbYtlu6+dha9/y3Llzm49jV5YnxeLFi/nqq68AKF68OEuWLCFTpsSf/apevbrN9ho1apiPQ0JCzPu42ys4ONh8nJyxrl27lqJ5rXFxcYnzfuTIkfHOQUzFg379+jFmzBhu3LjB1q1bad68earHIyIiIiIiIiIiIiLyT6YV6SIZTOyKWYhf3j29yrqHhYXFK9Nu+QoLC0vSOJkyZSJ//vx88MEH7N69m9KlSxMZGUm3bt2IiIiI09fWfEFBQcmK38XFhblz55I1a1YuXbrEkCFDknTdkydPaNmyJQcPHgRg8ODBDBs2LFlz22PEiBHUqVOHZcuW2UyiA8leTWw5XoECBWz2LViwoNXrnmdrdb5l8vvZs2dJCRF/f3+6d++OyWSiQIECbNmyJU4stuTPn99mu+U9J/bZJsX169ftui72YYbUlC1bNvOxs7Ozzf3kmzRpYj5O7u+TiIiIiIiIiIiIiMirQIl0kQymYsWKVK5cGQA/Pz9zovTx48esWLECgMqVK1OpUqV0izE1uLm50a9fPwDu3buHn59fms6XN29ePDw8AFizZg1Go9Fmf6PRSPv27dmxYwcAPXv2NO+FnZa2bdvGN998A0DJkiWZMmUKx44d486dOxiNRkwmEyaTybxaOyUMBkOKx0htAQEBtG3blqdPn5IrVy42b97Mm2++meTrE7un56skpJTlwwEBAQEcP348Sa/Y735qsizTX6BAAZydnZPU196HAUREREREREREREREXmYq7S6SAfn4+DB48GDu3bvH2rVr6dChA2vWrOHevXvAi12NDjGltVM7AQlxS4IfP348TltazBe7r/ijR4+4ceOGeT/650VHR9O1a1fWrVsHQIcOHZg+fXqqx2PNzJkzAciZMyd79+5NcIX18yv4k8qy1Hpi5cUt2y2vSysHDhygefPmPHnyBDc3NzZu3JjsB0bCw8NttlsmjVPjnvLkyWM+dnZ2pkKFCike016lSpXCycmJp0+fJrr637Ld0VH/FBAREREREREREREReZ5WpItkQJ06dTInt2LLucf+N3Yf9ZeB5arwp0+fpvl8liXo3dzcEuzXp08fli5dCkCzZs1YuHBhkvbnTg1//PEHAO+8847NMuWWe3MnR8mSJc2l2Pfv32+z74EDB8zHaZ0gPnbsGO+99x4PHjzAxcWFdevWJbqHuzWJlSm3bE+Ne6patar5ePPmzSkeLyWcnJzM+7SHh4fz8OHDBPuePXvWfFy4cOE0j01ERERERERERERE5J9Gy9BEMqACBQrg6enJhg0b2LRpEyEhIeYknaenZ5L3i87oLJOalqWm00JYWBh79+4FoFixYnH2k7Y0ePBgZs2aBUCjRo3w8/PDyckpTWOzFPtwga09tI8cOcK+ffvsGt/R0ZH69euzceNGtmzZwqVLlxL87GM/BwcHBxo0aGDXfEnx119/4enpSUREBE5OTqxYscLu+TZv3szVq1etVhuIjo5m/vz5AOTKlYtq1aqlJGwA6tSpQ+7cubl9+zbTpk3jP//5D9mzZ0/xuPZq06YNO3fu5NmzZ6xZsybBh25WrlxpPq5bt+6LCk9EREREREREROSFa7PiQOKd0oFHptfTOwQRSYRWpItkUD4+PkBMYvXDDz80J1hfdFn3tHLhwgWmTJlift+0aVO7xvnrr7/Yvn27zT53796lY8eOREVFAdC1a1er/UaMGMH48eMBqF27NmvWrCFz5sx2xWWvUqVKAbB7927OnTsXr/3GjRt06dIlRXMMGDAAiKkC8NFHH5k/F0tz5swxP7zRpk2bBMvgp9TFixdp3Lgx4eHhODg4sGTJEru/CwCRkZH06dPHamnzH3/80byFwEcffZQqP1sXFxc+++wzIKYU/ocffmhzJfj9+/eZNGlSiudNyEcffWSuZPDf//7Xaqn7gIAAc4WLChUq4OHhkWbxiIiIiIiIiIiIiIj8U2lFukgG1aJFC3LmzMmdO3fM5b6zZ89Oy5Yt0zmypAsJCYnzPjo6mlu3brFr1y5++eUXbt26BUDnzp2pUqWKXXNcuXKFRo0aUblyZVq1aoW7uzsFCxbE0dGRa9eu8fvvvzN79mzzft8VKlRg2LBh8caZOHEi33zzDRBT6vqnn34iNDTU5txlypRJ9dXq3t7erFu3jgcPHlC/fn2GDh2Ku7s7JpOJPXv2MG7cOK5du0atWrXMK+yTy8vLi3bt2rF8+XK2bt1KzZo1+fTTTylXrhwREREsXbqUOXPmADH7iI8bNy41b9Hs1q1bNG7cmEuXLgHw6aefUrZs2XjfG0u5cuWyWYr87bffZt26dXh4ePCf//yHUqVKcf36debPn28u11+kSBG++uqrVLuPIUOGsG3bNrZt28bGjRt566236Nu3L7Vq1SJnzpzcv3+fU6dOERAQwOrVq3FxcWHgwIHxxtm9ezdnzpwxv79586b5+MyZM8ybNy9O/27dusUbw83NjV9++YWOHTty4cIFqlevzrBhw6hRowZPnjxh48aNjB8/nmfPnuHo6Mi0adMwGAyp9lmIiIiIiIiIiIiIiLwslEgXyaBcXFxo164dM2fONJ9r164dWbJkSceokqdixYqJ9unQoQOzZ89O8VxHjx7l6NGjNvt4eXkxd+5cXF1d47WtWLHCfBwWFkadOnUSnTM0NJTixYsnO1Zb2rZtS/fu3Zk7dy6XL19m0KBBcdodHBwYP348ERERdifSARYsWIDRaGTVqlUcOXLE6ir91157DX9//zTbQ/v48eOcPn3a/P6nn37ip59+snmNj49PvISypQEDBhAYGMi8efP48MMP47UXKlSITZs2kSNHDrvjfp6DgwPr1q2jb9++LFiwgIsXL/Lf//43wf6xK8afN2vWLHPp+ef9/vvv/P7773HOWUukQ8zv1M2bNxk8eDCXLl0yVyCw5ObmxqJFi7QaXUREREREREREREQkAUqkS6ryb9MrvUN4qfj4+MRJpP/Ty7obDAbc3NwoWrQotWrVwtvbm3r16qVoTA8PDwIDA9m+fTu7d+/m4sWLhIeH8+jRI7Jnz06JEiWoWbMmnTp1+sckDefMmcM777zDjBkzOHLkCFFRURQsWJB69eoxcOBAatSowYgRI1I0h4uLCytXrmTdunXMmzePffv2cfPmTVxdXSldujStWrVi4MCBuLm5pc5NvUBz587F09OTGTNmcPz4cR48eECxYsVo1aoVw4YNI1euXKk+Z5YsWZg/fz7//ve/mT17Njt37uTy5cs8fPgQNzc3ihcvjru7O++//z7NmjVL9fmfN2DAABo0aMDkyZPZsmULYWFhODg4ULJkSd577z0++eSTNCvXLyIiIiIiIiIiIiLyMjCYTKb0jkHSmMFgKAJcArh06RJFihRJ8rWnT5/GaDTi6Oho3rtZRERE5FWifw+lvRtTF6V3CFZFPtue3iFYddolPL1DsOqC09P0DsGq01kzpXcIVh12qpbeISTI8KxEeodgVSZT3vQOwSpnQ9pUcEopj0yvp3cIVlV76JDeIVhV5ooxvUNIUCaXs+kdglUF/p14JTd5eWTUf6/l69clvUOwascsr/QOwaqGPf3TOwSrvlz+XnqHYFVG/vfahlaj0juEf5Q2Kw6kdwhWZdR/rw1uXTC9QxCxy+XLlylatGjs26Imk+lySsfMmP+PgoiIiIiIiIiIiIiIiIiISDpRIl1ERERERERERERERERERMSCEukiIiIiIiIiIiIiIiIiIiIWHNM7ABERkfTy8OFDQkND7bq2TJkyODk5pXJEIiIiIiIiIiIiIiKSESiRLiIir6ygoCAaNmxo17WhoaEUL148dQMSEREREREREREREZEMQaXdRURERERERERERERERERELGhFuoiIvLIaNGiAyWRK7zBERERERERERERERCSD0Yp0ERERERERERERERERERERC0qki4iIiIiIiIiIiIiIiIiIWFAiXURERERERERERERERERExIIS6SIiIiIiIiIiIiIiIiIiIhaUSBcREREREREREREREREREbGgRLqIiIiIiIiIiIiIiIiIiIgFx/QOQERERERERERERERERETknyj8l93pHYJVBf5dJ71D+MfTinQRERERERERERERERERERELSqSLiIiIiIiIiIiIiIiIiIhYUCJdRERERERERERERERERETEghLpIiIiIiIiIiIiIiIiIiIiFpRIFxERERERERERERERERERsaBEuoiIiIiIiIiIiIiIiIiIiAUl0kVeQgaDAYPBwIgRI9I7FJEXZt68eebv/vnz59M7HBERERERERERERER+QdTIl0knfXp08ec/NuxY0eyrt22bZv52oEDB9rsG9svJa+kJCcbNGiQ4PVOTk7ky5eP+vXr89NPPxEREZGs+03IyZMnmTRpEj4+PlSrVo0iRYrg4uKCq6srJUuWpEOHDqxZswaTyWRznIsXLzJ16lQ6dOhAmTJlcHV1xcXFhSJFitCyZUt8fX0xGo2pErOIiIiIiIiIiIiIiIhkXI7pHYC8XJr7rUrvENLMurat02Rcb29vZsyYAcDChQtp2LBhkq9dtGiR+bhr166pHltqMxqN3Lx5k507d7Jz507GjRvH6tWr+de//pWicUeOHMnixYuttoWGhhIaGsqyZcuoX78+K1euJHfu3PH6ff3113z//fdWk+1hYWGEhYWxdu1axo0bx4oVK3j99ddTFLOIiIiIiIiIiIiIiIhkXEqki6QzDw8P3njjDc6ePYufnx+TJ08mS5YsiV73+PFjVqxYAUCZMmWoWbOmuc1aMvj48eMJjtW9e3eCg4MT7Ve4cOFE47I1Z1RUFOfOnWPhwoWsXbuW8PBwvLy8OHXqFHnz5k3W2JYcHR2pWbMmHh4eVKxYkYIFC5IvXz4iIiL4888/mT59OiEhIQQGBtK8eXN27dpFpkxxC3JcuXIFk8mEq6srrVu3plGjRpQqVQoXFxdOnjzJL7/8QlBQEMHBwTRu3JhDhw7h5uZmd8yS+rp160a3bt3SOwwREREREREREREREXkJKJEukgF4e3szfPhw7t+/z5o1a/jwww8TvWb16tXcv38fSNpq9AoVKiTY5urqmqR+yWVtrGrVqtG2bVt8fHxYsGABt2/fZvbs2QwdOtTueWbNmoWjo/U/Z40bN6Zfv360b9+elStXsmfPHvz9/WnevHmcfnny5GH06NH069ePbNmyxWlzd3enY8eOdOrUiWXLlnH69GnGjx/PV199ZXfMIiIiIiIiIiIiIiIiknFpj3SRDKBr164YDAYgprx7UsT2MxgMdOnSJc1iSytDhgwxH+/fvz9FYyWURI/l4OAQZ76dO3fG6zN69GiGDBkSL4luOcaUKVNwdnYGwM/PLwURi4iIiIiIiIiIiIiISEamRLpIBlCiRAnq1KkDwObNm7l+/brN/uHh4WzZsgWA+vXrU6xYsTjtBoMBg8HAiBEj0iTe1FC8eHHz8ZMnT9J8PstV9/bOlydPHipVqgTA2bNnUxzTjRs3+N///kfVqlXJmTMnLi4uFC9enK5du7J7926b1xYvXhyDwWAuZR4UFETHjh0pWrQoLi4uFC1alG7dunHy5MkkxXL58mW++OILqlWrRq5cuXBxceH111+nQ4cO7NixI8Hrzp8/b/6+zZs3D4AtW7bQvHlzChYsSObMmSlRogT9+vXj8uXLNmMICQnh+++/p0mTJhQpUoTMmTPj5uZGqVKl8PHxYd++fTavnzdvnjmW8+fPJ+m+RURERERERERERERErFEiXSSD8Pb2BsBoNOLr62uzr6+vL0ajMc51/zSWic7XX389zeez/EzLli1r9ziRkZEA8fZYT67Nmzfz5ptvMnLkSI4cOcLdu3eJjIzkwoULLFq0iLp16zJw4ECio6MTHWvOnDnUrl2bpUuXcvnyZSIjI7l8+TLz58+natWq/Prrrzavnz17NqVLl+bHH3/k8OHD3Llzh8jISC5dusSyZct455136Nmzp/k7Z8uwYcPw9PRk/fr1hIeHExUVxfnz55k2bRrVqlVLMLEfEBBAxYoV+eqrr9i8eTNhYWFERUXx8OFDzpw5w4IFC6hVqxZffPFFojGIiIiIiIiIiIiIiIiklBLpIhlE+/btyZIlC5B4effY9qxZs9K2bds0jy0tjBkzxnzcokWLNJnj5s2b7N27lx49evDDDz8AMavKO3fubNd4169fNyeCU5KMP3LkCM2bN+fevXs4OTnxySefsGPHDg4cOMD06dMpUaIEAJMnT040cXzkyBH69u1L/vz5mThxIvv37ycwMJChQ4eSOXNmIiMj6dKlCwcOHLB6/Zw5c+jZsyePHz+mQoUKTJw4kd27d3Po0CFWrFhB06ZNAZK0j/3MmTMZPXo09evXZ8mSJQQHB7N161bzwx43btzgo48+snqt0WjE1dWV9u3bM23aNAICAjh06BC//fYbY8eONVdd+PHHH5k7d67NOERERERERERERERERFLK9sbCIvLCZM+enZYtW7J06VIOHjzIyZMnKVeuXLx+J06c4NChQwC0atUqwT29M4KQkJA472NXJy9atIhVq1YB0LZtW3OyNjU0aNCAwMBAq225c+dm5cqV5MyZ066xf/75Z/Oq7Pbt29sbIr179yYqKgoHBwfWr1+Pp6enua169eq0a9eOOnXqcOLECcaMGYO3tzfly5e3OtbRo0cpVqwY+/bto2DBgubz9erVo0mTJnh6emI0GhkwYABBQUFxrr106RKDBg0CwMfHh1mzZsXZb75q1ap88MEHfPnll4waNYoJEybQp08fSpcubTWWPXv20KtXL6ZPn47BYDCfb9SoEc7OzsyaNYt9+/Zx+PBhqlatGufaKlWqcPnyZas/myZNmjBw4ECaNWvGli1b+Oabb/D29sbBwSGBT1hERERERERERERERCRltCJdJAOxLNOe0Kp0y/MZvax7xYoV47zc3d1p06YNq1atonTp0syaNSvRsuOpZdCgQZw8eZJ69erZdf3+/fuZMGECAEWKFKF///52jXPgwAFzQrtnz55xkuixcuXKxYwZMwCIjo5mypQpNscc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BSXSRURERERERERERERERERELCiRLiIiIiIiIiIiIiIiIiIiYkGJdBEREREREREREREREREREQuO6R2AiIgk3/nz59M7BBERERERERERERERkZeWVqSLiIiIiIiIiIiIiIiIiIhYUCJdRERERERERERERERERETEghLpIiIiIiIiIiIiIiIiIiIiFpRIFxERERERERERERERERERseCY3gGIiIiIiIiIiIiIiIhI0nitmJneIVjl36ZXeocgIpKqtCJdRERERERERERERERERETEghLpIiIiIiIiIiIiIiIiIiIiFpRIFxERERERERERERERERERsaBEuoiIiIiIiIiIiIiIiIiIiAUl0kVERERERERERERERERERCwokS4iIiIiIiIiIiIiIiIiImJBiXQRERERERERERERERERERELjukdgIiIiIiIiIiIiIhIcl2e9FF6h2CdS3oHICIiIqlBK9JFXkIGgwGDwcCIESPSOxT5W4MGDTAYDDRo0CDN5niVfu4BAQHm+w0ICEjvcP6x0vM7M2LECPP8L4tu3bphMBgoXrx4eociIiIiIiIiIiIiIimkRLpIOuvTp485mbRjx45kXbtt2zbztQMHDrTZN7ZfSl7nz59PUlyxSeO0TJAZjUYOHz7M9OnT6dmzJ5UqVcLR0THZsSZkypQpce593rx5qRK3wJMnT1izZg2DBg2iZs2a5M6dGycnJ3Lnzk2tWrUYMWIEV69eTe8w04y/vz8jRozAy8uLcuXKkTdvXpycnMiVKxfu7u58+umnnDp1yuYYJpOJ3bt38/XXX9OoUSMKFSqEs7Mz2bNnp3z58vTv35+jR4++oDvKGC5cuMCwYcNwd3cnZ86c5u9U7dq1+e6777hx44bN6y9evMjUqVPp0KEDZcqUwdXVFRcXF4oUKULLli3x9fXFaDS+oLsRERERERERERERkfSm0u6SqtqsOJDeIaSZFW1qpMm43t7ezJgxA4CFCxfSsGHDJF+7aNEi83HXrl1TPbaMbOTIkWm2ivbKlSt88cUXaTL2q+7YsWPUqVOH+/fvx2uLiIhg37597Nu3j3HjxjFr1izat2+fDlGmHaPRSLNmzay23blzh0OHDnHo0CEmTpzIt99+y7Bhw6z2LV68OBcvXox3/unTp5w4cYITJ04wbdo0Pv/8c3788ceXatW3NUuWLKFXr148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kS4iIm+ULl260KVLl+QO47VWuHBhrc4XEREREREREZFIGq9YndwhWGVnypfcIYjIa0or0kVERERERERERERERERERCwokS4iIiIiIiIiIiIiIiIiImJBiXQRERERERERERERERERERELSqSLiIiIiIiIiIiIiIiIiIhYUCJdRERERERERERERERERETEghLpIiIiIiIiIiIiIiIiIiIiFpRIFxERERERERERERERERERsaBEuoiIiIiIiIiIiIiIiIiIiAUl0kVERERERERERERERERERCwokS4iIiIiIiIiIiIiIiIiImJBiXQRERERERERERERERERERELSqSLiIiIiIiIiIiIiIiIiIhYUCJdRERERERERERERERERETEghLpIv9BJpMJk8mEu7t7cociL7h8+bLx+sydOzdJ5pg7d64xx+XLl5NkjpSkS5cumEwmChcunNyhvLaS+z1TuHBhTCYTXbp0eeVzJxX9HRYRERERERERERF5vSmRLpLM3NzcjITLzp0743Xu9u3bjXP79OkTY9+Ifi/zk1KTsvfv32fr1q389NNPNGvWjLx58xoxOzo6vtTYz58/p3r16pGeB0k8V69eZcqUKbRp04aSJUvi4OCAvb09+fPnp2nTpixevJjQ0NDkDjPJXLt2jZUrV/LNN99Qt25dMmbMGO8EbFBQEEuWLKFHjx5UrFiRzJkzY2dnR44cOXB0dGT06NHcv38/Sa8jpdu4cWOkz3BMz63ZbGbPnj0MHTqUevXqkSdPHuzs7MiYMSNlypThs88+48SJE68ueBERERERERERERFJFqmTOwD5bxm7+mZyh5BkBjTPnSTjdu7cmenTpwMwf/586tSpE+dzFyxYYBx36tQp0WN7XVSoUCHJkvyTJ0/mwIEDSTL2m27o0KH8+OOPmM3mKG3+/v74+/uzdu1axo4dy8qVKylYsGAyRJl0rly58tKr6Ddu3Ejz5s0JDg6O0nb79m28vb3x9vZm9OjRLF68OF5/X/4rHj16RK9eveLcv3Dhwly9ejXK4yEhIZw+fZrTp08zdepUvv76a3755RfdXCMiIiIiIiIiIiLyH6VEukgyq1GjBkWLFsXX15cVK1YwadIk0qZNG+t5T548YeXKlQCULFmSatWqGW3WEpMnT56MdqyuXbty+PDhWPvly5cv1riSg+X15sqViypVqrB+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pkyZkjnilKN8+fIcP36cESNGsHHjRq5fv06GDBkoVqwYrVu3pnfv3i994wFA/fr1uXDhAr/99hsbNmzg4sWLBAcHkytXLj744AM+/fTTOCW2U5rKlStz9OhRRo8ejaenJ/7+/jg4OFClShX69etHw4YNE22uQoUKcfz4cbZu3cqOHTu4ePEiAQEBPHz4kMyZM1OmTBkaN25Mz549yZAhQ6LNm9SyZMnCvn37+O2331i6dCm+vr6YzWZKlSpF586d6dWrV6LvjW7pk08+4Z133mHcuHHs2bOH27dvkyNHDurVq8egQYMoXbp0ks39KjVq1IiVK1fSsmVLLl26RN26dfHy8iJ//vzJHZqIiIiIiIiIiIiIAKaY9naV/waTyZQfuAZw7dq1eP1P+vPnzxuldC33bxZ5WX5+fhQoUAAI36u7e/fuyRyRiIiIdfo+lPRuTVmQ3CFYFRy2I7lDsOq8fUByh2DVFduQ5A7BqvPpUiV3CFYds62Y3CFEyxQW921LXqVU5uzJHYJVdqZ8yR2CVTVSpcxqNxUfJd1NmS+j5PXQ5A4hWqnsfZM7BKty9Xv9br6WhNP3tfjR97X40fe1+NP3tfjR97X40fe1+NP3tZTBMu8EFDCbzX4vO2bK/C+UiPznWZaMfu+995IxEhEREREREREREREREZHIlEgXkUT36NEjbty4EW37sWPHGD58OACVKlWiTJkyryo0ERERERERERERERERkVhpj3QRSXS3bt2iVKlSNGvWjI8++oiSJUuSJk0arl+/zqZNm5g1axZPnjzBZDIxduzY5A5XREREREREREREREREJBIl0kUkSTx9+pQlS5awZMkSq+12dnbMmDGDWrVqveLIRP7fpUuXePToUbzPy5IlC/nypcy9lV61wMBAAgMD432enZ0dJUqUSIKIRERERERERERERERenhLpIpLo8uXLx9KlS9m4cSOHDx8mMDCQe/fukS5dOgoXLoyTkxN9+/alUKFCyR2qvOG6du2Kt7d3vM9zdXVl7ty5iR/Qa2jy5Ml8//338T6vUKFCXL58OfEDEhERERERERERERFJBEqki0iis7W1pXXr1rRu3Tq5QxERERERERERERERERGJNyXSRUTkjeXl5ZXcIbz23N3dcXd3T+4wREREREREREREREQSVarkDkBERERERERERERERERERCQlUSJdRERERERERERERERERETEghLpIiIiIiIiIiIiIiIiIiIiFpRIFxERERERERERERERERERsaBEuoiIiIiIiIiIiIiIiIiIiAUl0kVERERERERERERERERERCwokS4iIiIiIiIiIiIiIiIiImJBiXQRERERERERERERERERERELSqSLiIiIiIiIiIiIiIiIiIhYUCJdRERERERERERERERERETEghLpIiIiIiIiIiIiIiIiIiIiFpRIFxERERERERERERERERERsaBEuoiIiIiIiIiIiIiIiIiIiAUl0kX+g0wmEyaTCXd39+QORV4DXl5exnvGy8srUceeO3euMfbly5cTdexXzd3d3biW5JSUr1eElHKtIiIiIiIiIiIiIiLJRYl0kWTm5uZmJKx27twZr3O3b99unNunT58Y+0b0e5mfuCRCHR0doz3f1taWHDlyULt2bUaNGsW9e/fidb3ROXPmDBMnTsTV1ZWKFSuSP39+7O3tcXBw4K233qJNmzZ4eHhgNptjHOfq1atMmTKFNm3aULJkSRwcHLC3tyd//vw0bdqUxYsXExoamigxi0jSmjx5cqS/P3Pnzo3Tefv376dTp04ULlwYe3t78uTJw0cffcSSJUviPHdoaCjTpk2jVq1a5MiRg7Rp01KsWDE+/fRTTp8+ncAr+m8JDg5m9erVDB48GCcnJ0qUKEHWrFmxtbUlW7ZsvP/++wwdOhQ/P78YxwkNDWXr1q18/fXXfPDBB+TIkQNbW1syZ85MxYoV+eqrr/D19X1FVyUiIiIiIiIiIiL/JamTOwD5b/FacCu5Q0gyjh1zJMm4nTt3Zvr06QDMnz+fOnXqxPncBQsWGMedOnVK9NgSW2hoKLdv32bXrl3s2rWLsWPHsmbNGt57772XGvenn35i4cKFVtsuXbrEpUuXWLZsGbVr12bVqlVkzZo1Sr+hQ4fy448/Wk22+/v74+/vz9q1axk7diwrV66kYMGCLxWziCSd69evM3jw4Hif98MPP/D999/z/Plz47GbN29y8+ZNNm/ezKJFi1i2bBn29vbRjnHnzh2cnZ05ePBgpMd9fX3x9fVl7ty5TJ48mW7dusU7vv+Sa9eu0aJFC6ttd+/eZf/+/ezfv5+xY8cyefJkOnfuHKXfrVu3KFWqFHfu3InS9s8//3Ds2DGOHTvGhAkTGDVqFJ9//nmiX4eIiIiIiIiIiIj8dymRLpLMatSoQdGiRfH19WXFihVMmjSJtGnTxnrekydPWLlyJQAlS5akWrVqRpu1ZPDJkyejHatr164cPnw41n758uWLNa6Y5nz27BkXL15k/vz5rF27loCAAJydnTl37hzZs2eP19iWUqdOTbVq1ahRowZly5Yld+7c5MiRg3v37nH27FmmTZvGqVOn8Pb2pnHjxuzevZtUqSIX5Lh+/TpmsxkHBweaN29OvXr1KF68OPb29pw5c4bff/8dHx8fDh8+jJOTE0ePHiV9+vQJjjklcXR0jHW1vrxZ3N3dX+utIfr06UNQUBA5c+YkMDAwTufMnDmTYcOGAVC0aFG+/fZbypYty/Xr1xk/fjw7d+5k3bp1fPLJJ5FuYrIUFhZGixYtjCR6ixYt6NGjB1mzZuXgwYP8+OOPBAYG0rNnT/Lly0eDBg0S54JfUzlz5qROnTpUqVKFQoUKkSdPHmxtbfH398fT05OFCxfy6NEjunTpQo4cOWjYsGGk84ODg40kevny5WnatCnVqlUjV65c/PPPP2zcuJEJEybw9OlTvvjiC9KmTUvPnj2T41JFRERERERERETkNaREukgK0LlzZ4YNG8aDBw/w8PCgbdu2sZ6zZs0aHjx4AMRtNfo777wTbZuDg0Oc+sWXtbEqVqxIq1atcHV15Y8//uDu3bvMmjWLQYMGJXiemTNnkjq19T9nTk5O9OrVi9atW7Nq1Sr27duHp6cnjRs3jtQvW7ZsjBw5kl69epEhQ4ZIbZUqVaJdu3a0b9+eZcuWcf78ecaNG8d3332X4JhFJGl4eHiwevVqcuTIwaBBg/jyyy9jPef+/ft8/fXXABQsWJADBw5Eurnn448/pnnz5qxbt46FCxfSs2dPatWqFWWc+fPns2vXLgA+++wzJk2aZLRVrVqVhg0bUqlSJYKCgujbty+nT5+O9m/Xf91bb73FzZs3MZlMVtubN29Oz549qVmzJiEhIfzvf/+Lkkg3mUx8+OGH/PDDD1Yrm9SpU4eWLVtSp04dnjx5wsCBA2nXrl2Uv/EiIiIiIiIiIiIi1miPdJEUoFOnTkYyYf78+XE6J6KfyWSiY8eOSRZbUhk4cKBx/GIJ5PiKLRFlY2MTab6IRJelkSNHMnDgwGgTLDY2NkyePBk7OzsAVqxY8RIRi0hSePDgAX369AFg9OjRVrdxsGbGjBncv38fCP9b8GKFjIjPv42NDQC//vqr1XEiHs+SJYvVPsWKFTNKzp8/fx4PD484xfdflCpVqmiT6BGqVq1KvXr1ADh69CgPHz6M1J4vXz62bNkS4/Yg1apV47PPPgPCy71v27btJSMXERERERERERGRN4US6SIpQJEiRahZsyYAW7ZsibUUcUBAAFu3bgWgdu3aFCpUKFK7yWTCZDKl6NLMhQsXNo6fPn2a5PNZrrpP6HzZsmXj3XffBcL3O04Mfn5+9O7dm7feegt7e3vy5s1LkyZNjGSPu7u78Xq+6PLly0bb3LlzY5yncOHCmEwmunTpEqXNy8vLGMfLyyvGcTZs2EDHjh156623cHBwIFOmTJQpU4a2bduycuVKnjx5EtdLN1y7do23334bk8lE+vTpjfe2pUePHvHDDz9QtmxZHBwcyJYtGzVr1mT27NmYzeY4X4PZbGbFihW0bNmSAgUKYG9vT5YsWahatSrDhw83kqkJEdfPnaOjIyaTCUdHxwTPFZsDBw7wv//9D0dHR3Lnzo2dnR0ZM2akdOnS9OrVi9OnT8d4fkzvO0uXL1+mf//+lClThgwZMpAuXTqKFy+Om5tbjNtEQNTny8fHh3bt2pE/f37SpElDvnz56NSpE2fOnInzdQ8ePBg/Pz8cHR2t7qkdnTVr1gCQMWPGaPftzp8/P05OTgBs3bo1SlL3/PnzxvPapk0b0qVLZ3Ucy8/gqlWrorS/+NwHBQXh7u5O2bJlSZ8+Pbly5aJRo0bs27cv0nmBgYH873//o0yZMsZnpGnTphw7diz2J+AlHDp0iB49elCiRAnSp0+Pg4MDb7/9Nr179+b8+fMvPb7l3+7g4OAEjVGnTh3jOLH+douIiIiIiIiIiMh/35tZT1QkBercuTO7d+8mNDSUxYsX8/nnn0fbd/HixYSGhhrnvY4uX75sHBcsWDDJ51u8eLFx/Pbbbyd4nIhEzot7rCeEt7c3TZo0ISgoyHjsxo0brFu3jnXr1vH999+/9ByJ5c6dO7Rp04bt27dHaTt9+jSnT59m6dKlzJkzx2qyPjrnzp3jww8/5Nq1a2TJkoUNGzZEWV167do16taty4ULF4zHHj9+zN69e9m7dy+rV6+mX79+sc5169Ytmjdvzt69eyM9HhwcjI+PDz4+PkyaNAkPDw+qVasW52tIaebOnUvXrl2jPB4SEsKZM2c4c+YMM2bM4PfffzdW6ibEH3/8Qc+ePaMkNy9cuMCFCxeYNWsWw4cPN1Zgx2TixIn079/f+LsGcP36dRYsWMCqVavYuHGj1VLqlg4ePMiUKVOws7NjypQpcb6OZ8+ecejQIQCqV69uVJ2wpnbt2mzevNl4z1gmaHfv3h2pX3Ry585NiRIl+Pvvv9mzZ0+MsV27dg0nJyf+/vtv47FHjx6xceNGtmzZwuLFi3FxceHPP/+kUaNG+Pv7G/0eP37M2rVr2bx5Mxs2bKBu3boxzhVfoaGh9OvXz+pzfe7cOc6dO8eMGTOYNGkSPXr0SNAcgYGB7NixA4Ds2bOTLVu2BI1j+R5NjL/dIiIiIiIiIiIi8mbQ/00USSFat25N2rRpgdjLu0e0p0uXjlatWiV5bElh9OjRxnGTJk2SZI7bt2+zf/9+unfvzogRI4DwVeUdOnRI0HiBgYHG6tiXScZD+I0EjRs3JigoiFSpUvHpp5+ybds2fHx8mDVrFsWLF2fYsGF4enq+1DyJ4fHjx9SpU8dIoleqVIlp06axd+9eDh8+zOrVq+nfvz958+aN17hHjhyhZs2aXLt2jTx58rBr164oSfRnz57RqFEjI4nesGFDVq9ezeHDh1mzZg2NGjVi/fr1se5X/+jRI2rXrs3evXuxs7PDzc0NDw8Pjh49yu7du/npp5/Ili0bAQEBNGzYkCtXrsTrWlKS0NBQsmTJgqurK7Nnz2b37t0cPXqU9evX88MPP5A9e3bCwsLo06ePkaSML09PT7p06UJwcDDp06dn2LBh7N69m/379zNmzBhjjm+//TbWpPbmzZvp168fZcqUYfbs2fj4+LBr1y769+9PqlSpePz4MZ06deLZs2fRjhESEkKPHj14/vw5X3/9dbw+n+fPnzcS+LGdZ9n+4kp5y9/jOs61a9d49OhRtP1cXFzw8/Nj8ODBeHt74+Pjw7hx48iYMSNhYWF0796dS5cu8fHHH/PkyRN++ukn9uzZw8GDB/n++++xs7MjODiYrl27xvj8JUT37t2N17Zhw4YsWLCAQ4cO4ePjw4wZMyhTpgwhISH07NmTdevWxXnc4OBgLl26xIwZM3j//fe5d+8eQIw3l8XG29vbOH7Zv90iIiIiIiIiIiLy5tCKdJEUImPGjDRt2pQlS5Zw5MgRzpw5Q6lSpaL0O336NEePHgWgWbNm0e7pnRKcOnUq0u/Pnj3j8uXLLFiwgNWrVwPQqlUrGjVqlGhzOjo6RkqaWMqaNSurVq0ic+bMCRr7119/NRJurVu3TmiIAHz55Zc8ePAAgAULFtCuXTujrXLlyri4uPDBBx9w+PDhl5onMQwZMsQo0927d28mTJgQqeR3pUqVaNasGb/88ouR9IqNl5cXTZo04cGDBxQtWpStW7dSpEiRKP0mTZpkvI/69OnDhAkTIs3btGlT+vbty8SJE2Oc75tvvuHMmTNkypSJbdu2Ubly5UjtNWvWpEOHDlSvXp0bN27wv//9L9YbWlKqhg0b0r59+yilxStUqICzszP9+vWjVq1a/PnnnwwbNizeK5VDQkJwc3PDbDaTPn16du/eTfny5Y329957j5YtWxrP5VdffYWLi0uUfccjHDhwgEaNGrF69epIq8E/+OADsmXLxv/+9z+uXr2Kp6cnzZs3tzrGr7/+ysmTJ3nrrbcYMmRIvK7n2rVrxnH+/Plj7FugQAGr5yV0HLPZjJ+fHyVLlrTa7/jx43h7e0eqkFC5cmVKlCiBs7MzDx48oFq1apjNZg4dOkTRokWNflWrViV79uz07t071ucvvlauXMkff/wBhO8v/8knn0Rqr1y5Mh07dsTZ2ZkdO3bQr18/GjZsSOrU1r92enl5RVrd/6IOHTrw9ddfJyjWGzduMGfOHCB8VXtM84iIiIiIiIiIiIhY0op0kRTEskx7dEk8y8dTeln3smXLRvqpVKkSLVu2ZPXq1ZQoUYKZM2eydOnSVxJL3759OXPmTKzloaNz8OBBfvvtNyA8SfYyJbFv3LiBh4cHAB9//HGkJHqEDBkyMH369ATPkVju3btnxFGxYkXGjx8f7b7ZdnZ25MqVK9YxPTw8aNiwIQ8ePKBs2bLs2bPHahIdYNq0aQDkzZuXX3/91WqfX3/9NcbV8Ldv32bmzJkA/PDDD1GS6BEKFSpkrGxfunQpjx8/jvVaUqJ8+fJFuz83QKZMmfjhhx8A2LNnD3fu3InX+KtXrzZKiA8ZMiRSEj1CoUKFjNfr8ePHRiLTGnt7e+bMmWO1pHq/fv2Mxy1Lp1u6cOECw4cPB8JvvIio7BFXETe0AKRPnz7Gvpb7db+4R3pijWPpiy++sLrNQKNGjShUqBAQvmXBjz/+GCmJHqFr167Y29sD0T9/CRFR4aN58+ZRkugR7O3tjRtcLl++jJeXV7znKVy4MJs2bWLBggWkSZMm3uebzWY+/fRT47X57rvv4v3+EBERERERERERkTeXEukiKUj9+vXJkycPAAsXLsRsNkdqN5vNLFy4EIA8efLg5OT0ymNMLH///TezZ89m3759iTrunDlzOHnyJH/++Se7du1i7NixFC9enEmTJtG9e3cCAgLiPWZAQACtWrUiNDQUk8nEvHnzYkxUxmbnzp2EhYUBWN3LOkLVqlUpU6ZMgudJDDt37jQSyv369cPGxualxps3bx4tW7bk6dOnVK9eHW9vb3Lnzm21r7+/P+fOnQPCKwBEJARfZG9vj4uLS7Rzbt68madPnxrjxCTiRouQkBCOHDkS6/W8Dh49esTly5f566+/OHXqFKdOncLW1tZoP3HiRLzG27ZtGwAmk4lu3bpF28/FxYVMmTJFOseaDz/8kJw5c1pty5AhA8WLFwfg4sWLVvt8+umnPH36FBcXFz766KM4XYOliPcGEOP+6ECkZO6TJ0+SZBxLbdu2jbbt3XffBcJfh+je12nTpo31+Ysvf39/47MR2+epVKlSRiWC/fv3R9uvSpUqnDx5kpMnT3L48GFWrVpFly5duHbtGl27dmXWrFkJivXnn39m7dq1ANSpU4c+ffokaBwRERERERERERF5M6m0u0gKYmNjQ/v27RkzZgxXr17F29sbR0dHo93Ly8soH9y+ffuXTmrGVUhIiJHQtKZkyZKREnMRXrwR4Pnz59y+fZs9e/bwww8/sG/fPpycnFi8eHGUksMvloW3VKRIkUgrOl9ss/TBBx/Qq1cvXFxcWL9+PVWqVGHfvn2xll6O8ODBA5ydnfHz8wPCEzPRlcK+dOlStPsd58yZ00gWRpRJh/AEUkyqVq3KX3/9FadYk8KxY8eM44Su5o8wfvx4xo8fj9lspkGDBqxatSrGGxIs3wOVKlWKcezoVpkDkcrjR9yoEhc3b96Mc9+U5vbt24wdO5aVK1dy/vz5KJ/FF/vGR8TrUrhw4WgT4BCeTK5QoQJeXl4xfp5j27M6a9asQOQV3xHmzp3L9u3byZgxo1ExIr4sb9CIbR/x4OBg4/jFlc0vjhPdjR+xjWOpRIkS0bZFbFGRPXt2smTJEms/a89fQlh+ntq1a2e1ooY1MX2eHBwceOedd4zfK1WqRPPmzY3y8J988gn+/v4MHTo0znEuXLjQqDBRuHBhFi1aRKpUun9URERERERERERE4k7/R1EkhXF1dTWOXyzvnlxl3f39/aOUabf8iSjzHJtUqVKRM2dOWrRowZ49eyhRogTBwcF06dIlyt7aMc3n4+MTr/gjSkenS5eOa9euMXDgwDid9/TpU5o2bWqsvhwwYADffPNNtP27du0abcyTJ082+llea0yJSCBOpdKTkmWSNT5JaGt+++03zGYzOXLkYOXKlbGu6o/P85QjR45o2wIDA+MX6L9e19LuR44c4e2332bEiBH8/fffMSbRIeYV0dbcvXsXiNt7M6LaQMQ51sT2PohIfkZUcYhw69YtvvrqKwCGDx8eY3n/mGTIkME4jqnMOhDpRpkXy7cn1jiWYnpuIp6XhD5/CfUqP0/16tXj888/B+D777/n7NmzcTrP09OTrl27YjabyZUrF1u3bo228oWIiIiIiIiIiIhIdLQiXSSFKVu2LOXKlePEiROsWLGCiRMnkjZtWp48ecLKlSsBKFeunFHW93WVPn16evXqRf/+/QkKCmLFihX06NEjyebLnj07NWrUYOvWrXh4eBAaGkrq1NH/CQwNDaV169bs3LkTgE8++YQxY8YkSiyWic3o9hu31vd117JlS1auXMmtW7fo2LEjy5cvj/E1SCwRCUQ7O7t4lWuPa9WClOTZs2e0bt2aO3fuYGtrS9++fWnatCklSpQgS5YsRknxixcvGntqJ/Q9Ftt792XGjouZM2dy584dMmfOTLZs2ViyZEmUPgcPHox0HLFKvG7dusbNGZavc0TliehEVAQBKFCgQKS2F8eJKGke0zgmk+m1e59ZJuQXLlwY5/8WxbRqPiZNmzZl1KhRPH/+nFWrVvHtt9/G2N/Ly4tWrVoREhJClixZ2LJlC8WKFUvQ3CIiIiIiIiIiIvJmUyJdJAVydXVlwIABBAUFsXbtWtq0aYOHhwdBQUHAq12NDuFlcZMiIWZZ0tmy3DkkTQIuYtXy48ePuXXrVrQrrJ8/f06nTp1Yt24dAG3atGHatGmxju/l5RWnOCJKVUP4/usvJuQsxbT607JM8fPnz2OcM7qS87GxTAbeuHEjSun8+Bg9ejR58uRh4sSJrFmzhnbt2rF48eJok+mWibfYVsHeunUr2rZs2bIB4UnmbNmyvfTK+uiYTCbMZnOSvRZxsWPHDmMv7EmTJkV7c8qLFSDiI+L9G5fS9wEBAZHOSUwR5dHv379Px44dY+0/depUpk6dCsDOnTuNRHqJEiWwsbEhLCws1hXPlu2lSpWK1Fa6dOlI/cqXLx/rOAUKFIh2m4qUKuLzBOHvecuS7EnBstrElStXYux76NAhGjduzNOnT0mfPj0bN2587W86ExERERERERERkeSj0u4iKVD79u2N5GJEOfeIfyP2Uf8vCA0NNY5DQkKSfD7LEvQxlVN2c3MzVrd+/PHHzJ8/P1H31i1btqxxHFuZ+pjaLUtJx5QYvXPnTrz3wY5QsWJF43jXrl0JGsPShAkT6NWrFwArVqygY8eO0ZacLlOmjHFsuS+zNTG1V6hQwTjesmVLfMKNl4jXI6bX4vnz55w/fz7JYvjrr7+M47Zt20bbL7bnMyYRidPLly/HeINDSEgIx44di3ROSmRnZ0fVqlUB2L9/f4z7pHt7ewOQJk0aKleuHKmtZs2aUfpZc/PmTf7++28AatSokeC4k8ur+jxFiOvf7T///JOPPvqIhw8fYm9vz7p166hWrVqSxyciIiIiIiIiIiL/XUqki6RAuXLlon79+gBs3ryZU6dOGQmL+vXr/2f2erVMEse0Kjsx+Pv7s3//fgAKFSoUKQltacCAAcycORMI3593xYoV2NraJmosderUwcbGBoB58+ZF2+/w4cOcOnUq2vYsWbKQOXNmo290Fi9enLBACY81YsXshAkTEmWf5UmTJtGzZ08Ali5dSufOna2u4s6fPz8lSpQAYPny5Tx9+tTqeE+fPmX58uXRztewYUPjNRw3blykGzgSU8Rq/Zheiw0bNvDPP/8kyfwQ+eaU6Pakfv78OdOnT0/wHE5OTkB41YjZs2dH22/FihXGtUack5jc3d0xm80x/syZM8foP2fOHONxR0fHSGM1a9YMgKCgIFatWmV1Pj8/P7Zt2waE/2148W9IiRIljFXqy5Yti/b5nzt3rnHcvHnz+FxyilCsWDFj9f2SJUu4evVqks5n+dm2vAnJ0t9//039+vW5d+8etra2rFy5MsprLCIiIiIiIiIiIhJfSqSLpFCurq5AeGKsbdu2RoLsVZd1TypXrlxh8uTJxu+NGjVK0Dh///03O3bsiLHPP//8Q7t27YyVpp06dbLaz93dnXHjxgHw/vvv4+HhYewpnZjy5MlD06ZNAVi7di3Lli2L0ufhw4dGsjkmtWrVAsDDwwNfX98o7WfOnGHo0KEJjjVz5sy4ubkBcOTIEb744otoy+6HhITEWoIdwstBT506le7duwOwaNEiunTpYjWZHjH39evX+frrr62O9/XXX3P9+vVo58uXLx9du3YF4MSJE7i5ucWYTA8MDDRupoiP2rVrA+F7ce/duzdK+40bN+jXr1+8x42P4sWLG8fR3aQxePBgjh49muA5mjdvTt68eQH4+eefOXHiRJQ+165d46uvvgIgXbp0xvOfUn3yySdkypQJgG+++YY7d+5Eag8LC+Ozzz4zbiSJuLYXRTx+9+5dBg4cGKXd19eXESNGAFC0aNHXMpEO8L///Q8Iv4mlRYsWMW6tEBwczOTJk6PcCLN48eJYbypZtmyZsa1GpkyZaNKkSZQ+V69excnJiYCAAGxsbFi0aFGC/3siIiIiIiIiIiIiYkl7pIukUE2aNCFz5szcv3/fKNecMWNGIwH7OnhxNfXz58+5c+cOu3fv5vfffzeSVR06dIhxP+GYXL9+nXr16lGuXDmaNWtGpUqVyJ07N6lTp+bmzZvs3buXWbNmGfs5v/POO3zzzTdRxpkwYQLff/89EJ54HTVqFJcuXYpx7pIlSyZ4tfqYMWPYunUrDx48oH379nh7e9OqVSsyZszIn3/+yS+//MLff/9N5cqVY1zh/Nlnn7F27VqePHmCo6Mj7u7uVKhQgYcPH7Jt2zbGjx9Pzpw5SZ06dYzJrpgMHz6crVu3cvLkSSZOnMj+/ftxc3OjbNmy2NnZ4efnx549e1i0aBE//vgjXbp0iXVMk8nEjBkzeP78OXPmzGH+/PmkTp2aWbNmYTKZjH59+vRhzpw5nDp1iokTJ3Lx4kXc3NzInz8/fn5+TJ8+HU9PT6pWrcqhQ4eMsV80ZswY9u3bx6lTp5g9ezYHDhygZ8+eVKpUifTp0xufs23btrFhwwbKli3LJ598Eq/nqWfPnkyePJnQ0FAaN27M0KFDqVmzJs+ePWPv3r2MGTOG0NBQihcvnmTl3Rs0aEDOnDkJDAxkyJAhXLlyhSZNmpA9e3YuXLjAjBkz2L59OzVq1LCa7I8LW1tbpk+fTuPGjXnw4AE1a9bk66+/pl69eqROnZp9+/bxyy+/GDdVjB49muzZsyfmZSa6rFmzMnLkSD799FOuXLlCtWrVGDJkCGXLluX69ev89ttv7Ny5E4B27dpRp04dq+O4uroye/Zs9u7dy6RJk7h58yY9evQgS5YsHDp0iOHDhxMUFESqVKmYMGGCsYXH66Zdu3Zs3ryZefPmceTIEUqXLo2bmxu1a9cmR44cPHr0CF9fX3bv3s2qVau4e/dulJvApk2bRs+ePWnWrBm1atWiZMmSZMqUiUePHnHu3DlWrFjBhg0bgPDP9Pjx48maNWukMe7cuYOTkxPXrl0D4Msvv+Ttt9+OtZJHvnz5EvkZERERERERERERkf+i1/P/4Iq8Aezt7XFxcWHGjBnGYy4uLqRNmzYZo4qf6MrwWmrTpg2zZs166blOnDhhdWWsJWdnZ+bMmWOUKre0cuVK49jf3z/SfsfRuXTpEoULF453rACFCxdm7dq1NGnShAcPHjB58uRIK/QBhg0bBsRcKrxBgwb069eP33//HT8/vyjJ3wIFCuDh4fFSKzTTpUvHjh07aNmyJbt27eLIkSNxWi0fG5PJxMyZMwkLC+OPP/5gzpw52NjYMH36dCMZbmdnh6enJ3Xr1sXX15cNGzYYybUI9evXp3///jRs2BAI/+y8KH369Hh7e9OhQwc2bdrE6dOn+eKLL6KNLWPGjPG+njJlyjBq1CgGDBjAvXv36N+/f6T2LFmysGbNGoYOHZpkiXQHBwf++OMPmjVrxtOnT62+rxwdHZk4ceJL7Vse8Vlyc3Pj4cOHDBs2zHi/RrCxsWH48OH06tUrwfO8Sm5ubly/fp3hw4fj6+tLt27dovRp1KhRjOXsbWxsWLNmDY0aNcLHx4eVK1dG+tsC4e/piRMnGu/X19WsWbPIlSsXY8aM4fbt2/z000/89NNPVvs6ODgY21lYevjwIQsWLGDBggXRzpMlSxYmTJhAhw4dorSdPHky0mdp1KhRjBo1Ksa4XV1dI5XXFxEREREREREREYmOEumSqBw75kjuEP5TXF1dIyXSX/ey7iaTifTp01OgQAGqV69O586djdLkCVWjRg28vb3ZsWMHe/bs4erVqwQEBPD48WMyZsxIkSJFqFatGu3bt6dGjRqJdCWJw9HRkb/++osRI0awYcMGbty4QZYsWahcuTJ9+/alQYMGuLu7xzrO+PHjee+995g6dSrHjx8nJCSEggUL0rx5c7766iuyZcv20rFmz54db29vVq9ezaJFizhw4AC3bt0iXbp05MuXj3LlytG6dWs++uijeI2bKlUq5syZQ1hYGAsXLmTmzJnY2NgwZcoUI5lesGBBTpw4wZgxY1i+fDm+vr6kSZOGt99+m86dO+Pm5sbatWuNMSNKdL8oa9asbNy4kR07drBgwQL27NnDjRs3ePr0KRkzZqRo0aJUrVoVZ2dn6tevn6DnqX///pQuXZpx48Zx6NAhHj9+TN68eWnUqBEDBw6kYMGCCRo3Pho0aMDhw4f55Zdf2LFjB7du3SJz5syULl2aDh060L1790TZ19rV1ZXatWvz22+/sWXLFq5evcrz58/JmzcvdevWpW/fvnG6mSYl+f7772nQoAGTJk1i9+7dBAQEkDlzZsqVK0fXrl1p165drGNkz56dffv2MWPGDBYtWsSZM2d49OgRefPmpV69enz++eeUKVPmFVxN0rKxsWHkyJF0796d6dOns2PHDi5fvkxQUBDp0qWjYMGClC9fnvr169O8efMoN4EtXLiQbdu2sXPnTv78808CAgK4desWdnZ2ZM+enbJly/LRRx/Rvn17smTJkkxXKSIiIiIiIiIiIm8yU3R73cp/h8lkyg9cg/B9a/Pnzx/nc8+fP09oaCipU6eOtPeuiLwa7u7uRsl5/b2O3o8//sh3331H6tSpefDggdVV6SIiCaXvQ0nv1pToKxMkp+CwHckdglXn7QOSOwSrrtiGJHcIVp1Plyq5Q7DqmG3F5A4hWqawIskdglWpzClzuxg7U8rcNqRGqqS/iTMhKj6KWqkmJSh5PTS5Q4hWKnvf5A7Bqlz9Yq/kJv8d+r4WP/q+Fj/6vhZ/+r4WP/q+Fj/6vhZ/+r6WMvj5+VGgQIGIXwuYzWa/lx0zZf4XSkREJI7MZjNLly4FoHz58kqii4iIiIiIiIiIiIjIS1MiXUREUrTLly8TGhr93YZDhw7l1KlTQHi5cRERERERERERERERkZelPdJFRCRFmzt3LnPmzDH2uc+bNy8hISGcOXOGefPm4eXlBUDp0qXp0aNH8gYrIiIiIiIiIiIiIiL/CUqki4hIinf16lV++eWXaNvffvttPD09SZMmzSuMSuT1ExISwrlz5xJ0bpEiRXBwcEjkiERERERERERERERSJiXSRUQkRevevTuZMmVi8+bNXLhwgVu3bvHkyROyZs1KuXLlaN68Od26dcPOzi65QxVJ8fz9/SlbtmyCzt25cyeOjo6JG5CIiIiIiIiIiIhICqVEuohICubu7o67u3tyh5GsChQoQP/+/enfv39yhyIiIiIiIiIiIiIiIm8IJdJFRERE3hCFCxfGbDYndxgiIiIiIiIiIiIiKV6q5A5AREREREREREREREREREQkJVEiXURERERERERERERERERExIIS6SIiIiIiIiIiIiIiIiIiIhaUSBcREREREREREREREREREbGgRLqIiIiIiIiIiIiIiIiIiIgFJdJFREREREREREREREREREQsKJEuIiIiIiIiIiIiIiIiIiJiQYl0ERERERERERERERERERERC0qki4iIiIiIiIiIiIiIiIiIWFAiXURERERERERERERERERExIIS6SIiIiIiIiIiIiIiIiIiIhaUSBcREREREREREREREREREbGgRLqIiIiIiIiIiIiIiIiIiIgFJdJF/oNMJhMmkwl3d/fkDkWs6NKlCyaTicKFCyfZHIULF8ZkMtGlS5ckm0NEREREREREREREROS/KnVyByD/LTdG3UjuEJJMnoF5kmRcNzc3pk+fDsCOHTuoU6dOnM/dvn07Tk5OAPTu3ZuJEydG29dkMr1coMClS5diTf46Ojri7e1ttS116tRkzpyZ0qVL4+zsTI8ePciSJctLx/X8+XPOnj3LoUOHOHToED4+Pvz55588e/YMgJ07d+Lo6BivMUNCQli4cCHLly/n5MmTBAQEkCFDBvLkyUO1atVo0KABLi4uLx27WPf8+XNq1KjBgQMHjMfMZnOs54WGhjJr1iwWLlzImTNnePjwIfny5cPJyYl+/fpRunTpOM1/9epVfv/9dzw9Pbl69Spp0qShWLFitG7dms8++4x06dIl+Nr+K65cucKWLVs4dOgQJ06cICAggFu3bmE2m8mePTsVKlTAxcWFtm3bYmtrG+04t27dYv369ezcuZOjR49y5coVgoODyZo1K+XLl6d58+Z07tyZtGnTvsKrExEREREREREREZE3nRLpIsmsc+fORiJ9/vz58UqkL1iwwDju1KlToseW2EJDQ7l9+za7du1i165djB07ljVr1vDee++91Ljz589P1JXXf/75Jx06dODUqVORHr9z5w537tzh1KlTrFixQon0JDR58uRISfS4uHPnDs7Ozhw8eDDS476+vvj6+jJ37lwmT55Mt27dYhzH09OTDh068M8//xiPPX78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e/fuTfL5LLd+iKkU/o8//sioUaMAqFKlCuvXr49xD3oRERERERERERERkaSkRLpICpQrVy7q168PwObNmzl16hRbtmwBoH79+pH2rn6dWe51ntwlsosUKWIkGDdv3hztftAPHjxg69atABQtWpQ8efIkahwRNxfEtB/18ePHOXDgQILGT506NbVr1wZg69atRqlza2bOnAmE37zh6OiYoPlicvnyZcxmc4w/EbECxmOXL1+ONE6JEiWMleHLli2L9rmbO3eucdy8efMo7c2aNTOO58yZY3WM58+f88cffwDhVQPq1KkTl0tNUZo2bWocRySuk8qjR4/YuHEjAGnTpqVo0aJW+40fP57vvvsOCN/eYtOmTZH2rRcRERERERERERERedWUSBdJoVxdXYHwxGrbtm2NBOurLuueVK5cucLkyZON3xs1apSM0YT75ptvALh//z5ffvml1T79+/fnwYMHAHz66aeJHkPx4sUB2LNnDxcvXozSfuvWLTp27PhSc/Tu3RsIrwLQrVs3nj17FqXP7NmzjZs3WrZsmeg3DCS2r776CoC7d+8ycODAKO2+vr6MGDECCL8BwloivWrVqnzwwQcAzJo1i/3790fpM2bMGM6cOQPA559//lqWHa9SpYpxo86GDRsYNmxYjP0vX77M4sWLIz12+/ZtVq5cGeN5T58+pVu3bsY+9y1btjSqIViaM2cO/fv3B8Jviti6dWuSbCUgIiIiIiIiIiIiIhIf2iNdJIVq0qQJmTNn5v79+0a574wZM0ZaTZrSnTp1KtLvz58/586dO+zevZvff/+dO3fuANChQ4cY97WOC8vVxhC+ajvCpk2bIq1iLlasWKRy4BFat27NvHnz2LBhA1OnTuXatWv07NmTAgUKcPXqVaZOncqmTZuA8PLYffr0eamYrencuTPr1q3j4cOH1K5dm0GDBlGpUiXMZjP79u1j7Nix3Lx5k+rVq1tN9MaFs7MzLi4uLF++nG3btlGtWjW+/PJLSpUqxb1791iyZAmzZ88GwvdGHzt2bGJeYpJwdXVl9uzZ7N27l0mTJnHz5k169OhBlixZOHToEMOHDycoKIhUqVIxYcKEaPcFHz9+PDVq1ODJkyfUr1+fb7/9ljp16vDkyROWLFnC9OnTgfCEb3Q3W7wO5syZQ+XKlblx4wY//PADmzdvplu3bpQtWxZ7e3vu3LnDn3/+yaZNm9ixYwfNmjUz9qgHePjwIa1ataJYsWK0bNmSqlWrki9fPtKkScPt27c5dOgQs2bNMm4GyZcvHyNHjowSx5o1a+jRowdms5mMGTMyfvx4bt26xa1bt6KNvUiRIlH2txcRERERERERERERSWxKpIukUPb29ri4uDBjxgzjMRcXl9dqz+CyZcvG2qdNmzbMmjXrpefq2rVrtG0vJvBcXV2tJtIBli5dSsuWLdmyZQuenp54enpG6VOlShXWrl2Lvb39ywVtRatWrejatStz5szBz8+Pvn37Rmq3sbFh3Lhx3Lt3L8GJdIA//viD0NBQVq9ezfHjx+nUqVOUPnnz5sXT0zPR94FPCjY2NqxZs4ZGjRrh4+PDypUro6yYtrOzY+LEiTRs2DDacSpUqMDSpUvp2LEjQUFBfPvtt1H6lChRAk9Pz9e69HjevHnZv38/Li4u+Pj4cPDgQQ4ePBht/4wZM1p9/MKFC1YT5JaqV6/OggULyJs3b5S2NWvWEBYWBkBQUFCMr02EnTt3JslWAyIiIiIiIiIiIiIilpRIl0SVZ2DKLv/8unF1dY2USH/dy7qbTCbSp09PgQIFqF69Op07d6ZWrVrJHVYk6dOnZ/PmzSxZsoR58+Zx/Phx7ty5Q+bMmSlfvjzt2rWjc+fO2NjYJFkMs2fPpm7dukyfPp3jx4/z7NkzcufOTa1atejTpw9Vq1bF3d39peawt7dn1apVrFu3jrlz53LgwAFu376Ng4MDJUqUoFmzZvTp04f06dMnzkW9AtmzZ2ffvn3MmDGDRYsWcebMGR49ekTevHmpV68en3/+OWXKlIl1nMaNG/Pnn38yfvx4PD098fPzw87OjmLFiuHi4kKfPn2slih/3RQqVIiDBw/i4eHB0qVLOXjwIAEBAYSEhJA5c2aKFy9O9erVadKkiVHyPkLBggU5ePAgO3fuxNvbm0uXLhEQEMCDBw9Inz49BQsWpHLlyri4uNCgQQNMJlMyXaWIiIiIiIiIiIiISMKYzGZzcscgScxkMuUHrgFcu3aN/Pnzx/nc8+fPExoaSurUqY29m0VERETeJPo+lPRuTVmQ3CFYFRy2I7lDsOq8fUByh2DVFduQ5A7BqvPpUiV3CFYds62Y3CFEyxRWJLlDsCqVOXtyh2CVnSllVnCqkapgcodgVcVHSXdT8ssoeT00uUOIVip73+QOwapc/axXepP/Jn1fix99X4sffV+LP31fix99X4sffV+LP31fSxn8/PwoUKBAxK8FzGaz38uOmTL/CyUiIiIiIiIiIiIiIiIiIpJMlEgXERERERERERERERERERGxoES6iIiIiIiIiIiIiIiIiIiIhdTJHYCIiIjEXWBgIIGBgfE+z87OjhIlSiRBRCIiIiIiIiIiIiIi/z1KpIuIiLxGJk+ezPfffx/v8woVKsTly5cTPyARERERERERERERkf8glXYXERERERERERERERERERGxoES6iIjIa8Td3R2z2RzvH61GFxERERERERERERGJOyXSRURERERERERERERERERELCiRLiIiIiIiIiIiIiIiIiIiYkGJdMBkMhU0mUyjTSbTGZPJ9MhkMt01mUyHTCbTVyaTKV0SzZnHZDLdN5lM5n9/vJJiHhERERERERERERERERERiZ/UyR1AcjOZTM7AQiCTxcPpgCr//nxiMpkamc3mi4k89YQX5hQRERERERERERERERERkRTgjV6RbjKZygHLCE9oPwSGAO8D9YAZ/3YrCXiaTKb0iThvY6AlEJhYY4qIiIiIiIiIiIiIiIiISOJ4oxPpwG+Erz4PBeqbzeafzWbzfrPZvMNsNvcEBv7b721gQGJM+G9CftK/v36VGGOKiIiIiIiIiIiIiIiIiEjieWMT6SaTqQrg+O+vs8xm834r3cYAZ/49/sJkMtkmwtQ/AwWAnWazeX4ijCciIiIiIiIiIiIiIiIiIonojU2kA80sjudY62A2m58Df/z7axb+P/GeICaTqSrQG3gG9HqZsUREREREREREREREREREJGm8yYn0D/799xFwJIZ+3hbHNRM6mclkSg1MJ/w5H2k2m88ldCwREREREREREREREREREUk6qZM7gGRU6t9/L5jN5tAY+p21ck5CfAWUA3wJL++eaEwmU/5YuuROzPlERERERERERERERERERP7L3shEuslksgey//urX0x9zWbzPZPJ9AhwIHxv84TM9xYw9N9fPzObzU8TMk4MriXyeCIiIiIiIiIiIiIiIiIib6wUn0g3mUzlgKYAZrP5h0QaNoPF8cM49I9IpKdP4HzTgLTAUrPZvCWBY4iIiIiIiIiIiIiIiIiIyCuQ4hPpQHnAHTADiZVIt7c4fhaH/sH//ps2vhOZTKbOgBMQ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h+itQw45ZHj07+GHHz48tfZI9ttvv6VC9CFrrbVW9t577yTJ+eefnz//+c8jXn/ggQfmhhtuyLbbbpt99913oj9O7rijN0nIGmusMWbbds3udqT90D3Gc5/l3WNZq622Wr785S8vFaInydy5c4e/VHDHHXdk3XXXzaGHHjri9XvttVeS0f/8Jur444/P+eefnyQ56qijHhaiD3n5y18+PMvFokWLJtXXfvvtl4suuigvetGLJnX92WefnU9/+tNJel9weNe73jWp+wAAAAAAwIqYtiC91vpArfWQWutHaq0nrcB9FndB99iL9sIj3M4775z1118/SXL00UcPj5YdUmvN0UcfnSRZf/3187KXvWzGa1zZvOMd78g999yT3XbbbXgK9X6rteb666/PpZdemgsuuGD4tcEGGyRJzjvvvAnd79prrx2eJvuNb3zjcmcxmDt37nAIfuuttw7PfDCS0absfu5znzu8f8UVVzzs/dNPPz1f+9rXMm/evHzxi18cMdQfyz333JMkWbBgwZhth0agJ8ndd9/9sHuM5z7Lu8ey/vIv/zJrrbXWiO8961kPrXLy+te/PvPnzx+x3ZZbbjm8P9Kf32T84Ac/SNJbC76tYyRDAfgvf/nLUddpX7RoUX7zm9/k/PPPz+mnn55///d/z1Oe8pQcdthhefvb3z6pddZvuOGG7LrrrlmyZElKKTnyyCOz2mqrTfg+AAAAAACwoqZzandggubOnZs99tgjn/rUp/LHP/4xp5122lKjfk899dThaaX32GOPh416nS73339/LrnkkuW+v9lmmy03FJxNfSzriCOOyE9+8pMsXLhweARsPx1//PH5whe+kNNPP32p0dLLuvnmmyd03wsuuGB4f5ttthm1bfv+BRdckG233XbEdqOtW90Gycv+HPfee2/+9m//NrXW7L///mOGusuzyiqrJEnuu+++Mdu2I+vbGQeG7jGe+yzvHst66lOfutz32mnOx9tutH8HE3HOOeckSS655JJxf3Hhvvvuyy233JJ11113xPc33XTTpY5f+MIX5p3vfGd22223/PjHP87WW2+dn/3sZ2NOmz/kjjvuyC677DK8bv3HP/7xvOQlLxnXtQAAAAAAMNUE6TDL7LXXXvnUpz6VpDeNexuk92ta92uuuSZbbLHFct+/4oor8sQnPnHW99G66aab8r73vS9J8tGPfnR4tHc/1Fqz77775qtf/eq42o82Inokt9xyy/D+4x//+FHbrrfeeiNet6zRRgnPmfPQZCfLjmj+2Mc+lksuuSQbb7xxDj744FFrGc3QqPrRplkfsnjx4uH9dgr3dmT+WPdZ3j2WNd4/l8n++U3WjTfeOKnr7rpruaubjGiVVVbJokWLsskmm+Sqq67KQQcdlG9+85tjXnfPPffkNa95TX71q18lSQ444IB84AMfmFTNAAAAAAAwFQTpMMtsscUW2XLLLXPeeefl2GOPzec///msuuqqufvuu/Pd7343SW/q58mO5KXnK1/5Sv70pz/lsY99bNZee+1861vfelibs88+e6n9oRHML3nJS/K4xz1uymr52te+NhyiP/vZz8573vOebLPNNtlwww2z2mqrDc88sOeee+brX//6w6b8n4ixRiOvyL3H49/+7d+SJC972cvy4x//eMQ2Q6H14sWLh/9eHve4xy01OnmjjTbK2WefncWLF+e2225bahT3soZmcVh33XWXmqK9HSk9NAp6rHskycYbbzxq29loKJDffvvt88UvfnHc103mCybrrLNOtt9++5x00kn5wQ9+kCVLlmTevOU/bixZsiRvfOMbc8oppyRJ9tlnn+EvEwEAAAAAQL/MaJBeStk4yZFJapK31lqvHaP9hkmO6g7fXGud3JA6eITZa6+9csABB+T222/PD3/4w7zpTW/KD37wg9x+++1JZnY0epI88YlPnPaAdSb6aA1N1X3bbbflr//6r8ds/8UvfnE4gDzllFOmNEg//PDDkyRPetKT8rOf/Wy5U4ffeuutk7p/O9X69ddfP2rbdl3r5a31vSKGplBftGhRFi1aNGrbm2++OW9+85uTJDvuuONSQfrTn/704S+WXHzxxXnBC14w4j2WLFmS3/3ud0mSzTfffKn31lhjjWy88ca56qqrcvHFF49aS/v+svd5JFh77bVzww035Kabbsozn/nMae9vaDr4u+66KzfddFPWX3/9Eds9+OCDeetb35of/ehHSZI3velN+dKXvjTt9QEAAAAAwFjmjN1kSu2WZKck88cK0ZOk1npNemH/TkneOK2VwSyyxx57DI/gHJrOfWg7tI46K4/f/va3SZLXvOY1yw3Ra6359a9/Pan7t8FpO8p+JL/4xS9GvG622WGHHYb3TzvttOW2O+ecc4ZHuG+//fbLvc8ll1wy6pcM2j5Gus9s95znPCdJcumll+bKK6+c9v6uueaa4f3RpsL/u7/7u+FZB175ylfm61//+lJT2wMAAAAAQL/M9KfVr0xvNPpxE7jme0lKkldPS0UwCz3+8Y/PzjvvnCQ54YQTcsEFF+TEE09Mkuy8885LrWPN5Bx88MGptY76akdML1q0aPh8u279VFiyZEmS0dej/uEPf5hrrx3z+0cj2mCDDYZHUR9zzDG54447Rmz3wAMP5IgjjkiSrLnmmtlqq60m1d9oxvozr7Vmk002SZJssskmw+dOPfXUpe6z00475TGPeUyS5Mgjj1zubAZDP0+SvO51r3vY+6997WtHbNu666678p3vfCdJbyT8U5/61HH+tLPHq1/90K/QQw89dFr7uuaaa3LWWWcl6f0dtmvRtw444IB85StfSZK89KUvzbHHHpv58+dPa20AAAAAADBeMx2kP7HbTmRY5f90202ntBKY5fbaa68kvZB19913Hw5bZ3pad6bfU57ylCTJj370oxGnb//d736Xd73rXSvUx7vf/e4kyU033ZT99ttvxOD5Ix/5SC688MIkyb777rvUeuKzzYIFC/IP//APSZKLLroon/zkJx/W5qyzzhpee37HHXfM1ltv/bA2r3vd6/KkJz0pSfKv//qvw9PAtw488MDhv5cDDzxwyn6GmfSGN7xh+MsUX/jCF4b/XJbnggsuGJ5ufcill16ak08+edTr/vznP+fNb37z8BT+b33rW0dsd/DBB+c//uM/kiTbbbddfvCDH8zqf28AAAAAAAyeGV0jPcnQIqm3TeCaobYbTGklMMu9+tWvzmMf+9jcdtttw1N/L1y4MK95zWv6XNnELG+Ub2uNNdbIrrvuOqH73nnnnTn22GOXOnf55ZcP7x977LFZZ511ho+f/exn59nPfvaE+pgpe+65Zw488MBcc8012W677XLQQQflGc94Ru65556cfPLJ+fSnP5177703W2211aSnd3/HO96Ro48+OmeddVaOPPLIXHnllXn3u9+dv/iLv8h1112Xr33ta/ne976XpLdW+4c+9KGp/BGnxYEHHphvf/vbufTSS3PQQQfl8ssvz+67755VV101p5xySj7+8Y9nyZIlWXXVVfPpT396xHvMnz8/n/3sZ/OqV70qt99+e7bffvv8r//1v/L85z8/t956aw4//PDhtdh32GGH5QbDs93cuXPz7W9/O9ttt13uvPPO7LPPPjnmmGOyxx57ZLPNNsv8+fNz44035txzz82Pf/zj/OxnP8t73/vevOpVrxq+x7XXXpuXvvSl2XLLLfPa1742z33uc7Peeutl3rx5uf7663PmmWfmq1/96vAU+c985jPzgQ984GG1fO5zn8tHPvKRJMmGG26YQw89NFdcccWo9Q/VCAAAAAAAM2Wmg/TFSRYkWXsC1wy1vW/qy4HZa5VVVsluu+2Www8/fPjcbrvtttw1tGervffee8w2m2yyyYSD9JtvvnnUey87cvjDH/7wrA3S999//5x00kk58cQTc/HFF+dtb3vbUu+vuuqqOeqoo3L88cdPOkifO3dufvzjH+fVr351zjzzzJx66qkPmy49STbffPP813/916jrWs8Wj370o3P88cfnFa94RS677LJ8+ctfzpe//OWl2ixcuDBHH330qH/3r3jFK/LFL34xf//3f58bbrgh++2338PaPP/5z89xxx2XuXPnTvWPMWO22GKLnHnmmdl1111z2WWX5YQTTsgJJ5yw3PYLFy4c8fx5552X8847b9S+dtlllyxatCirr776w94b+mJC0psGvl3vfnmuuOKKPPGJTxyzHQAAAAAATJWZDtL/kGTNJDslGX1+2Ie8uNv+cRrqYYo9/h/GDkQYv7322mupIN207iun+fPn5/jjj88XvvCFHHXUUbnwwgtTa82GG26Yl73sZdl///3ztKc9Lccff/wK9bPWWmvl9NNPzze/+c0cffTROffcc3PLLbdk4cKF2WKLLbLrrrtm3333zYIFC6boJ5t+T37yk3PuuefmsMMOyzHHHJPLL7889913XzbeeOO84hWvyP777z+85vpo9t1332y77bb57Gc/m5/85Ce59tprs/rqq2fzzTfPW97yluyzzz6ZN2+mf2VOvWc961m58MIL881vfjPHHXdcfvWrX+Wmm27Kgw8+mLXXXjubbbZZdthhh7zuda/LVltttdS122+/fU477bScfPLJOeOMM/LHP/4xN9xwQ+66664sXLgwm266abbZZpvsscce2X777fv0EwIAAAAAwNQoI62TO22dlfK/kxyU5NYkz6y1XjdG+w2T/CbJY5J8utb63umvcuVTStkoyVVJctVVV2WjjTYa97WXXXZZlixZknnz5g2v4wwA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IB0AAAAAAAAAGoJ0AAAAAAAAAGgI0gEAAAAAAACgIUgHAAAAAAAAgIYgHQAAAAAAAAAagnQAAAAAAAAAaAjSAQAAAAAAAKAhSAcAAAAAAACAhiAdAAAAAAAAABqCdAAAAAAAAABoCNIBAAAAAAAAoCFIBwAAAAAAAICGIB0AAAAAAAAAGoJ0AAAAAAAAAGgI0gEAAAAAAACgIUgHAAAAAAAAgIYgHQAAAAAAAAAagnQAAAAAAAAAaAjSAQAAAAAAAKAhSAcAAAAAAACAhiAdAAAAAAAAABqCdAAAAAAAAABoCNIBAAAAAAAAoCFIBwAAAAAAAICGIB0AAAAAAAAAGoJ0AAAAAAAAAGgI0gEAAAAAAACgIUgHAAAAAAAAgIYgHQAAAAAAAAAagnQAAAAAAAAAaAjSAQAAAAAAAKAhSAcAAAAAAACAhiAdAAAAAAAAABqCdAAAAAAAAABoCNIBAAAAAAAAoCFIBwAAAAAAAICGIB0AAAAAAAAAGoJ0AAAAAAAAAGgI0gEAAAAAAACgIUgHAAAAAAAAgIYgHQAAAAAAAAAagnQAAAAAAAAAaAjSAQAAAAAAAKAhSAcAAAAAAACAhiAdAAAAAAAAABqCdAAAAAAAAABoCNIBAAAAAAAAoCFIBwAAAAAAAICGIB0AAAAAAAAAGoJ0AAAAAAAAAGgI0gEAAAAAAACgIUgHAAAAAAAAgIYgHQAAAAAAAAAagnQAAAAAAAAAaAjSAQAAAAAAAKAhSAcAAAAAAACAhiAdAAAAAAAAABqCdAAAAAAAAABoCNIBAAAAAAAAoCFIBwAAAAAAAICGIB0AAAAAAAAAGoJ0AAAAAAAAAGgI0gEAAAAAAACgIUgHAAAAAAAAgIYgHQAAAAAAAAAagnQAAAAAAAAAaAjSAQAAAAAAAKAhSAcAAAAAAACAhiAdAAAAAAAAABqCdAAAAAAAAABoCNIBAAAAAAAAoCFIBwAAAAAAAICGIB0AAAAAAAAAGoJ0AAAAAAAAAGgI0gEAAAAAAACgIUgHAAAAAAAAgIYgHQAAAAAAAAAagnQAAAAAAAAAaAjSAQAAAAAAAKAhSAcAAAAAAACAhiAdAAAAAAAAABqCdAAAAAAAAABoCNIBAAAAAAAAoCFIBwAAAAAAAICGIB0AAAAAAAAAGoJ0AAAAAAAAAGgI0gEAAAAAAACgIUgHAAAAAAAA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(12,8))\n", + "order = list(dataset_type.keys())\n", + "ax = sns.barplot(\n", + " x=\"dataset_type\", y=\"acc1\", \n", + " data=df,\n", + " hue=\"model_fullname\",\n", + " ci=None\n", + ")\n", + "ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)\n", + "ax" + ] + }, + { + "cell_type": "markdown", + "id": "0cd85d6a-2b71-44e6-a4b6-96a58a9400b7", + "metadata": {}, + "source": [ + "# Grouping over architecture for each dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "169f49c6-deec-4534-a120-635e7537f276", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAB9IAAAb7CAYAAABV0eoFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzde5xWZb03/s8SUEAgD6SimJB5KvEQkRkmWDzU1jzsEiXSQTpZibXLU+0Okj66n1LKEs0yD4kme4cpmqX4M0FD82xBWpZhKCYeCVQ8DKzfHwOzF8EMDMzMPTDv9+t1v2bd9/Vd1/W9J9l/7M9c1yrKsgwAAAAAAAAA0GCTWjcAAAAAAAAAAB2JIB0AAAAAAAAAKgTpAAAAAAAAAFAhSAcAAAAAAACACkE6AAAAAAAAAFQI0gEAAAAAAACgQpAOAAAAAAAAABWCdAAAAAAAAACoEKQDAAAAAAAAQIUgHQAAAAAAAAAqBOkAAAAAAAAAUCFIBwAAAAAAAIAKQToAAAAAAAAAVAjSAQAAAAAAAKBCkA4AAAAAAAAAFYJ0AAAAAAAAAKjoWusGaHtFUWyWZNDyt88mWVrDdgAAAAAAAABaU5ckb15+Pbssy9fWd0JBeucwKMm9tW4CAAAAAAAAoI0NSXLf+k7iaHcAAAAAAAAAqLAjvXN4dsXFPffck379+tWyFwAAAAAAAIBW849//CPvfve7V7x9trnatSVI7xwan4ner1+/9O/fv5a9AAAAAAAAALSVpWsuWTNHuwMAAAAAAABAhSAdAAAAAAAAACoE6QAAAAAAAABQIUgHAAAAAAAAgApBOgAAAAAAAABUCNIBAAAAAAAAoEKQDgAAAAAAAAAVgnQAAAAAAAAAqBCkAwAAAAAAAECFIB0AAAAAAAAAKrrWugEAAAAAAADYEC1btiwvvfRSFi1alNdffz1Lly6tdUuwwenSpUs23XTT9OnTJ7169comm3SMveCCdAAAAAAAAGihxYsXZ/78+SnLstatwAatvr4+r732WhYvXpyiKLLDDjukd+/etW5LkA4AAAAAAAAtsboQvSiKdOnSpYZdwYZp6dKljf+WyrLM/PnzO0SYLkgHAAAAAACAtbRs2bKVQvRevXplq622Ss+ePVMURY27gw1PWZZ55ZVX8sILL+Sll15qDNN33XXXmh7z3jEOmAcAAAAAAIANwIqgL2kI0fv375/NN99ciA7rqCiKbL755unfv3969eqVpCFcf+mll2ralyAdAAAAAAAA1tKiRYsar7faaisBOrSSoiiy1VZbNb6v/lurBUE6AAAAAAAArKXXX389SUPo17Nnzxp3AxuX6iMSVvxbqxVBOgAAAAAAAKylpUuXJkm6dOliNzq0sqIo0qVLlyT/+2+tVgTpAAAAAAAAAFAhSAcAAAAAAACACkE6AAAAAAAAAFQI0gEAAAAAAACgQpAOAAAAAAAAABWCdAAAAAAAAKAmLr/88hRFkaIo8vjjj7fJGscdd1yKosiAAQPaZP4NwYrf8YQJE2rdygZDkA4AAAAAAAAAFYJ0AAAAAAAAAKgQpAMAAAAAAABAhSAdAAAAAAAAACoE6QAAAAAAAABQIUgHAAAAAACADcCECRNSFEWKokiSLFq0KBMmTMigQYPSq1evbLvttjn44INz5513rnTfM888k69//et5xzvekc033zxbb711Dj/88Dz44IPNrrds2bJceeWVOfjgg7Pddttl0003zZvf/OYcdNBBufDCC/P666+vsecXX3wxX/nKV7L77runR48e2WabbTJixIj8/Oc/b9F3r6+vzyWXXJKDDz4422+/fTbbbLP07ds3Bx54YM4777y8+uqrLZqvNbz44ou57LLLcswxx+Ttb397evXqlU033TTbbbddPvjBD+bHP/5xs7+jxx9/vPF/z8svvzxJ8otf/KLxO3bt2jXDhw9f7X2nnXZaBg8enK233jrdu3fPwIEDc9BBB2XixImZN2/eGnu/995787GPfSz9+/fPZpttlh122CHHHntsHnnkkXX9dWx0irIsa90Dbawoiv5JnkiSJ554Iv37969xRwAAAAAAABumv/zlL6mvr0/Xrl2zyy67tOvaEyZMyLe+9a0kybx58zJixIg8+uijq9R16dIlV199dUaNGpU//OEPOfjggzN//vxV6jbbbLP86le/yvvf//5Vxl544YUcdthhmTVrVpP97LHHHvn1r3+dnXbaabXjDz/8cEaMGJF//OMfqx3/xCc+kfe9730ZN25ckmTu3LkZMGDAKnWPPfZYDjvssDz88MNN9rLLLrvkxhtvXO3/Jscdd1x++tOfZqeddsrjjz/e5BwtNWDAgPz9739vtmbffffNr371q2y33XarjD3++OMZOHBgkuTSSy/NbbfdlsmTJ69UM2zYsMyYMaPx/bnnnpv//M//zBtvvNHkmv96T5LGP744/fTT07dv33zpS19KfX39Kvf27Nkzv/71r3PggQc2+73a0rr8G3vyySez4447rni7Y1mWT65vH13XdwIAAAAAAACgfY0aNSpPPvlkvvrVr+ZDH/pQevbsmd/+9rc5/fTTs2jRonzyk5/Mu971rnz4wx/OkiVLctZZZ2XYsGHp1q1bbrrpppx11ll57bXXMm7cuPzlL3/Jpptu2jj30qVL8+EPfzh33XVXkoZgdvz48Rk4cGCeeuqpXHrppbnuuuvyyCOP5AMf+EAeeuih9OrVa6X+/vnPf+aDH/xgY4h+9NFHZ+zYsdlmm23y6KOP5rvf/W4uvfTSzJ49u9nv+Y9//CNDhw7NggUL0rt373zmM5/JiBEjsu222+af//xnpk+fnu9///v5y1/+kg996EN54IEH8qY3vamVf9urt3Tp0uy333758Ic/nH333TfbbrttXn/99cydOzdXXnllbrrppjz44IMZPXr0KsH2vzrvvPPyhz/8Ie973/vyuc99LrvuumsWLly4UvB/5pln5pvf/GaSZIsttsjnP//5HHTQQdl6662zcOHCPPDAA7n22msbQ/PVufnmm3P33Xdnr732yhe/+MUMGjQoS5YsybXXXpvvf//7eeWVV3Lssceu8t9EZyRIBwAAAAAAgA3MQw89lJkzZ2a//fZr/Oxd73pXdt111xxyyCFZvHhx9ttvv5RlmXvuuSc777xzY9273/3u9O3bNyeccELmzZuXG2+8Mf/+7//eOH7RRRc1huh1dXW5/PLLG8PZwYMH59BDD83Xvva1nH322Xnsscdy5pln5tvf/vZK/Z1xxhl58smGTcFnn312vvrVrzaODR48OEceeWQ+/OEPZ/r06c1+z8985jNZsGBBdtxxx8yYMSNvfetbVxofPnx4Ro0alfe9733529/+lnPPPTdnnnlmS36V6+w3v/nNandMv/e9783HP/7xXHbZZfnEJz6RmTNn5tZbb80HPvCBJuf6wx/+sMrvuuqBBx7IhAkTkiS77rprbr311lVOoT7ooINy0kknNf7eV+d3v/tdDj744Fx77bUrBeXve9/7svXWW+frX//6av+b6Iw67TPSi6LYpiiKDxdFcUZRFL8uiuK5oijK5a/L22jN0UVR3FwUxT+Koni1KIrHi6KYXBTFe9piPQAAAAAAADZO//Ef/7FSiL7CwQcf3HjU+rPPPpv/+3//70oh+grjxo1L9+7dkyR33HHHSmMXXHBBkqRv376ZNGnSaoPdM844I7vvvnuS5OKLL85rr73WOPbaa6/lsssuS5LstddeOe2001a5v1u3brnkkkvSrVu3Jr/jnDlz8stf/jJJMmnSpFVC9BX23XffnHDCCUkajkhvL2s6dnzcuHHZd999kyTXXXdds7VbbLFFk7/rJDnnnHOybNmyFEWRKVOmNPso5+bGunfvnssuu2y1u82/8IUvNH7+r/9NdEadNkhPsiDJDUm+keRDSbZuq4WKouheFMUNSa5OMjLJdkk2S7JTkmOSzCqK4htttT4AAAAAAAAbl9GjRzc5ttdeeyVpeC72UUcdtdqaHj16NAbBf/vb3xo/f+qpp/LII48kSY466qj07t17tfd36dKl8dnmL774Yh544IHGsfvvvz8vvvhikmTs2LHZZJPVR5L9+/fPyJEjm/we06ZNS9Lw3O5DDjmkybokjc/0fuqpp/LEE080W9sWyrLM008/nUcffTRz5sxpfG2//fZJkt///vfN3n/ooYc2+btetmxZbrrppiQNx+yvCOfXxf/5P/8n22yzzWrHevfuvdr/JjorR7s3eCLJI2kIudvCJUk+vPz6tiTfT/JUkkFJ/jPJzknOKIriH2VZ/qSNegAAAAAAAGAjseuuuzY5tsUWWyRp2FG+5ZZbrrFu8eLFjZ/NmTOn8Xp1O96rquNz5szJ/vvvnyQrPfd8yJAhzc7x7ne/OzfeeONqx+67774kySuvvJKuXdc+1nz66aez4447rnX9+rjxxhvzwx/+MLfffvtKv8d/9dxzzzU7z4o/fliduXPnZuHChUn+9w8G1tWKUwSastVWWyVJs9+ls+jMQfoZSe5Ncm9ZlguKohiQZG5rL1IUxbAkY5a/vSHJv5dluXT5+3uLorg+yf1J3pLkO0VRTC3LcmFr9wEAAAAAAMDGo2fPnk2OrdgB3lxNtW7p0qWNn73wwguN19tuu22z92+33XarvW/FbvQkTe5+Xps1nnnmmWbvbcorr7yyTve1RFmW+fSnP51LLrlkreqXLFnS7Hhzf/BQDeH79eu3dg02YV3+m+isOm2QXpbl6e201KnLfy5N8vlKiL6ij+eKojgtDce+b5nkk0kmtlNvAAAAAAAAsFpNPa97hbIs1/j5us6R/G+YO3DgwFx//fXNzlM1cODAta5dV5deemljiL7PPvs0PrN+hx12SM+ePdOlS5ckSV1dXSZPntzs90zSWL8ma/p90no6bZDeHoqi6JXkA8vf3lKW5ZNNlP4iyaIkfZJ8JIJ0AAAAAAAAamDF0d5JwxHpzVmwYMFq76teL1iwoNlj6Jvbdb711ls3zrH77ru36Hj3tnbxxRcnSXbeeefceeed6dGjx2rrqrvz11Xfvn0br5966qn1no+1s0mtG9jIvTvJZsuvZzZVVJbl60l+t+Keoii6tXVjAAAAAAAA8K/23HPPxuu777672dp77rlntfcNGjSo8free+9tdo7mxvfdd98kDUe1z5o1q9l52tsf//jHJMnhhx/eZIhelmUeeOCB9V5r4MCBjUe/33777es9H2tHkN629qhc/2kNtSvGuybZpSWLFEXRv7lXku3WOAkAAAAAAACd3vbbb5899miIuH7+859n8eLFq61bunRpLr/88iQNz/d+5zvf2Tg2ePDgxuC3uWPN58+fn+nTpzfZy+GHH954/Z3vfKdF36Ot1dfXJ2n+eezXX399q+wg32STTXLwwQcnSWbOnJkHH3xwvedkzQTpbWvHynVTx7qv8EQT962NJ9bwav5PfQAAAAAAAGC5E044IUny7LPP5sQTT1xtEP6tb30rDz/8cJLk05/+dDbbbLPGsc022yzjxo1Lkjz00EM555xzVrm/vr4+n/70p/P666832ceQIUMycuTIJMmvfvWrnH766c32/fjjj+fqq69ew7drHbvs0rAv9oYbbljt8e2PPfZYPv/5z7faeieffHI22WSTlGWZ0aNH58knm44emxtj7QnS21bvyvVLa6h9uXLdqw16AQAAAAAAgDX67Gc/m/333z9J8tOf/jTvf//7M3Xq1DzwwAO58cYb89GPfjRnnnlmkoZnhH/jG99YZY5vfvOb6d+/f5LktNNOy5gxY3LTTTflgQceyJQpU/Le9743v/71rzNkyJBme7nsssvSr1+/JMkZZ5yR97znPfnxj3+cu+66Kw8++GD+v//v/8t3v/vdjBw5Mm9729tyzTXXtOavokl1dXVJGnbVv/e9781ll12We+65J7fffnsmTJiQwYMH54UXXlhpp/762GefffKtb30rSfLoo49m0KBB+frXv55bb701Dz30UGbMmJHzzjsvBx54YI499thWWbOz61rrBjZy3SvXTf85TYPXKterf5BC09a0g3272JUOAAAAAADAWujSpUt++ctf5rDDDsusWbMyY8aMzJgxY5W6PfbYI7/+9a/Tq9eqe0Tf9KY35aabbsqIESPy9NNP5+qrr15lt/i4ceNy4IEHNu5eX53tt98+d911V0aNGpV77703d999d7PPbu/Tp8/af9H18MUvfjG33HJLpk+fnj/96U/5xCc+sdJ4jx49csUVV+TGG29sleekJ8nXv/71dOnSJd/85jezcOHCnHXWWTnrrLNWqRs2bFirrNfZ2ZHetl6tXG+6htrNKtdLWrJIWZZPNvdK8nRL5gMAAAAAAKBz22qrrXL77bdn8uTJ+dCHPpRtt9023bp1y9Zbb53hw4dn0qRJeeihh7LTTjs1Occ73vGO/PGPf8ypp56aXXbZJZtttln69u2bgw46KD/72c9y6aWXrlUvO+20U+6+++5ce+21GT16dAYOHJiePXumW7duefOb35z3vve9OemkkzJz5sxccsklrfUraFa3bt1y44035gc/+EHe9a53pWfPnunRo0fe9ra35bOf/WweeOCBjBo1qtXX/epXv5qHH344//Ef/5E999wzffr0Sffu3fPWt741H/jAB3LeeedlypQprb5uZ1Ss7pkGnVFRFAOSzF3+9qdlWR7XCnP+vySnLX87pCzL+5qpPTnJigdEfKgsy5vXd/3K3P2z/BnsTzzxROMxGgAAAAAAALTMX/7yl9TX16dr166Nz8kGWs+6/Bt78skns+OOjYd477h8s/F6sSO9bVX/B1pTel09nv2JNugFAAAAAAAAgLUgSG9bD1eud19D7Yrx+iR/bZt2AAAAAAAAAFgTQXrbujfJ68uvhzVVVBTFpknes+Kesixfb6oWAAAAAAAAgLbVtdYNbMzKslxcFMWtSf4tyYiiKPo3cR7/R5L0WX59bbs1CAAAAAAAAJ3Q3Llz8/LLL7f4vi233DI77LBDG3RERyNIXw9FURyX5LLlb79VluWE1ZSdm4YgvWuSC4qi+EhZlksrc/RN8u3lbxcm+Ulb9QsAAAAAAAAk48aNy8yZM1t839ixY3P55Ze3fkN0OJ02SC+K4oAkb6t81Ldy/bblIXmjsiwvX5d1yrL8TVEUU5KMTnJYkluKojgvyVNJBiX5WpK3LC//SlmWL67LOgAAAAAAAAC0jk4bpCf5VJKxTYwNXf6qunw91vpEGo5uPzjJQctfVcuSnFmW5Y/WYw0AAAAAAABgLcyYMaPWLdDBbVLrBjqDsiyXlGV5SJKPJ7klyTNJXk/yRJKfJTmgiWPhAQAAAAAAAGhnnXZHelmWxyU5bj3nuDwt2KleluXP0hCcAwAAAAAAANBBddogHQAAAADYcA0+5Ypmx+8/p66dOgEAYGPkaHcAAAAAAAAAqBCkAwAAAAAAAECFIB0AAAAAAAAAKjwjHQAAAACghSaddEOz4+MnHtpOnQAA0BYE6QAAAABApzP0/KHNjs86cVY7dQIAQEfkaHcAAAAAAAAAqBCkAwAAAAAAAECFIB0AAAAAAAAAKgTpAAAAAAAAAFAhSAcAAAAAAACACkE6AAAAAAAAsFEriiJFUWTChAm1boUNhCAdAAAAAAAA6FCOP/74xvD7tttua9G9t956a+O948ePb7JuRc36vB5//PG16mn48OGN97SV+vr6PPjgg/nRj36UT33qU9lrr73StWvXFvfalAsvvHCl73755Ze3St8dVddaNwAAAAAAAAAbq8GnXFHrFtrU/efUtcm8dXV1+fGPf5wkmTx5cg466KC1vvfKK69svD722GNbvbeO6qyzzmqzHfdPPfVUvvrVr7bJ3B2VIB0AAAAAAADoUIYOHZqdd945jz32WKZOnZoLLrggPXr0WON9S5YsyTXXXJMk2W233bLffvslScqyXKV29uzZTc4zbty43HfffWus22GHHdbYU3upfsfu3btnn332ybPPPpvHHntsveceP358Fi1alG222SbPPPPMes+3IRCkAwAAAAAAAB1OXV1dTj/99CxevDjTpk3L6NGj13jPddddl8WLFydZ8270Pffcs8mxzTfffK3qOpL9998/F110UYYMGdJ4rPtxxx233kH6tGnTcu211+bNb35zTjvttJx00kmt1HHH5hnpAAAAAAAAQIdz7LHHNj5TfPLkyWt1z4q6oihyzDHHtFlvHdEHP/jBHH/88XnnO9+Zrl1bZz/14sWLG58zf+6552arrbZqlXk3BHakA8AGaOj5Q5sdn3XirHbqBAAAAACgbQwcODAHHHBA7rjjjkyfPj3PPPNMttlmmybrFyxYkFtuuSVJMmzYsOy0006NYysC+dNPP73NniO+MfrqV7+aJ598MsOHD09dXV0uv/zyWrfUbgTpAAAAAMBGZ94Zg5ov2LJP+zQCAKyXurq63HHHHamvr8/VV1+dL37xi03WXn311amvr2+8j/Vz991354c//GE23XTT/PCHP6x1O+3O0e4AAAAAAABAh3TUUUelR48eSdZ8vPuK8Z49e+bII49s8942Zm+88UY+/elPZ9myZTnllFOy++6717qldidIBwAAAAAAADqkPn365PDDD0+S3H///XnkkUdWW/fwww/ngQceSJIcccQR6d27d7v1uDE655xzMnv27Lz1rW/N1772tVq3UxOOdgeATmjSSTc0Oz5+4qHt1AkAAAAAQPPq6uoyZcqUJA27zs8+++xVaqq71R3rvn7++te/5swzz0ySXHDBBY0nAnQ2dqQDAAAAAAAAHdbIkSPTr1+/JMlVV12VsixXGi/LMldddVWSpF+/fhkxYkS797gx+exnP5tXX301o0aNyoc+9KFat1MzdqQDAAAAAAAAHVaXLl0yZsyYTJw4MfPmzcvMmTMzfPjwxvEZM2bkiSeeSJKMGTMmXbp0afOe3njjjfz5z39ucny33XZLt27dOvwa/+ryyy/Prbfemj59+uS8885r1bk3NIJ0AAAAAAAAoEMbO3ZsJk6cmKThGPdqkF6LY93nz5+fQYMGNTk+d+7cDBgwoMOvUfXss8/m5JNPTpKceeaZ2X777Vtt7g2RIB0AAAAAAADo0AYNGpS99947v//97zN16tRMmjQpPXr0yJIlS3LNNdckSfbee+/stddeNe50w/WTn/wkzz//fLbYYotsvfXWjc+lr7r77rtXuu7evXuS5P3vf3+22Wabduu1PQjSAQAAAAAAgA5v7Nix+fKXv5xFixbl+uuvz9FHH51p06Zl0aJFSdpvN3qSDBgwYJVntW+Ia1S99tprSZKFCxfmmGOOWWP9RRddlIsuuihJctttt210QfomtW4AAAAAAAAAYE3GjBmTrl0b9gmvOM59xc8Vz1GH1iJIBwAAAAAAADq8bbfdNiNHjkyS3HzzzZkzZ06mT5+eJBk5cmS22267Wra3wZswYULKsmz2ddlllzXWX3bZZY2fV59Zv7FwtDsAAAAAwL+YeeCw5guGnNw+jQAAKxk7dmx+9atfpb6+PqNHj059fX2S9j3Wnc5BkA4AAAAAAABsEA477LBsscUWWbhwYf74xz8mSfr06ZPDDz+8xp2tvcsvv3yNNb169cqRRx7ZonlfeumlTJ06daXP/vrXvzZeT506NX379m18v88++2SfffZp0RqdiSAdAAAAAAAA2CB07949o0aNysUXX9z42ahRo9KjR48adtUy48aNW2PNTjvt1OIg/bnnnmt27lNOOWWl96effrogvRmCdAAAAAAAAGgj95/jyPHWNnbs2JWCdMe60xYE6QAAAAAAAMAGY+jQoSnLskX3tLR+xowZLapv7/lWZ8CAAS3+ni113HHH5bjjjmvTNTqKTWrdAAAAAAAAAAB0JIJ0AAAAAAAAAKgQpAMAAAAAAABAhSAdAAAAAAAAACoE6QAAAAAAAABQIUgHAAAAAAAAgIqutW4AADqjwadc0ez4/efUtVMnAAAAAADAv7IjHQAAAAAAAAAqBOkAAAAAAAAAUCFIBwAAAAAAAIAKQToAAAAAAAAAVAjSAQAAAAAAAKBCkA4AAAAAAAAAFYJ0AAAAAAAAAKgQpAMAAAAAAABAhSAdAAAAAAAAACoE6QAAAAAAAABQIUgHAAAAAAAAgIqutW4AAACA9jX0/KHNjs86cVY7dQIAAADQMdmRDgAAAAAAAGzUiqJIURSZMGFCrVthA2FHOgAAAC0y6aQbmh0fP/HQduoEAACAjdXxxx+fH//4x0mS3/zmNznooIPW+t5bb701I0aMSJKccMIJmTRp0mrriqJY7z7nzp2bAQMGNFszfPjwzJw5c7VjXbt2zRZbbJG3v/3tOeSQQ/LpT386W2655Xr3tWzZsvzpT3/KPffck3vuuSf33ntv/vCHP+T1119Pktx2220ZPnx4i+Z84403ctVVV+XnP/95Zs+enQULFqR3797p169f9ttvv3zwgx/MqFGj1rv3jkKQDgAAAAAAAG1k3hmDat1Cm3rLN2e3ybx1dXWNQfrkyZNbFKRfeeWVjdfHHntsq/fWmurr6/Pcc8/l9ttvz+23357vfve7ue666/Ke97xnveadPHlyjjvuuNZpMskf/vCHfPzjH8+cOXNW+vz555/P888/nzlz5mTq1KmCdAAAAAAAAIC2MnTo0Oy888557LHHMnXq1FxwwQXp0aPHGu9bsmRJrrnmmiTJbrvtlv322y9JUpblKrWzZzf9RwDjxo3Lfffdt8a6HXbYYY09Nbfm66+/nr/97W+ZPHlyrr/++ixYsCCHHHJI/vznP6dv374tmruq+n27deuWPffcM/X19c1+l6b84Q9/yEEHHZQXXnghm266acaNG5d/+7d/S//+/bNw4cL8/e9/z6233po77rhjnfvtiATpAAAAAAAAQIdTV1eX008/PYsXL860adMyevToNd5z3XXXZfHixUnWvBt9zz33bHJs8803X6u6llrdXO985ztz5JFHZuzYsbniiivywgsv5JJLLslpp522zuu8/e1vz/e///28+93vzj777JPu3btnwoQJLQ7SX3311YwaNSovvPBC+vXrl+nTp6/2O3ziE59oPDZ+Y7FJrRsAAAAAAAAA+FfHHnts43PMJ0+evFb3rKgriiLHHHNMm/XWFk499dTG67vvvnu95nr3u9+dL3zhC3nPe96T7t27r/M85557bh599NEkyc9+9rNm/6hg0003Xed1OiJBOgAAAAAAANDhDBw4MAcccECSZPr06XnmmWearV+wYEFuueWWJMmwYcOy0047NY4VRZGiKDJhwoQ263d9DRgwoPH61VdfrV0jyy1dujQXXXRRkmT48OEZPnx4bRtqZ4J0AAAAAAAAoEOqq6tLktTX1+fqq69utvbqq69OfX39SvdtSB5//PHG67e85S21a2S5O++8M/Pnz0+SjBo1qvHzV155JX/961/zj3/8I8uWLatVe21OkA4AAAAAAAB0SEcddVR69OiRZM3Hu68Y79mzZ4488sg27621nXvuuY3Xhx12WA07afC73/2u8Xr//ffPPffckw9+8IPp3bt3dtlll2y//fZ585vfnE996lP5+9//XsNO20bXWjcAAAAAAAAAsDp9+vTJ4YcfnilTpuT+++/PI488kj322GOVuocffjgPPPBAkuSII45I796927vVtTJnzpyV3r/++ut5/PHHc+WVV+baa69Nkhx55JE5+OCDa9HeSh5++OHG69/97nf5whe+0Ljjf4UXXnghl1xySa655ppMmzYtBx54YHu32WYE6QAAbHSGnj+02fFZJ85qp04AAAAAWF91dXWZMmVKkoZd52efffYqNdXd6h35WPdBgwY1Obbrrrvm1FNPzbhx49qxo6a98MILjddf+tKXsnTp0px66qk5/vjj079//zzxxBO56KKLMnHixCxcuDAf+chH8vvf/z477LBDDbtuPY52BwAAAAAAADqskSNHpl+/fkmSq666KmVZrjRelmWuuuqqJEm/fv0yYsSIdu+xNTz66KO59NJLc+edd9a6lSTJyy+/3Hj92muv5Tvf+U6+/e1v561vfWs23XTT7LzzzjnnnHNy1llnJUmef/75/Nd//Vet2m11gnQAAAAAAACgw+rSpUvGjBmTJJk3b15mzpy50viMGTPyxBNPJEnGjBmTLl26tHlPb7zxRubMmdPk64033ljtfWVZrvRaunRpFixYkGuuuSZ777137rzzzowYMaLxmPeq5tarht6tpXv37o3X/fv3z5e+9KXV1p1yyimNf+gwZcqUVf7QYUPlaHcAAAAAAACgQxs7dmwmTpyYpOEY9+HDhzeO1eJY9/nz5zd7TPvcuXMzYMCANc6zySabZJtttslHPvKRjBw5MoMHD86jjz6a4447LsOHD8+WW27ZWNvcerfddttKv5PWUH3O/P/5P/+nyT9Q6Nq1a97//vfnqquuyvPPP5+5c+fmrW99a6v2Ugt2pAMAAAAAAAAd2qBBg7L33nsnSaZOnZolS5YkSZYsWZJrrrkmSbL33ntnr732qlmP66tXr1753Oc+lyRZtGhRpk6dWtN+dtxxx8br/v37r3XtM88802Y9tSdBOgAAAAAAANDhjR07NklDyHz99dcnSaZNm5ZFixYlab/d6EkyYMCAVY5pr77WZjf66uy+++6N17Nnz15prLn1Wns3epK84x3vaLxeunRps7XV8a5dN45D0TeObwEAANCJDD7limbH7z+n/f4fBwAAANBexowZk1NPPTX19fWZPHlyjj766MZj3avPUd+Q1dfXN1439Zz19nLggQc2Xj/22GPN1lbHd9hhhzbrqT3ZkQ4AAAAAAAB0eNtuu21GjhyZJLn55pszZ86cTJ8+PUkycuTIbLfddrVsr1Xce++9jdfV49JrYeDAgdl3332TNPy+X3nlldXWLV68OLfcckuSZOedd06/fv3arce2ZEc6AAD8i0kn3dDs+PiJh7ZTJwAAAABUjR07Nr/61a9SX1+f0aNHN+7gbs9j3dvK3//+91x44YWN7w8++OAadtPgK1/5So4++ugsXLgwJ510Un74wx+uUvOlL30pixcvTpJ89rOfbe8W24wgHQAAAAAAANggHHbYYdliiy2ycOHC/PGPf0yS9OnTJ4cffniNO1s7c+bMWen9smXL8vzzz+eOO+7ID37wgzz//PNJko9//OPZZ5991mutyy+/fKX3Dz30UOP1TTfdlMcff7zx/dve9rYccMABq8xx1FFH5ac//Wl+9atf5aKLLsoTTzyRz3zmM9lxxx0zb968XHTRRbnpppuSJPvuu2/Gjx+/Xj13JIJ0AAAAAAAAYIPQvXv3jBo1KhdffHHjZ6NGjUqPHj1q2NXaGzRo0Bprjj766FxyySXrvda4ceOaHPv2t7+90vuxY8euNkhPkv/+7//ORz/60UyfPj033nhjbrzxxlVqhgwZkuuvvz7du3dfv6Y7EEE6AAAAAAAAtJG3fHN2rVvY6IwdO3alIH1DPta9KIr06tUrO+64Y/bff//U1dXlwAMPrHVbK+nVq1duvvnmTJkyJT/96U/z0EMP5fnnn88WW2yRffbZJx/72MdSV1eXLl261LrVViVIBwAAAAAAADYYQ4cOTVmWLbqnpfUzZsxoUX17zdUSLf3OazJ69OiMHj26VefsyDapdQMAAAAAAAAA0JEI0gEAAAAAAACgQpAOAAAAAAAAABWCdAAAAAAAAACo6FrrBgCA1jfzwGHNFww5uX0aAQAAAACADZAd6QAAAAAAAABQIUgHAAAAAAAAgApHuwNABzTvjEHNF2zZp30aAQAAAACATsiOdAAAAAAAAACoEKQDAAAAAAAAQIUgHQAAAAAAAAAqBOkAAAAAAAAAUCFIBwAAAAAAAIAKQToAAAAAAAAAVAjSAQAAAAAAAKBCkA4AAAAAAAAAFYJ0AAAAAAAAAKgQpAMAAAAAAABAhSAdAAAAAAAAACoE6QAAAAAAAMBGrSiKFEWRCRMm1LoVNhBda90AAAAAAAAAbKyGnj+01i20qVknzmqTeY8//vj8+Mc/TpL85je/yUEHHbTW9956660ZMWJEkuSEE07IpEmTVltXFMV69zl37twMGDBgjXXDhw/PzJkzkyRlWa7V3Cv6GzZsWGbMmLGuLaa+vj6zZ8/OPffck3vvvTf33HNPHn744SxdujTJ2n+Hplx44YU54YQTGt9fdtllOe6449Z5vo5CkA4AAAAAAAB0KHV1dY1B+uTJk1sUpF955ZWN18cee2yr97ahOeuss9psJ/5TTz2Vr371q20yd60J0gEAAAAAAIAOZejQodl5553z2GOPZerUqbngggvSo0ePNd63ZMmSXHPNNUmS3XbbLfvtt1+S1e8Cnz17dpPzjBs3Lvfdd98a63bYYYc19lRr1e/evXv37LPPPnn22Wfz2GOPrffc48ePz6JFi7LNNtvkmWeeWe/5OhJBOgAAAAAAANDh1NXV5fTTT8/ixYszbdq0jB49eo33XHfddVm8eHGSNe9G33PPPZsc23zzzdeqbkOw//7756KLLsqQIUOy1157pWvXrjnuuOPWO0ifNm1arr322rz5zW/OaaedlpNOOqmVOu4YNql1AwAAAAAAAAD/6thjj218TvjkyZPX6p4VdUVR5Jhjjmmz3jYkH/zgB3P88cfnne98Z7p2bZ191osXL8748eOTJOeee2622mqrVpm3IxGkAwAAAAAAAB3OwIEDc8ABByRJpk+fvsajwxcsWJBbbrklSTJs2LDstNNOjWNFUaQoijZ7Vnhn89WvfjVPPvlkhg8fnrq6ulq30yYE6QAAAAAAAECHtCKkra+vz9VXX91s7dVXX536+vqV7qP13X333fnhD3+YTTfdND/84Q9r3U6bEaQDAAAAAAAAHdJRRx2VHj16JFnz8e4rxnv27JkjjzyyzXvrjN544418+tOfzrJly3LKKadk9913r3VLbaZ1DsEHAAAAAAAAaGV9+vTJ4YcfnilTpuT+++/PI488kj322GOVuocffjgPPPBAkuSII45I796927vVtTZnzpxat7DOzjnnnMyePTtvfetb87Wvfa3W7bQpQToAAAAAAADQYdXV1WXKlClJGnadn3322avUVHerd/Rj3QcNGlTrFtbJX//615x55plJkgsuuKDxpICNlaPdAQAAAAAAgA5r5MiR6devX5LkqquuSlmWK42XZZmrrroqSdKvX7+MGDGi3XvsDD772c/m1VdfzahRo/KhD32o1u20OTvSAQAAAAAAgA6rS5cuGTNmTCZOnJh58+Zl5syZGT58eOP4jBkz8sQTTyRJxowZky5durR5T2+88Ub+/Oc/Nzm+2267pVu3bqsd+9c/BGhKURStvva6uvzyy3PrrbemT58+Oe+881p17o5KkA4AAAAAAAB0aGPHjs3EiROTNBzjXg3Sa3Gs+/z585s9on3u3LkZMGDARrH2s88+m5NPPjlJcuaZZ2b77bdvtbk7MkE6AADARmbeGWt41tqWfdqnEQAAAGglgwYNyt57753f//73mTp1aiZNmpQePXpkyZIlueaaa5Ike++9d/baa68ad7rx+clPfpLnn38+W2yxRbbeeuvG59VX3X333Stdd+/ePUny/ve/P9tss0279dqaBOkAAAAAAABAhzd27Nh8+ctfzqJFi3L99dfn6KOPzrRp07Jo0aIk7bcbPUkGDBiw1ke0b+hrv/baa0mShQsX5phjjllj/UUXXZSLLrooSXLbbbcJ0oHaG3r+0GbHZ504q506AQAAAAAAaF1jxozJqaeemvr6+kyePDlHH31047HuK56jDq1lk1o3AAAAAAAAALAm2267bUaOHJkkufnmmzNnzpxMnz49STJy5Mhst912tWxvozVhwoSUZdns67LLLmusv+yyyxo/rz7LfkMjSAcAAAAAAAA2CGPHjk2S1NfXZ/To0amvr0/Svse60zk42h0AAAAAAADYIBx22GHZYostsnDhwvzxj39MkvTp0yeHH354jTvruF566aVMnTp1pc/++te/Nl5PnTo1ffv2bXy/zz77ZJ999mmv9josQToAAAAAAACwQejevXtGjRqViy++uPGzUaNGpUePHjXsqmN77rnnMm7cuCbHTznllJXen3766YL0CNIBAAAAAACgzcw6cVatW9jojB07dqUg3bHutAVBOgAAAAAAALDBGDp0aMqybNE9La2fMWNGi+rbYr6W9tyUAQMGtNpcTTnuuONy3HHHteka7W2TWjcAAAAAAAAAAB2JHelAo0kn3dDs+PiJh7ZTJwAAAAAAAFA7gnQAAABWMvPAYc0XDDm5fRoBAAAAqBFHuwMAAAAAAABAhSAdAAAAAAAAACoE6QAAAAAAAABQIUgHAAAAAAAAgApBOgAAAAAAAABUCNIBAAAAAAAAoEKQDgAAAAAAAAAVgnQAAAAAAAAAqBCkAwAAAAAAAECFIB0AAAAAAAAAKgTpAAAAAAAAAFAhSAcAAAAAAACACkE6AAAAAAAAAFQI0gEAAAAAAACgomutGwD+1+BTrmh2/P5z6tqpEwAAAAAAAOi87EgHAAAAAAAAgApBOgAAAAAAALBRK4oiRVFkwoQJtW6FDYSj3QEAAAAAAKCNzDxwWK1baFPDbp/ZJvMef/zx+fGPf5wk+c1vfpODDjpore+99dZbM2LEiCTJCSeckEmTJq22riiK9e5z7ty5GTBgQLM1w4cPz8yZq/89de3aNVtssUXe/va355BDDsmnP/3pbLnlluvd1yOPPJJbb7019957b2bPnp1nnnkmzz33XLp06ZJtt902Q4YMyZgxY3LYYYc1+3uYN29ebrzxxsyYMSMPPfRQnnzyySxdujR9+/bN4MGDM3r06IwaNSpdu258sbMd6QAAAAAAAECHUldX13g9efLkFt175ZVXNl4fe+yxrdZTW6ivr89zzz2X22+/Paeddlr22GOP/O53v1vvec8666yceOKJueKKK/Lggw9m/vz5ee211/LKK69k7ty5+Z//+Z8cccQROeigg/LCCy+sdo5vfvObGTBgQD7/+c/nf/7nf/Loo4/mlVdeyWuvvZb58+fn+uuvz5gxY7L//vtn3rx5691zR7Px/WkAAAAAAAAAsEEbOnRodt555zz22GOZOnVqLrjggvTo0WON9y1ZsiTXXHNNkmS33XbLfvvtlyQpy3KV2tmzZzc5z7hx43LfffetsW6HHXZYY0/Nrfn666/nb3/7WyZPnpzrr78+CxYsyCGHHJI///nP6du3b4vmruratWv222+/DB06NIMGDcp2222XN7/5zXnxxRfzpz/9KT/60Y8yZ86czJw5M4ceemjuuOOObLLJynuwn3rqqZRlmc033zz//u//ng984APZZZdd0r179zzyyCP5wQ9+kHvvvTf33XdfRowYkQceeCC9evVa5547GkE6AAAAAAAA0OHU1dXl9NNPz+LFizNt2rSMHj16jfdcd911Wbx4cZI170bfc889mxzbfPPN16qupVY31zvf+c4ceeSRGTt2bK644oq88MILueSSS3Laaaet8zo/+clPmjxufcSIEfnc5z6Xo446Kr/4xS9y55135sYbb8yhhx66Ut3WW2+db3/72/nc5z6X3r17rzQ2ePDgfOxjH8uYMWPyP//zP/nLX/6S733ve/nGN76xzj13NI52BwAAAAAAADqcY489tvH53Wt7vPuKuqIocswxx7RZb23h1FNPbby+++6712uuNT2zvEuXLiutd/vtt69S8+1vfzunnnrqKiF6dY4LL7wwm266aZJk6tSp69FxxyNIBwAAAAAAADqcgQMH5oADDkiSTJ8+Pc8880yz9QsWLMgtt9ySJBk2bFh22mmnxrGiKFIURSZMmNBm/a6vAQMGNF6/+uqrbb5eddf9uq639dZbZ6+99kqSPPbYY63SV0chSAcAAAAAAAA6pLq6uiRJfX19rr766mZrr7766tTX169034bk8ccfb7x+y1ve0ubrVX+fu++++zrP89prryXJKs9Y39BtXN8GAAAAAAAA2GgcddRR6dGjR5I1H+++Yrxnz5458sgj27y31nbuuec2Xh922GFtssZzzz2Xu+66K5/85CfzX//1X0kadpV//OMfX6f5nnnmmTzyyCNJ1i+M74iaPxwfAAAAAAAAoEb69OmTww8/PFOmTMn999+fRx55JHvssccqdQ8//HAeeOCBJMkRRxzR5HO9a23OnDkrvX/99dfz+OOP58orr8y1116bJDnyyCNz8MEHt9qaw4cPz8yZM1c7ttVWW+UXv/hFtthii3Wa+5xzzmk8BeCoo45a1xY7JEE6AAAAAAAA0GHV1dVlypQpSRp2nZ999tmr1FR3q3fkY90HDRrU5Niuu+6aU089NePGjWuXXk488cR8/etfzzbbbLNO9999990577zzkiT9+/fP5z//+VbsrvYc7Q4AAAAAAAB0WCNHjky/fv2SJFdddVXKslxpvCzLXHXVVUmSfv36ZcSIEe3eY2t49NFHc+mll+bOO+9s1Xkvu+yyzJ49O3/4wx9y++2357vf/W522WWXXHDBBfnkJz+ZBQsWtHjOBQsW5Mgjj0x9fX2KoshPf/rT9OzZs1X7rjU70gEAAAAAAIAOq0uXLhkzZkwmTpyYefPmZebMmRk+fHjj+IwZM/LEE08kScaMGZMuXbq0eU9vvPFG/vznPzc5vttuu6Vbt26rfP6vfwSwbNmyPPfcc/ntb3+bM844I3feeWdGjBiRq6++Ov/+7/++Uu2/HgtfNXDgwGy++eZNjlW9733vy+c+97mMGjUqv/zlLzNkyJDceeed6d+/f5PzVy1evDiHHHJInnzyySTJ2Wefnfe///1rde+GRJAOAAAAAAAAdGhjx47NxIkTkzQc414N0mtxrPv8+fObPaZ97ty5GTBgwBrn2WSTTbLNNtvkIx/5SEaOHJnBgwfn0UcfzXHHHZfhw4dnyy23bKxtbr3bbrttpd/JmnTv3j2XXXZZdtpppzzxxBM59dRT87Of/WyN97366qs5/PDDc//99ydJvvzlL+crX/nKWq+7IXG0OwAAAAAAANChDRo0KHvvvXeSZOrUqVmyZEmSZMmSJbnmmmuSJHvvvXf22muvmvW4vnr16pXPfe5zSZJFixZl6tSpbbpe3759M3To0CTJtGnTUl9f32x9fX19jjrqqNx2221Jkk996lONf9ywMRKkAwAAAAAAAB3e2LFjkzSEzNdff32ShgB40aJFSdpvN3qSDBgwIGVZNvlam93oq7P77rs3Xs+ePXulsebWa8lu9Ko3v/nNSZJXXnklzz77bJN1y5Yty7HHHpsbbrghSXL00UfnRz/60TqtuaEQpAMAAAAAAAAd3pgxY9K1a8OTq1cc577i54rnqG/oqrvC33jjjTZfb/78+Y3XvXr1arLu+OOPz5QpU5IkH/7whzN58uRsssnGHTVv3N8OAAAAAAAA2Chsu+22GTlyZJLk5ptvzpw5czJ9+vQkyciRI7PddtvVsr1Wce+99zZe77jjjm261vz583PXXXclSXbaaaf07t17tXVf/vKX85Of/CRJ8oEPfCBTp05Nt27d2rS3jkCQDgAAAAAAAGwQVhzvXl9fn9GjRzfu4G7PY93byt///vdceOGFje8PPvjgdZrn0UcfzW9+85tma/75z3/mYx/7WF5//fUkybHHHrvaugkTJuR73/tekuS9731vpk2bls0222yd+trQdK11AwAAAAAAAABr47DDDssWW2yRhQsX5o9//GOSpE+fPjn88MNr3NnamTNnzkrvly1blueffz533HFHfvCDH+T5559Pknz84x/PPvvss05rPPXUU/nABz6QvffeO0cccUQGDx6c7bbbLl27ds3TTz+dWbNm5ZJLLsnTTz+dJNlzzz3zla98ZZV5zj///HzrW99Kkuywww75zne+k7lz5za79m677bbR7FYXpAMAAAAAAAAbhO7du2fUqFG5+OKLGz8bNWpUevToUcOu1t6gQYPWWHP00UfnkksuWe+1fv/73+f3v/99szWHHHJILrvssmy++earjF1zzTWN1/Pnz88BBxywxjXnzp2bAQMGtLjXjkiQDgAAAAAAAG1k2O0za93CRmfs2LErBekb8rHuRVGkV69e2XHHHbP//vunrq4uBx544HrNOXTo0MycOTO/+c1v8tvf/jbz5s3LggUL8sorr6RPnz4ZOHBg9ttvv4wZMyZDhw5tpW+y8RGkAwAA0ClNOumGZsfHTzy0nToBAACgJYYOHZqyLFt0T0vrZ8yY0aL69pprbXTr1i0HHnjgegfy7d13R7NJrRsAAAAAAAAAgI7EjnQAAAA2SEPPb/74uVknzmqnTgAAAICNjR3pAAAAAAAAAFAhSAcAAAAAAACACke7AwDQ4Qw+5Ypmx+8/p66dOgEAAAAAOiNBOgBQM55tCwAAAABAR+RodwAAAAAAAACoEKQDAAAAAAAAQIUgHQAAAAAAAAAqBOkAAAAAAAAAUCFIBwAAAAAAAICKrrVuAAAAgM5p8ClXNDt+/zl17dQJAAAAwMrsSAcAAAAAAACACkE6AAAAAAAAAFQ42h0A2GBNOumGZsfHTzy0nToBAAAAAGBjYkc6AAAAAAAAAFQI0gEAAAAAAACgQpAOAAAAAAAAABWCdAAAAAAAAGCjVhRFiqLIhAkTat0KGwhBOgAAAAAAANChHH/88Y3h92233daie2+99dbGe8ePH99k3Yqa9Xk9/vjj6/lN28bChQtzyy235KyzzsoRRxyR7bffvrHn4cOHr9fcy5Yty/7777/S72Fj1LXWDQAAAAAAAMDGatJJN9S6hTY1fuKhbTJvXV1dfvzjHydJJk+enIMOOmit773yyisbr4899thW721DsO+++7ZZyH/hhRfmd7/7XZvM3ZEI0gEAAAAAAIAOZejQodl5553z2GOPZerUqbngggvSo0ePNd63ZMmSXHPNNUmS3XbbLfvtt1+SpCzLVWpnz57d5Dzjxo3Lfffdt8a6HXbYYY091UL1+2677bYZMmRIfvnLX673vPPnz8/Xvva1FEWRrbfeOs8999x6z9lRCdIBAAAAAACADqeuri6nn356Fi9enGnTpmX06NFrvOe6667L4sWLk6x5N/qee+7Z5Njmm2++VnUd1fjx4zNw4MAMGTIkb3nLW5KkVY5gHz9+fBYtWpRPfOITeeyxxzJz5sz1nrOjEqQDAADQIc07Y1DzBVv2aZ9GAAAAqIljjz02EyZMSFmWmTx58loF6ZMnT07SEBofc8wxbd1ih3XyySe3+py/+MUvct1116Vv3775zne+k49+9KOtvkZHskmtGwAAAIC2MPPAYc2+AAAA6NgGDhyYAw44IEkyffr0PPPMM83WL1iwILfcckuSZNiwYdlpp50ax4qiSFEUmTBhQpv1uzauv/76fPCDH0zfvn3Ts2fP7LrrrjnllFPy9NNPJ0kGDBiQoihy3HHH1bTPf7Vo0aJ84QtfSJKcc8452XrrrWvcUdsTpAMAAAAAAAAdUl1dXZKkvr4+V199dbO1V199derr61e6r6MoyzKf/exnc/jhh2f69Ol5/vnns2TJkvzlL3/Jueeem3333TcPPvhgrdts0le+8pXMnz8/Bx54YIcL+duKIB0AAAAAAADokI466qj06NEjyf8e296UFeM9e/bMkUce2ea9tcT/+3//Lz/60Y+SJP3798+kSZNy99135/bbb8/Xvva1/POf/8yRRx6ZV155pcadruquu+7Kj370o3Tr1i0//OEPa91Ou/GMdAAAAAAAAKBD6tOnTw4//PBMmTIl999/fx555JHsscceq9Q9/PDDeeCBB5IkRxxxRHr37t3erTbpH//4R84444wkyVvf+tbcdddd2WabbRrH3/e+9+Xggw/OQQcdlNdff71Wba7WG2+8kc985jNZtmxZTjvttLz97W+vdUvtxo50AAAAAAAAoMOqHtPe1K706ucd7Vj3n/70p3n11VeTJN/73vdWCtFXeO9735sTTjihvVtbo29/+9uZM2dOBg4cmG984xu1bqddCdIBAAAAAACADmvkyJHp169fkuSqq65KWZYrjZdlmauuuipJ0q9fv4wYMaLde2zOrbfemiTZeuutc8ghhzRZ19H+AOAvf/lLzjrrrCTJpEmTGo/Y7ywc7Q4AAAAAAAB0WF26dMmYMWMyceLEzJs3LzNnzszw4cMbx2fMmJEnnngiSTJmzJh06dKlzXt644038uc//7nJ8d122y3dunVLksyZMydJss8++zTb26BBg7LZZpvltddeW2XsmWeeyTPPPLPa+zbffPMMHDiwJe2vleOPPz6vvvpqPvrRj+bggw9u9fk7OkE6AAAAAAAA0KGNHTs2EydOTNJwjHs1SK/Fse7z58/PoEGDmhyfO3duBgwYkCR58cUXk2S1R7pXdenSJVtuuWWefvrpVcYuvPDCfOtb31rtfcOGDcuMGTPWrvG1dOmll+a2225L79698/3vf79V595QCNIBAAAAAACADm3QoEHZe++98/vf/z5Tp05tPGp8yZIlueaaa5Ike++9d/baa68ad7px+Pa3v52kIaS/4447VltT3SE/ZcqUJA274w899NC2b7AdCNIBAAAAAACADm/s2LH58pe/nEWLFuX666/P0UcfnWnTpmXRokVJ2vcZ4wMGDFjlWe1NWbHLvKmj2VdYunRp4+71fzVhwoRMmDChpW2usxXHy//yl7/ML3/5yzXWf+xjH0uS7LTTThtNkL5JrRsAAAAAAAAAWJMxY8aka9eGfcIrjnNf8XPFc9Q7one84x1JkoceeihLly5tsm727NmrfT46tSFIBwAAAAAAADq8bbfdNiNHjkyS3HzzzZkzZ06mT5+eJBk5cmS22267WrbXpA984ANJkueffz433nhjk3VXXHFFe7W0Ro8//njKsmz2NWzYsMb6FZ89/vjjtWu6lQnSAQAAAAAAgA3C2LFjkyT19fUZPXp06uvrk7Tvse4tNXbs2Gy22WZJki996Ut59tlnV6m56667csEFF7R3azTDM9IBAAAAAACADcJhhx2WLbbYIgsXLswf//jHJEmfPn1y+OGH17izpm2//fY5/fTT85//+Z/529/+lsGDB+crX/lKhgwZktdeey0333xzJk6cmO233z4vv/xynn322RRFsV5rPvTQQ3nooYdWO/b000/n8ssvX+mzI488Mr169VqvNTc2gnQAAAAAAABgg9C9e/eMGjUqF198ceNno0aNSo8ePWrY1Zp95Stfyd///vf86Ec/yhNPPJETTjhhpfG+ffvm5z//eT7ykY8kafie6+O6667Lt771rdWO/fnPf864ceNW+mz48OGC9H/haHcAAAAAAABgg7HiePcVOvKx7isURZGLLroo06ZNy8iRI7PVVlule/fuedvb3pYvfOELefDBB/Oud70rixYtSpK86U1vqnHH2JEOAAAAAAAAbWT8xENr3cJGZ+jQoSnLskX3tLR+xowZLapfW4cddlgOO+yw1Y49+eST+ec//5kk2WWXXdZrnQkTJmTChAnrNceatNXvqKOwIx0AAAAAAACgxq6++urG6/e85z017IREkA4AAAAAAADQpl5++eX84x//aHL8wQcfzJlnnpkkGTx4cN7xjne0V2s0wdHuAAAAAAAAAG3o2WefzR577JEjjjgiH/rQh7Lbbrtls802y1NPPZWbbropl1xySZYsWZKiKPLd73631u0SQToAAAAAAABAm3v11VczZcqUTJkyZbXjm266aS6++OIceOCB7dwZqyNIBwAAAAAAAGhDO+ywQ/77v/87v/71r3PfffflmWeeyYsvvpiePXtmwIABGTFiRE488cTstNNOtW6V5QTpAAAAAAAAAG2oW7duOeqoo3LUUUfVuhXW0ia1bgAAAAAAAAAAOhI70gEAAIAOYdJJNzQ7Pn7ioe3UCQAAAJ2dHekAAAAAAAAAUCFIBwAA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(12,8))\n", + "order = list(dataset_type.keys())\n", + "ax = sns.barplot(\n", + " x=\"dataset\", y=\"acc1\", \n", + " data=df,\n", + " order=order,\n", + " hue=\"model_arch\",\n", + " ci=None\n", + ")\n", + "ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)\n", + "ax" + ] + }, + { + "cell_type": "markdown", + "id": "b397daeb-e12c-4bae-887a-8c4d7bfd7db7", + "metadata": {}, + "source": [ + "# Grouping over pre-training data source" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "c7c746f2-820c-4939-80dc-796efef941e4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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dfjwYav1CQkJOnTokKTceYbBwcGZrs9o/rt375qeh6urq9q3b3/vAf7rl19+0fXr1yVJvXr1yrC9j4+PPvnkE0nSjh071LFjR8XGxuZYPHmJRDoAAAAAAAAAAAByVUoSOC4uTklJSRbbxMbGplplm1WtW7eWJEVHR2vVqlVW2y1YsMC0jXZKn9wQGxurjh076sCBA5Kk9957T++++262xrp69appNbYlCxcuNF3n5j2ZS1mlLiWvus+qiIgI7d69W5JUrlw5FSpUyGK70aNHa/78+aY5V65cKTs7u2xELPn7+1utW7NmjWlVf248w99++00XLlywWJeUlGSKrVixYqpdu3a6YwUEBOjy5cuSpH79+mV49ntmJSQkaMKECZIkOzs7DR48OFP93n33XU2ePFmStG3bNnXq1Em3b9/OkZjyEol0AAAAAAAAAAAA5KqKFStKkmJiYrRy5co09YmJiRo0aJAiIyOzPcfAgQPl6OgoSXrrrbd0/vz5NG0OHz6sKVOmSEo+A7xbt27Zni898fHx8vLy0s6dOyVJb7zxhj7++ON7GnP06NEWtwcPCgrSvHnzJEl16tRRvXr17mkeKXmVecrqbEuMRqM2b94sKfnMbQ8PD1PdyZMnFRgYmO74169fV9++fU2r6AcMGGCx3cSJE/XFF19Ikp577jmtW7dODg4OWbiT1ObMmaMdO3akKb948aJ8fHwkSY6OjtneKj09cXFxGjp0qBITE9PUffLJJzp69Kgk6eWXX87wHs1fOMnKMQFXrlyxulo8Pj5eL7/8sul89HfffVcVKlTI9Njjxo3TRx99JEn6/fff1blzZ925cyfT/R9EnJEOAAAAAAAAAACAXNWrVy+NGzdOcXFx8vb21qFDh9S6dWsVLlxYx44d08yZM7V//355enqaks9Z5erqKl9fXw0fPlyRkZGqW7euxowZo+eee06JiYnavHmzfH19devWLRkMBs2bNy/bK5sz0rdvX/3222+SpJYtW+qVV15RSEiI1fb29vaqVKmS1fpnn31Wx48fV506dTR27FjVr19fcXFx+uWXX/TFF18oISFBtra2mjVrVo7Ef+jQIQ0cOFD16tVT586dVbt2bZUsWVJ3795VaGioFi1apE2bNkmSunbtmups88jISLVq1UrPPvusunXrpjp16qhkyZKytbXVxYsXtXPnTi1YsMB0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myUln7nt4eFhqjt58qQCAwPTHf/69evq27evaRX9gAED7jnmzJgzZ4527NiRpvzixYvy8fGRJDk6OmZ7q/T0xMXFaejQoUpMTExT98knn+jo0aOSpJdfflkODg7pjmX+wklWjgm4cuWK1dXi8fHxevnll03no7/77ruqUKFCpsceN26cPvroI0nS77//rs6dO+vOnTuZ7v8g4ox0AAAAAAAAAAAA5KpevXpp3LhxiouLk7e3tw4dOqTWrVurcOHCOnbsmGbOnKn9+/fL09PTlHzOKldXV/n6+mr48OGKjIxU3bp1NWbMGD333HNKTEzU5s2b5evrq1u3bslgMGjevHmys7PL4TtN1rdvX/3222+SpJYtW+qVV15RSEiI1fb29vaqVKmS1fpnn31Wx48fV506dTR27FjVr19fcXFx+uWXX/TFF18oISFBtra2mjVrVo7Ef+jQIQ0cOFD16tVT586dVbt2bZUsWVJ3795VaGioFi1apE2bNkmSunbtajrbXJIiIyPVqlUrPfvss+rWrZvq1KmjkiVLytbWVhcvXtTOnTu1YMEC01n21atX15gxY3Ik7vS4urrK0dFRbdq00ahRo9ShQwc5ODho7969mjJliukljkmTJsnNzS3H569bt65++ukneXp6atSoUapYsaKioqLk7+9v2qbd3d1d48ePT3eca9eu6eeff5aU/OwyWr1ubuvWrRo8eLD69++v1q1bq2zZsoqNjdXBgwc1d+5c0xEEbdu2zTAOS8aPH6/ExER9+OGH2rJli7p27ar169dn+GLAg4pEOgAAAADgsXdictrVElXea5kHkQAAAACPJnd3d82ZM0eDBg3S7du3NXXqVE2dOjVVm969e2vw4MH3tK32a6+9pujoaI0fP15RUVEaPXp0mjYODg6aN2+eOnTokO15MrJ69WrTdWBgoJ555pl025crV05hYWFW62vWrKnXX39dw4YN0+uvv56m3t7eXv7+/mrQoEG2Y7YkODg43bO9GzdurAULFlisO3z4cLpnkktSx44dtWjRIhUsWPCe4swMR0dHrVy5Uu3bt7f4/ZOkkSNHWvzO5IThw4crKChIfn5+6tOnT5r6UqVKaePGjSpSpEi64yxbtkxxcXGSsrYaPUV0dLRmzZpl9aULb29vzZkzR/b29lkeW5ImTpyoxMREffzxx/rtt9/k5eWltWvX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mjdvbro+c+ZMpvoEBwerb9++KlOmjPLnz68yZcrI29tbJ06cuKdYMvLXX39p5MiRqlatmooUKaICBQqoQoUKGjhwoA4cOJCrc0vSb7/9plOnTkmSxo4dm24SHcgpJNIBAAAAAAAAAACQ6z766CO1atVK06dP165du/TPP/8oISFB169f1+HDhzV9+nRVqVJFa9asuad5pk6dqpo1a+rbb7/V6dOndfv2bd26dUvHjx/XjBkz9PTTT2vxYstHTf3XmDFj1LZtW/3888+6dOmS4uPjFRYWprlz56p27dr3lMA23348M2d6L1y4UM8995x+/PFHhYeHKy4uTuHh4fL391etWrW0bNmybMeSnkmTJql69eqaOXOmjh8/rhs3bujOnTsKDQ2Vn5+f6tatqwkTJuTK3ClWrFghSbKxsVH37t1N5VeuXNHp06d1/fr1XJ0fjycS6QAAAAAAAAAAAMh1CQkJKlWqlF577TUtWbJEO3fu1P79+7V27Vq98847cnJyUmxsrPr165ftBPXs2bM1btw4JSUlydXVVZ999pl2796tHTt2aOLEiSpYsKDi4uLk7e2tX375Jd2xvv32W02bNk3NmjXTDz/8oH379mnz5s168cUXJUmXL1/Wyy+/nK04JSkoKMh0/fTTT6fb9tChQ3r11Vfl5uammTNn6o8//lBQUJDeffddOTg4KC4uTi+88IL27t2b7Xgs+eCDD/TBBx8oISFBzz33nObPn6/du3dr3759+v7779WoUSMZjUZ99NFHmjlzZo7ObW7Pnj2SpGrVqqlgwYL66quv9NRTT8nV1VUVK1ZU0aJFVa1aNX311Ve6e/dursWBxwtnpAMAAAAAAAAAACDXDRo0SBMmTJCdnV2q8tq1a6tr164aMWKEGjZsqIiICE2ZMkVLlizJ0viXL1/W22+/LUkqXbq09uzZozJlypjqPT091aVLFzVp0kQxMTEaMmSIQkND08STYteuXRo8eLC++eYbGQwGU3mrVq1kb2+v+fPna8+ePTp48KBq1aqVpViTkpL0ySefmD736tUr3faHDx9WuXLltGfPHpUsWdJU3rRpU7Vr105t27ZVQkKChg8fruDg4CzFYk1wcLAmT54sSXr//fc1adKkVPV16tRRnz599NJLL+m7777Te++9pwEDBqho0aI5Mn+KpKQk/fnnn5KksmXLqnv37lq3bl2adsePH9cbb7yh1atX66efflKhQoVyNA48fliRDgAAAAAAAAAAgFzn4eFhNWktSe7u7qZE+Pr162U0GrM0/qJFixQbGytJmj59eqokeopatWpp7NixkqSIiAitXbvW6nilSpXSzJkzUyXRU/j4+Jiut2/fnqU4JemLL74wrR738vJS3bp1M+wzffr0VEn0FC1atNDgwYMlSfv27cuxRPq0adOUlJSkOnXq6KOPPrLYJl++fJo5c6YcHBx08+ZNrVy5MkfmNnf9+nUlJSVJSj6vft26dXJ3d9fSpUt17do1xcbGauvWrWrQoIGk5JX+Kc8DuBck0gEAAAAAAAAAAHDf3bhxQ6GhoTp27JhCQkIUEhIiR0fHVHVZsXnzZklS0aJF1aNHD6vtBg0alKaPJT179pSDg4PFusqVK8vJyUmS9Pfff2cpzqCgII0ZM0aS5Obmpjlz5mTYp1ixYuratavVevMt5tO7p8y6e/euAgICJCU/B0svE6QoWrSoatSoIUnavXv3Pc/9XzExMabruLg4FSpUSEFBQerTp4+KFi2qAgUKqFmzZvr999/17LPPSpKWLVuWYy8U4PFFIh0AAAAAAAAAAAD3xdmzZzVixAh5eHioSJEiqlChgqpXr64aNWqoRo0aGjJkiKntlStXsjR2SEiIpORV5+mtfC9RooQ8PDxS9bEko3PLixUrJkm6efNmpmM8duyYvLy8lJCQIAcHBy1fvlwlSpTIsF+tWrVka2v9xOaaNWvK3t5eUvr3lFnHjx83re4fO3asDAZDuj/79u2TJF28ePGe5/6v/Pnzp/o8fPhwVahQIU27AgUKmLail6Qff/wxx2PB44Uz0gEAAAAAAAAAAJDrAgIC1LNnT1OCNiO3b9/O0vhXr16VpEwlpkuWLKmwsDBTH0tSVsdbky9f8nrVxMTETMUXGhqqtm3b6tq1a7KxsdHSpUvVrFmzTPV1c3NLt97W1lbOzs66ePFiuveUWVFRUdnql9nfbVb896zz9u3bW23bqlUr2draKiEhgRXpuGck0gEAAAAAAAAAAJCr/vnnH/Xr10+xsbFycnKSj4+P2rVrpyeffFJFihQxraYODAxUq1atJCnLZ6SnSG8b8hTZHTu7IiMj1bp1a0VGRspgMGjhwoXy8vLKdP/7fU/mLwf4+vrqf//7X6b6FSxYMMdiSOHg4CBXV1ddvnxZkuTu7m61bf78+eXi4qKLFy9m+2UAIAWJdAAAAAAAAAAAAOSqFStWKDo6WpK0evVqtWnTxmK7a9euZXsOZ2dnXbhwIVPbi1+6dMnUJ7dduXJFbdq0MZ2lPnPmTL344otZGiMlXmsSEhJMzy4n7ql48eKm67t376p69er3POa9qFatmrZu3Sop4x0AUurT2wofyAzOSAcAAAAAAAAAAECuOnbsmKTkJK+1JLok01nb2ZGS7D148KDu3r1rtV1UVJTOnj2bqk9uuX79utq1a6fjx49Lkj755BMNHz48y+McOnRICQkJVusPHz6s+Ph4STlzT9X+j707D9dzuvfH/77J1CAEUSEIPeaxYg6iBBWUoAmOISnqZzqteTpKkaSaog6qVSTRfqtas7ZaIkQENQ8hPXU0igRBxZCQSHL//tg7u09kZyd7Zw9J9ut1Xbme+1n3utf6PE922uvy3mutTTet2SXg/vvvX+TxFtWuu+5ac/3aa6/Nt9/HH3+c999/P0my5pprNnldLN0E6QAAAAAAADSpOSHw9OnTM3v27Fr7TJs2LTfffHOD5+jdu3eSZMqUKbn99tvn2+/GG2+s2QZ9zjNNYdq0adl3333z7LPPJknOP//8nH322Q0a61//+lfuvffe+d6/6aabaq4b4zN17NixZov9hx9+OE8++eQij7koDj744JrrO+64Y7797rzzzpq/21122aXJ62LpJkgHAAAAAACgSa2//vpJkqlTp+a2226b5/6sWbNy7LHHZtKkSQ2eY+DAgenYsWOS5PTTT8+bb745T58XXnghgwcPTlK1YvnAAw9s8Hx1mTFjRvr27ZuxY8cmSb73ve/l0ksvXaQxTzvttFq3eB89enSuv/76JEmPHj2y7bbbLtI8c5x//vk1Z7Mfeuihda4EnzVrVn7zm9/krbfeapS5v2yLLbbIPvvskyQZNmxYHn300Xn6vP322/nv//7vJEm7du0ycODAJqmF1sPhAAAAAAAAADSpfv365bzzzsv06dMzYMCAPP/88+ndu3c6deqUl19+OVdffXWeeeaZ9OzZsyZ8rq8uXbpk6NChOemkkzJp0qRss802Oeecc7LTTjtl1qxZGTlyZIYOHZpPP/00RVHk+uuvT9u2bRv5k1Y57LDDarZE33333XPMMcdk3Lhx8+3frl27bLDBBvO9v+WWW+aVV15Jjx49cu6552a77bbL9OnT86c//SlXXnllZs6cmTZt2uTaa69ttM/Qs2fP/OAHP8gPf/jDTJgwIVtttVWOOeaY7LXXXunatWumT5+e119/PY8//nhuu+22TJo0KS+99FK6des21zj/93//N0/w/emnn9a8Dh8+fK573/zmN7P66qvPU89Pf/rTPP7445kyZUr23nvvnHrqqfnmN7+Z9u3b58knn8yQIUMyceLEJMkll1xia3cWmSAdAAAAAACAJtWtW7dcd911OfbYY/PZZ59lyJAhGTJkyFx9+vfvn+OOO26RtiY/8cQTM2XKlFxwwQWZPHlyTjvttHn6tG/fPtdff3369OnT4HkWpHL78VGjRmWLLbaos/8666yT119/fb73t9pqq5x88sk54YQTcvLJJ89zv127dhkxYkS23377Btdcm4suuigrrbRSzjnnnHz66ae56qqrctVVV9Xat127dunQocM87Y8++uh8V4d/8MEH89x76KGHag3SN9hgg9x777055JBD8u6772bQoEEZNGjQXH2Kosj555+fs846a2E/IsyXrd0BAAAAAABocgMHDsyYMWNy4IEHpkuXLmnbtm26du2ab37zm7n11lvz29/+Nssuu+wiz3Peeeflueeey3HHHZevfe1r+cpXvpLlllsuG2+8cb73ve/lb3/7W4466qhG+ETN69hjj82YMWPSr1+/rLHGGmnXrl3WXHPNHHXUUXnuuedy6KGHNsm83//+9/Paa6/lggsuyA477JBVV101bdq0yXLLLZcNNtggBx98cH7+859n4sSJ+Y//+I8mqWGOnXfeOS+//HIuvPDCbLnllunUqVM6dOiQddddNwMHDswzzzyTSy65pElroPWwIh0AAAAAAKDayZfv39IlLNEGDBiQAQMGzPf+TjvtlDvvvHO+93fbbbeUZTnf+8OHD59nK/DabLHFFjXnhtdH9+7d65y/Ul0ryBd2jPrOscMOO+TWW29tlLHrY80118zFF1+ciy++uN7PLuhnor5WWWWVXHTRRbnooosabUyojRXpAAAAAAAAAFBBkA4AAAAAAAAAFQTpAAAAAAAAAFDBGekAAAAAAACwlBk3blyDnuvWrVtWWmmlxi0GlkCCdAAAAGCxMn7QqFrbNz5/92auBAAAllybb755g54bNmxYBgwY0LjFwBJIkA6LkR5n3lxr+zNDj2rmSgAAAAAAAKD1EqQDAAAAAADAUqYsy5YuAZZoy7R0AYuDoijWLoriJ0VRjC+KYmpRFP8qiuLJoijOKIqiYyPNsUlRFFcXRfFSURQfF0UxoyiK94qieKgoilOLolihMeYBAAAAAAAAYNG0+hXpRVHsm+T/JVmxorljkm2r/xxbFEWfsiz/sQhznJ7kR5n3+141yW7Vf75XFMW3yrJ8saHzAAAAAAAAALDoWvWK9KIotkzyu1SF6J8mOT/JTkn2SPLL6m4bJvljURTLN3COfkl+kqoQfUaSK5Psm2T7JIcnebS66zpJ/lwUxYq1jQMAAAAAAABA82jtK9J/mqrV5zOT7FWW5eMV90YVRfFqkh8n2SjJaUkubsAcF1RcH1SW5R8r3j+Z5JaiKG5PclCSrkmOSXJFA+YBAACAJcqgIw6ptf2gjU9s5koAAABgbq12RXpRFNumakv1JLnxSyH6HJcnGV99/f2iKNrWc45OSTarfvvsl0L0Sj+suN6pPnMAAAAAAAAA0LhabZCe5MCK62G1dSjLcnaSm6vfds6/g/eF1a7iuq4z1l+ruG5fzzkAAAAAAAAAaEStOUjfpfp1apJn6ug3uuJ65/pMUJbl+0n+Vf12vTq6fq3i+u/1mQMAAAAAAACAxtWaz0jfuPr1/8qynFlHv7/V8kx9XJ/knCRbF0WxT1mW99XSZ8456rOS3FDfCYqi6LaALqvXd0wAYOnX8+qetbaPPWVsM1cCAAAAALB4aZVBelEUHZKsWv32rbr6lmX5YVEUU5Msl2StBkw3KMk2SXonubMoimuSPJjk/VStUj8hSa9Uhej/VZbl+PkNVIc3G/AMAAAAAAAAALVolUF6khUqrj9diP5zgvTl6ztRWZafFkWxT5IBqVqZfnr1n0p3JPlxWZZ/re/4AAAAAAAAADSu1hqkd6i4nrEQ/adXv36lgfNtk+SwzP+c9N5J3i2KYnxZlh83YPwFrZRfPclTDRgXAAAAAAAAoNVprUH65xXX7Raif/vq18/qO1FRFIck+XX1GC8muTDJI0k+SVUA3j9VZ6SfkGTXoih6l2X5Tn3mKMuyzu3pi6Kob9kAAAAAAAAArdYyLV1AC/mk4nphtmtfrvp1YbaBr1EUxVeTDE9ViP5ykp3KsryrLMt/lWX5RVmW/yjLckiS/ZOUSTZNcnV95gAAAAAAAACgcbXKIL0sy8+TvF/9tltdfYui6Jx/B+lv1nOqQyueHVyW5dT51PNgkger3x5UPScAAAAAAMASZfjw4SmKIkVR5PXXX2/08QcMGJCiKNK9e/dGH3tx1L179xRFkQEDBrR0KUuslvyZef3112v+PQwfPrzZ528KDz/8cM1nevjhh1u6nCbVKoP0auOrX/+jKIq6trjfqJZnFtbGFdfPLqDvM9WvyyTZoJ7zAAAAAAAAsBh59tlnM3jw4Oyzzz5Za6210r59+yy//PLZYIMNMmDAgIwZM6alS2wy48ePzzXXXJOjjz46W2+9dbp165YOHTpkueWWy3rrrZf+/fvn7rvvTlmWdY7zxhtv5Lrrrkv//v2z4YYbZrnllkuHDh3SrVu3HHDAAbnlllsyc+bMZvpULW/GjBm58cYb881vfjNdu3at+ZnacMMN853vfCdPPPFEnc9//vnnufvuu3PKKadk++23z8orr5y2bdtm5ZVXzo477piLLroob7/9djN9msVfaz0jPUkeTbJLqlaM90jy1/n061VxPbaec1T+y13Qd912Ps8BAAAAAADNZNARh7R0CU3m/F/f1tIltBq9evXKI488Mk/7jBkz8uqrr+bVV1/NiBEjcuSRR+aGG25Iu3btWqDKpjNo0KD8v//3/2q9N2HChEyYMCG/+93v0qtXr9xxxx1ZeeWV5+n3gx/8IJdeemmtYfvEiRMzceLE3HPPPbniiity++23Z+211270z7E4efPNN7PvvvvmpZdemqt9xowZ+fvf/56///3vGTZsWE499dRcfvnlKYpirn4vvvhidt5553zyySf5sg8//DBPPPFEnnjiiVxxxRW54YYb0q9fvyb9PEuC1hyk35Xk3OrrgaklSC+KYpkkR1W/nZLkoXrOMaHiepck4+rou2v1a5nk9XrOAwAAAAAAsNQbPnz4ErFF9sSJE5Mka6yxRr797W9nl112ydprr51Zs2bl8ccfz+WXX56JEyfmV7/6VWbOnJnf/OY3LVxx42rTpk2233779OzZM5tvvnlWX331dOnSJR9++GH+9re/5Re/+EXGjRuX0aNHZ//998+YMWOyzDJzb6Q9adKklGWZ5ZZbLn379s0ee+yR9ddfPx06dMj48ePzP//zP3nqqafy9NNPp3fv3nn22Wez/PLLt9AnblozZ86cK0TfYostctppp2XDDTfMJ598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77+fV199NTfccEOGDas6HXmVVVbJf/7nfzaoxsmTJ9esxl/Qdzht2rR8+9vfzkcffZRzzjknffr0Sfv27fPXv/41Q4YMydtvv52rrroqa6+9dk47rV6R4UL52c9+lqeeeirbbbddTj311Ky//vqZPHlyRowYkVtvvTVvv/129t5777z88svp1GnuhZSHHXZYLrjggnz88ce57LLL0qdPn3m2d3/uuefyxz/+MUly6KGHzjPGwqrPz+WXTZgwIXvuuWdee+21rLDCCrnnnnvm2nlhSSNIBwAAAJrcNaff29IlAADQwo499thceOGFadu27VztW2+9dQ444ICccsop2WGHHTJx4sQMHjy43ttBv/feeznzzDOTJGussUaeeOKJrLXWWjX3e/bsmW9961vZZZddMnXq1Hz3u9/NhAkT5qlnjsceeyzHHXdcfvGLX6Qoipr2PfbYI+3atcsNN9yQJ554Is8991y+/vWv16vW2bNn50c/+lHN+379+tXZ/4UXXsg666yTJ554IquvvnpN+6677pq99947e+21V2bOnJmTTjopTz31VL1qqc0//vGPPPPMM0mSK664otYV5wceeGAGDRqUKVOm1DnWbrvtNlc4W2nllVfOHXfckZVWWqlBdQ4dOrRmhf6CvsP33nsvU6ZMyciRI7PrrrvWtG+33XY5+OCDs/322+ett97KBRdckCOOOCKrrbZag2qan6eeeip9+vTJ3XffPdcZ8vvss0823XTT/OAHP8hbb72VSy65JEOHDp3r2S5dumT48OH5z//8z4wdOzbbbrttvv/972eDDTbIp59+mrFjx+byyy/PjBkzstVWW+WKK65oUI0vvPBCTRi/6aab1nme+peNGzcue+21V95+++2suuqq+fOf/5wePXo0qI7FRas+Ix0AAAAAAIDm0b179/mG1knSrVu3miD8nnvuSVmW9Rp/2LBhmTat6rTeyy+/fK4QfY6vf/3rOffcc5NUnZV91113zXe8rl275uqrr54rRJ/jjDPOqLkeM2ZMvepMkiuvvDJPPvlkkqRv377ZZpttFvjM5ZdfPleIPsc3vvGNHHfccUmqti5vjCD9nXfeqbmuDJ2/rCiKdO7cuUFznHLKKRk/fnyd49flr3/9a8027N26dcuJJ564wGeOP/74WudbY401cvnllyepWrk+YsSIBtVUl/bt2+eXv/zlXCH6HOeff34222yzJMmNN95Y6/nmffv2zdNPP51jjjkmzz//fI4++ujsuOOO2XPPPXPRRRelY8eOueKKK/Loo4/W+nOyINOnT8+xxx6bWbNmJUkGDx680M8+/vjj2XXXXfP2229nrbXWypgxY5b4ED0RpAMAAAAAANACPv7440yYMCEvv/xyxo0bl3HjxqVjx45z3auPkSNHJklWWmmlHHzwwfPtd+yxx87zTG0OOeSQtG/fvtZ7G264YZZffvkkVau362P06NE555xzkiSrrbZarrvuugU+07lz5xxwwAHzvf+d73yn5rquz7SwunbtWnM9fPjwRRpr2LBheemll/Liiy/mkUceyRVXXJH1118/1157bY455pi8++679R7z3XffzSGHHJKZM2emKIqMGDGi5menLgMHDpzvvb59+9asjG+M7/DL9tprr6yxxhq13ltmmWVy9NFHJ0k+/PDDPPvss/P0+eKLL/Kb3/wm9957b62/ZPLuu+/mlltuycMPP9yg+k4++eQ8/fTTSZKjjz56oc81v//++7Pnnnvmww8/zIYbbphHH310kc68X5wI0gEAAAAAAGgW//znP3PKKaeke/fuWXHFFbPeeutls802y+abb57NN9883/3ud2v6vv/++/Uae9y4cUmqVp3XtfL9q1/9arp37z7XM7VZUBg4ZyX2J598stA1vvzyy+nbt29mzpyZ9u3b53e/+12++tWvLvC5r3/967WuZJ5jq622Srt27ZLU/ZkW1rrrrptddtklSdXq+Tlbj48aNapm1X99xprzd7zLLrvk1FNPzYsvvpg+ffrkD3/4Q7bddtu89dZbCz3eJ598kn333bfmmcGDB2f33Xdf4HPt2rXLFltsMd/7bdu2rdmivzG+wy/bdttt67xfebb9l+efOnVqevfunUGDBuWDDz7IWWedlfHjx2f69On56KOPcv/992fnnXfOU089lf333z9XXXVVvWobMmRIbrjhhiRJjx49cu211y7Uc7fddlv233//TJ06NVtvvXXGjBmTtddeu15zL84E6QAAAAAAADS5++67L5tsskmuueaa/POf/1xg/88++6xe4//rX/9KkoUKpudsfT3nmdosaIXzMstUxWxztsJekAkTJmSvvfbKhx9+mGWXXTa33HJLevXqtVDPLui87jZt2mTllVdOUvdnqo9bbrklO+64Y5LklVdeySWXXJI99tgjK620Unr16pWf//zn+fzzzxs0docOHTJs2LB07Ngxb775Zs4666yFeu7zzz/PAQccUHN++2mnnVazun9BVl555Tp/GSH5989OY32HlRb0d1j5c/vl+S+88MI88sgjSaq2fr/sssuy0UYbpV27dunUqVP23HPPPPTQQ/nGN76Rsixz2mmn5cUXX1youn7xi1/kvPPOS1K108J9992X5ZZbbqGevfbaazNjxoy0b98+d911V7p06bJQzy0pBOkAAAAAAAA0qQ8++CCHH354pk2bluWXXz4XXXRRHn/88UyePDnTp09PWZYpyzIPPvhgzTP1PSN9jtrONP+yho7dUJMmTUrv3r0zadKkFEWRm266KX379l3o51viM6255pp57LHHMnLkyJx44onZdNNNUxRFvvjiizzyyCM54YQTstlmm+Xvf/97g8ZfddVV07NnzyTJ3XffnZkzZ9bZf+bMmenXr18eeuihJFVb9M8513xhtPTPxYLmn9/cZVlm2LBhSZINNtigZgv4L2vTpk0uueSSJMns2bNrnqnLLbfcUnO2/DrrrJORI0fWKww/6KCDklSdr96/f/967c6wJBCkAwAAAAAA0KR+//vfZ8qUKUmSO+64IxdeeGF22GGHdOnSpWZL8qTqfOiGmrMi+5133llg3znncs95pim9//772XPPPWvOUr/66qtz1FFH1WuMBZ0jPnPmzJrvrrE/0x577JFrr70248aNy3vvvZff/va3NVupv/baa+nfv3+Dx54T2k6bNi3vvffefPvNnj07Rx55ZO69994kSf/+/fOLX/yiXnN98MEHC9w9YPLkyUma5udiQX+Hc+b+8vzvvvtuzQr1OVvPz0+PHj1qrv/2t7/V2feee+7JUUcdldmzZ6dr16558MEH061btzqf+bJTTjklQ4cOTZI8/vjj6dOnTz799NN6jbE4E6QDAAAAAADQpF5++eUkVQHhnnvuOd9+Tz/9dIPn2GyzzZIkzz33XL744ov59ps8eXLN1vJznmkqH330Ufbee++88sorSZIf/ehHOemkk+o9zvPPP1/niu0XXnghM2bMSNK0n2mVVVZJ//798+CDD+Zb3/pWTW2vvvpqg8abOHFizfXyyy8/337HH398fvvb3yZJ9ttvv/zqV7+q2Vp/Yc2YMSMvvPDCfO/PnDkzzz//fJKm+Q6feuqphb5fOX/ldvQLWrVf+XNf1zb2Dz74YPr165eZM2dmlVVWyQMPPJCvfe1rdY49P2eccUZ+9KMfJUkeffTR7Lvvvpk2bVqDxlrcCNIBAAAAAABoUnMCwOnTp2f27Nm19pk2bVpuvvnmBs/Ru3fvJMmUKVNy++23z7ffjTfeWLON9pxnmsK0adOy77775tlnn02SnH/++Tn77LMbNNa//vWvmtXYtbnppptqrpvyM1XaY489aq7ff//9ej8/ceLEPP7440mqthVfYYUVau132mmn5YYbbqiZ87bbbkvbtm0bUHEyYsSI+d678847a1b1N8V3eP/99+ftt9+u9d7s2bNrauvcuXO23nrrmnsrr7xyOnXqlKRq1XddYfro0aNrrtddd91a+zz22GM54IADMn369HTq1Cl/+ctfsummm9b781Q6++yzM2jQoCTJI488kv322y+fffbZIo25OBCkAwAAAAAA0KTWX3/9JMnUqVNz2223zXN/1qxZOfbYYzNp0qQGzzFw4MB07NgxSXL66afnzTffnKfPCy+8kMGDByepOgP8wAMPbPB8dZkxY0b69u2bsWPHJkm+973v5dJLL12kMU877bRatwcfPXp0rr/++iRVW3tvu+22izRPUrXKfM7q7NqUZZmRI0cmqTr7u3v37jX3/v73v2fUqFF1jv/RRx/lsMMOq1lFf+SRR9ba76KLLsqVV16ZJNlpp51y9913p3379vX4JHO77rrr8uijj87T/s477+SMM85IknTs2HG+55AviunTp+f444+vdXv5H/3oR3nppZeSJN/5znfm+ozLLLNM9t133yTJpEmTagLrL/vwww/n+kWN/fbbb54+zz//fPbdd99MnTo1yy23XP70pz/NtR38ojjvvPNy8cUXJ0keeuih7L///vn8888bZeyWMv81/QAAAAAAANAI+vXrl/POOy/Tp0/PgAED8vzzz6d3797p1KlTXn755Vx99dV55pln0rNnz5rwub66dOmSoUOH5qSTTsqkSZOyzTbb5JxzzslOO+2UWbNmZeTIkRk6dGg+/fTTFEWR66+/vsErmxfksMMOy/33358k2X333XPMMcdk3Lhx8+3frl27bLDBBvO9v+WWW+aVV15Jjx49cu6552a77bbL9OnT86c//SlXXnllZs6cmTZt2uTaa69tlPqff/75DBw4MNtuu23233//bL311ll99dXzxRdfZMKECRk2bFgeeOCBJMkBBxyQrl271jw7adKk7LHHHtlyyy1z4IEHpkePHll99dXTpk2bvPPOOxk7dmxuvPHGmrPsN9tss5xzzjnz1HD11Vfnhz/8YZKqX3r48Y9/nAkTJtRZ94Ybbjjfv9MuXbqkY8eO2XPPPXPqqaemT58+ad++fZ588skMHjy45pc4Lrnkkqy22mr1/9IWYJtttsm9996bnj175tRTT83666+fyZMnZ8SIETXb1nfr1i0XXHDBPM/+4Ac/yN13351p06bloosuyjPPPJOjjz466623Xj7//PM88cQT+elPf5o33ngjSdXK/b322muuMV577bXsvffemTJlSpLk0ksvzYorrljnz+Vqq61Wr+/iggsuyKxZs/LDH/4wDz74YA444IDcc889i/TLDy1JkM5C63l1z1rbx57SsP9DAwAAAAAAWodu3brluuuuy7HHHpvPPvssQ4YMyZAhQ+bq079//xx33HGLtK32iSeemClTpuSCCy7I5MmTc9ppp83Tp3379rn++uvTp0+fBs+zIHfccUfN9ahRo7LFFlvU2X+dddbJ66+/Pt/7W221VU4++eSccMIJOfnkk+e5365du4wYMSLbb799g2uuzVNPPVXn2d4777xzbrzxxlrvvfDCC3WeSZ4k++67b4YNG5bllltunnuV2/NPnDgxO++88wLrnTBhwlyr4yt17Ngxt912W/bZZ59af/6S5L/+679q/ZlpDCeddFJGjx6d4cOH59BDD53nfteuXfOXv/wlK6644jz3Ntpoo9x999057LDD8v777+fee++d71b/u+++e37/+9/P0z5mzJhMnjy55v2pp566wJovvPDCXHTRRQvsV+miiy7KrFmzcumll+b+++9P3759c9ddd6Vdu3b1GmdxIEgHAAAAkiQ9zpz3PMpnhh7VApUAALA0GjhwYDbccMMMHTo0Y8eOzZQpU7Lqqqtmyy23zMCBA9OvX788/PDDizzPeeedl/322y/XXHNNRo0alUmTJmWZZZbJ2muvnb322ivf//735xu2Ls6OPfbYbLbZZrnyyivz6KOP5v3330+XLl2yxx575Oyzz84mm2zSaHMdfvjh6d69ex544IGMGTMmb731Vt59993MnDkzq622Wrbeeusceuih6d+/f5ZZZu6TpHv27JnRo0dn1KhRefTRR/PGG2/k3XffzbRp09KpU6esu+662X777XP44YenZ8/aF3E2lW222SbPPvtsfvKTn+SPf/xjJk6cmOWWWy7bbrtt/uu//iv77LNPk84/bNiw7LXXXrn++uvz0ksv5dNPP80666yTAw88MOecc046d+4832d79+6dv/3tb7nxxhtz33335eWXX86UKVPSpk2brL766tl2221z+OGH51vf+laKomjSz7Egl1xySWbNmpUhQ4bkvvvuy8EHH5zbb799iQvTBekAAAAAAADVzv/1vOd3s/AGDBiQAQMGzPf+TjvtlDvvvHO+93fbbbeUZTnf+8OHD8/w4cMXWMcWW2xRc254fXTv3r3O+SvVtYJ8Yceo7xw77LBDbr311kYZuy7t2rXLbrvtlt12263ez7Zt2za77rprdt1110WqoTF+qSKZ92dmrbXWylVXXZWrrrqqUcavS20/T4cddlgOO+ywBo23yiqr5KyzzspZZ51V72cX9G9zYS3o3+gcgwcPzuDBgxd5vpa0zIK7AAAAAAAAAEDrYUU6AACNbvygUbW2b3z+7s1cCQBNpefVtW/BONh/agAAAGApYEU6AAAAAAAAAFTwa+IAAAAAAACwlBk3blyDnuvWrVtWWmmlxi1mCTVhwoRMnTq13s917tw5a665ZhNURHMSpAMAAAAAAMBSZvPNN2/Qc8OGDcuAAQMat5gl1MCBAzN69Oh6P3f00Udn+PDhjV8QzcrW7gAAAAAAAABQwYp0AAAAAAAAWMqUZdnSJSzxHn744ZYugRZkRToAAAAAAAAAVBCkAwAAAAAAAEAFQToAAAAAAAAAVBCkAwAAAAAAAEAFQToAAAAAAAAAVGjT0gVAkowfNKrW9o3P372ZKwEAAAAAAABaOyvSAQAAAAAAAKCCIB0AAAAAAAAAKtjaHZYyo3ftVWt7r0dGN3MlAAAAAAAAsGSyIh0AAAAAAAAAKgjSAQAAAAAAAKCCIB0AAAAAAAAAKjgjHQAAAJivNy7evPYbnTs1byEAAADQjKxIBwAAAAAAoFEMHz48RVGkKIq8/vrrjT7+gAEDUhRFunfv3uhjL466d++eoigyYMCAli5lidWSPzOvv/56zb+H4cOHN/v8TeHhhx+u+UwPP/xwS5fTpKxIh1bimtPvbekSAFgKDTrikFrbD9r4xGauBAAAAGDx8uyzz+bPf/5zxowZk3HjxmXy5Mlp27Zt1lhjjey000455phjsssuu7R0mU1i9uzZ+dvf/pYnn3wyTz75ZJ566qm8+OKLmTFjRpLkoYceym677bbAcd5444388Y9/zMMPP5znn38+b731VmbNmpVVV101PXr0yKGHHppvf/vbadOm9UaeZ511VoYOHVrzvq7v9vPPP89f/vKXjBw5Mk8++WReffXVfPLJJ1lhhRWy4YYbZu+9987xxx+frl27NlP1i7fW+1MFAAAAAADwJeMHjWrpEprMxufv3tIltBq9evXKI488Mk/7jBkz8uqrr+bVV1/NiBEjcuSRR+aGG25Iu3btWqDKpvOrX/1qkVfR/+AHP8ill16asiznuTdx4sRMnDgx99xzT6644orcfvvtWXvttRdpviXRCy+8kCuvvHKh+r744ovZeeed88knn8xz78MPP8wTTzyRJ554IldccUVuuOGG9OvXr7HLXeII0gEAAAAAAFgiDB8+fInYInvixIlJkjXWWCPf/va3s8suu2TttdfOrFmz8vjjj+fyyy/PxIkT86tf/SozZ87Mb37zmxauuHFVht9t27bNZpttlpkzZ+all15a6DEmTZqUsiyz3HLLpW/fvtljjz2y/vrrp0OHDhk/fnz+53/+J0899VSefvrp9O7dO88++2yWX375pvg4i6XZs2fnuOOOy8yZM7Paaqtl8uTJdfb/+OOPa0L0nj17Zr/99ss222yTVVZZJe+9917uuOOO3HDDDfnkk09y+OGHZ4UVVsg+++zTHB9lsSVIBwAAAAAAgEa00UYbZfDgwTn44IOz7LLLznVvhx12yJFHHpmePXvm73//e2655ZaccMIJS9U275tsskmuuuqqbLfddtlqq63SoUOHXHTRRfUK0ldZZZVcdtllOeGEE7LCCivMda9Hjx457LDDcvjhh+d3v/tdXn311Vx55ZW54IILGvujLLbm/CLBRhttlL59+2bIkCF19l9mmWXSr1+/XHjhhdlkk03mub/XXntln332Sd++fTNr1qyccsopefXVV1MURVN9hMWeIB0AaFGjd+1Va3uvR0Y3cyUAAAAA0Dj+8Ic/1Hl/1VVXzeWXX579998/SXLbbbctVUH6dtttl+22226RxrjsssvqvL/sssvmZz/7We66667MmDEjt912W6sJ0t98882az3rdddfl4YcfXuAzO+20U3baaac6+xxwwAE56KCDcvvtt+e1117L888/n69//euNUfISaZmWLgAAAAAAAICl3+zZszNq1KicccYZ6dmzZ1ZdddW0bds2K620UrbaaqucccYZeeONN+ocY8CAASmKIt27d6+z30svvZTvfve7WX/99dOxY8essMIK2XTTTXPqqafm9ddfn+9zr7/+eoqiSFEUNVvIP/DAA9l///2z+uqrp3379ll33XVzwgkn5K233qrnNzC33Xbbreb6tddeW6hnnnrqqRx22GFZa6210qFDh6y11loZMGBAxo8fv0i1zM+UKVMyaNCg7LjjjuncuXPatm2bLl26ZJNNNknfvn1z3XXXLXBL8aa0yiqrZIsttkiy8N/hxIkTc9ppp2WDDTZIx44d06VLl/Tp0yf33XdfU5Za4/e//3169+6d1VZbLV/5yley0UYb5ZxzzsmHH3640GOceOKJ+fTTT3P00UfP9XPUGL7xjW/UXC/sd/plU6ZMSc+ePVMURdq2bZtf/epXjVVes7IiHQAAAKAJjB80qtb2jc/fvZkrAQBYPFx88cX54Q9/OE/7Rx99lBdeeCEvvPBCrrvuuvz6179O3759GzzPkCFD8t///d+ZPXv2XO2vvPJKXnnllVx33XW5/vrrc9RRRy1wrHPOOWeeldGvv/56fv7zn+f222/P6NGjs/HGGzeozhkzZtRcL7PMgte+3nTTTTn++OMzc+bMmra33norI0aMyG9/+9uMGDEi/fv3b1AttRk/fnx69+6dSZMmzdX+/vvv5/3338/48eNz1113ZdasWTn55JMbbd76mj59epKF+w6ffvrp7LvvvnOF/5999lnuu+++3Hffffne976Xn/70p01Vao455pjcdNNNc7X97//+by677LLcfPPNGTlyZK3brlf63e9+lz/84Q9ZeeWVM3To0Eavcc73mSzcd/pl77zzTvbee++8+OKL6dChQ2699dZ861vfaswSm40gHQAAAAAAgCY3c+bMdO3aNX379s2OO+6Y9dZbLx06dMibb76Zxx57LD/72c/y6aef5vDDD8+zzz7boID6Zz/7Wc4777wkSZcuXXL22WenZ8+emTVrVkaOHJmhQ4dm6tSpGTBgQFZdddX06dNnvmP98pe/zGOPPZZevXrl+OOPzwYbbJApU6bk5ptvzs0335z33nsv3/nOd/L444836PsYPfrfRxtutNFGdfZ9/vnn85vf/CarrbZazj333Gy33Xb5/PPP86c//Sk//elPM3369BxxxBFZd911F3lL9TmOPPLITJo0KW3bts1xxx2XffbZJ6uvvnpmz56dSZMm5cknn8ztt9/eKHM11OTJk2tW4y/oO5w2bVq+/e1v56OPPso555yTPn36pH379vnrX/+aIUOG5O23385VV12VtddeO6eddlqj1/qzn/0sTz31VLbbbruceuqpWX/99TN58uSMGDEit956a95+++3svffeefnll9OpU6dax5gyZUq+973vJana+r5Lly6NXmd9fi6/bMKECdlzzz3z2muvZYUVVsg999zT6Cvmm5MgnWY16IhDam0/aOMTm7kSABZ315x+b0uXAAC0Aj2v7llr+9hTxjZzJQAAS79jjz02F154Ydq2bTtX+9Zbb50DDjggp5xySnbYYYdMnDgxgwcPrvd20O+9917OPPPMJMkaa6yRJ554ImuttVbN/Z49e+Zb3/pWdtlll0ydOjXf/e53M2HChHnqmeOxxx7Lcccdl1/84hcpiqKmfY899ki7du1yww035Iknnshzzz1X73OkZ8+enR/96Ec17/v161dn/xdeeCHrrLNOnnjiiay++uo17bvuumv23nvv7LXXXpk5c2ZOOumkPPXUU/WqpTb/+Mc/8swzzyRJrrjiilpXnB944IEZNGhQpkyZssjzNdTQoUNrVugv6Dt87733MmXKlIwcOTK77rprTft2222Xgw8+ONtvv33eeuutXHDBBTniiCOy2mqrNWqtTz31VPr06ZO77747bdr8O6LdZ599summm+YHP/hB3nrrrVxyySXzXWl+1lln5Z133slOO+2UY445plHrS6p+zv74xz8mSTbddNMFro6vNG7cuOy11155++23s+qqq+bPf/5zevTo0eg1NidnpAMAAAAAANDkunfvPt/QOkm6detWE4Tfc889KcuyXuMPGzYs06ZNS5Jcfvnlc4Xoc3z961/Pueeem6TqrOy77rprvuN17do1V1999Vwh+hxnnHFGzfWYMWPqVWeSXHnllXnyySeTJH379s0222yzwGcuv/zyuUL0Ob7xjW/kuOOOS1K1dXljBOnvvPNOzXVl6PxlRVGkc+fOizxfQ/z1r3+t2Ya9W7duOfHEBS/aPP7442v9PGussUYuv/zyJFUr10eMGNGotSZJ+/bt88tf/nKuEH2O888/P5tttlmS5MYbb5xre/U5Hn300dxwww1p06ZNfv7zn9f6c7kopk+fnmOPPTazZs1KkgwePHihn3388cez66675u23385aa62VMWPGLPEheiJIBwAAAAAAoAV8/PHHmTBhQl5++eWMGzcu48aNS8eOHee6Vx8jR45Mkqy00ko5+OCD59vv2GOPneeZ2hxyyCFp3759rfc23HDDLL/88kmqVm/Xx+jRo3POOeckSVZbbbVcd911C3ymc+fOOeCAA+Z7/zvf+U7NdV2faWF17dq15nr48OGLPF5je/fdd3PIIYdk5syZKYoiI0aMqPnZqcvAgQPne69v375ZaaWVkjTOd/hle+21V9ZYY41a7y2zzDI5+uijkyQffvhhnn322bnuz5gxI9/97ndTlmVOPfXUbL755o1e38knn5ynn346SXL00Ucv9Lnm999/f/bcc898+OGH2XDDDfPoo4/We0v4xZUgHQAAAAAAgGbxz3/+M6ecckq6d++eFVdcMeutt14222yzbL755tl8883z3e9+t6bv+++/X6+xx40bl6Rq1XldK9+/+tWvpnv37nM9U5sFhYFzVmJ/8sknC13jyy+/nL59+2bmzJlp3759fve73+WrX/3qAp/7+te/XutK5jm22mqrtGvXLkndn2lhrbvuutlll12SVK2en7P1+KhRo2pW/beUTz75JPvuu2/eeuutJFUrp3ffffcFPteuXbtsscUW873ftm3bmi36G+M7/LJtt922zvuVZ9t/ef7Bgwdn/PjxWXvttXPhhRc2em1DhgzJDTfckCTp0aNHrr322oV67rbbbsv++++fqVOnZuutt86YMWOy9tprN3p9LUWQDgAAAAAAQJO77777sskmm+Saa67JP//5zwX2/+yzz+o1/r/+9a8kWahges4W6XOeqc2CVjgvs0xVzDZnK+wFmTBhQvbaa698+OGHWXbZZXPLLbekV69eC/Xsgs7rbtOmTVZeeeUkdX+m+rjllluy4447JkleeeWVXHLJJdljjz2y0korpVevXvn5z3+ezz//vFHmWliff/55DjjggJrz20877bSa1f0LsvLKK9f5ywjJv392Gus7rLSgv8PKn9vK+f/2t79lyJAhSZKrr746yy23XKPW9Ytf/CLnnXdekqqdFu67776FnuPaa6/NjBkz0r59+9x1113p0qVLo9bW0ur+aQEAAAAAAIBF9MEHH+Twww/PtGnTsvzyy+eMM87I3nvvna997WtZccUVa1ZTjxo1KnvssUeS1PuM9DkW5uzoho7dUJMmTUrv3r0zadKkFEWRm266KX379l3o51viM6255pp57LHH8uCDD+aOO+7I6NGj88orr+SLL77II488kkceeSQ/+clP8qc//SkbbLBBo85dm5kzZ6Zfv3556KGHklRt0T/nXPOF0dI/Fwuaf35zX3nllZkxY0bWW2+9TJs2Lb/97W/n6VO5gn3UqFE1Z9zvv//+dYbit9xyS83Z8uuss05GjhxZrzD8oIMOyh133JHp06enf//++ctf/pIVVlhhoZ9f3AnSAQAAAAAAaFK///3vM2XKlCTJHXfckT333LPWfh9++GGD51h55ZXz9ttv14SIdXn33Xdrnmlq77//fvbcc8+as9SvvvrqHHXUUfUaY0698zNz5sya766xP9Mee+xR88sNH3zwQUaOHJnrr78+o0aNymuvvZb+/fvnueeea9Q5v2z27Nk58sgjc++99yZJ+vfvn1/84hf1GuODDz7IrFmzsuyyy863z+TJk5M0zc/Fgv4O58z95fmnT5+eJPnHP/6Rww47bIHzXHLJJTXXEyZMmG+Qfs899+Soo47K7Nmz07Vr1zz44IPp1q3bAsevdMopp2THHXfMmWeemccffzx9+vTJfffdl+WXX75e4yyubO0OAAAAAABAk3r55ZeTVAWE8wvRk+Tpp59u8BybbbZZkuS5557LF198Md9+kydPrtlafs4zTeWjjz7K3nvvnVdeeSVJ8qMf/SgnnXRSvcd5/vnnM3PmzPnef+GFFzJjxowkTfuZVllllfTv3z8PPvhgvvWtb9XU9uqrrzbZnEly/PHH16zE3m+//fKrX/2qZmv9hTVjxoy88MIL870/c+bMPP/880ma5jt86qmnFvp+U/9cPvjgg+nXr19mzpyZVVZZJQ888EC+9rWvNWisM844Iz/60Y+SJI8++mj23XffTJs2rTHLbTGCdAAAAAAAAJrUnBB4+vTpmT17dq19pk2blptvvrnBc/Tu3TtJMmXKlNx+++3z7XfjjTfWbKM955mmMG3atOy777559tlnkyTnn39+zj777AaN9a9//atmNXZtbrrppprrpvxMleasUk+qVt03ldNOOy033HBDzZy33XZb2rZt26CxRowYMd97d955Z82q/qb4Du+///68/fbbtd6bPXt2TW2dO3fO1ltvXXNv+PDhKcuyzj8XXnhhTf+HHnqopr179+7zzPXYY4/lgAMOyPTp09OpU6f85S9/yaabbrpIn+3ss8/OoEGDkiSPPPJI9ttvv3z22WeLNObiQJAOAAAAAABAk1p//fWTJFOnTs1tt902z/1Zs2bl2GOPzaRJkxo8x8CBA9OxY8ckyemnn54333xznj4vvPBCBg8enKTqDPADDzywwfPVZcaMGenbt2/Gjh2bJPne976XSy+9dJHGPO2002rdHnz06NG5/vrrkyQ9evTItttuu0jzJFWrzOeszq5NWZYZOXJkkqqzv2sLbBvDRRddlCuvvDJJstNOO+Xuu+9O+/btGzzeddddl0cffXSe9nfeeSdnnHFGkqRjx445+uijGzzH/EyfPj3HH398Zs2aNc+9H/3oR3nppZeSJN/5zncW6TPW5fnnn8++++6bqVOnZrnllsuf/vSn9OjRo1HGPu+883LxxRcnqQrz999//3z++eeNMnZLcUY6AAAAwCIadMQh87QdtPGJLVAJAMDiqV+/fjnvvPMyffr0DBgwIM8//3x69+6dTp065eWXX87VV1+dZ555Jj179qwJn+urS5cuGTp0aE466aRMmjQp22yzTc4555zstNNOmTVrVkaOHJmhQ4fm008/TVEUuf766xu8snlBDjvssNx///1Jkt133z3HHHNMxo0bN9/+7dq1ywYbbDDf+1tuuWVeeeWV9OjRI+eee2622267TJ8+PX/6059y5ZVXZubMmWnTpk2uvfbaRqn/+eefz8CBA7Pttttm//33z9Zbb53VV189X3zxRSZMmJBhw4blgQceSJIccMAB6dq16zxjDB8+fJ4x5/jzn/+c119/veb9f/zHf2TnnXeeq//VV1+dH/7wh0mqfunhxz/+cSZMmFBn3RtuuOF8/067dOmSjh07Zs8998ypp56aPn36pH379nnyySczePDgml/iuOSSS7LaaqvVOU9DbLPNNrn33nvTs2fPnHrqqVl//fUzefLkjBgxombb+m7duuWCCy5o9LmT5LXXXsvee++dKVOmJEkuvfTSrLjiinX+XK622mr1+i4uuOCCzJo1Kz/84Q/z4IMP5oADDsg999zTZL8Y0NQE6QAAAAAAADSpbt265brrrsuxxx6bzz77LEOGDMmQIUPm6tO/f/8cd9xxi7St9oknnpgpU6bkggsuyOTJk3PaaafN06d9+/a5/vrr06dPnwbPsyB33HFHzfWoUaOyxRZb1Nl/nXXWmStY/rKtttoqJ598ck444YScfPLJ89xv165dRowYke23377BNdfmqaeeqvNs75133jk33nhjrfcGDhw43+cuu+yyud4fffTR8wTpldvzT5w4cZ77tZkwYcJ8V8d37Ngxt912W/bZZ59af/6S5L/+679q/ZlpDCeddFJGjx6d4cOH59BDD53nfteuXfOXv/wlK664YpPMP2bMmEyePLnm/amnnrrAZy688MJcdNFF9ZrnoosuyqxZs3LppZfm/vvvT9++fXPXXXelXbt29S25xQnSAQAAAAAAqm18/u4tXcJSa+DAgdlwww0zdOjQjB07NlOmTMmqq66aLbfcMgMHDky/fv3y8MMPL/I85513Xvbbb79cc801GTVqVCZNmpRlllkma6+9dvbaa698//vfb7KtyJvSsccem8022yxXXnllHn300bz//vvp0qVL9thjj5x99tnZZJNNGm2uww8/PN27d88DDzyQMWPG5K233sq7776bmTNnZrXVVsvWW2+dQw89NP37988yyyw5J0lvs802efbZZ/OTn/wkf/zjHzNx4sQst9xy2XbbbfNf//Vf2WeffZp0/mHDhmWvvfbK9ddfn5deeimffvpp1llnnRx44IE555xz0rlz5yadv7lccsklmTVrVoYMGZL77rsvBx98cG6//fYlLkwXpAMAAAAAANAoBgwYkAEDBsz3/k477ZQ777xzvvd32223lGU53/vDhw+fZ8vw2myxxRY154bXR/fu3eucv1JdK8gXdoz6zrHDDjvk1ltvbZSx69KuXbvstttu2W233Ro8xqJ+B43xSxXJvD8za621Vq666qpcddVVjTJ+XWr7eTrssMNy2GGHNeo8F1100QJXji/o3+bCWtC/0TkGDx6cwYMHL/J8LWnJ+RURAAAAAAAAAGgGgnQAAAAAAAAAqGBrdwCApUSPM2+utf2ZoUc1cyUAAAAAAEs2QToAAAAAAAAsZcaNG9eg57p165aVVlqpcYtZQk2YMCFTp06t93OdO3fOmmuu2QQV0ZwE6QAAAAAAALCU2XzzzRv03LBh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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(12,8))\n", + "order = list(dataset_type.keys())\n", + "d = df.copy()\n", + "ax = sns.barplot(\n", + " x=\"dataset\", y=\"acc1\", \n", + " data=d,\n", + " order=order,\n", + " hue=\"pretrained\",\n", + " ci=None,\n", + ")\n", + "ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)\n", + "ax" + ] + }, + { + "cell_type": "markdown", + "id": "b914d109-eec9-40f4-b0f8-23eb179dc49a", + "metadata": {}, + "source": [ + "# Best results from each pre-training source" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c70befe3-0c72-4f6c-b57f-0d1a67ae2553", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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MmVKiiR6surVq2v06NGSks7KXr16tdXxSpQooWnTpllMTPr6+pqut2/fnqk4Jemrr77S3r17JUne3t6qVatWun2mTJmSIomerGnTpho4cKCkpK3LsyORfunSJdO1edL5vwwGgwoXLpylOYYNG6YTJ06kOX5a/vzzT9M27O7u7nr99dfT7TN48GCL85UsWVJTpkyRlLRyfcGCBVmKKS0ODg76/vvvLW6T/v7776tKlSqSpLlz55q2q8+IjGzrLklt27Y1/fv78ssvdfXq1VRtEhMT9f7776cou3XrVrox7N69W40aNdLFixfl4eGh7du3P/JJdIlEOgAAAAAAAAAAAHLBzZs3FRISomPHjik4OFjBwcFydHRMUZcZmzZtkiQ5Ozura9euVtsNGDAgVR9LunXrJgcHB4t1FSpUkJOTk6Sk1duZERgYqFGjRkmS3NzcNHPmzHT7FC5cWJ06dbJa/8orr5iu07qnjCpRooTp2t/f/77Gmj9/vo4ePaojR45o27Zt+vLLL1WuXDlNnz5dr776qi5fvpzpMS9fvqxu3bopPj5eBoNBCxYsMH130tK/f3+rdd7e3qaV8dnxDP+rVatWKlmypMW6PHnyqF+/fpKk69ev68CBAxkaMywsTFu3bpUk1atXT+XLl7fa1t3dXUOGDJGU9BKJl5eX1qxZo5s3b+ru3bvas2eP2rZtq99//1329vamfnfu3Ekzhj/++EMtW7bU9evXVaFCBe3YseO+zrx/mJBIBwAAAAAAAAAAwANx7tw5DRs2TJ6enipUqJDKli2rKlWqqGrVqqpataoGDRpkamtpxWxagoODJSWtOk9r5XuxYsXk6emZoo8l6SUDk1diZ2TFbrJjx47J29tb8fHxcnBw0M8//6xixYql26969eoWVzInq1atmin5mdY9ZVSZMmXUsGFDSUmr55O3Hg8ICDCt+s/MWMm/44YNG2rEiBE6cuSI2rZtq19//VW1a9dWWFhYhse7deuW2rVrZ+ozadIkNWvWLN1+9vb2eu6556zW29nZmbboz45n+F+1a9dOs978bPuMzv/DDz8oMTFRkkyJ+LT4+fmpQ4cOkqRTp06pc+fOKlSokPLly6f69etrw4YNKlu2rIYPH27qU6BAAavjLV++XB06dFB0dLRq1Kih7du3q1SpUhmK/VFAIh0AAAAAAAAAAAA5bv369apU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OnfurJo1a6p48eKytbXVpUuXtHPnTs2dO9d0ln2VKlU0atSoVDFMmzZNH330kaSklx4+//xzhYSEpBl3hQoVrP5OXV1d5ejoqJYtW2rEiBFq27atHBwctHfvXk2aNMn0EseECRPk5uaW+YeWjlq1aumXX36Rl5eXRowYoXLlyikyMlILFiwwbdPu7u6usWPHpjnO9evX9euvv0pKenbprV43t3XrVg0cOFB9+vRRixYtVKpUKcXExOjgwYOaNWuW6QiCVq1apRuHJWPHjlVCQoI++ugjbd68WZ06ddLatWvv6+WH3EQiHQAAAAAAAAAAADnK3d1dM2fO1IABA3Tnzh1NnjxZkydPTtGmR48eGjhw4H1tq/36668rKipKY8eOVWRkpEaOHJmqjYODg2bPnq22bdtmeZ70rFy50nQdEBCg5557Ls32pUuXVmhoqNX6atWq6Y033tCQIUP0xhtvpKq3t7fXggULVLdu3SzHbElQUFCaZ3s3aNBAc+fOtVh3+PDhNM8kl6R27dpp/vz5yp8/f6o68+35w8PD1aBBg3TjDQkJSbE63pyjo6OWL1+uNm3aWPz+SdLw4cMtfmeyw9ChQxUYGCh/f3/17NkzVX2JEiW0YcMGFSpUKM1xli5dqtjYWEmZW42eLCoqStOnT7f60oWPj49mzpwpe3v7TI8tJe0ikJCQoE8++UR//PGHvL29tXr16iyPl5tIpAMAAAAATL592/qZewAAAMCTYOewrK2GRvr69++vChUqyM/PTzt37lRUVJRcXFz0/PPPq3///urevbu2bt163/OMGTNG7du317fffquAgABFREQoT548KlWqlFq1aqW33nrLarL1YTZgwABVqVJFX331lXbs2KGrV6/K1dVVzZs313vvvadKlSpl21y9e/eWp6enNm7cqO3btyssLEyXL19WfHy83NzcVKNGDfXs2VM9evRQnjwpT5L28vJSYGCgAgICtGPHDp0/f16XL19WTEyMChYsqDJlyqhu3brq3bu3vLy8si3mjKhVq5YOHDigL774QuvWrVN4eLjy58+v2rVra/jw4WrTpk2Ozj9//ny1atVKs2fP1tGjR3X79m2VLl1anTt31qhRo1S4cOF0x1i0aJEkycbGRn369MnU/A0bNpSfn58CAgJ08uRJXb58WXny5FHJkiXVtGlT+fj4qF69elm6N3MTJkxQQkKCJk+erPXr16tr165asWLFI5dMNxiNxtyOATnMYDC4S7ogSRcuXJC7u3suR4Ts4jUt9R8Y/p884NFQ852FqcpWFfCz2LaXlW2rJy2z/D7c0dq+qcpuXF5gsW2Xiq9bLK/4fjOL5UBusra1u7V/I5n5mzjxpW4Wy/k3goeVpb8jkuW/JfwdAQA8rjLz91Cy/DcxM38Ppcz9TeTvIfDwOH36tGnb6+RzugEAD6+s/Hc7LCxMHh4eyR89jEZj2P3GkSf9JgAAAAAAAAAAAAAAPDnY2h14iFh7k3q/X+bPuAAAAAAAAAAAAACQNaxIBwAAAAAAAAAAAADADCvSAQAAAAAAAAAAgMdMcHBwlvq5u7vL2dk5e4N5RIWEhCg6OjrT/QoXLqynnnoqByLCg0QiHQAAAAAAAAAAAHjMVK1aNUv95s+fLx8fn+wN5hHVv39/BQYGZrpfv3795O/vn/0B4YFia3cAAAAAAAAAAAAAAMywIh2ARScmBqQqq/h+s1yIBAAAAAAAAAAAZJbRaMztEB55W7duze0QkItYkQ4AAAAAAAAAAAAAgBkS6QAAAAAAAAAAAAAAmCGRDgAAAAAAAAAAAACAGRLpAAAAAAAAAAAAAACYIZEOAAAAAAAAAAAAAIAZEukAAAAAAAAAAAAAAJghkQ4AAAAAAAAAAAAAgBkS6QAAAAAAAAAAAAAAmCGRDgAAAAAAAAAAAACAGRLpAAAAAAAAAAAAAACYIZEOAAAAAAAAAAAAAIAZEukAAAAAAAAAAAAAAJghkQ4AAAAAAAAAAAAAgBkS6QAAAAAAAAAAAMgW/v7+MhgMMhgMCg0NzfbxfXx8ZDAY5Onpme1jP4w8PT1lMBjk4+OT26E8snLzOxMaGmr69+Dv7//A588JW7duNd3T1q1bczucHGWb2wEAyF0TX+pmsbxLxdcfcCQAAAAAAAAAkPsCGzXO7RByTONtgbkdwhPlwIED+v3337V9+3YFBwcrMjJSdnZ2KlmypF544QW9+uqratiwYW6HmSNOnDihzZs3KygoSEePHlVkZKSuXr0qGxsbFStWTLVr11bv3r3VsWNHGQyGTI+/fv16tW3b1vR53LhxGj9+fDbewcOlSZMmCgzM3L/fLVu2qEmTJhbrQkJC9M0332jjxo06d+6cEhMT9dRTT6lly5Z6/fXXVbly5WyI+tFHIh0AAAAAAAAAAADIRo0bN9a2bdtSlcfFxen06dM6ffq0FixYoL59+2rOnDmyt7fPhShzzsSJE/Xjjz9arAsJCVFISIh+/vlnNW7cWCtXrlSRIkUyPHZ0dLSGDBmSXaE+lvLkyaNy5cpZrJs9e7aGDRumuLi4FOXJ38s5c+Zo6tSpPGORSAcAAAAAAAAAAMAjwt/f/5HYIjs8PFySVLJkSb344otq2LChSpUqpYSEBO3evVtTpkxReHi4Fi1apPj4eP3000+5HHH2srW1Vd26deXl5aWqVauqePHicnV11fXr13Xy5El99913Cg4OVmBgoDp06KDt27crT56MnUg9duxYnTt3Tm5uboqMjMzhO3k4zJ8/X9HR0Wm2OX78uHr06CFJat68uZ566qlUbZYsWaLBgwdLkgoVKqS3335bzZo1k4ODgw4ePKjPP/9cZ86c0dChQ+Xq6qpu3SzvavykIJEOAAAAAAAAAAAAZKNnn31WkyZNUteuXWVjY5Oirl69eurbt6+8vLx06tQpLV68WEOGDHmstnmfM2eObG0tpyFbtGihIUOGqHv37lq5cqV27dqldevWqUOHDumOe+DAAX3zzTdycHDQJ598okGDBmV36A+lMmXKpNtm0aJFpuuXX345VX1MTIzefPNNSZKTk5N27NihKlWqmOpr1aqlHj16qEGDBjp69KiGDRumNm3aKH/+/NlwB4+mjL3aAQAAAAAAAAAAACBDfv31V3Xv3j1VEj2Zi4uLpkyZYvq8fPnyBxXaA2EtiZ7MxsZG7777rumzpW3w/yshIUEDBw5UQkKCxowZY3Xr8idRYmKiaSt9JycndenSJVWb9evXm1bwv/nmmymS6MkKFiyoL7/8UpJ06dKlR2L3h5xEIh0AAAAAAAAAAAA5LjExUQEBAfL19ZWXl5dcXFxkZ2cnZ2dnVatWTb6+vjp//nyaY/j4+MhgMMjT0zPNdkePHtWgQYNUrlw5OTo6qkCBAqpcubJGjBih0NBQq/1CQ0NlMBhkMBhMScSNGzeqQ4cOKl68uBwcHFSmTBkNGTJEYWFhmXwCKTVp0sR0ffbs2Qz1CQoKUq9eveTh4aG8efPKw8NDPj4+OnHixH3FYk1UVJQmTpyo+vXrq3DhwrKzs5Orq6sqVaokb29vzZw5M8vbq5uvdL5792667b/66isdOHBA5cuX13vvvZelOaWkbfdHjhyp8uXLy9HRUa6urmrbtq3Wr1+f5TEzY9myZWrRooXc3NyUL18+Pfvssxo1apSuX7+e5TE3b95sOk6gW7ducnR0TNUmKCjIdN2mTRurYzVp0kR58+aVlPUXPKKiouTl5SWDwSA7O7sUq+UfJWztDgAAAAAAAAAAgBz38ccf66OPPkpVfuPGDR0+fFiHDx/WzJkz9cMPP8jb2zvL80yePFkffPCBEhMTU5QfP35cx48f18yZMzV79myL21//16hRo/TZZ5+lKAsNDdWsWbO0YsUKBQYGqmLFilmKMy4uznSdkfPB582bp8GDBys+Pt5UFhYWpgULFmjJkiVasGCB6Yzs7HDixAm1aNFCERERKcqvXr2qq1ev6sSJE1q9erUSEhL0xhtvZHr8xYsXm66fffbZNNuGhoZq3LhxkqQZM2bIwcEh0/NJ0r59+9SuXbsUyf87d+5o/fr1Wr9+vd58801NnTo1S2NnxKuvvqp58+alKPvrr7/02WefaeHChdq0aZMqVaqU6XEXLlxourb2vb527ZrpulixYlbHsrW1VZEiRRQREaFdu3YpPj4+3R0GzF26dEmtW7fWkSNHlDdvXi1dulQdO3bMcP+HCYl0AAAAAAAAAAAA5Lj4+HiVKFFC3t7eql+/vsqWLau8efPqwoUL2rVrl2bMmKHbt2+rd+/eOnDgQJYS1DNmzNCYMWMkSa6urnrvvffk5eWlhIQEbdq0SX5+foqOjpaPj49cXFzUtm1bq2N9//332rVrlxo3bqzBgwerfPnyioqK0sKFC7Vw4UJduXJFr7zyinbv3p2l5xEYGGi6Ti+RfOjQIf30009yc3PT6NGjVadOHd29e1e//fabpk6dqtjYWL300ksqU6aM6tSpk6V4/qtv376KiIiQnZ2dBg4cqDZt2qh48eJKTExURESE9u7dqxUrVmRqzKtXr+r06dOaM2eO5s+fL0kqWrSo+vTpk2a/IUOGKCYmRn369FHz5s2zdD8xMTF68cUXdePGDY0aNUpt27aVg4OD/vzzT02ePFkXL17U119/rVKlSmnkyJFZmiMtM2bMUFBQkOrUqaMRI0aoXLlyioyM1IIFC7R06VJdvHhRrVu31rFjx1SwYMEMj3v79m2tWrVKklSqVKkUOx2YM98B4MaNG1bHMxqNunnzpqSklz3OnDmT7vczWUhIiFq2bKmzZ8+qQIECWrt2rdV4HgUk0gEAAAAAAAAAAJDjBgwYoHHjxsnOzi5FeY0aNdSpUycNGzZM9erVU3h4uCZNmpTp7aCvXLmid955R5JUsmRJ7dmzRx4eHqZ6Ly8vdezYUQ0bNlR0dLQGDRqkkJCQVPEk27VrlwYOHKjvvvtOBoPBVN68eXPZ29trzpw52rNnjw4ePKjq1atnKtbExER9+umnps/du3dPs/3hw4dVunRp7dmzR8WLFzeVN2rUSK1bt1arVq0UHx+voUOHptjCO6v+/vtv7d+/X5L05ZdfWlxx3rlzZ02cOFFRUVFpjtWkSZMULw2YK1KkiFauXClnZ2er/X/66Sf9/vvvcnZ2TnGufGZduXJFUVFR2rRpkxo1amQqr1Onjrp27aq6desqLCxMY8eO1UsvvSQ3N7csz2VJUFCQ2rZtqzVr1qRY4d2mTRtVrlxZH374ocLCwjRhwgT5+flleNwVK1YoOjpaUtLLD+bfVXPmL6YEBgaqZs2aFtsdPHhQt2/fNn0+f/58hhLpwcHBatWqlS5evCgXFxf9/vvvVud4VHBGOgAAAAAAAAAAAHKcp6en1aS1JLm7u5sS4WvXrpXRaMzU+PPnz1dMTIwkacqUKSmS6MmqV6+u0aNHS0o6K3v16tVWxytRooSmTZtmMTHp6+trut6+fXum4pSSzvveu3evJMnb21u1atVKt8+UKVNSJNGTNW3aVAMHDpSUtHV5diTSL126ZLo2Tzr/l8FgUOHChbM0x7Bhw3TixIk0x7927ZpGjBghKWnL/rS2JM+IwYMHW5yvZMmSpiR9TEyMFixYcF/zWOLg4KDvv//e4jbp77//vqpUqSJJmjt3rmJjYzM8bka2dZektm3bmv79ffnll7p69WqqNomJiXr//fdTlN26dSvdGHbv3q1GjRrp4sWL8vDw0Pbt2x/5JLpEIh0AAAAAAAAAAAC54ObNmwoJCdGxY8cUHBys4OBgOTo6pqjLjE2bNkmSnJ2d1bVrV6vtBgwYkKqPJd26dbN6FneFChXk5OQkKWn1dmYEBgZq1KhRkiQ3NzfNnDkz3T6FCxdWp06drNa/8sorpuu07imjSpQoYbr29/e/r7Hmz5+vo0eP6siRI9q2bZu+/PJLlStXTtOnT9err76qy5cvW+3r6+uryMhI1a1bV4MGDbqvOCSpf//+Vuu8vb1NK+Oz4xn+V6tWrVSyZEmLdXny5FG/fv0kSdevX9eBAwcyNGZYWJi2bt0qSapXr57Kly9vta27u7uGDBkiKeklEi8vL61Zs0Y3b97U3bt3tWfPHrVt21a///677O3tTf3u3LmTZgx//PGHWrZsqevXr6tChQrasWNHhreCf9iRSAcAAAAAAAAAAMADce7cOQ0bNkyenp4qVKiQypYtqypVqqhq1aqqWrVqimSppRWzaQkODpaUtOo8rZXvxYoVk6enZ4o+lqSXDExeiZ2RFbvJjh07Jm9vb8XHx8vBwUE///xzhlZZV69e3eJK5mTVqlUzJT/TuqeMKlOmjBo2bCgpafV88tbjAQEBplX/mRkr+XfcsGFDjRgxQkeOHFHbtm3166+/qnbt2goLC0vVb+vWrZo/f75sbGw0a9Ys5clzf2lNe3t7Pffcc1br7ezsTFv0Z8cz/K/atWunWW9+tn1G5//hhx+UmJgoSaZEfFr8/PzUoUMHSdKpU6fUuXNnFSpUSPny5VP9+vW1YcMGlS1bVsOHDzf1KVCggNXxli9frg4dOig6Olo1atTQ9u3bVapUqQzF/iggkQ4AAAAAAAAAAIAct379elWqVEnffvutzp07l2779FbC/te1a9ckKUOJ6eQt0pP7WJK8Ot6a5MRuQkJChuILCQlRq1atdP36ddnY2Gjx4sVq3Lhxhvqmd163ra2tihQpIinte8qMxYsXq379+pKk48ePa8KECWrevLmcnZ3VuHFjzZo1S3fv3s3S2Hnz5tX8+fPl6OioCxcu6N13301RHxsbq8GDB0uShg8frmrVqt3XvUhJ57Gn9TKC9P/fnex6hubS+x2af28zOv+iRYskJW0b36NHj3Tb29vba82aNZo/f75q1qyZ4uUEZ2dnDRs2TAcOHEhxrEJaW/dPnz5dcXFxcnBw0OrVq+Xq6pqhuB8VaX9bAAAAAAAAAAAAgPv0zz//qHfv3oqJiZGTk5N8fX3VunVrPf300ypUqJBpNXVAQICaN28uSZk+Iz2ZpTPN/yurY2dVRESEWrRooYiICBkMBs2bN0/e3t4Z7p8b9/TUU09p165d2rx5s1auXKnAwEAdP35c9+7d07Zt27Rt2zZ98cUX+u2339LcUtwaFxcXeXl5aePGjVqzZo3i4+NNie6VK1fq1KlTsrW1VaVKlbRkyZJU/Y8fP266Dg4ONrWpW7euypQpk6p9bn8v0ps/s3Pv27fP9Azat2+f4bPqDQaDfHx85OPjo9u3b+vy5cuyt7dXyZIlZWNjI0k6cuSIqX2lSpWsjtWlSxetXLlSsbGx6tGjhzZs2JDmCvZHDYl0AAAAAAAAAAAA5Khly5YpKipKUlKStGXLlhbbXb9+PctzFClSRBcvXtSlS5fSbZt8LnfyKu6cdPXqVbVs2dJ0lvq0adP08ssvZ2qMtM4Rl6T4+HjTs8vue2revLnp5YZ//vlHmzZt0uzZsxUQEKCzZ8+qR48eOnjwYJbGTl7BHBMToytXrpjOZo+NjZWUdF8DBw5Md5wVK1ZoxYoVkpLOZLeUSP/nn3+UkJBgShZbEhkZKSlnvhfp/Q6T587o/AsXLjRdZ2Rbd0ucnJzk5OSUoiwuLk579+6VJJUtW1YuLi5W+w8bNkz169fXO++8o927d6tt27Zav359qjEfVWztDgAAAAAAAAAAgBx17NgxSUkJQmtJdClplW1WValSRZJ08OBB3bt3z2q7yMhI09byyX1yyo0bN9S6dWvTyuFPP/1UQ4cOzfQ4hw4dUnx8vNX6w4cPKy4uTlLO3lPRokXVo0cPbd68WR07djTFdvr06SyNFx4ebrrO6eRrXFycDh8+bLU+Pj5ehw4dkpQzzzAoKCjD9enNf+/ePdMKfFdXV7Vp0+b+A/zXb7/9phs3bkiSunfvnm57X19fffrpp5KkHTt2qF27doqJicm2eHITiXQAAAA8lgIbNbb4AwAAAAAAHrzkJHBsbKwSExMttomJiUmxyjazWrRoIUmKiooyrU62ZO7cuaZttJP75ISYmBi1a9dOBw4ckCS9//77eu+997I01rVr1/TLL79YrZ83b57pOifvyVzyKnUpadV9ZoWHh2v37t2SpNKlS6fYEtzHx0dGozHNny1btpjajxs3zlTu4+Njdc4FCxZYrVu1apVpVX9OPMM//vhDFy9etFiXmJhoiq1w4cKqUaNGmmOtX79eV65ckST17t073bPfMyo+Pl7jxo2TJNnZ2WVoNwBJeu+99zRx4kRJ0rZt29S+fXvduXMnW2LKTSTSAQAAAAAAAAAAkKPKlSsnSYqOjtby5ctT1SckJGjAgAGKiIjI8hz9+/eXo6OjJOntt9/WhQsXUrU5fPiwJk2aJCnpDPDOnTtneb60xMXFydvbWzt37pQkvfnmm/rkk0/ua8yRI0da3B48MDBQs2fPliTVrFlTtWvXvq95pKRV5smrsy0xGo3atGmTpKQztz09PU11p06dUkBAQJrj37hxQ7169TKtou/bt+99x5wRM2fO1I4dO1KVX7p0Sb6+vpIkR0fHLG+VnpbY2FgNHjxYCQkJqeo+/fRTHT16VJL0yiuvyMHBIc2xzF84ycwxAVevXrW6WjwuLk6vvPKK6Xz09957T2XLls3w2GPGjNHHH38sSdqyZYs6dOigu3fvZrj/w4gz0gEAAAAAAAAAAJCjunfvrjFjxig2NlY+Pj46dOiQWrRooYIFC+rYsWOaNm2a9u/fLy8vL1PyObNcXV3l5+enoUOHKiIiQrVq1dKoUaP0wgsvKCEhQZs2bZKfn59u374tg8Gg2bNny87OLpvvNEmvXr30xx9/SJKaNWumV199VcHBwVbb29vbq3z58lbrn3/+eR0/flw1a9bU6NGjVadOHcXGxuq3337TV199pfj4eNna2mr69OnZEv+hQ4fUv39/1a5dWx06dFCNGjVUvHhx3bt3TyEhIZo/f742btwoSerUqZPpbHNJioiIUPPmzfX888+rc+fOqlmzpooXLy5bW1tdunRJO3fu1Ny5c01n2VepUkWjRo3KlrjT4urqKkdHR7Vs2VIjRoxQ27Zt5eDgoL1792rSpEmmlzgmTJggNze3bJ+/Vq1a+uWXX+Tl5aURI0aoXLlyioyM1IIFC0zbtLu7u2vs2LFpjnP9+nX9+uuvkpKeXXqr181t3bpVAwcOVJ8+fdSiRQuVKlVKMTExOnjwoGbNmmU6gqBVq1bpxmHJ2LFjlZCQoI8++kibN29Wp06dtHbt2nRfDHhYkUgHAAAAAAAAAABAjnJ3d9fMmTM1YMAA3blzR5MnT9bkyZNTtOnRo4cGDhx4X9tqv/7664qKitLYsWMVGRmpkSNHpmrj4OCg2bNnq23btlmeJz0rV640XQcEBOi5555Ls33p0qUVGhpqtb5atWp64403NGTIEL3xxhup6u3t7bVgwQLVrVs3yzFbEhQUlObZ3g0aNNDcuXMt1h0+fDjNM8klqV27dpo/f77y589/X3FmhKOjo5YvX642bdpY/P5J0vDhwy1+Z7LD0KFDFRgYKH9/f/Xs2TNVfYkSJbRhwwYVKlQozXGWLl2q2NhYSZlbjZ4sKipK06dPt/rShY+Pj2bOnCl7e/tMjy1J48ePV0JCgj755BP98ccf8vb21urVq7M8Xm4ikQ4AAAAAAAAAAPCvxtsCczuEx1b//v1VoUIF+fn5aefOnYqKipKLi4uef/559e/fX927d9fWrVvve54xY8aoffv2+vbbbxUQEKCIiAjlyZNHpUqVUqtWrfTWW2+l2Ir8UTFgwABVqVJFX331lXbs2KGrV6/K1dVVzZs313vvvadKlSpl21y9e/eWp6enNm7cqO3btyssLEyXL19WfHy83NzcVKNGDfXs2VM9evRQnjwpT5L28vJSYGCgAgICtGPHDp0/f16XL19WTEyMChYsqDJlyqhu3brq3bu3vLy8si3mjKhVq5YOHDigL774QuvWrVN4eLjy58+v2rVra/jw4WrTpk2Ozj9//ny1atVKs2fP1tGjR3X79m2VLl1anTt31qhRo1S4cOF0x1i0aJEkycbGRn369MnU/A0bNpSfn58CAgJ08uRJXb58WXny5FHJkiXVtGlT+fj4qF69elm6N3MTJkxQQkKCJk+erPXr16tr165asWLFI5dMJ5EOAAAAAAAAAACAbOHj4yMfHx+r9S+88IJWrVpltb5JkyYyGo1W6/39/eXv759uHM8995zp3PDM8PT0THN+c2mtIM/oGJmdo169elq6dGm2jJ0We3t7NWnSRE2aNMl0Xzs7OzVq1EiNGjXK/sDMpPddSfbf74yHh4e+/vprff311zkYXRJL36devXqpV69eWR4zq0cfSFKxYsXk6+trOg8+KzL63CdNmqRJkyZleZ6HQZ70mwAAAAAAAAAAAAAA8OQgkQ4AAAAAAAAAAAAAgBkS6QAAAAAAAAAAAAAAmOGMdAAAAADAE+/ExIBUZRXfb5YLkQAAAABA9ggODs5SP3d3dzk7O2dvMI+okJAQRUdHZ7pf4cKF9dRTT+VARHiQSKQDAAAAAAAAAAAAj5mqVatmqd/8+fPl4+OTvcE8ovr376/AwMBM9+vXr5/8/f2zPyA8UCTSAQAAAACPBK9pXqnKdg7bmakxJr7UzWJ5l4qvZykmAAAAAADweCKRDgAAAAAAAAAAADxmjEZjbofwyNu6dWtuh4BclCe3AwAAAAAAAAAAAAAA4GHCinTgEXD+YyvnmBQu+GADAQAAAAAAAAAAAJ4AJNIBAMADYelcWynzZ9sCAAAAAAAAAJDT2NodAAAAAAAAAAAAAAAzJNIBAAAAAAAAAAAAADBDIh0AAAAAAAAAAAAAADMk0gEAAAAAAAAAAAAAMEMiHQAAAAAAAAAAAAAAM7a5HQAAAADwIH379i+5HQKAdJz/uKrlisIFH2wgAAAAAADgicWKdAAAAAAAAAAAAAAAzJBIBwAAAAAAAAAAAADADFu7AwCAR96JiQEWyyu+3+wBRwIAeNACGzW2WN54W+ADjgQAAAAAADxOSKQDAAAAAHJFzXcWWixfVeABBwIAAAAg2/j7+6t///6SpJCQEHl6embr+D4+PlqwYIFKly6t0NDQbB37YeTp6alz586pX79+8vf3z+1wgCcKiXQAAAAAAAAAAAAgmx04cEC///67tm/fruDgYEVGRsrOzk4lS5bUCy+8oFdffVUNGzbM7TBz3O3bt3XgwAHt3btXe/fuVVBQkOkliKy+EHH+/HnNnTtX69at07lz53Tr1i25urrK09NTTZs2Vffu3VWlSpXsvRE8cUikAwAAAAAAAAAA/Ovbt3/J7RByzBtTOuR2CE+Mxo0ba9u2banK4+LidPr0aZ0+fVoLFixQ3759NWfOHNnb2+dClA9Ghw4dtHXr1mwbb9q0aRo9erSio6NTlIeFhSksLEw7duzQzZs3NXXq1GybE08mEukAAAAAAAAAAAB4JPj7+z8SW5yHh4dLkkqWLKkXX3xRDRs2VKlSpZSQkKDdu3drypQpCg8P16JFixQfH6+ffvoplyPOOUaj0XRduHBh1apVS7t379bt27czPdYnn3yisWPHSpLKli2rQYMGqW7duipQoIDCw8N16tQprVq1Snny5Mm2+PHkIpEOAAAAAAAAAAAAZKNnn31WkyZNUteuXWVjY5Oirl69eurbt6+8vLx06tQpLV68WEOGDHlst3nv3bu3Bg0apDp16uiZZ56RlHT2e2YT6QEBAaYkerdu3fTDDz/IwcHBVF+zZk1Jkq+vr+Li4rIpejzJSKQDAAAAAAAAAAAA2ejXX39Ns97FxUVTpkxRhw5J2+0vX778sU2kDxo06L7HSExM1GuvvSZJqlChQqok+n89zlvl48FhXwMAAPBImfhSt1Q/AAAAAAAAePglJiYqICBAvr6+8vLykouLi+zs7OTs7Kxq1arJ19dX58+fT3MMHx8fGQwGeXp6ptnu6NGjGjRokMqVKydHR0cVKFBAlStX1ogRIxQaGmq1X2hoqAwGgwwGg2kL+Y0bN6pDhw4qXry4HBwcVKZMGQ0ZMkRhYWGZfAIpNWnSxHR99uzZDPUJCgpSr1695OHhobx588rDw0M+Pj46ceLEfcWSnr/++kvDhw9X5cqVVahQIeXLl09ly5ZV//79deDAgRydW5L++OMPnT59WpI0evToNJPoQHYhkQ4AAAAAAAAAAIAc9/HHH6t58+aaMmWKdu3apX/++Ufx8fG6ceOGDh8+rClTpqhixYpatWrVfc0zefJkVatWTd9//73OnDmjO3fu6Pbt2zp+/LimTp2qZ599VgsXLszQWKNGjVKrVq3066+/6vLly4qLi1NoaKhmzZqlGjVq3FcC23z78Yyc6T1v3jy98MILWrJkicLCwhQbG6uwsDAtWLBA1atX19KlS7McS1omTJigKlWqaNq0aTp+/Lhu3rypu3fvKiQkRP7+/qpVq5bGjRuXI3MnW7ZsmSTJxsZGXbp0MZVfvXpVZ86c0Y0bN3J0fjyZSKQDAAAAAAAAAAAgx8XHx6tEiRJ6/fXXtWjRIu3cuVP79+/X6tWr9e6778rJyUkxMTHq3bt3lhPUM2bM0JgxY5SYmChXV1d98cUX2r17t3bs2KHx48crf/78io2NlY+Pj3777bc0x/r+++/12WefqXHjxvrpp5+0b98+bdq0SS+//LIk6cqVK3rllVeyFKckBQYGmq6fffbZNNseOnRIr732mtzc3DRt2jT9+eefCgwM1HvvvScHBwfFxsbqpZde0t69e7McjyUffvihPvzwQ8XHx+uFF17QnDlztHv3bu3bt08//vij6tevL6PRqI8//ljTpk3L1rnN7dmzR5JUuXJl5c+fX998842eeeYZubq6qly5cnJ2dlblypX1zTff6N69ezkWB54snJEOAAAAAHjsfPv2L7kdAgAAAID/GDBggMaNGyc7O7sU5TVq1FCnTp00bNgw1atXT+Hh4Zo0aZIWLVqUqfGvXLmid955R5JUsmRJ7dmzRx4eHqZ6Ly8vdezYUQ0bNlR0dLQGDRqkkJCQVPEk27VrlwYOHKjvvvtOBoPBVN68eXPZ29trzpw52rNnjw4ePKjq1atnKtbExER9+umnps/du3dPs/3hw4dVunRp7dmzR8WLFzeVN2rUSK1bt1arVq0UHx+voUOHKigoKFOxWBMUFKSJEydKkj744ANNmDAhRX3NmjXVs2dP9evXTz/88IPef/999e3bV87Oztkyf7LExESdPHlSklSqVCl16dJFa9asSdXu+PHjevPNN7Vy5Ur98ssvKlCgQLbGgScPK9IBAAAAAAAAAACQ4zw9Pa0mrSXJ3d3dlAhfu3atjEZjpsafP3++YmJiJElTpkxJkURPVr16dY0ePVqSFB4ertWrV1sdr0SJEpo2bVqKJHoyX19f0/X27dszFackffXVV6bV497e3qpVq1a6faZMmZIiiZ6sadOmGjhwoCRp37592ZZI/+yzz5SYmKiaNWvq448/ttgmT548mjZtmhwcHHTr1i0tX748W+Y2d+PGDSUmJkpKOq9+zZo1cnd31+LFi3X9+nXFxMRo69atqlu3rqSklf7JzwO4HyTSAQAAAAAAAAAA8MDdvHlTISEhOnbsmIKDgxUcHCxHR8cUdZmxadMmSZKzs7O6du1qtd2AAQNS9bGkW7ducnBwsFhXoUIFOTk5SZL+/vvvTMUZGBioUaNGSZLc3Nw0c+bMdPsULlxYnTp1slpvvsV8WveUUffu3dP69eslJT0HSy8TJHN2dlbVqlUlSbt3777vuf8rOjradB0bG6sCBQooMDBQPXv2lLOzs/Lly6fGjRtry5Ytev755yVJS5cuzbYXCvDkIpEOAAAAAAAAAACAB+LcuXMaNmyYPD09VahQIZUtW1ZVqlRR1apVVbVqVQ0aNMjU9urVq5kaOzg4WFLSqvO0Vr4XK1ZMnp6eKfpYkt655YULF5Yk3bp1K8MxHjt2TN7e3oqPj5eDg4N+/vlnFStWLN1+1atXl62t9RObq1WrJnt7e0lp31NGHT9+3LS6f/To0TIYDGn+7Nu3T5J06dKl+577v/LmzZvi89ChQ1W2bNlU7fLly2fail6SlixZku2x4MnCGekAAAAAAAAAAADIcevXr1e3bt1MCdr03LlzJ1PjX7t2TZIylJguXry4QkNDTX0sSV4db02ePEnrVRMSEjIUX0hIiFq1aqXr16/LxsZGixcvVuPGjTPU183NLc16W1tbFSlSRJcuXUrznjIqMjIyS/0y+rvNjP+edd6mTRurbZs3by5bW1vFx8ezIh33jUQ6AAAAAAAAAAAActQ///yj3r17KyYmRk5OTvL19VXr1q319NNPq1ChQqbV1AEBAWrevLkkZfqM9GRpbUOeLKtjZ1VERIRatGihiIgIGQwGzZs3T97e3hnu/6DvyfzlAD8/P/3vf//LUL/8+fNnWwzJHBwc5OrqqitXrkiS3N3drbbNmzevXFxcdOnSpSy/DAAkI5EOAAAAAAAAAACAHLVs2TJFRUVJklauXKmWLVtabHf9+vUsz1GkSBFdvHgxQ9uLX7582dQnp129elUtW7Y0naU+bdo0vfzyy5kaIzlea+Lj403PLjvuqWjRoqbre/fuqUqVKvc95v2oXLmytm7dKin9HQCS69PaCh/ICM5IBwAAAAAAAAAAQI46duyYpKQkr7UkuiTTWdtZkZzsPXjwoP6PvTuPt7Kq9wf+eZQpUBMVE8WprvOQijMqpqg5pahBeh0gNX9OeR1zuCapQEZqXjTLHEC7meVsaRmiiKg5QqJ08xqkgoqWOICCB57fH+dw7kYOcM7hDAzv9+u1X/vZ61nPWt+92aeX9372Ws9nn322wH5Tp07NP/7xj3muaS4ffPBB9ttvv7zyyitJkh/+8Ic59dRTGzzO2LFjU1VVtcDz48aNy6xZs5I0zXvaYostancJePjhhxd7vMW1xx571B6/9tprC+z34Ycf5r333kuSrLPOOs1eF8s2QToAAAAAAADNam4IPHPmzMyZM6fOPjNmzMitt97a6Dl69eqVJJk2bVruuuuuBfa76aabardBn3tNc5gxY0YOPPDAvPDCC0mSiy66KN/73vcaNda//vWvPPDAAws8f/PNN9ceN8V76tixY+0W+4899lieeeaZxR5zcRx++OG1x3ffffcC+91zzz21/7a77757s9fFsk2QDgAAAAAAQLPaaKONkiTTp0/PnXfeOd/52bNn54QTTsiUKVMaPUf//v3TsWPHJMnZZ5+dN954Y74+48aNy6BBg5JUr1g+9NBDGz3fwsyaNSu9e/fOmDFjkiRnnHFGLr/88sUa86yzzqpzi/dRo0blhhtuSJJ07949O+yww2LNM9dFF11Ue2/2b33rWwtdCT579uz86le/yptvvtkkc3/e1ltvnf333z9Jcsstt+SJJ56Yr89bb72V//zP/0yStGvXLv3792+WWlh+uDkAAAAAAAAAzapPnz658MILM3PmzPTr1y9jx45Nr169ssoqq+Tll1/O0KFD8/zzz6dHjx614XNDdenSJUOGDMmpp56aKVOmZPvtt8/555+fXXfdNbNnz86IESMyZMiQfPzxxymKIjfccEPatm3bxO+02pFHHlm7Jfpee+2V448/PuPHj19g/3bt2mXjjTde4PmvfvWreeWVV9K9e/dccMEF2XHHHTNz5sw8+OCDufrqq1NVVZU2bdrkuuuua7L30KNHj3z/+9/PD37wg0ycODHbbLNNjj/++Oy7777p2rVrZs6cmUmTJuWpp57KnXfemSlTpuSll15Kt27d5hnnf//3f+cLvj/++OPa52HDhs1z7utf/3rWWmut+er5yU9+kqeeeirTpk3LfvvtlzPPPDNf//rX0759+zzzzDMZPHhwJk+enCS57LLLbO3OYhOkAwAAAAAA0Ky6deuW66+/PieccEI++eSTDB48OIMHD56nT9++fXPiiScu1tbkp5xySqZNm5aLL744U6dOzVlnnTVfn/bt2+eGG27IAQcc0Oh5FqVy+/GRI0dm6623Xmj/9ddfP5MmTVrg+W222SannXZaTj755Jx22mnznW/Xrl2GDx+enXbaqdE112XAgAFZddVVc/755+fjjz/ONddck2uuuabOvu3atUuHDh3ma3/iiScWuDr8n//853znHn300TqD9I033jgPPPBAjjjiiLzzzjsZOHBgBg4cOE+foihy0UUX5bzzzqvvW4QFsrU7AAAAAAAAza5///4ZPXp0Dj300HTp0iVt27ZN165d8/Wvfz133HFHfv3rX2fFFVdc7HkuvPDCvPjiiznxxBPzla98JV/4whfSqVOnbLbZZjnjjDPy17/+Nccee2wTvKOWdcIJJ2T06NHp06dP1l577bRr1y7rrLNOjj322Lz44ov51re+1Szz/sd//Edee+21XHzxxdl5552zxhprpE2bNunUqVM23njjHH744fnZz36WyZMn59/+7d+apYa5dtttt7z88su55JJL8tWvfjWrrLJKOnTokA033DD9+/fP888/n8suu6xZa2D5YUU6AAAAAABAjdOuPLi1S1iq9evXL/369Vvg+V133TX33HPPAs/vueeeKctygeeHDRs231bgddl6661r7xveEBtssMFC56+0sBXk9R2joXPsvPPOueOOO5pk7IZYZ511cumll+bSSy9t8LWL+k401Oqrr54BAwZkwIABTTYm1MWKdAAAAAAAAACoIEgHAAAAAAAAgAqCdAAAAAAAAACo4B7pAAAAAAAAsIwZP358o67r1q1bVl111aYtBpZCgnQAAAAAAABYxmy11VaNuu6WW25Jv379mrYYWArZ2h0AAAAAAAAAKliRDgAAAAAAAMuYsixbuwRYqlmRDgAAAAAAAAAVBOkAAAAAAAAAUEGQDgAAAAAAAAAV3CMdAAAAWKJMGDiyzvbNLtqrhSsBAABgeWVFOgAAAAAAAABUEKQnKYpivaIoflwUxYSiKKYXRfGvoiieKYrinKIoOjbRHJsXRTG0KIqXiqL4sCiKWUVRvFsUxaNFUZxZFMXKTTEPAAAAAAAAAItnud/avSiKA5P8d5IvVjR3TLJDzeOEoigOKMvy74sxx9lJfpj5P+81kuxZ8zijKIpvlGX5l8bOAwAAAAAAAMDiW65XpBdF8dUkv0l1iP5xkouS7Jpk7yS/qOm2SZLfF0WxUiPn6JPkx6kO0WcluTrJgUl2SnJUkidquq6f5A9FUXyxrnEAAAAAAAAAaBnL+4r0n6R69XlVkn3Lsnyq4tzIoiheTfKjJJsmOSvJpY2Y4+KK48PKsvx9xetnktxeFMVdSQ5L0jXJ8UmuasQ8AAAAsFQZePQRdbYfttkpLVwJAAAAzGu5XZFeFMUOqd5SPUlu+lyIPteVSSbUHP9HURRtGzjHKkm2rHn5wudC9Eo/qDjetSFzAAAAAAAAANC0ltsgPcmhFce31NWhLMs5SW6tedk5/xe811e7iuOF3WP9tYrj9g2cAwAAAAAAAIAmtDwH6bvXPE9P8vxC+o2qON6tIROUZflekn/VvPzyQrp+peL4bw2ZAwAAAAAAAICmtTzfI32zmuf/LcuyaiH9/lrHNQ1xQ5Lzk2xXFMX+ZVk+VEefufdRn53kxoZOUBRFt0V0WauhYwIAy74eQ3vU2T7m9DEtXAkAAAAAwJJluVyRXhRFhyRr1Lx8c2F9y7J8P9Wr1pNk3UZMNzDJiJrje4qi+HFRFPsXRbFDURR9i6J4LMkRqQ7Rv1uW5YQFDbQQbyzi8WwjxgQAAAAAAGiQYcOGpSiKFEWRSZMmNfn4/fr1S1EU2WCDDZp87CXRBhtskKIo0q9fv9YuZanVmt+ZSZMm1f49DBs2rMXnbw6PPfZY7Xt67LHHWrucZrVcBulJVq44/rge/ecG6Ss1dKKyLD9Osn+SE1Md2p+d5MEkzyT5dZKeSe5O0qMsy582dHwAAAAAAACWPC+88EIGDRqU/fffP+uuu27at2+flVZaKRtvvHH69euX0aNHt3aJzWbChAm59tprc9xxx2W77bZLt27d0qFDh3Tq1Clf/vKX07dv39x3330py3Kh47z++uu5/vrr07dv32yyySbp1KlTOnTokG7duuWQQw7J7bffnqqqhW08vWyZNWtWbrrppnz9619P165da79Tm2yySb797W/n6aefXuj1n376ae67776cfvrp2WmnnbLaaqulbdu2WW211bLLLrtkwIABeeutt1ro3Sz5ltet3TtUHM+qR/+ZNc9faOR82yc5Mgu+T3qvJO8URTGhLMsPGzH+olbKrxWr0gEAAAAAYJEGHn1Ea5fQbC765Z2tXcJyo2fPnnn88cfna581a1ZeffXVvPrqqxk+fHiOOeaY3HjjjWnXrl0rVNl8Bg4cmP/+7/+u89zEiRMzceLE/OY3v0nPnj1z9913Z7XVVpuv3/e///1cfvnldYbtkydPzuTJk3P//ffnqquuyl133ZX11luvyd/HkuSNN97IgQcemJdeemme9lmzZuVvf/tb/va3v+WWW27JmWeemSuvvDJFUczT7y9/+Ut22223fPTRR/ON/f777+fpp5/O008/nauuuio33nhj+vTp06zvZ2mwvAbpn1Yc1+d/mdrXPH/S0ImKojgiyS9rxvhLkkuSPJ7ko1QH4H1TfY/0k5PsURRFr7Is327IHGVZLnR7+s//oQAAAAAAACyNhg0btlRskT158uQkydprr51vfvOb2X333bPeeutl9uzZeeqpp3LllVdm8uTJue2221JVVZVf/epXrVxx02rTpk122mmn9OjRI1tttVXWWmutdOnSJe+//37++te/5uc//3nGjx+fUaNG5eCDD87o0aOzwgrzbqQ9ZcqUlGWZTp06pXfv3tl7772z0UYbpUOHDpkwYUL+67/+K88++2yee+659OrVKy+88EJWWqnBm0svFaqqquYJ0bfeeuucddZZ2WSTTfLRRx/liSeeyJVXXpnp06fn6quvTteuXXPuuefOM8aHH35YG6L36NEjBx10ULbffvusvvrqeffdd3P33XfnxhtvzEcffZSjjjoqK6+8cvbff/8Wf69LkuU1SK/8qUV9/qI61TzXZxv4WkVRfCnJsFSH6C8n2bUsy+kVXf6eZHBRFM8k+VOSLZIMTfLNhswDAAAAAADAkmPTTTfNoEGDcvjhh2fFFVec59zOO++cY445Jj169Mjf/va33H777Tn55JOz++67t1K1Te/GG29MmzZ1x5C9evXKySefnD59+uTuu+/Ok08+md///vc5+OCD5+m3+uqr54orrsjJJ5+clVdeeZ5z3bt3z5FHHpmjjjoqv/nNb/Lqq6/m6quvzsUXX9xs76k13XfffbUh+i677JLRo0fP873aZ5998o1vfCO77LJLPvvsswwePDhnnnnmPP8GK6ywQvr06ZNLLrkkm2+++Xxz7Lvvvtl///3Tu3fvzJ49O6effnpeffXV5XrB7nJ5j/SyLD9N8l7Ny24L61sURef8X5D+RgOn+lbFtYM+F6JX1vNIkkdqXh5WMycAAAAAAABLod/97nfp06fPfCH6XGussUauvPLK2td33rlsbbu/oBB9rhVXXDHnnXde7eu6tsG/4oorct55580XoleO8dOf/rR2W/xl7TOsNGbMmNrjCy64oM7vVffu3XPQQQclSe3K/0q77rpr7rjjjjpD9LkOOeSQHHbYYUmS1157LWPHjm2C6pdey2WQXmNCzfO/FUWxsL/mTeu4pr42qzh+YRF9n695XiHJxg2cBwAAAAAAYIk2Z86cjBw5Muecc0569OiRNdZYI23bts2qq66abbbZJuecc05ef/31hY7Rr1+/FEWRDTbYYKH9XnrppXznO9/JRhttlI4dO2bllVfOFltskTPPPDOTJk1a4HWTJk1KURQpiqJ2C/k//elPOfjgg7PWWmulffv22XDDDXPyySfnzTcXeufdRdpzzz1rj1977bV6XfPss8/myCOPzLrrrpsOHTpk3XXXTb9+/TJhQkMjrPqZNm1aBg4cmF122SWdO3dO27Zt06VLl2y++ebp3bt3rr/++kydOrVRY3fq1Kn2+NNPP11IzwVbffXVs/XWWyep/2c4efLknHXWWdl4443TsWPHdOnSJQcccEAeeuihRtXQUL/97W/Tq1evrLnmmvnCF76QTTfdNOeff37ef//9BV4za9as2uMvf/nLC+z3la98pfZ45syZjarva1/7Wu1xfT/Tz5s2bVp69OiRoijStm3b3HbbbY0ap7Utr1u7J8kTSXZP9Yrx7kn+vIB+PSuOxyygz4JUVRwv6rNuu4DrAAAAAAAAlnqXXnppfvCDH8zX/sEHH2TcuHEZN25crr/++vzyl79M7969Gz3P4MGD85//+Z+ZM2fOPO2vvPJKXnnllVx//fW54YYbcuyxxy5yrPPPPz9XXHHFPG2TJk3Kz372s9x1110ZNWpUNttsswVcvXCV4ejn7w9el5tvvjknnXRSqqr+L0Z68803M3z48Pz617/O8OHD07dv30bVUpcJEyakV69emTJlyjzt7733Xt57771MmDAh9957b2bPnp3TTjutwePffvvttcebbrrpQnou3NzAuD6f4XPPPZcDDzxwnvD/k08+yUMPPZSHHnooZ5xxRn7yk580upZFOf7443PzzTfP0/Y///M/ueKKK3LrrbdmxIgRda4Y33jj/1uD+/e//z1bbLFFnePPDb6LoshGG23UqBorA/j6fKaf9/bbb2e//fbLX/7yl3To0CF33HFHvvGNbzSqlta2PK9Iv7fiuH9dHYqiWCHJ3P8VnZbk0QbOMbHieFE3ttij5rlMMqmB8wAAAAAAACzRqqqq0rVr15xyyim57bbbMmbMmDz//PO59957c95552WllVbKjBkzctRRRzV6hfVPf/rTXHjhhZkzZ066dOmSH//4x3nqqafyxBNPZMCAAenUqVNmzpyZfv365cEHH1zoWL/4xS9yxRVXpGfPnvnVr36V5557LiNGjKgN4N999918+9vfblSdSTJq1Kja40UFyWPHjs3/+3//L2uuuWaGDh2aP//5zxk1alS+973vpX379pk5c2aOPvroPPPMM42u5/OOOeaYTJkyJW3bts0pp5ySBx54IM8++2z+/Oc/55577skFF1wwT8BbH++9916eeuqpHH/88Rk8eHCS6lXl//7v/96oGqdOnVr7XVnUZzhjxox885vfzAcffJDzzz8/jz/+eP785z/nv/7rv9K1a9ckyTXXXJOrrrqqUbUsyk9/+tPcfPPN2XHHHXP77bfnueeey4MPPlj744e33nor++23Xz788MP5rj3yyCOzyiqrJKne8n727Nnz9XnxxRfz+9//PknyrW99q7Z/QzXke/l5EydOzG677Za//OUvWXnllfPQQw8ttSF6shyvSC/L8pmiKEanOuA+viiK4WVZPvW5bmfn/7Znv6Ysy88qTxZF0S/JLTUvf1CW5YDPXf/7JEOSFEkuKori/rIsJ3++lqIovpNk+5qXT5dl+c9Gvi0AAAAAAIAl0gknnJBLLrkkbdu2nad9u+22yyGHHJLTTz89O++8cyZPnpxBgwY1eDvod999N+eee26SZO21187TTz+dddddt/Z8jx498o1vfCO77757pk+fnu985zuZOHHifPXM9eSTT+bEE0/Mz3/+8xRFUdu+9957p127drnxxhvz9NNP58UXX8y2227boFrnzJmTH/7wh7Wv+/Tps9D+48aNy/rrr5+nn346a621Vm37Hnvskf322y/77rtvqqqqcuqpp+bZZ59tUC11+fvf/57nn6++K/FVV11V54rzQw89NAMHDsy0adMWOtaee+45TzhbabXVVsvdd9+dVVddtVF1DhkypHaF/qI+w3fffTfTpk3LiBEjsscee9S277jjjjn88MOz00475c0338zFF1+co48+OmuuuWajalqQZ599NgcccEDuu+++ee4hv//++2eLLbbI97///bz55pu57LLLMmTIkHmu7dKlS4YNG5Z///d/z5gxY7LDDjvkP/7jP7Lxxhvn448/zpgxY3LllVdm1qxZ2WabbRr9Y4Bx48bVhvFbbLHFQu+n/nnjx4/Pvvvum7feeitrrLFG/vCHP6R79+6NqmNJsTyvSE+SM5J8kuofFDxcFMUFRVHsXBTF14qi+HmSH9X0+1uSKxs6eFmWf83/Be3rJHmxKIoLi6LYvSiKbYqiOLgoiv9O8vOaPrOTXLg4bwgAYFnQ/dxb53sAAAAAS7cNNthggaF1knTr1q02CL///vtTlmWDxr/lllsyY8aMJMmVV145T4g+17bbbpsLLrggSfW9su+9994Fjte1a9cMHTp0nhB9rnPOOaf2ePTo0Q2qM0muvvrq2tXjvXv3zvbbb7+IK6rfU2WIPtfXvva1nHjiiUmqty5viiD97bffrj2uDJ0/ryiKdO7cuVFznH766ZkwYcJCx1+YP//5z7XbsHfr1i2nnHLKIq856aST6pxv7bXXzpVXVkeBM2bMyPDhwxtV08K0b98+v/jFL+YJ0ee66KKLsuWWWyZJbrrppjrvb967d+8899xzOf744zN27Ngcd9xx2WWXXbLPPvtkwIAB6dixY6666qo88cQTdX5PFmXmzJk54YQTale7Dxo0qN7XPvXUU9ljjz3y1ltvZd11183o0aOX+hA9Wc6D9LIsX0zSN8mHSVZKMijJU0lGJvlOTbe/JTmwLMuPGjnNKUnuqDnukmRgkseTvJjk/iRH1ZybnuTYsiwfa+Q8AMByrq7wWQANAAAALKk+/PDDTJw4MS+//HLGjx+f8ePHp2PHjvOca4gRI0YkSVZdddUcfvjhC+x3wgknzHdNXY444oi0b9++znObbLJJVlpppSTVq7cbYtSoUTn//POTJGuuuWauv/76RV7TuXPnHHLIIQs8X7nF/MLeU33N3eo8SYYNG7ZYY91yyy156aWX8pe//CWPP/54rrrqqmy00Ua57rrrcvzxx+edd95p8JjvvPNOjjjiiFRVVaUoigwfPrz2u7Mw/fvXebfnJNVB9dyV8U3xGX7evvvum7XXXrvOcyussEKOO+64JMn777+fF154Yb4+n332WX71q1/lgQceqPNHJu+8805uv/32PPbYY42q77TTTstzzz2XJDnuuOPqvSX7ww8/nH322Sfvv/9+NtlkkzzxxBOLdc/7Jclyu7X7XGVZPlAUxdapXp1+YJJuSWYl+d8kv01ybVmWMxZj/JlJvlWzwr1fkp1TvTq9faoD/P9JMiLJDWVZvrkYbwUAAABa3ag9etbZ3vPxurdyBABg+fKPf/wjP/7xj/PAAw/kH//4x0L7vvfee/nyl79c77HHjx+fpHrV+cJWvn/pS1/KBhtskEmTJtVeU5dFhYGdO3fOxx9/nI8+qv9azJdffjm9e/dOVVVV2rdvn9/85jf50pe+tMjrtt122zpXMs+1zTbbpF27dpk1a9ZC31N9bbjhhtl9990zevToXH311fnjH/+Yww8/PHvuuWd23nnneoXWlWNV2n333XPyySfnm9/8Zn73u99lhx12yJNPPplu3brVa7yPPvooBx54YN58szpWGzRoUPbaa69FXteuXbtsvfXWCzzftm3bbLvttnn00Ueb5DP8vB122GGh53fcccfa4/Hjx2eXXXapfT19+vQccMABefzxx7PiiivmvPPOS//+/fPlL385n376af785z/n0ksvzRNPPJGDDz44V199dc4444x61zZ48ODceOONSZLu3bvnuuuuq9d1d955Z37xi19k1qxZ2W677fKHP/whXbp0qfe8S7rlekX6XGVZ/qMsy7PKstykLMtOZVl2Lstyh7Isf7SwEL0sy2FlWRY1jwGLmOPRsiyPq5ljpbIs25ZluXpZlruWZfl9IToAAAAAALAse+ihh7L55pvn2muvXWSIniSffPJJg8b/17/+lST1Cqbnbn0995q6LCosXmGF6pht7lbYizJx4sTsu+++ef/997Piiivm9ttvT8+edf8Q9fMWdb/uNm3aZLXVVkuy8PfUELfffnttmPvKK6/ksssuy957751VV101PXv2zM9+9rN8+umnjRq7Q4cOueWWW9KxY8e88cYbOe+88+p13aeffppDDjmk9v7tZ511Vu3q/kVZbbXVFvpjhOT/vjtN9RlWWtS/YeX39vPzX3LJJXn88ceTVG/9fsUVV2TTTTdNu3btssoqq2SfffbJo48+mq997WspyzJnnXVW/vKXv9Srrp///Oe58MLqO09vsskmeeihh9KpU6d6XXvddddl1qxZad++fe69995lKkRPBOkAAABAC7j27AfmewAAsPz45z//maOOOiozZszISiutlAEDBuSpp57K1KlTM3PmzJRlmbIs88gjj9Re09B7pM9V1z3NP6+xYzfWlClT0qtXr0yZMiVFUeTmm29O79696319a7ynddZZJ08++WRGjBiRU045JVtssUWKoshnn32Wxx9/PCeffHK23HLL/O1vf2vU+GussUZ69OiRJLnvvvtSVVW10P5VVVXp06dPHn300STVW/TPva95fbT292JR8y9o7rIsc8sttyRJNt5449ot4D+vTZs2ueyyy5Ikc+bMqb1mYW6//fbae8uvv/76GTFiRIPC8MMOOyxJ9f3V+/bt26DdGZYGgnQAAAAAAACa1W9/+9tMmzYtSXL33Xfnkksuyc4775wuXbqkXbt2tf3ef//9Rs8xd0X222+/vci+c+/LPfea5vTee+9ln332qb2X+tChQ3Psscc2aIxF3Ue8qqqq9rNr6ve0995757rrrsv48ePz7rvv5te//nXtVuqvvfZa+vbt2+ix54a2M2bMyLvvvrvAfnPmzMkxxxyTBx6o/kFu37598/Of/7xBc/3zn/9c5O4BU6dOTdI834tF/RvOnfvz87/zzju1K9S33XbbhY7RvXv32uO//vWvC+17//3359hjj82cOXPStWvXPPLII/XeXn+u008/PUOGDEmSPPXUUznggAPy8ccfN2iMJdlyf490AIDu595aZ/vzQxr2f9AAAAAAULeXX345SXVAuM8++yyw33PPPdfoObbccsu89dZbefHFF/PZZ58t8D7pU6dOrd1afsstt2z0fPXxwQcfZL/99ssrr7ySJPnhD3+YU089tcHjjB07NlVVVQvcmnzcuHGZNWtWkuZ9T6uvvnr69u2bvn375pBDDsn999+fsWPH5tVXX81GG23U4PEmT55ce7zSSistsN9JJ52UX//610mSgw46KLfddlvt1vr1NWvWrIwbNy7bbbddneerqqoyduzYJM3zGT777LP1Pl85f+W/+aJW7X/22Wd1Xvd5jzzySPr06ZOqqqqsvvrq+dOf/pSvfOUrCx17Qc4555zMnj07559/fp544okceOCBeeihhxZ5a4SlgRXpAAAAAAAANKu5AeDMmTMzZ86cOvvMmDEjt95a94KH+ujVq1eSZNq0abnrrrsW2O+mm26q3UZ77jXNYcaMGTnwwAPzwgsvJEkuuuiifO9732vUWP/6179qV2PX5eabb649bs73VGnvvfeuPX7vvfcafP3kyZPz1FNPJaneVnzllVeus99ZZ52VG2+8sXbOO++8c4E/kliU4cOHL/DcPffcU7uqvzk+w4cffjhvvfVWnefmzJlTW1vnzp3nCftXW221rLLKKkmqV30vLEwfNWpU7fGGG25YZ58nn3wyhxxySGbOnJlVVlklf/zjH7PFFls0+P1U+t73vpeBAwcmSR5//PEcdNBB+eSTTxZrzCWBIB0AAAAAAIBmNXe18vTp03PnnXfOd3727Nk54YQTMmXKlEbP0b9//9pVsGeffXbeeOON+fqMGzcugwYNSlJ9D/BDDz200fMtzKxZs9K7d++MGTMmSXLGGWfk8ssvX6wxzzrrrDq3Bx81alRuuOGGJNVbe++www6LNU9SvQJ+7ursupRlmREjRiSpvvf3BhtsUHvub3/7W0aOHLnQ8T/44IMceeSRtavojznmmDr7DRgwIFdffXWSZNddd819992X9u3bN+CdzOv666/PE088MV/722+/nXPOOSdJ0rFjxwXeh3xxzJw5MyeddFKd28v/8Ic/zEsvvZQk+fa3vz3Pe1xhhRVy4IEHJkmmTJlSG1h/3vvvvz/PDzUOOuig+fqMHTs2Bx54YKZPn55OnTrlwQcfnGc7+MVx4YUX5tJLL02SPProozn44IPz6aefNsnYrcXW7gAAAAAAADSrPn365MILL8zMmTPTr1+/jB07Nr169coqq6ySl19+OUOHDs3zzz+fHj161IbPDdWlS5cMGTIkp556aqZMmZLtt98+559/fnbdddfMnj07I0aMyJAhQ/Lxxx+nKIrccMMNjV7ZvChHHnlkHn744STJXnvtleOPPz7jx49fYP927dpl4403XuD5r371q3nllVfSvXv3XHDBBdlxxx0zc+bMPPjgg7n66qtrt32/7rrrmqT+sWPHpn///tlhhx1y8MEHZ7vttstaa62Vzz77LBMnTswtt9ySP/3pT0mSQw45JF27dq29dsqUKdl7773z1a9+NYceemi6d++etdZaK23atMnbb7+dMWPG5Kabbqq9l/2WW26Z888/f74ahg4dmh/84AdJqn/08KMf/SgTJ05caN2bbLLJAv9Nu3Tpko4dO2afffbJmWeemQMOOCDt27fPM888k0GDBtX+iOOyyy7Lmmuu2fAPbRG23377PPDAA+nRo0fOPPPMbLTRRpk6dWqGDx9eu219t27dcvHFF8937fe///3cd999mTFjRgYMGJDnn38+xx13XL785S/n008/zdNPP52f/OQnef3115NUr9zfd9995xnjtddey3777Zdp06YlSS6//PJ88YtfXOj3cs0112zQZ3HxxRdn9uzZ+cEPfpBHHnmkdvv/xfnxQ2sSpAMAAABJku7nzr+N5vNDjm2FSgAAWNZ069Yt119/fU444YR88sknGTx4cAYPHjxPn759++bEE09crG21TznllEybNi0XX3xxpk6dmrPOOmu+Pu3bt88NN9yQAw44oNHzLMrdd99dezxy5MhsvfXWC+2//vrrZ9KkSQs8v8022+S0007LySefnNNOO22+8+3atcvw4cOz0047Nbrmujz77LMLvbf3brvtlptuuqnOc+PGjcu4ceMWOv6BBx6YW265JZ06dZrvXOX2/JMnT85uu+22yHonTpw4z+r4Sh07dsydd96Z/fffv87vX5J897vfrfM70xROPfXUjBo1KsOGDcu3vvWt+c537do1f/zjH/PFL35xvnObbrpp7rvvvhx55JF577338sADDyxwq/+99torv/3tb+drHz16dKZOnVr7+swzz1xkzZdcckkGDBiwyH6VBgwYkNmzZ+fyyy/Pww8/nN69e+fee+9Nu3btGjTOksDW7gAAAAAAADS7/v37Z/To0Tn00EPTpUuXtG3bNl27ds3Xv/713HHHHfn1r3+dFVdccbHnufDCC/Piiy/mxBNPzFe+8pV84QtfSKdOnbLZZpvljDPOyF//+tcce+zS94PRE044IaNHj06fPn2y9tprp127dllnnXVy7LHH5sUXX6wznG2so446Ko8++mguvPDC7L777tlwww3TsWPHtGvXLt26dcs3vvGN/OpXv8qoUaOy2mqrzXNtjx49MmrUqFxyySXZe++9s9FGG2WVVVZJmzZtstpqq6V79+455ZRT8sQTT+R3v/tdunTp0mR1L8r222+fF154Id/97nfzla98JR06dMjqq6+er3/963nwwQdzzTXXNOv8t9xyS371q19lzz33zOqrr5727dtn4403znnnnZeXX345m2+++QKv7dWrV/7617/miiuuyJ577ln7N/SFL3whG264Yfr06ZN77703I0aMSOfOnZv1fSzKZZddlgsuuCBJ8tBDD+Xwww+v3cZ/aWJFOgAAAAAAQI2Lfjn//bupv379+qVfv34LPL/rrrvmnnvuWeD5PffcM2VZLvD8sGHDMmzYsEXWsfXWW9feN7whNthgg4XOX2lhK8jrO0ZD59h5551zxx13NMnYC9OuXbvsueee2XPPPRt8bdu2bbPHHntkjz32WKwaHnvsscW6fq7Pf2fWXXfdXHPNNc0emid1f5+OPPLIHHnkkY0ab/XVV895552X8847r8HXLupvs74W9Tc616BBgzJo0KDFnq81WZEOAAAAAAAAABUE6QAAAAAAAABQwdbu1FuPoT3qbB9z+pgWrgQAAAAAAACg+QjSAQAAAAAAYBkzfvz4Rl3XrVu3rLrqqk1bzFJq4sSJmT59eoOv69y5c9ZZZ51mqIiWJEgHAAAAAACAZcxWW23VqOtuueWW9OvXr2mLWUr1798/o0aNavB1xx13XIYNG9b0BdGi3CMdAAAAAAAAACpYkQ4AQJObMHBkne2bXbRXC1cCQHPpMbRHne2D/L8aAABgiVCWZWuXsNR77LHHWrsEWpEV6QAAAAAAAABQwc/EAYAm9/qlddx/qfMqLV8IAAAAAAA0giAdYDnQ/dxb62x/fsixLVwJAAAAAADAks/W7gAAAAAAAABQQZAOAAAAAAAAABUE6QAAAAAAAABQQZAOAAAAAAAAABUE6QAAAAAAAABQoU1rFwAAAAAsuV6/dKu6T3RepWULAQAAgBZkRToAAAAAAAAAVLAinSXChIEj62zf7KK9WrgSAAAAAAAAYHknSF/OdT/31vnanh9ybCtUAgAAAAAAALBksLU7AAAAAAAAAFQQpMMyZtQePet8ANBwr1+6VZ0PAAAAAOo2bNiwFEWRoigyadKkJh+/X79+KYoiG2ywQZOPvSTaYIMNUhRF+vXr19qlLLVa8zszadKk2r+HYcOGtfj8zeGxxx6rfU+PPfZYa5fTrATpAAAAAAAA0MReeOGFDBo0KPvvv3/WXXfdtG/fPiuttFI23njj9OvXL6NHj27tEpvNnDlz8sorr2TYsGE55ZRTssMOO6R9+/YNDmBff/31XH/99enbt2822WSTdOrUKR06dEi3bt1yyCGH5Pbbb09VVVXzvpkl3HnnnVf7uS7qs/30009z33335fTTT89OO+2U1VZbLW3bts1qq62WXXbZJQMGDMhbb73VcsUv4dwjHQAAAAAAoMaEgSNbu4Rms9lFe7V2CcuNnj175vHHH5+vfdasWXn11Vfz6quvZvjw4TnmmGNy4403pl27dq1QZfO57bbbFnsV/fe///1cfvnlKctyvnOTJ0/O5MmTc//99+eqq67KXXfdlfXWW2+x5lsajRs3LldffXW9+v7lL3/Jbrvtlo8++mi+c++//36efvrpPP3007nqqqty4403pk+fPk1d7lJHkA4ANFr3c2+ts/2elVu4EAAAAACWC8OGDVsqtsiePHlykmTttdfON7/5zey+++5Zb731Mnv27Dz11FO58sorM3ny5Nx2222pqqrKr371q1auuGlVht9t27bNlltumaqqqrz00kv1HmPKlCkpyzKdOnVK7969s/fee2ejjTZKhw4dMmHChPzXf/1Xnn322Tz33HPp1atXXnjhhay00krN8XaWSHPmzMmJJ56YqqqqrLnmmpk6depC+3/44Ye1IXqPHj1y0EEHZfvtt8/qq6+ed999N3fffXduvPHGfPTRRznqqKOy8sorZ//992+Jt7LEEqQDAAAAAABAE9p0000zaNCgHH744VlxxRXnObfzzjvnmGOOSY8ePfK3v/0tt99+e04++eTsvvvurVRt09t8881zzTXXZMcdd8w222yTDh06ZMCAAQ0K0ldfffVcccUVOfnkk7PyyvOu3OnevXuOPPLIHHXUUfnNb36TV199NVdffXUuvvjipn4rS6y5PyTYdNNN07t37wwePHih/VdYYYX06dMnl1xySTbffPP5zu+7777Zf//907t378yePTunn356Xn311RRF0VxvYYnnHukAAAAAAADQhH73u9+lT58+84Xoc62xxhq58sora1/feeedLVVai9hxxx3z3e9+NzvvvHM6dOjQqDGuuOKKnHfeefOF6HOtuOKK+elPf1q7Lf6y9hkuzBtvvFH7o4Hrr7++XrcG2HXXXXPHHXfUGaLPdcghh+Swww5Lkrz22msZO3Zsk9S7tBKkw3Li2rMfqPMBAItj4NFH1PkAAAAA+Lw5c+Zk5MiROeecc9KjR4+sscYaadu2bVZdddVss802Oeecc/L6668vdIx+/fqlKIpssMEGC+330ksv5Tvf+U422mijdOzYMSuvvHK22GKLnHnmmZk0adICr5s0aVKKokhRFLVbyP/pT3/KwQcfnLXWWivt27fPhhtumJNPPjlvvvlmAz+Bee255561x6+99lq9rnn22Wdz5JFHZt11102HDh2y7rrrpl+/fpkwYcJi1bIg06ZNy8CBA7PLLrukc+fOadu2bbp06ZLNN988vXv3zvXXX7/ILcWb0+qrr56tt946Sf0/w8mTJ+ess87KxhtvnI4dO6ZLly454IAD8tBDDzVnqbV++9vfplevXllzzTXzhS98IZtuumnOP//8vP/++/Ue45RTTsnHH3+c4447bp7vUVP42te+Vntc38/086ZNm5YePXqkKIq0bds2t912W1OV16Js7Q4AAAAAAECzu/TSS/ODH/xgvvYPPvgg48aNy7hx43L99dfnl7/8ZXr37t3oeQYPHpz//M//zJw5c+Zpf+WVV/LKK6/k+uuvzw033JBjjz12kWOdf/75ueKKK+ZpmzRpUn72s5/lrrvuyqhRo7LZZps1qs5Zs2bVHq+wwqLXvt5888056aSTUlVVVdv25ptvZvjw4fn1r3+d4cOHp2/fvo2qpS4TJkxIr169MmXKlHna33vvvbz33nuZMGFC7r333syePTunnXZak83bUDNnzkxSv8/wueeey4EHHjhP+P/JJ5/koYceykMPPZQzzjgjP/nJT5qr1Bx//PG5+eab52n7n//5n1xxxRW59dZbM2LEiIWuGE+S3/zmN/nd736X1VZbLUOGDGnyGud+nkn9PtPPe/vtt7PffvvlL3/5Szp06JA77rgj3/jGN5qyxBYjSAcAAAAAAKDZVVVVpWvXrundu3d22WWXfPnLX06HDh3yxhtv5Mknn8xPf/rTfPzxxznqqKPywgsvNCqg/ulPf5oLL7wwSdKlS5d873vfS48ePTJ79uyMGDEiQ4YMyfTp09OvX7+sscYaOeCAAxY41i9+8Ys8+eST6dmzZ0466aRsvPHGmTZtWm699dbceuuteffdd/Ptb387Tz31VKM+j1GjRtUeb7rppgvtO3bs2PzqV7/KmmuumQsuuCA77rhjPv300zz44IP5yU9+kpkzZ+boo4/OhhtumB133LFR9XzeMccckylTpqRt27Y58cQTs//++2ettdbKnDlzMmXKlDzzzDO56667mmSuxpo6dWrtavxFfYYzZszIN7/5zXzwwQc5//zzc8ABB6R9+/b585//nMGDB+ett97KNddck/XWWy9nnXVWk9f605/+NM8++2x23HHHnHnmmdloo40yderUDB8+PHfccUfeeuut7Lfffnn55Zezyiqr1DnGtGnTcsYZZySp3vq+S5cuTV5nQ76Xnzdx4sTss88+ee2117Lyyivn/vvvb/IV8y1JkA4AAAAAAECzO+GEE3LJJZekbdu287Rvt912OeSQQ3L66adn5513zuTJkzNo0KAGbwf97rvv5txzz02SrL322nn66aez7rrr1p7v0aNHvvGNb2T33XfP9OnT853vfCcTJ06cr565nnzyyZx44on5+c9/nqIoatv33nvvtGvXLjfeeGOefvrpvPjii9l2220bVOucOXPywx/+sPZ1nz59Ftp/3LhxWX/99fP0009nrbXWqm3fY489st9++2XfffdNVVVVTj311Dz77LMNqqUuf//73/P8888nSa666qo6V5wfeuihGThwYKZNm7bY8zXWkCFDalfoL+ozfPfddzNt2rSMGDEie+yxR237jjvumMMPPzw77bRT3nzzzVx88cU5+uijs+aaazZprc8++2wOOOCA3HfffWnT5v8i2v333z9bbLFFvv/97+fNN9/MZZddtsCV5uedd17efvvt7Lrrrjn++OObtL6k+nv2+9//PkmyxRZbLHJ1fKXx48dn3333zVtvvZU11lgjf/jDH9K9e/cmr7EluUc6ANCqRu3Rs84HAAAAAMuWDTbYYIGhdZJ069atNgi///77U5Zlg8a/5ZZbMmPGjCTJlVdeOU+IPte2226bCy64IEn1vbLvvffeBY7XtWvXDB06dJ4Qfa5zzjmn9nj06NENqjNJrr766jzzzDNJkt69e2f77bdf5DVXXnnlPCH6XF/72tdy4oknJqneurwpgvS333679rgydP68oijSuXPnxZ6vMf785z/XbsPerVu3nHLKKYu85qSTTqrz/ay99tq58sork1SvXB8+fHiT1pok7du3zy9+8Yt5QvS5Lrroomy55ZZJkptuumme7dXneuKJJ3LjjTemTZs2+dnPflbn93JxzJw5MyeccEJmz56dJBk0aFC9r33qqaeyxx575K233sq6666b0aNHL/UheiJIBwAAAAAAoBV8+OGHmThxYl5++eWMHz8+48ePT8eOHec51xAjRoxIkqy66qo5/PDDF9jvhBNOmO+auhxxxBFp3759nec22WSTrLTSSkmqV283xKhRo3L++ecnSdZcc81cf/31i7ymc+fOOeSQQxZ4/tvf/nbt8cLeU3117dq19njYsGGLPV5Te+edd3LEEUekqqoqRVFk+PDhtd+dhenfv/8Cz/Xu3Turrrpqkqb5DD9v3333zdprr13nuRVWWCHHHXdckuT999/PCy+8MM/5WbNm5Tvf+U7KssyZZ56ZrbbaqsnrO+200/Lcc88lSY477rh639f84Ycfzj777JP3338/m2yySZ544okGbwm/pLK1OwDAMu71SxfwH9ad677XEgDQNCYMHFln+2YX7dXClQAALDn+8Y9/5Mc//nEeeOCB/OMf/1ho3/feey9f/vKX6z32+PHjk1SvOl/YyvcvfelL2WCDDTJp0qTaa+qyqDCwc+fO+fjjj/PRRx/Vu8aXX345vXv3TlVVVdq3b5/f/OY3+dKXvrTI67bddts6VzLPtc0226Rdu3aZNWvWQt9TfW244YbZfffdM3r06Fx99dX54x//mMMPPzx77rlndt5553qF1s3lo48+yoEHHpg333wzSfXK6b32WvR/Y7dr1y5bb731As+3bds22267bR599NEm+Qw/b4cddljo+cp7248fPz677LJL7etBgwZlwoQJWW+99XLJJZc0eW2DBw/OjTfemCTp3r17rrvuunpdd+edd+YXv/hFZs2ale222y5/+MMfmuW+7a3FinQAAAAAAACa3UMPPZTNN98811577SJD9CT55JNPGjT+v/71rySpVzA9d4v0udfUZVFh8QorVMdsc7fCXpSJEydm3333zfvvv58VV1wxt99+e3r2rN8tDhd1v+42bdpktdVWS7Lw99QQt99+e22Y+8orr+Syyy7L3nvvnVVXXTU9e/bMz372s3z66adNMld9ffrppznkkENq799+1lln1a7uX5TVVlttoT9GSP7vu9NUn2GlRf0bVn5vK+f/61//msGDBydJhg4dmk6dOjVpXT//+c9z4YUXJqneaeGhhx6q9xzXXXddZs2alfbt2+fee+9dpkL0xIp0WtjAo4+os/2wzRZ93woAli/Xnv1Aa5cAACwHegztUWf7mNPHtHAlAADLtn/+85856qijMmPGjKy00ko555xzst9+++UrX/lKvvjFL6Zdu3ZJkpEjR2bvvfdOkgbfI32u+tw7urFjN9aUKVPSq1evTJkyJUVR5Oabb07v3r3rfX1rvKd11lknTz75ZB555JHcfffdGTVqVF555ZV89tlnefzxx/P444/nxz/+cR588MFsvPHGTTp3XaqqqtKnT588+uijSaq36J97X/P6aO3vxaLmX9DcV199dWbNmpUvf/nLmTFjRn7961/P16dyBf3IkSNr73F/8MEHLzQUv/3222vvLb/++utnxIgRDQrDDzvssNx9992ZOXNm+vbtmz/+8Y9ZeeWV6339kk6QDgAAAAAAQLP67W9/m2nTpiVJ7r777uyzzz519nv//fcbPcdqq62Wt956qzZEXJh33nmn9prm9t5772WfffapvZf60KFDc+yxxzZojLn1LkhVVVXtZ9fU72nvvfeu/XHDP//5z4wYMSI33HBDRo4cmddeey19+/bNiy++2KRzft6cOXNyzDHH5IEHqhff9O3bNz//+c8bNMY///nPzJ49OyuuuOIC+0ydOjVJ83wvFvVvOHfuz88/c+bMJMnf//73HHnkkYuc57LLLqs9njhx4gKD9Pvvvz/HHnts5syZk65du+aRRx5Jt27dFjl+pdNPPz277LJLzj333Dz11FM54IAD8tBDD2WllVZq0DhLKlu7AwAAAAAA0KxefvnlJNUB4YJC9CR57rnnGj3HlltumSR58cUX89lnny2w39SpU2u3lp97TXP54IMPst9+++WVV15Jkvzwhz/Mqaee2uBxxo4dm6qqqgWeHzduXGbNmpWked/T6quvnr59++aRRx7JN77xjdraXn311WabM0lOOumk2pXYBx10UG677bbarfXra9asWRk3btwCz1dVVWXs2LFJmuczfPbZZ+t9vrm/l4888kj69OmTqqqqrL766vnTn/6Ur3zlK40a65xzzskPf/jDJMkTTzyRAw88MDNmzGjKcluNIB0AAAAAAIBmNTcEnjlzZubMmVNnnxkzZuTWW29t9By9evVKkkybNi133XXXAvvddNNNtdtoz72mOcyYMSMHHnhgXnjhhSTJRRddlO9973uNGutf//pX7Wrsutx88821x835nirNXaWeVK+6by5nnXVWbrzxxto577zzzrRt27ZRYw0fPnyB5+65557aVf3N8Rk+/PDDeeutt+o8N2fOnNraOnfunO2226723LBhw1KW5UIfl1xySW3/Rx99tLZ9gw02mG+uJ598MoccckhmzpyZVVZZJX/84x+zxRZbLNZ7+973vpeBAwcmSR5//PEcdNBB+eSTTxZrzCWBIB0AAAAAAIBmtdFGGyVJpk+fnjvvvHO+87Nnz84JJ5yQKVOmNHqO/v37p2PHjkmSs88+O2+88cZ8fcaNG5dBgwYlqb4H+KGHHtro+RZm1qxZ6d27d8aMGZMkOeOMM3L55Zcv1phnnXVWnduDjxo1KjfccEOSpHv37tlhhx0Wa56kepX53NXZdSnLMiNGjEhSfe/vugLbpjBgwIBcffXVSZJdd9019913X9q3b9/o8a6//vo88cQT87W//fbbOeecc5IkHTt2zHHHHdfoORZk5syZOemkkzJ79uz5zv3whz/MSy+9lCT59re/vVjvcWHGjh2bAw88MNOnT0+nTp3y4IMPpnv37k0y9oUXXphLL700SXWYf/DBB+fTTz9tkrFbi3ukAwAAAAAA0Kz69OmTCy+8MDNnzky/fv0yduzY9OrVK6usskpefvnlDB06NM8//3x69OhRGz43VJcuXTJkyJCceuqpmTJlSrbffvucf/752XXXXTN79uyMGDEiQ4YMyccff5yiKHLDDTc0emXzohx55JF5+OGHkyR77bVXjj/++IwfP36B/du1a5eNN954gee/+tWv5pVXXkn37t1zwQUXZMcdd8zMmTPz4IMP5uqrr05VVVXatGmT6667rknqHzt2bPr3758ddtghBx98cLbbbrustdZa+eyzzzJx4sTccsst+dOf/pQkOeSQQ9K1a9f5xhg2bNh8Y871hz/8IZMmTap9/W//9m/Zbbfd5uk/dOjQ/OAHP0hS/aOHH/3oR5k4ceJC695kk00W+G/apUuXdOzYMfvss0/OPPPMHHDAAWnfvn2eeeaZDBo0qPZHHJdddlnWXHPNhc7TGNtvv30eeOCB9OjRI2eeeWY22mijTJ06NcOHD6/dtr5bt265+OKLm3zuJHnttdey3377Zdq0aUmSyy+/PF/84hcX+r1cc801G/RZXHzxxZk9e3Z+8IMf5JFHHskhhxyS+++/v9l+GNDcBOkAAAAAAAA0q27duuX666/PCSeckE8++SSDBw/O4MGD5+nTt2/fnHjiiYu1rfYpp5ySadOm5eKLL87UqVNz1llnzdenffv2ueGGG3LAAQc0ep5Fufvuu2uPR44cma233nqh/ddff/15guXP22abbXLaaafl5JNPzmmnnTbf+Xbt2mX48OHZaaedGl1zXZ599tmF3tt7t912y0033VTnuf79+y/wuiuuuGKe18cdd9x8QXrl9vyTJ0+e73xdJk6cuMDV8R07dsydd96Z/fffv87vX5J897vfrfM70xROPfXUjBo1KsOGDcu3vvWt+c537do1f/zjH/PFL36xWeYfPXp0pk6dWvv6zDPPXOQ1l1xySQYMGNCgeQYMGJDZs2fn8ssvz8MPP5zevXvn3nvvTbt27RpacqsTpAMAAAAAANTY7KK9WruEZVb//v2zySabZMiQIRkzZkymTZuWNdZYI1/96lfTv3//9OnTJ4899thiz3PhhRfmoIMOyrXXXpuRI0dmypQpWWGFFbLeeutl3333zX/8x38021bkzemEE07IlltumauvvjpPPPFE3nvvvXTp0iV77713vve972XzzTdvsrmOOuqobLDBBvnTn/6U0aNH580338w777yTqqqqrLnmmtluu+3yrW99K3379s0KKyw9d5Lefvvt88ILL+THP/5xfv/732fy5Mnp1KlTdthhh3z3u9/N/vvv36zz33LLLdl3331zww035KWXXsrHH3+c9ddfP4ceemjOP//8dO7cuVnnbymXXXZZZs+encGDB+ehhx7K4YcfnrvuumupC9MF6QAAAAAAADSJfv36pV+/fgs8v+uuu+aee+5Z4Pk999wzZVku8PywYcPm2zK8LltvvXXtfcMbYoMNNljo/JUWtoK8vmM0dI6dd945d9xxR5OMvTDt2rXLnnvumT333LPRYyzuZ9AUP6pI5v/OrLvuurnmmmtyzTXXNMn4C1PX9+nII4/MkUce2aTzDBgwYJErxxf1t1lfi/obnWvQoEEZNGjQYs/Xmpaen4gAAAAAAAAAQAuwIh0A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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize=(12,8))\n", + "order = list(dataset_type.keys())\n", + "d = df.copy()\n", + "ax = sns.barplot(\n", + " x=\"dataset\", y=\"acc1\", \n", + " data=d,\n", + " order=order,\n", + " hue=\"pretrained\",\n", + " estimator=np.max,\n", + " ci=None\n", + ")\n", + "ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)\n", + "ax" + ] + }, + { + "cell_type": "markdown", + "id": "eea94f09-18c1-445b-a4e2-7418f25c816b", + "metadata": {}, + "source": [ + "# Detailed results" + ] + }, + { + "cell_type": "markdown", + "id": "ccba4abe-53bc-4092-b05b-dafc0eccb4c5", + "metadata": {}, + "source": [ + "### All results (acc1)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f03782e4-be8f-4e3b-a699-c516da5c62a2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_fullnameViT-B-16 laion400m_e32ViT-B-16 openaiViT-B-16-plus-240 laion400m_e32ViT-B-32 laion2b_e16ViT-B-32 laion2b_s34b_b79kViT-B-32 openaiViT-B-32-quickgelu laion400m_e32ViT-H-14 laion2b_s32b_b79kViT-L-14 laion2b_s32b_b82kViT-L-14 laion400m_e32ViT-L-14 openaiViT-L-14-336 openaiViT-g-14 laion2b_s12b_b42k
dataset
cars0.8370.6450.8440.8420.8600.5940.7920.9350.9260.8960.7770.7930.928
country2110.1810.2280.1880.1650.1660.1720.1470.3000.2640.2310.3180.3450.287
fer20130.4290.4580.4460.4770.4690.4090.4270.5180.5370.5010.4900.4800.466
fgvc_aircraft0.1750.2420.1850.2300.2460.1970.1680.4280.3690.2510.3170.3290.378
gtsrb0.4350.4360.4950.3650.4930.3310.4200.5840.5610.5000.5020.5160.497
imagenet-a0.3320.5010.3680.2620.2630.3140.2170.5920.5390.4660.7070.7740.571
imagenet-r0.7790.7770.8040.7590.7640.6930.7340.8930.8740.8480.8790.8910.886
imagenet1k0.6700.6840.6910.6550.6650.6330.6290.7800.7520.7270.7550.7650.767
imagenet_sketch0.5230.4810.5440.5290.5360.4230.4930.6660.6330.5960.5960.6110.652
imagenetv20.5960.6190.6140.5720.5820.5600.5510.7080.6770.6560.6970.7070.696
mnist0.6660.4950.5700.6370.6920.4850.3740.7290.5490.7640.7680.7870.690
objectnet0.5150.5540.5380.4880.4900.4420.4390.6970.6550.5990.6910.7180.675
renderedsst20.5470.6110.5780.5370.5660.5900.5260.6410.5930.5630.6990.7070.646
stl100.9700.9830.9690.9650.9660.9710.9550.9840.9890.9800.9940.9940.986
sun3970.6960.6430.6980.6850.6870.6250.6700.7520.7430.7260.6750.6870.754
voc20070.7680.7840.7630.7890.7910.7660.7570.7760.8050.7560.7830.7820.810
vtab/caltech1010.8350.8250.8330.8310.8390.8190.8330.8500.8500.8420.8390.8380.852
vtab/cifar100.9170.9080.9270.9400.9350.8980.9080.9740.9660.9470.9570.9500.971
vtab/cifar1000.7100.6690.7370.7520.7560.6450.7020.8470.8340.7740.7610.7460.839
vtab/clevr_closest_object_distance0.2450.1580.1590.1670.1900.1720.1590.1680.1610.1490.1610.1580.177
vtab/clevr_count_all0.2880.2040.2320.1980.1570.2350.1630.2780.3110.2420.1900.1990.332
vtab/diabetic_retinopathy0.0870.0630.1320.2700.7350.2630.3380.2380.2110.0720.7330.7330.434
vtab/dmlab0.1510.1590.1490.1890.1580.1950.1720.1420.2240.1860.1670.1590.190
vtab/dsprites_label_orientation0.0300.0200.0260.0270.0340.0240.0190.0260.0200.0260.0230.0240.031
vtab/dsprites_label_x_position0.0310.0300.0430.0310.0300.0350.0290.0310.0320.0300.0320.0310.035
vtab/dtd0.5130.4460.5570.5400.5570.4430.5430.6790.6280.6030.5510.5570.681
vtab/eurosat0.5030.5560.5800.5020.4820.5070.5160.7170.6510.6180.6270.6190.648
vtab/flowers0.6930.7140.7110.6890.7160.6630.6830.8020.7590.7540.7920.7840.776
vtab/kitti_closest_vehicle_distance0.1900.2700.2840.1660.2590.2740.2880.1110.2290.2080.2240.2690.146
vtab/pcam0.6050.5060.5440.5040.5860.6220.5460.5360.5530.4860.5160.6130.551
vtab/pets0.8920.8890.9040.8930.9070.8730.8680.9440.9320.9190.9310.9380.943
vtab/resisc450.5850.5850.6130.6170.6090.5380.5460.6960.6670.6730.6350.6370.717
vtab/smallnorb_label_azimuth0.0590.0560.0550.0520.0620.0600.0450.0550.0560.0520.0460.0480.059
vtab/smallnorb_label_elevation0.0980.1190.1080.1090.1150.1180.0970.1110.1090.1100.1140.1120.113
vtab/svhn0.3860.3050.3630.3850.4100.1240.2790.5610.4630.3820.5710.5540.603
\n", + "
" + ], + "text/plain": [ + "model_fullname ViT-B-16 laion400m_e32 ViT-B-16 openai \\\n", + "dataset \n", + "cars 0.837 0.645 \n", + "country211 0.181 0.228 \n", + "fer2013 0.429 0.458 \n", + "fgvc_aircraft 0.175 0.242 \n", + "gtsrb 0.435 0.436 \n", + "imagenet-a 0.332 0.501 \n", + "imagenet-r 0.779 0.777 \n", + "imagenet1k 0.670 0.684 \n", + "imagenet_sketch 0.523 0.481 \n", + "imagenetv2 0.596 0.619 \n", + "mnist 0.666 0.495 \n", + "objectnet 0.515 0.554 \n", + "renderedsst2 0.547 0.611 \n", + "stl10 0.970 0.983 \n", + "sun397 0.696 0.643 \n", + "voc2007 0.768 0.784 \n", + "vtab/caltech101 0.835 0.825 \n", + "vtab/cifar10 0.917 0.908 \n", + "vtab/cifar100 0.710 0.669 \n", + "vtab/clevr_closest_object_distance 0.245 0.158 \n", + "vtab/clevr_count_all 0.288 0.204 \n", + "vtab/diabetic_retinopathy 0.087 0.063 \n", + "vtab/dmlab 0.151 0.159 \n", + "vtab/dsprites_label_orientation 0.030 0.020 \n", + "vtab/dsprites_label_x_position 0.031 0.030 \n", + "vtab/dtd 0.513 0.446 \n", + "vtab/eurosat 0.503 0.556 \n", + "vtab/flowers 0.693 0.714 \n", + "vtab/kitti_closest_vehicle_distance 0.190 0.270 \n", + "vtab/pcam 0.605 0.506 \n", + "vtab/pets 0.892 0.889 \n", + "vtab/resisc45 0.585 0.585 \n", + "vtab/smallnorb_label_azimuth 0.059 0.056 \n", + "vtab/smallnorb_label_elevation 0.098 0.119 \n", + "vtab/svhn 0.386 0.305 \n", + "\n", + "model_fullname ViT-B-16-plus-240 laion400m_e32 \\\n", + "dataset \n", + "cars 0.844 \n", + "country211 0.188 \n", + "fer2013 0.446 \n", + "fgvc_aircraft 0.185 \n", + "gtsrb 0.495 \n", + "imagenet-a 0.368 \n", + "imagenet-r 0.804 \n", + "imagenet1k 0.691 \n", + "imagenet_sketch 0.544 \n", + "imagenetv2 0.614 \n", + "mnist 0.570 \n", + "objectnet 0.538 \n", + "renderedsst2 0.578 \n", + "stl10 0.969 \n", + "sun397 0.698 \n", + "voc2007 0.763 \n", + "vtab/caltech101 0.833 \n", + "vtab/cifar10 0.927 \n", + "vtab/cifar100 0.737 \n", + "vtab/clevr_closest_object_distance 0.159 \n", + "vtab/clevr_count_all 0.232 \n", + "vtab/diabetic_retinopathy 0.132 \n", + "vtab/dmlab 0.149 \n", + "vtab/dsprites_label_orientation 0.026 \n", + "vtab/dsprites_label_x_position 0.043 \n", + "vtab/dtd 0.557 \n", + "vtab/eurosat 0.580 \n", + "vtab/flowers 0.711 \n", + "vtab/kitti_closest_vehicle_distance 0.284 \n", + "vtab/pcam 0.544 \n", + "vtab/pets 0.904 \n", + "vtab/resisc45 0.613 \n", + "vtab/smallnorb_label_azimuth 0.055 \n", + "vtab/smallnorb_label_elevation 0.108 \n", + "vtab/svhn 0.363 \n", + "\n", + "model_fullname ViT-B-32 laion2b_e16 \\\n", + "dataset \n", + "cars 0.842 \n", + "country211 0.165 \n", + "fer2013 0.477 \n", + "fgvc_aircraft 0.230 \n", + "gtsrb 0.365 \n", + "imagenet-a 0.262 \n", + "imagenet-r 0.759 \n", + "imagenet1k 0.655 \n", + "imagenet_sketch 0.529 \n", + "imagenetv2 0.572 \n", + "mnist 0.637 \n", + "objectnet 0.488 \n", + "renderedsst2 0.537 \n", + "stl10 0.965 \n", + "sun397 0.685 \n", + "voc2007 0.789 \n", + "vtab/caltech101 0.831 \n", + "vtab/cifar10 0.940 \n", + "vtab/cifar100 0.752 \n", + "vtab/clevr_closest_object_distance 0.167 \n", + "vtab/clevr_count_all 0.198 \n", + "vtab/diabetic_retinopathy 0.270 \n", + "vtab/dmlab 0.189 \n", + "vtab/dsprites_label_orientation 0.027 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.540 \n", + "vtab/eurosat 0.502 \n", + "vtab/flowers 0.689 \n", + "vtab/kitti_closest_vehicle_distance 0.166 \n", + "vtab/pcam 0.504 \n", + "vtab/pets 0.893 \n", + "vtab/resisc45 0.617 \n", + "vtab/smallnorb_label_azimuth 0.052 \n", + "vtab/smallnorb_label_elevation 0.109 \n", + "vtab/svhn 0.385 \n", + "\n", + "model_fullname ViT-B-32 laion2b_s34b_b79k \\\n", + "dataset \n", + "cars 0.860 \n", + "country211 0.166 \n", + "fer2013 0.469 \n", + "fgvc_aircraft 0.246 \n", + "gtsrb 0.493 \n", + "imagenet-a 0.263 \n", + "imagenet-r 0.764 \n", + "imagenet1k 0.665 \n", + "imagenet_sketch 0.536 \n", + "imagenetv2 0.582 \n", + "mnist 0.692 \n", + "objectnet 0.490 \n", + "renderedsst2 0.566 \n", + "stl10 0.966 \n", + "sun397 0.687 \n", + "voc2007 0.791 \n", + "vtab/caltech101 0.839 \n", + "vtab/cifar10 0.935 \n", + "vtab/cifar100 0.756 \n", + "vtab/clevr_closest_object_distance 0.190 \n", + "vtab/clevr_count_all 0.157 \n", + "vtab/diabetic_retinopathy 0.735 \n", + "vtab/dmlab 0.158 \n", + "vtab/dsprites_label_orientation 0.034 \n", + "vtab/dsprites_label_x_position 0.030 \n", + "vtab/dtd 0.557 \n", + "vtab/eurosat 0.482 \n", + "vtab/flowers 0.716 \n", + "vtab/kitti_closest_vehicle_distance 0.259 \n", + "vtab/pcam 0.586 \n", + "vtab/pets 0.907 \n", + "vtab/resisc45 0.609 \n", + "vtab/smallnorb_label_azimuth 0.062 \n", + "vtab/smallnorb_label_elevation 0.115 \n", + "vtab/svhn 0.410 \n", + "\n", + "model_fullname ViT-B-32 openai \\\n", + "dataset \n", + "cars 0.594 \n", + "country211 0.172 \n", + "fer2013 0.409 \n", + "fgvc_aircraft 0.197 \n", + "gtsrb 0.331 \n", + "imagenet-a 0.314 \n", + "imagenet-r 0.693 \n", + "imagenet1k 0.633 \n", + "imagenet_sketch 0.423 \n", + "imagenetv2 0.560 \n", + "mnist 0.485 \n", + "objectnet 0.442 \n", + "renderedsst2 0.590 \n", + "stl10 0.971 \n", + "sun397 0.625 \n", + "voc2007 0.766 \n", + "vtab/caltech101 0.819 \n", + "vtab/cifar10 0.898 \n", + "vtab/cifar100 0.645 \n", + "vtab/clevr_closest_object_distance 0.172 \n", + "vtab/clevr_count_all 0.235 \n", + "vtab/diabetic_retinopathy 0.263 \n", + "vtab/dmlab 0.195 \n", + "vtab/dsprites_label_orientation 0.024 \n", + "vtab/dsprites_label_x_position 0.035 \n", + "vtab/dtd 0.443 \n", + "vtab/eurosat 0.507 \n", + "vtab/flowers 0.663 \n", + "vtab/kitti_closest_vehicle_distance 0.274 \n", + "vtab/pcam 0.622 \n", + "vtab/pets 0.873 \n", + "vtab/resisc45 0.538 \n", + "vtab/smallnorb_label_azimuth 0.060 \n", + "vtab/smallnorb_label_elevation 0.118 \n", + "vtab/svhn 0.124 \n", + "\n", + "model_fullname ViT-B-32-quickgelu laion400m_e32 \\\n", + "dataset \n", + "cars 0.792 \n", + "country211 0.147 \n", + "fer2013 0.427 \n", + "fgvc_aircraft 0.168 \n", + "gtsrb 0.420 \n", + "imagenet-a 0.217 \n", + "imagenet-r 0.734 \n", + "imagenet1k 0.629 \n", + "imagenet_sketch 0.493 \n", + "imagenetv2 0.551 \n", + "mnist 0.374 \n", + "objectnet 0.439 \n", + "renderedsst2 0.526 \n", + "stl10 0.955 \n", + "sun397 0.670 \n", + "voc2007 0.757 \n", + "vtab/caltech101 0.833 \n", + "vtab/cifar10 0.908 \n", + "vtab/cifar100 0.702 \n", + "vtab/clevr_closest_object_distance 0.159 \n", + "vtab/clevr_count_all 0.163 \n", + "vtab/diabetic_retinopathy 0.338 \n", + "vtab/dmlab 0.172 \n", + "vtab/dsprites_label_orientation 0.019 \n", + "vtab/dsprites_label_x_position 0.029 \n", + "vtab/dtd 0.543 \n", + "vtab/eurosat 0.516 \n", + "vtab/flowers 0.683 \n", + "vtab/kitti_closest_vehicle_distance 0.288 \n", + "vtab/pcam 0.546 \n", + "vtab/pets 0.868 \n", + "vtab/resisc45 0.546 \n", + "vtab/smallnorb_label_azimuth 0.045 \n", + "vtab/smallnorb_label_elevation 0.097 \n", + "vtab/svhn 0.279 \n", + "\n", + "model_fullname ViT-H-14 laion2b_s32b_b79k \\\n", + "dataset \n", + "cars 0.935 \n", + "country211 0.300 \n", + "fer2013 0.518 \n", + "fgvc_aircraft 0.428 \n", + "gtsrb 0.584 \n", + "imagenet-a 0.592 \n", + "imagenet-r 0.893 \n", + "imagenet1k 0.780 \n", + "imagenet_sketch 0.666 \n", + "imagenetv2 0.708 \n", + "mnist 0.729 \n", + "objectnet 0.697 \n", + "renderedsst2 0.641 \n", + "stl10 0.984 \n", + "sun397 0.752 \n", + "voc2007 0.776 \n", + "vtab/caltech101 0.850 \n", + "vtab/cifar10 0.974 \n", + "vtab/cifar100 0.847 \n", + "vtab/clevr_closest_object_distance 0.168 \n", + "vtab/clevr_count_all 0.278 \n", + "vtab/diabetic_retinopathy 0.238 \n", + "vtab/dmlab 0.142 \n", + "vtab/dsprites_label_orientation 0.026 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.679 \n", + "vtab/eurosat 0.717 \n", + "vtab/flowers 0.802 \n", + "vtab/kitti_closest_vehicle_distance 0.111 \n", + "vtab/pcam 0.536 \n", + "vtab/pets 0.944 \n", + "vtab/resisc45 0.696 \n", + "vtab/smallnorb_label_azimuth 0.055 \n", + "vtab/smallnorb_label_elevation 0.111 \n", + "vtab/svhn 0.561 \n", + "\n", + "model_fullname ViT-L-14 laion2b_s32b_b82k \\\n", + "dataset \n", + "cars 0.926 \n", + "country211 0.264 \n", + "fer2013 0.537 \n", + "fgvc_aircraft 0.369 \n", + "gtsrb 0.561 \n", + "imagenet-a 0.539 \n", + "imagenet-r 0.874 \n", + "imagenet1k 0.752 \n", + "imagenet_sketch 0.633 \n", + "imagenetv2 0.677 \n", + "mnist 0.549 \n", + "objectnet 0.655 \n", + "renderedsst2 0.593 \n", + "stl10 0.989 \n", + "sun397 0.743 \n", + "voc2007 0.805 \n", + "vtab/caltech101 0.850 \n", + "vtab/cifar10 0.966 \n", + "vtab/cifar100 0.834 \n", + "vtab/clevr_closest_object_distance 0.161 \n", + "vtab/clevr_count_all 0.311 \n", + "vtab/diabetic_retinopathy 0.211 \n", + "vtab/dmlab 0.224 \n", + "vtab/dsprites_label_orientation 0.020 \n", + "vtab/dsprites_label_x_position 0.032 \n", + "vtab/dtd 0.628 \n", + "vtab/eurosat 0.651 \n", + "vtab/flowers 0.759 \n", + "vtab/kitti_closest_vehicle_distance 0.229 \n", + "vtab/pcam 0.553 \n", + "vtab/pets 0.932 \n", + "vtab/resisc45 0.667 \n", + "vtab/smallnorb_label_azimuth 0.056 \n", + "vtab/smallnorb_label_elevation 0.109 \n", + "vtab/svhn 0.463 \n", + "\n", + "model_fullname ViT-L-14 laion400m_e32 ViT-L-14 openai \\\n", + "dataset \n", + "cars 0.896 0.777 \n", + "country211 0.231 0.318 \n", + "fer2013 0.501 0.490 \n", + "fgvc_aircraft 0.251 0.317 \n", + "gtsrb 0.500 0.502 \n", + "imagenet-a 0.466 0.707 \n", + "imagenet-r 0.848 0.879 \n", + "imagenet1k 0.727 0.755 \n", + "imagenet_sketch 0.596 0.596 \n", + "imagenetv2 0.656 0.697 \n", + "mnist 0.764 0.768 \n", + "objectnet 0.599 0.691 \n", + "renderedsst2 0.563 0.699 \n", + "stl10 0.980 0.994 \n", + "sun397 0.726 0.675 \n", + "voc2007 0.756 0.783 \n", + "vtab/caltech101 0.842 0.839 \n", + "vtab/cifar10 0.947 0.957 \n", + "vtab/cifar100 0.774 0.761 \n", + "vtab/clevr_closest_object_distance 0.149 0.161 \n", + "vtab/clevr_count_all 0.242 0.190 \n", + "vtab/diabetic_retinopathy 0.072 0.733 \n", + "vtab/dmlab 0.186 0.167 \n", + "vtab/dsprites_label_orientation 0.026 0.023 \n", + "vtab/dsprites_label_x_position 0.030 0.032 \n", + "vtab/dtd 0.603 0.551 \n", + "vtab/eurosat 0.618 0.627 \n", + "vtab/flowers 0.754 0.792 \n", + "vtab/kitti_closest_vehicle_distance 0.208 0.224 \n", + "vtab/pcam 0.486 0.516 \n", + "vtab/pets 0.919 0.931 \n", + "vtab/resisc45 0.673 0.635 \n", + "vtab/smallnorb_label_azimuth 0.052 0.046 \n", + "vtab/smallnorb_label_elevation 0.110 0.114 \n", + "vtab/svhn 0.382 0.571 \n", + "\n", + "model_fullname ViT-L-14-336 openai \\\n", + "dataset \n", + "cars 0.793 \n", + "country211 0.345 \n", + "fer2013 0.480 \n", + "fgvc_aircraft 0.329 \n", + "gtsrb 0.516 \n", + "imagenet-a 0.774 \n", + "imagenet-r 0.891 \n", + "imagenet1k 0.765 \n", + "imagenet_sketch 0.611 \n", + "imagenetv2 0.707 \n", + "mnist 0.787 \n", + "objectnet 0.718 \n", + "renderedsst2 0.707 \n", + "stl10 0.994 \n", + "sun397 0.687 \n", + "voc2007 0.782 \n", + "vtab/caltech101 0.838 \n", + "vtab/cifar10 0.950 \n", + "vtab/cifar100 0.746 \n", + "vtab/clevr_closest_object_distance 0.158 \n", + "vtab/clevr_count_all 0.199 \n", + "vtab/diabetic_retinopathy 0.733 \n", + "vtab/dmlab 0.159 \n", + "vtab/dsprites_label_orientation 0.024 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.557 \n", + "vtab/eurosat 0.619 \n", + "vtab/flowers 0.784 \n", + "vtab/kitti_closest_vehicle_distance 0.269 \n", + "vtab/pcam 0.613 \n", + "vtab/pets 0.938 \n", + "vtab/resisc45 0.637 \n", + "vtab/smallnorb_label_azimuth 0.048 \n", + "vtab/smallnorb_label_elevation 0.112 \n", + "vtab/svhn 0.554 \n", + "\n", + "model_fullname ViT-g-14 laion2b_s12b_b42k \n", + "dataset \n", + "cars 0.928 \n", + "country211 0.287 \n", + "fer2013 0.466 \n", + "fgvc_aircraft 0.378 \n", + "gtsrb 0.497 \n", + "imagenet-a 0.571 \n", + "imagenet-r 0.886 \n", + "imagenet1k 0.767 \n", + "imagenet_sketch 0.652 \n", + "imagenetv2 0.696 \n", + "mnist 0.690 \n", + "objectnet 0.675 \n", + "renderedsst2 0.646 \n", + "stl10 0.986 \n", + "sun397 0.754 \n", + "voc2007 0.810 \n", + "vtab/caltech101 0.852 \n", + "vtab/cifar10 0.971 \n", + "vtab/cifar100 0.839 \n", + "vtab/clevr_closest_object_distance 0.177 \n", + "vtab/clevr_count_all 0.332 \n", + "vtab/diabetic_retinopathy 0.434 \n", + "vtab/dmlab 0.190 \n", + "vtab/dsprites_label_orientation 0.031 \n", + "vtab/dsprites_label_x_position 0.035 \n", + "vtab/dtd 0.681 \n", + "vtab/eurosat 0.648 \n", + "vtab/flowers 0.776 \n", + "vtab/kitti_closest_vehicle_distance 0.146 \n", + "vtab/pcam 0.551 \n", + "vtab/pets 0.943 \n", + "vtab/resisc45 0.717 \n", + "vtab/smallnorb_label_azimuth 0.059 \n", + "vtab/smallnorb_label_elevation 0.113 \n", + "vtab/svhn 0.603 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metric = \"acc1\"\n", + "df_metric = pd.pivot(df, index=\"model_fullname\", columns=\"dataset\", values=metric).T.dropna()\n", + "df_metric" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "208d6deb-2f0c-47e8-884a-b3c36da17a57", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_fullnameViT-B-16 laion400m_e32ViT-B-16 openaiViT-B-16-plus-240 laion400m_e32ViT-B-32 laion2b_e16ViT-B-32 laion2b_s34b_b79kViT-B-32 openaiViT-B-32-quickgelu laion400m_e32ViT-H-14 laion2b_s32b_b79kViT-L-14 laion2b_s32b_b82kViT-L-14 laion400m_e32ViT-L-14 openaiViT-L-14-336 openaiViT-g-14 laion2b_s12b_b42k
dataset
cars0.8380.6470.8460.8440.8620.5970.7930.9350.9260.8960.7770.7930.929
country2110.1820.2280.1880.1640.1670.1710.1470.2990.2630.2310.3180.3450.288
fer20130.3920.4170.3940.4650.4330.3590.3990.5060.5340.4500.4890.4910.481
fgvc_aircraft0.1750.2410.1880.2320.2460.1970.1660.4260.3650.2480.3170.3320.378
gtsrb0.4010.3700.4320.3510.4350.3200.3930.5440.5170.4500.4390.4470.466
imagenet-a0.3410.4830.3810.2840.2790.3240.2350.5810.5360.4730.6750.7350.564
imagenet-r0.7640.7610.7910.7440.7520.6790.7210.8800.8600.8330.8650.8780.875
imagenet1k0.6700.6840.6920.6560.6650.6330.6290.7800.7530.7270.7540.7660.767
imagenet_sketch0.5230.4820.5450.5290.5370.4230.4940.6660.6330.5960.5960.6100.652
imagenetv20.5960.6200.6150.5720.5820.5600.5510.7090.6780.6540.6970.7080.696
mnist0.6670.5260.5680.6280.6880.4580.3710.7330.5430.7590.7580.7780.683
objectnet0.5020.5360.5270.4750.4820.4270.4270.6850.6430.5860.6740.7010.665
renderedsst20.5460.6110.5790.5370.5660.5900.5260.6410.5930.5640.6990.7070.646
stl100.9700.9830.9700.9650.9670.9720.9550.9850.9890.9810.9940.9950.986
sun3970.6800.6530.6850.6780.6850.6350.6610.7510.7350.7130.6820.6920.752
voc20070.8040.8350.8160.8050.8050.8070.7910.8510.8490.8310.8640.8630.858
vtab/caltech1010.9010.9090.9180.9030.9090.8790.9090.9440.9390.9340.9330.9330.944
vtab/cifar100.9170.9080.9270.9410.9360.9000.9080.9740.9670.9470.9570.9500.971
vtab/cifar1000.7110.6690.7370.7530.7550.6450.7030.8470.8330.7740.7610.7470.839
vtab/clevr_closest_object_distance0.1670.1680.1700.1830.1390.1620.1670.1950.1740.1440.1770.1810.227
vtab/clevr_count_all0.2820.2150.2330.1820.1500.2200.1580.2560.3070.2310.1870.1950.319
vtab/diabetic_retinopathy0.2520.2110.2310.2210.2000.2190.2590.2330.2340.2200.2060.2070.217
vtab/dmlab0.1720.1700.1480.1680.1660.1640.1580.1660.1820.1930.1780.1710.173
vtab/dsprites_label_orientation0.0330.0180.0260.0250.0340.0220.0200.0270.0220.0260.0240.0250.030
vtab/dsprites_label_x_position0.0320.0290.0430.0310.0300.0340.0310.0310.0320.0310.0320.0320.036
vtab/dtd0.5100.4490.5540.5370.5620.4430.5470.6810.6320.6040.5500.5560.683
vtab/eurosat0.5110.5470.5890.5110.4940.4900.5260.7200.6640.6300.6380.6310.645
vtab/flowers0.6670.6910.6860.6730.7000.6650.6630.7990.7460.7260.7930.7860.781
vtab/kitti_closest_vehicle_distance0.2570.3520.4080.3250.3400.4060.3650.2720.3080.1790.3720.3740.182
vtab/pcam0.6050.5060.5440.5040.5860.6220.5460.5360.5530.4860.5160.6130.551
vtab/pets0.8920.8850.9040.8910.9070.8700.8660.9430.9310.9160.9330.9370.943
vtab/resisc450.5930.5920.6150.6240.6150.5420.5540.7060.6760.6780.6420.6460.726
vtab/smallnorb_label_azimuth0.0600.0520.0550.0540.0630.0630.0450.0560.0570.0530.0460.0460.060
vtab/smallnorb_label_elevation0.0980.1180.1090.1090.1160.1210.0970.1100.1100.1080.1140.1130.115
vtab/svhn0.3690.3500.4030.3790.4220.1330.2800.5570.4870.4060.5890.5590.568
\n", + "
" + ], + "text/plain": [ + "model_fullname ViT-B-16 laion400m_e32 ViT-B-16 openai \\\n", + "dataset \n", + "cars 0.838 0.647 \n", + "country211 0.182 0.228 \n", + "fer2013 0.392 0.417 \n", + "fgvc_aircraft 0.175 0.241 \n", + "gtsrb 0.401 0.370 \n", + "imagenet-a 0.341 0.483 \n", + "imagenet-r 0.764 0.761 \n", + "imagenet1k 0.670 0.684 \n", + "imagenet_sketch 0.523 0.482 \n", + "imagenetv2 0.596 0.620 \n", + "mnist 0.667 0.526 \n", + "objectnet 0.502 0.536 \n", + "renderedsst2 0.546 0.611 \n", + "stl10 0.970 0.983 \n", + "sun397 0.680 0.653 \n", + "voc2007 0.804 0.835 \n", + "vtab/caltech101 0.901 0.909 \n", + "vtab/cifar10 0.917 0.908 \n", + "vtab/cifar100 0.711 0.669 \n", + "vtab/clevr_closest_object_distance 0.167 0.168 \n", + "vtab/clevr_count_all 0.282 0.215 \n", + "vtab/diabetic_retinopathy 0.252 0.211 \n", + "vtab/dmlab 0.172 0.170 \n", + "vtab/dsprites_label_orientation 0.033 0.018 \n", + "vtab/dsprites_label_x_position 0.032 0.029 \n", + "vtab/dtd 0.510 0.449 \n", + "vtab/eurosat 0.511 0.547 \n", + "vtab/flowers 0.667 0.691 \n", + "vtab/kitti_closest_vehicle_distance 0.257 0.352 \n", + "vtab/pcam 0.605 0.506 \n", + "vtab/pets 0.892 0.885 \n", + "vtab/resisc45 0.593 0.592 \n", + "vtab/smallnorb_label_azimuth 0.060 0.052 \n", + "vtab/smallnorb_label_elevation 0.098 0.118 \n", + "vtab/svhn 0.369 0.350 \n", + "\n", + "model_fullname ViT-B-16-plus-240 laion400m_e32 \\\n", + "dataset \n", + "cars 0.846 \n", + "country211 0.188 \n", + "fer2013 0.394 \n", + "fgvc_aircraft 0.188 \n", + "gtsrb 0.432 \n", + "imagenet-a 0.381 \n", + "imagenet-r 0.791 \n", + "imagenet1k 0.692 \n", + "imagenet_sketch 0.545 \n", + "imagenetv2 0.615 \n", + "mnist 0.568 \n", + "objectnet 0.527 \n", + "renderedsst2 0.579 \n", + "stl10 0.970 \n", + "sun397 0.685 \n", + "voc2007 0.816 \n", + "vtab/caltech101 0.918 \n", + "vtab/cifar10 0.927 \n", + "vtab/cifar100 0.737 \n", + "vtab/clevr_closest_object_distance 0.170 \n", + "vtab/clevr_count_all 0.233 \n", + "vtab/diabetic_retinopathy 0.231 \n", + "vtab/dmlab 0.148 \n", + "vtab/dsprites_label_orientation 0.026 \n", + "vtab/dsprites_label_x_position 0.043 \n", + "vtab/dtd 0.554 \n", + "vtab/eurosat 0.589 \n", + "vtab/flowers 0.686 \n", + "vtab/kitti_closest_vehicle_distance 0.408 \n", + "vtab/pcam 0.544 \n", + "vtab/pets 0.904 \n", + "vtab/resisc45 0.615 \n", + "vtab/smallnorb_label_azimuth 0.055 \n", + "vtab/smallnorb_label_elevation 0.109 \n", + "vtab/svhn 0.403 \n", + "\n", + "model_fullname ViT-B-32 laion2b_e16 \\\n", + "dataset \n", + "cars 0.844 \n", + "country211 0.164 \n", + "fer2013 0.465 \n", + "fgvc_aircraft 0.232 \n", + "gtsrb 0.351 \n", + "imagenet-a 0.284 \n", + "imagenet-r 0.744 \n", + "imagenet1k 0.656 \n", + "imagenet_sketch 0.529 \n", + "imagenetv2 0.572 \n", + "mnist 0.628 \n", + "objectnet 0.475 \n", + "renderedsst2 0.537 \n", + "stl10 0.965 \n", + "sun397 0.678 \n", + "voc2007 0.805 \n", + "vtab/caltech101 0.903 \n", + "vtab/cifar10 0.941 \n", + "vtab/cifar100 0.753 \n", + "vtab/clevr_closest_object_distance 0.183 \n", + "vtab/clevr_count_all 0.182 \n", + "vtab/diabetic_retinopathy 0.221 \n", + "vtab/dmlab 0.168 \n", + "vtab/dsprites_label_orientation 0.025 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.537 \n", + "vtab/eurosat 0.511 \n", + "vtab/flowers 0.673 \n", + "vtab/kitti_closest_vehicle_distance 0.325 \n", + "vtab/pcam 0.504 \n", + "vtab/pets 0.891 \n", + "vtab/resisc45 0.624 \n", + "vtab/smallnorb_label_azimuth 0.054 \n", + "vtab/smallnorb_label_elevation 0.109 \n", + "vtab/svhn 0.379 \n", + "\n", + "model_fullname ViT-B-32 laion2b_s34b_b79k \\\n", + "dataset \n", + "cars 0.862 \n", + "country211 0.167 \n", + "fer2013 0.433 \n", + "fgvc_aircraft 0.246 \n", + "gtsrb 0.435 \n", + "imagenet-a 0.279 \n", + "imagenet-r 0.752 \n", + "imagenet1k 0.665 \n", + "imagenet_sketch 0.537 \n", + "imagenetv2 0.582 \n", + "mnist 0.688 \n", + "objectnet 0.482 \n", + "renderedsst2 0.566 \n", + "stl10 0.967 \n", + "sun397 0.685 \n", + "voc2007 0.805 \n", + "vtab/caltech101 0.909 \n", + "vtab/cifar10 0.936 \n", + "vtab/cifar100 0.755 \n", + "vtab/clevr_closest_object_distance 0.139 \n", + "vtab/clevr_count_all 0.150 \n", + "vtab/diabetic_retinopathy 0.200 \n", + "vtab/dmlab 0.166 \n", + "vtab/dsprites_label_orientation 0.034 \n", + "vtab/dsprites_label_x_position 0.030 \n", + "vtab/dtd 0.562 \n", + "vtab/eurosat 0.494 \n", + "vtab/flowers 0.700 \n", + "vtab/kitti_closest_vehicle_distance 0.340 \n", + "vtab/pcam 0.586 \n", + "vtab/pets 0.907 \n", + "vtab/resisc45 0.615 \n", + "vtab/smallnorb_label_azimuth 0.063 \n", + "vtab/smallnorb_label_elevation 0.116 \n", + "vtab/svhn 0.422 \n", + "\n", + "model_fullname ViT-B-32 openai \\\n", + "dataset \n", + "cars 0.597 \n", + "country211 0.171 \n", + "fer2013 0.359 \n", + "fgvc_aircraft 0.197 \n", + "gtsrb 0.320 \n", + "imagenet-a 0.324 \n", + "imagenet-r 0.679 \n", + "imagenet1k 0.633 \n", + "imagenet_sketch 0.423 \n", + "imagenetv2 0.560 \n", + "mnist 0.458 \n", + "objectnet 0.427 \n", + "renderedsst2 0.590 \n", + "stl10 0.972 \n", + "sun397 0.635 \n", + "voc2007 0.807 \n", + "vtab/caltech101 0.879 \n", + "vtab/cifar10 0.900 \n", + "vtab/cifar100 0.645 \n", + "vtab/clevr_closest_object_distance 0.162 \n", + "vtab/clevr_count_all 0.220 \n", + "vtab/diabetic_retinopathy 0.219 \n", + "vtab/dmlab 0.164 \n", + "vtab/dsprites_label_orientation 0.022 \n", + "vtab/dsprites_label_x_position 0.034 \n", + "vtab/dtd 0.443 \n", + "vtab/eurosat 0.490 \n", + "vtab/flowers 0.665 \n", + "vtab/kitti_closest_vehicle_distance 0.406 \n", + "vtab/pcam 0.622 \n", + "vtab/pets 0.870 \n", + "vtab/resisc45 0.542 \n", + "vtab/smallnorb_label_azimuth 0.063 \n", + "vtab/smallnorb_label_elevation 0.121 \n", + "vtab/svhn 0.133 \n", + "\n", + "model_fullname ViT-B-32-quickgelu laion400m_e32 \\\n", + "dataset \n", + "cars 0.793 \n", + "country211 0.147 \n", + "fer2013 0.399 \n", + "fgvc_aircraft 0.166 \n", + "gtsrb 0.393 \n", + "imagenet-a 0.235 \n", + "imagenet-r 0.721 \n", + "imagenet1k 0.629 \n", + "imagenet_sketch 0.494 \n", + "imagenetv2 0.551 \n", + "mnist 0.371 \n", + "objectnet 0.427 \n", + "renderedsst2 0.526 \n", + "stl10 0.955 \n", + "sun397 0.661 \n", + "voc2007 0.791 \n", + "vtab/caltech101 0.909 \n", + "vtab/cifar10 0.908 \n", + "vtab/cifar100 0.703 \n", + "vtab/clevr_closest_object_distance 0.167 \n", + "vtab/clevr_count_all 0.158 \n", + "vtab/diabetic_retinopathy 0.259 \n", + "vtab/dmlab 0.158 \n", + "vtab/dsprites_label_orientation 0.020 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.547 \n", + "vtab/eurosat 0.526 \n", + "vtab/flowers 0.663 \n", + "vtab/kitti_closest_vehicle_distance 0.365 \n", + "vtab/pcam 0.546 \n", + "vtab/pets 0.866 \n", + "vtab/resisc45 0.554 \n", + "vtab/smallnorb_label_azimuth 0.045 \n", + "vtab/smallnorb_label_elevation 0.097 \n", + "vtab/svhn 0.280 \n", + "\n", + "model_fullname ViT-H-14 laion2b_s32b_b79k \\\n", + "dataset \n", + "cars 0.935 \n", + "country211 0.299 \n", + "fer2013 0.506 \n", + "fgvc_aircraft 0.426 \n", + "gtsrb 0.544 \n", + "imagenet-a 0.581 \n", + "imagenet-r 0.880 \n", + "imagenet1k 0.780 \n", + "imagenet_sketch 0.666 \n", + "imagenetv2 0.709 \n", + "mnist 0.733 \n", + "objectnet 0.685 \n", + "renderedsst2 0.641 \n", + "stl10 0.985 \n", + "sun397 0.751 \n", + "voc2007 0.851 \n", + "vtab/caltech101 0.944 \n", + "vtab/cifar10 0.974 \n", + "vtab/cifar100 0.847 \n", + "vtab/clevr_closest_object_distance 0.195 \n", + "vtab/clevr_count_all 0.256 \n", + "vtab/diabetic_retinopathy 0.233 \n", + "vtab/dmlab 0.166 \n", + "vtab/dsprites_label_orientation 0.027 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.681 \n", + "vtab/eurosat 0.720 \n", + "vtab/flowers 0.799 \n", + "vtab/kitti_closest_vehicle_distance 0.272 \n", + "vtab/pcam 0.536 \n", + "vtab/pets 0.943 \n", + "vtab/resisc45 0.706 \n", + "vtab/smallnorb_label_azimuth 0.056 \n", + "vtab/smallnorb_label_elevation 0.110 \n", + "vtab/svhn 0.557 \n", + "\n", + "model_fullname ViT-L-14 laion2b_s32b_b82k \\\n", + "dataset \n", + "cars 0.926 \n", + "country211 0.263 \n", + "fer2013 0.534 \n", + "fgvc_aircraft 0.365 \n", + "gtsrb 0.517 \n", + "imagenet-a 0.536 \n", + "imagenet-r 0.860 \n", + "imagenet1k 0.753 \n", + "imagenet_sketch 0.633 \n", + "imagenetv2 0.678 \n", + "mnist 0.543 \n", + "objectnet 0.643 \n", + "renderedsst2 0.593 \n", + "stl10 0.989 \n", + "sun397 0.735 \n", + "voc2007 0.849 \n", + "vtab/caltech101 0.939 \n", + "vtab/cifar10 0.967 \n", + "vtab/cifar100 0.833 \n", + "vtab/clevr_closest_object_distance 0.174 \n", + "vtab/clevr_count_all 0.307 \n", + "vtab/diabetic_retinopathy 0.234 \n", + "vtab/dmlab 0.182 \n", + "vtab/dsprites_label_orientation 0.022 \n", + "vtab/dsprites_label_x_position 0.032 \n", + "vtab/dtd 0.632 \n", + "vtab/eurosat 0.664 \n", + "vtab/flowers 0.746 \n", + "vtab/kitti_closest_vehicle_distance 0.308 \n", + "vtab/pcam 0.553 \n", + "vtab/pets 0.931 \n", + "vtab/resisc45 0.676 \n", + "vtab/smallnorb_label_azimuth 0.057 \n", + "vtab/smallnorb_label_elevation 0.110 \n", + "vtab/svhn 0.487 \n", + "\n", + "model_fullname ViT-L-14 laion400m_e32 ViT-L-14 openai \\\n", + "dataset \n", + "cars 0.896 0.777 \n", + "country211 0.231 0.318 \n", + "fer2013 0.450 0.489 \n", + "fgvc_aircraft 0.248 0.317 \n", + "gtsrb 0.450 0.439 \n", + "imagenet-a 0.473 0.675 \n", + "imagenet-r 0.833 0.865 \n", + "imagenet1k 0.727 0.754 \n", + "imagenet_sketch 0.596 0.596 \n", + "imagenetv2 0.654 0.697 \n", + "mnist 0.759 0.758 \n", + "objectnet 0.586 0.674 \n", + "renderedsst2 0.564 0.699 \n", + "stl10 0.981 0.994 \n", + "sun397 0.713 0.682 \n", + "voc2007 0.831 0.864 \n", + "vtab/caltech101 0.934 0.933 \n", + "vtab/cifar10 0.947 0.957 \n", + "vtab/cifar100 0.774 0.761 \n", + "vtab/clevr_closest_object_distance 0.144 0.177 \n", + "vtab/clevr_count_all 0.231 0.187 \n", + "vtab/diabetic_retinopathy 0.220 0.206 \n", + "vtab/dmlab 0.193 0.178 \n", + "vtab/dsprites_label_orientation 0.026 0.024 \n", + "vtab/dsprites_label_x_position 0.031 0.032 \n", + "vtab/dtd 0.604 0.550 \n", + "vtab/eurosat 0.630 0.638 \n", + "vtab/flowers 0.726 0.793 \n", + "vtab/kitti_closest_vehicle_distance 0.179 0.372 \n", + "vtab/pcam 0.486 0.516 \n", + "vtab/pets 0.916 0.933 \n", + "vtab/resisc45 0.678 0.642 \n", + "vtab/smallnorb_label_azimuth 0.053 0.046 \n", + "vtab/smallnorb_label_elevation 0.108 0.114 \n", + "vtab/svhn 0.406 0.589 \n", + "\n", + "model_fullname ViT-L-14-336 openai \\\n", + "dataset \n", + "cars 0.793 \n", + "country211 0.345 \n", + "fer2013 0.491 \n", + "fgvc_aircraft 0.332 \n", + "gtsrb 0.447 \n", + "imagenet-a 0.735 \n", + "imagenet-r 0.878 \n", + "imagenet1k 0.766 \n", + "imagenet_sketch 0.610 \n", + "imagenetv2 0.708 \n", + "mnist 0.778 \n", + "objectnet 0.701 \n", + "renderedsst2 0.707 \n", + "stl10 0.995 \n", + "sun397 0.692 \n", + "voc2007 0.863 \n", + "vtab/caltech101 0.933 \n", + "vtab/cifar10 0.950 \n", + "vtab/cifar100 0.747 \n", + "vtab/clevr_closest_object_distance 0.181 \n", + "vtab/clevr_count_all 0.195 \n", + "vtab/diabetic_retinopathy 0.207 \n", + "vtab/dmlab 0.171 \n", + "vtab/dsprites_label_orientation 0.025 \n", + "vtab/dsprites_label_x_position 0.032 \n", + "vtab/dtd 0.556 \n", + "vtab/eurosat 0.631 \n", + "vtab/flowers 0.786 \n", + "vtab/kitti_closest_vehicle_distance 0.374 \n", + "vtab/pcam 0.613 \n", + "vtab/pets 0.937 \n", + "vtab/resisc45 0.646 \n", + "vtab/smallnorb_label_azimuth 0.046 \n", + "vtab/smallnorb_label_elevation 0.113 \n", + "vtab/svhn 0.559 \n", + "\n", + "model_fullname ViT-g-14 laion2b_s12b_b42k \n", + "dataset \n", + "cars 0.929 \n", + "country211 0.288 \n", + "fer2013 0.481 \n", + "fgvc_aircraft 0.378 \n", + "gtsrb 0.466 \n", + "imagenet-a 0.564 \n", + "imagenet-r 0.875 \n", + "imagenet1k 0.767 \n", + "imagenet_sketch 0.652 \n", + "imagenetv2 0.696 \n", + "mnist 0.683 \n", + "objectnet 0.665 \n", + "renderedsst2 0.646 \n", + "stl10 0.986 \n", + "sun397 0.752 \n", + "voc2007 0.858 \n", + "vtab/caltech101 0.944 \n", + "vtab/cifar10 0.971 \n", + "vtab/cifar100 0.839 \n", + "vtab/clevr_closest_object_distance 0.227 \n", + "vtab/clevr_count_all 0.319 \n", + "vtab/diabetic_retinopathy 0.217 \n", + "vtab/dmlab 0.173 \n", + "vtab/dsprites_label_orientation 0.030 \n", + "vtab/dsprites_label_x_position 0.036 \n", + "vtab/dtd 0.683 \n", + "vtab/eurosat 0.645 \n", + "vtab/flowers 0.781 \n", + "vtab/kitti_closest_vehicle_distance 0.182 \n", + "vtab/pcam 0.551 \n", + "vtab/pets 0.943 \n", + "vtab/resisc45 0.726 \n", + "vtab/smallnorb_label_azimuth 0.060 \n", + "vtab/smallnorb_label_elevation 0.115 \n", + "vtab/svhn 0.568 " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metric = \"mean_per_class_recall\"\n", + "df_metric = pd.pivot(df, index=\"model_fullname\", columns=\"dataset\", values=metric).T.dropna()\n", + "df_metric" + ] + }, + { + "cell_type": "markdown", + "id": "7f9eb124-635a-4076-ae90-0199a862202c", + "metadata": {}, + "source": [ + "### Imagenet robustness results (acc1)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e1c11461-63a1-49e5-9199-d8be38ab8f09", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_fullnameViT-B-16 laion400m_e32ViT-B-16 openaiViT-B-16-plus-240 laion400m_e32ViT-B-32 laion2b_e16ViT-B-32 laion2b_s34b_b79kViT-B-32 openaiViT-B-32-quickgelu laion400m_e32ViT-H-14 laion2b_s32b_b79kViT-L-14 laion2b_s32b_b82kViT-L-14 laion400m_e32ViT-L-14 openaiViT-L-14-336 openaiViT-g-14 laion2b_s12b_b42k
dataset
imagenet-a0.3320.5010.3680.2620.2630.3140.2170.5920.5390.4660.7070.7740.571
imagenet-r0.7790.7770.8040.7590.7640.6930.7340.8930.8740.8480.8790.8910.886
imagenet1k0.6700.6840.6910.6550.6650.6330.6290.7800.7520.7270.7550.7650.767
imagenet_sketch0.5230.4810.5440.5290.5360.4230.4930.6660.6330.5960.5960.6110.652
imagenetv20.5960.6190.6140.5720.5820.5600.5510.7080.6770.6560.6970.7070.696
objectnet0.5150.5540.5380.4880.4900.4420.4390.6970.6550.5990.6910.7180.675
\n", + "
" + ], + "text/plain": [ + "model_fullname ViT-B-16 laion400m_e32 ViT-B-16 openai \\\n", + "dataset \n", + "imagenet-a 0.332 0.501 \n", + "imagenet-r 0.779 0.777 \n", + "imagenet1k 0.670 0.684 \n", + "imagenet_sketch 0.523 0.481 \n", + "imagenetv2 0.596 0.619 \n", + "objectnet 0.515 0.554 \n", + "\n", + "model_fullname ViT-B-16-plus-240 laion400m_e32 ViT-B-32 laion2b_e16 \\\n", + "dataset \n", + "imagenet-a 0.368 0.262 \n", + "imagenet-r 0.804 0.759 \n", + "imagenet1k 0.691 0.655 \n", + "imagenet_sketch 0.544 0.529 \n", + "imagenetv2 0.614 0.572 \n", + "objectnet 0.538 0.488 \n", + "\n", + "model_fullname ViT-B-32 laion2b_s34b_b79k ViT-B-32 openai \\\n", + "dataset \n", + "imagenet-a 0.263 0.314 \n", + "imagenet-r 0.764 0.693 \n", + "imagenet1k 0.665 0.633 \n", + "imagenet_sketch 0.536 0.423 \n", + "imagenetv2 0.582 0.560 \n", + "objectnet 0.490 0.442 \n", + "\n", + "model_fullname ViT-B-32-quickgelu laion400m_e32 ViT-H-14 laion2b_s32b_b79k \\\n", + "dataset \n", + "imagenet-a 0.217 0.592 \n", + "imagenet-r 0.734 0.893 \n", + "imagenet1k 0.629 0.780 \n", + "imagenet_sketch 0.493 0.666 \n", + "imagenetv2 0.551 0.708 \n", + "objectnet 0.439 0.697 \n", + "\n", + "model_fullname ViT-L-14 laion2b_s32b_b82k ViT-L-14 laion400m_e32 \\\n", + "dataset \n", + "imagenet-a 0.539 0.466 \n", + "imagenet-r 0.874 0.848 \n", + "imagenet1k 0.752 0.727 \n", + "imagenet_sketch 0.633 0.596 \n", + "imagenetv2 0.677 0.656 \n", + "objectnet 0.655 0.599 \n", + "\n", + "model_fullname ViT-L-14 openai ViT-L-14-336 openai \\\n", + "dataset \n", + "imagenet-a 0.707 0.774 \n", + "imagenet-r 0.879 0.891 \n", + "imagenet1k 0.755 0.765 \n", + "imagenet_sketch 0.596 0.611 \n", + "imagenetv2 0.697 0.707 \n", + "objectnet 0.691 0.718 \n", + "\n", + "model_fullname ViT-g-14 laion2b_s12b_b42k \n", + "dataset \n", + "imagenet-a 0.571 \n", + "imagenet-r 0.886 \n", + "imagenet1k 0.767 \n", + "imagenet_sketch 0.652 \n", + "imagenetv2 0.696 \n", + "objectnet 0.675 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Imagenet robustness results\n", + "metric = \"acc1\"\n", + "df_metric = pd.pivot(df, index=\"model_fullname\", columns=\"dataset\", values=metric).T.dropna()\n", + "df_metric[(df_metric.index.str.startswith(\"imagenet\")) | (df_metric.index==\"objectnet\")]" + ] + }, + { + "cell_type": "markdown", + "id": "36d7adac-b3b1-4421-af4f-f7d820592e11", + "metadata": {}, + "source": [ + "# Robustness plot" + ] + }, + { + "cell_type": "markdown", + "id": "ec10d993-7934-476b-94d7-8cde3fedc9ee", + "metadata": {}, + "source": [ + "Here, following \"Measuring Robustness to Natural Distribution Shifts\n", + "in Image Classification\" (https://arxiv.org/pdf/2007.00644.pdf, https://share.streamlit.io/modestyachts/imagenet-testbed-website/main/website.py),\n", + "we show the deviation from the line fit of (x=imagenet1k accuracy, y=imagenetv2/imagenet-1/imagenet_sketch) which was used\n", + "to measure robustnest improvements separately from accuracy improvements in imagenet1k, as the two are correlated.\n", + "\n", + "In the plot below, deviation from the line are improvements in robustness." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "3fa79a28-b555-45d2-950d-efa415084004", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'imagenetv2 top-1 accuracy (%)')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(7, 5),dpi=100)\n", + "df_metric = pd.pivot(df, index=\"model_fullname\", columns=\"dataset\", values=\"acc1\").T.dropna()\n", + "dataset = \"imagenetv2\"\n", + "line_fits_data = {\n", + " # slopes and intercepts from https://share.streamlit.io/modestyachts/imagenet-testbed-website/main/website.py\n", + " \"imagenetv2\": (1.112, -20.433),\n", + " \"imagenet-r\": (1.549, -104.556),\n", + " \"imagenet_sketch\": (0.931, -45.373)\n", + "}\n", + "x=np.linspace(0, 100,100)\n", + "slope, intercept = line_fits_data[dataset]\n", + "y=x*slope+intercept\n", + "plt.xlim(55,90)\n", + "plt.ylim(40,90)\n", + "d = df_metric.T[[\"imagenet1k\", dataset]]*100\n", + "plt.scatter(d[\"imagenet1k\"], d[dataset], color=\"green\")\n", + "plt.plot(x,y, color=\"red\")\n", + "plt.xlabel(\"imagenet1k top-1 accuracy (%)\")\n", + "plt.ylabel(f\"{dataset} top-1 accuracy (%)\")" + ] + }, + { + "cell_type": "markdown", + "id": "7f52c332-cf8f-4aa4-b47b-7f58078f25f9", + "metadata": {}, + "source": [ + "### All results (mean_per_class_recall)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "f81989e8-e234-40dc-9889-5e2713e178b0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_fullnameViT-B-16 laion400m_e32ViT-B-16 openaiViT-B-16-plus-240 laion400m_e32ViT-B-32 laion2b_e16ViT-B-32 laion2b_s34b_b79kViT-B-32 openaiViT-B-32-quickgelu laion400m_e32ViT-H-14 laion2b_s32b_b79kViT-L-14 laion2b_s32b_b82kViT-L-14 laion400m_e32ViT-L-14 openaiViT-L-14-336 openaiViT-g-14 laion2b_s12b_b42k
dataset
cars0.8380.6470.8460.8440.8620.5970.7930.9350.9260.8960.7770.7930.929
country2110.1820.2280.1880.1640.1670.1710.1470.2990.2630.2310.3180.3450.288
fer20130.3920.4170.3940.4650.4330.3590.3990.5060.5340.4500.4890.4910.481
fgvc_aircraft0.1750.2410.1880.2320.2460.1970.1660.4260.3650.2480.3170.3320.378
gtsrb0.4010.3700.4320.3510.4350.3200.3930.5440.5170.4500.4390.4470.466
imagenet-a0.3410.4830.3810.2840.2790.3240.2350.5810.5360.4730.6750.7350.564
imagenet-r0.7640.7610.7910.7440.7520.6790.7210.8800.8600.8330.8650.8780.875
imagenet1k0.6700.6840.6920.6560.6650.6330.6290.7800.7530.7270.7540.7660.767
imagenet_sketch0.5230.4820.5450.5290.5370.4230.4940.6660.6330.5960.5960.6100.652
imagenetv20.5960.6200.6150.5720.5820.5600.5510.7090.6780.6540.6970.7080.696
mnist0.6670.5260.5680.6280.6880.4580.3710.7330.5430.7590.7580.7780.683
objectnet0.5020.5360.5270.4750.4820.4270.4270.6850.6430.5860.6740.7010.665
renderedsst20.5460.6110.5790.5370.5660.5900.5260.6410.5930.5640.6990.7070.646
stl100.9700.9830.9700.9650.9670.9720.9550.9850.9890.9810.9940.9950.986
sun3970.6800.6530.6850.6780.6850.6350.6610.7510.7350.7130.6820.6920.752
voc20070.8040.8350.8160.8050.8050.8070.7910.8510.8490.8310.8640.8630.858
vtab/caltech1010.9010.9090.9180.9030.9090.8790.9090.9440.9390.9340.9330.9330.944
vtab/cifar100.9170.9080.9270.9410.9360.9000.9080.9740.9670.9470.9570.9500.971
vtab/cifar1000.7110.6690.7370.7530.7550.6450.7030.8470.8330.7740.7610.7470.839
vtab/clevr_closest_object_distance0.1670.1680.1700.1830.1390.1620.1670.1950.1740.1440.1770.1810.227
vtab/clevr_count_all0.2820.2150.2330.1820.1500.2200.1580.2560.3070.2310.1870.1950.319
vtab/diabetic_retinopathy0.2520.2110.2310.2210.2000.2190.2590.2330.2340.2200.2060.2070.217
vtab/dmlab0.1720.1700.1480.1680.1660.1640.1580.1660.1820.1930.1780.1710.173
vtab/dsprites_label_orientation0.0330.0180.0260.0250.0340.0220.0200.0270.0220.0260.0240.0250.030
vtab/dsprites_label_x_position0.0320.0290.0430.0310.0300.0340.0310.0310.0320.0310.0320.0320.036
vtab/dtd0.5100.4490.5540.5370.5620.4430.5470.6810.6320.6040.5500.5560.683
vtab/eurosat0.5110.5470.5890.5110.4940.4900.5260.7200.6640.6300.6380.6310.645
vtab/flowers0.6670.6910.6860.6730.7000.6650.6630.7990.7460.7260.7930.7860.781
vtab/kitti_closest_vehicle_distance0.2570.3520.4080.3250.3400.4060.3650.2720.3080.1790.3720.3740.182
vtab/pcam0.6050.5060.5440.5040.5860.6220.5460.5360.5530.4860.5160.6130.551
vtab/pets0.8920.8850.9040.8910.9070.8700.8660.9430.9310.9160.9330.9370.943
vtab/resisc450.5930.5920.6150.6240.6150.5420.5540.7060.6760.6780.6420.6460.726
vtab/smallnorb_label_azimuth0.0600.0520.0550.0540.0630.0630.0450.0560.0570.0530.0460.0460.060
vtab/smallnorb_label_elevation0.0980.1180.1090.1090.1160.1210.0970.1100.1100.1080.1140.1130.115
vtab/svhn0.3690.3500.4030.3790.4220.1330.2800.5570.4870.4060.5890.5590.568
\n", + "
" + ], + "text/plain": [ + "model_fullname ViT-B-16 laion400m_e32 ViT-B-16 openai \\\n", + "dataset \n", + "cars 0.838 0.647 \n", + "country211 0.182 0.228 \n", + "fer2013 0.392 0.417 \n", + "fgvc_aircraft 0.175 0.241 \n", + "gtsrb 0.401 0.370 \n", + "imagenet-a 0.341 0.483 \n", + "imagenet-r 0.764 0.761 \n", + "imagenet1k 0.670 0.684 \n", + "imagenet_sketch 0.523 0.482 \n", + "imagenetv2 0.596 0.620 \n", + "mnist 0.667 0.526 \n", + "objectnet 0.502 0.536 \n", + "renderedsst2 0.546 0.611 \n", + "stl10 0.970 0.983 \n", + "sun397 0.680 0.653 \n", + "voc2007 0.804 0.835 \n", + "vtab/caltech101 0.901 0.909 \n", + "vtab/cifar10 0.917 0.908 \n", + "vtab/cifar100 0.711 0.669 \n", + "vtab/clevr_closest_object_distance 0.167 0.168 \n", + "vtab/clevr_count_all 0.282 0.215 \n", + "vtab/diabetic_retinopathy 0.252 0.211 \n", + "vtab/dmlab 0.172 0.170 \n", + "vtab/dsprites_label_orientation 0.033 0.018 \n", + "vtab/dsprites_label_x_position 0.032 0.029 \n", + "vtab/dtd 0.510 0.449 \n", + "vtab/eurosat 0.511 0.547 \n", + "vtab/flowers 0.667 0.691 \n", + "vtab/kitti_closest_vehicle_distance 0.257 0.352 \n", + "vtab/pcam 0.605 0.506 \n", + "vtab/pets 0.892 0.885 \n", + "vtab/resisc45 0.593 0.592 \n", + "vtab/smallnorb_label_azimuth 0.060 0.052 \n", + "vtab/smallnorb_label_elevation 0.098 0.118 \n", + "vtab/svhn 0.369 0.350 \n", + "\n", + "model_fullname ViT-B-16-plus-240 laion400m_e32 \\\n", + "dataset \n", + "cars 0.846 \n", + "country211 0.188 \n", + "fer2013 0.394 \n", + "fgvc_aircraft 0.188 \n", + "gtsrb 0.432 \n", + "imagenet-a 0.381 \n", + "imagenet-r 0.791 \n", + "imagenet1k 0.692 \n", + "imagenet_sketch 0.545 \n", + "imagenetv2 0.615 \n", + "mnist 0.568 \n", + "objectnet 0.527 \n", + "renderedsst2 0.579 \n", + "stl10 0.970 \n", + "sun397 0.685 \n", + "voc2007 0.816 \n", + "vtab/caltech101 0.918 \n", + "vtab/cifar10 0.927 \n", + "vtab/cifar100 0.737 \n", + "vtab/clevr_closest_object_distance 0.170 \n", + "vtab/clevr_count_all 0.233 \n", + "vtab/diabetic_retinopathy 0.231 \n", + "vtab/dmlab 0.148 \n", + "vtab/dsprites_label_orientation 0.026 \n", + "vtab/dsprites_label_x_position 0.043 \n", + "vtab/dtd 0.554 \n", + "vtab/eurosat 0.589 \n", + "vtab/flowers 0.686 \n", + "vtab/kitti_closest_vehicle_distance 0.408 \n", + "vtab/pcam 0.544 \n", + "vtab/pets 0.904 \n", + "vtab/resisc45 0.615 \n", + "vtab/smallnorb_label_azimuth 0.055 \n", + "vtab/smallnorb_label_elevation 0.109 \n", + "vtab/svhn 0.403 \n", + "\n", + "model_fullname ViT-B-32 laion2b_e16 \\\n", + "dataset \n", + "cars 0.844 \n", + "country211 0.164 \n", + "fer2013 0.465 \n", + "fgvc_aircraft 0.232 \n", + "gtsrb 0.351 \n", + "imagenet-a 0.284 \n", + "imagenet-r 0.744 \n", + "imagenet1k 0.656 \n", + "imagenet_sketch 0.529 \n", + "imagenetv2 0.572 \n", + "mnist 0.628 \n", + "objectnet 0.475 \n", + "renderedsst2 0.537 \n", + "stl10 0.965 \n", + "sun397 0.678 \n", + "voc2007 0.805 \n", + "vtab/caltech101 0.903 \n", + "vtab/cifar10 0.941 \n", + "vtab/cifar100 0.753 \n", + "vtab/clevr_closest_object_distance 0.183 \n", + "vtab/clevr_count_all 0.182 \n", + "vtab/diabetic_retinopathy 0.221 \n", + "vtab/dmlab 0.168 \n", + "vtab/dsprites_label_orientation 0.025 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.537 \n", + "vtab/eurosat 0.511 \n", + "vtab/flowers 0.673 \n", + "vtab/kitti_closest_vehicle_distance 0.325 \n", + "vtab/pcam 0.504 \n", + "vtab/pets 0.891 \n", + "vtab/resisc45 0.624 \n", + "vtab/smallnorb_label_azimuth 0.054 \n", + "vtab/smallnorb_label_elevation 0.109 \n", + "vtab/svhn 0.379 \n", + "\n", + "model_fullname ViT-B-32 laion2b_s34b_b79k \\\n", + "dataset \n", + "cars 0.862 \n", + "country211 0.167 \n", + "fer2013 0.433 \n", + "fgvc_aircraft 0.246 \n", + "gtsrb 0.435 \n", + "imagenet-a 0.279 \n", + "imagenet-r 0.752 \n", + "imagenet1k 0.665 \n", + "imagenet_sketch 0.537 \n", + "imagenetv2 0.582 \n", + "mnist 0.688 \n", + "objectnet 0.482 \n", + "renderedsst2 0.566 \n", + "stl10 0.967 \n", + "sun397 0.685 \n", + "voc2007 0.805 \n", + "vtab/caltech101 0.909 \n", + "vtab/cifar10 0.936 \n", + "vtab/cifar100 0.755 \n", + "vtab/clevr_closest_object_distance 0.139 \n", + "vtab/clevr_count_all 0.150 \n", + "vtab/diabetic_retinopathy 0.200 \n", + "vtab/dmlab 0.166 \n", + "vtab/dsprites_label_orientation 0.034 \n", + "vtab/dsprites_label_x_position 0.030 \n", + "vtab/dtd 0.562 \n", + "vtab/eurosat 0.494 \n", + "vtab/flowers 0.700 \n", + "vtab/kitti_closest_vehicle_distance 0.340 \n", + "vtab/pcam 0.586 \n", + "vtab/pets 0.907 \n", + "vtab/resisc45 0.615 \n", + "vtab/smallnorb_label_azimuth 0.063 \n", + "vtab/smallnorb_label_elevation 0.116 \n", + "vtab/svhn 0.422 \n", + "\n", + "model_fullname ViT-B-32 openai \\\n", + "dataset \n", + "cars 0.597 \n", + "country211 0.171 \n", + "fer2013 0.359 \n", + "fgvc_aircraft 0.197 \n", + "gtsrb 0.320 \n", + "imagenet-a 0.324 \n", + "imagenet-r 0.679 \n", + "imagenet1k 0.633 \n", + "imagenet_sketch 0.423 \n", + "imagenetv2 0.560 \n", + "mnist 0.458 \n", + "objectnet 0.427 \n", + "renderedsst2 0.590 \n", + "stl10 0.972 \n", + "sun397 0.635 \n", + "voc2007 0.807 \n", + "vtab/caltech101 0.879 \n", + "vtab/cifar10 0.900 \n", + "vtab/cifar100 0.645 \n", + "vtab/clevr_closest_object_distance 0.162 \n", + "vtab/clevr_count_all 0.220 \n", + "vtab/diabetic_retinopathy 0.219 \n", + "vtab/dmlab 0.164 \n", + "vtab/dsprites_label_orientation 0.022 \n", + "vtab/dsprites_label_x_position 0.034 \n", + "vtab/dtd 0.443 \n", + "vtab/eurosat 0.490 \n", + "vtab/flowers 0.665 \n", + "vtab/kitti_closest_vehicle_distance 0.406 \n", + "vtab/pcam 0.622 \n", + "vtab/pets 0.870 \n", + "vtab/resisc45 0.542 \n", + "vtab/smallnorb_label_azimuth 0.063 \n", + "vtab/smallnorb_label_elevation 0.121 \n", + "vtab/svhn 0.133 \n", + "\n", + "model_fullname ViT-B-32-quickgelu laion400m_e32 \\\n", + "dataset \n", + "cars 0.793 \n", + "country211 0.147 \n", + "fer2013 0.399 \n", + "fgvc_aircraft 0.166 \n", + "gtsrb 0.393 \n", + "imagenet-a 0.235 \n", + "imagenet-r 0.721 \n", + "imagenet1k 0.629 \n", + "imagenet_sketch 0.494 \n", + "imagenetv2 0.551 \n", + "mnist 0.371 \n", + "objectnet 0.427 \n", + "renderedsst2 0.526 \n", + "stl10 0.955 \n", + "sun397 0.661 \n", + "voc2007 0.791 \n", + "vtab/caltech101 0.909 \n", + "vtab/cifar10 0.908 \n", + "vtab/cifar100 0.703 \n", + "vtab/clevr_closest_object_distance 0.167 \n", + "vtab/clevr_count_all 0.158 \n", + "vtab/diabetic_retinopathy 0.259 \n", + "vtab/dmlab 0.158 \n", + "vtab/dsprites_label_orientation 0.020 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.547 \n", + "vtab/eurosat 0.526 \n", + "vtab/flowers 0.663 \n", + "vtab/kitti_closest_vehicle_distance 0.365 \n", + "vtab/pcam 0.546 \n", + "vtab/pets 0.866 \n", + "vtab/resisc45 0.554 \n", + "vtab/smallnorb_label_azimuth 0.045 \n", + "vtab/smallnorb_label_elevation 0.097 \n", + "vtab/svhn 0.280 \n", + "\n", + "model_fullname ViT-H-14 laion2b_s32b_b79k \\\n", + "dataset \n", + "cars 0.935 \n", + "country211 0.299 \n", + "fer2013 0.506 \n", + "fgvc_aircraft 0.426 \n", + "gtsrb 0.544 \n", + "imagenet-a 0.581 \n", + "imagenet-r 0.880 \n", + "imagenet1k 0.780 \n", + "imagenet_sketch 0.666 \n", + "imagenetv2 0.709 \n", + "mnist 0.733 \n", + "objectnet 0.685 \n", + "renderedsst2 0.641 \n", + "stl10 0.985 \n", + "sun397 0.751 \n", + "voc2007 0.851 \n", + "vtab/caltech101 0.944 \n", + "vtab/cifar10 0.974 \n", + "vtab/cifar100 0.847 \n", + "vtab/clevr_closest_object_distance 0.195 \n", + "vtab/clevr_count_all 0.256 \n", + "vtab/diabetic_retinopathy 0.233 \n", + "vtab/dmlab 0.166 \n", + "vtab/dsprites_label_orientation 0.027 \n", + "vtab/dsprites_label_x_position 0.031 \n", + "vtab/dtd 0.681 \n", + "vtab/eurosat 0.720 \n", + "vtab/flowers 0.799 \n", + "vtab/kitti_closest_vehicle_distance 0.272 \n", + "vtab/pcam 0.536 \n", + "vtab/pets 0.943 \n", + "vtab/resisc45 0.706 \n", + "vtab/smallnorb_label_azimuth 0.056 \n", + "vtab/smallnorb_label_elevation 0.110 \n", + "vtab/svhn 0.557 \n", + "\n", + "model_fullname ViT-L-14 laion2b_s32b_b82k \\\n", + "dataset \n", + "cars 0.926 \n", + "country211 0.263 \n", + "fer2013 0.534 \n", + "fgvc_aircraft 0.365 \n", + "gtsrb 0.517 \n", + "imagenet-a 0.536 \n", + "imagenet-r 0.860 \n", + "imagenet1k 0.753 \n", + "imagenet_sketch 0.633 \n", + "imagenetv2 0.678 \n", + "mnist 0.543 \n", + "objectnet 0.643 \n", + "renderedsst2 0.593 \n", + "stl10 0.989 \n", + "sun397 0.735 \n", + "voc2007 0.849 \n", + "vtab/caltech101 0.939 \n", + "vtab/cifar10 0.967 \n", + "vtab/cifar100 0.833 \n", + "vtab/clevr_closest_object_distance 0.174 \n", + "vtab/clevr_count_all 0.307 \n", + "vtab/diabetic_retinopathy 0.234 \n", + "vtab/dmlab 0.182 \n", + "vtab/dsprites_label_orientation 0.022 \n", + "vtab/dsprites_label_x_position 0.032 \n", + "vtab/dtd 0.632 \n", + "vtab/eurosat 0.664 \n", + "vtab/flowers 0.746 \n", + "vtab/kitti_closest_vehicle_distance 0.308 \n", + "vtab/pcam 0.553 \n", + "vtab/pets 0.931 \n", + "vtab/resisc45 0.676 \n", + "vtab/smallnorb_label_azimuth 0.057 \n", + "vtab/smallnorb_label_elevation 0.110 \n", + "vtab/svhn 0.487 \n", + "\n", + "model_fullname ViT-L-14 laion400m_e32 ViT-L-14 openai \\\n", + "dataset \n", + "cars 0.896 0.777 \n", + "country211 0.231 0.318 \n", + "fer2013 0.450 0.489 \n", + "fgvc_aircraft 0.248 0.317 \n", + "gtsrb 0.450 0.439 \n", + "imagenet-a 0.473 0.675 \n", + "imagenet-r 0.833 0.865 \n", + "imagenet1k 0.727 0.754 \n", + "imagenet_sketch 0.596 0.596 \n", + "imagenetv2 0.654 0.697 \n", + "mnist 0.759 0.758 \n", + "objectnet 0.586 0.674 \n", + "renderedsst2 0.564 0.699 \n", + "stl10 0.981 0.994 \n", + "sun397 0.713 0.682 \n", + "voc2007 0.831 0.864 \n", + "vtab/caltech101 0.934 0.933 \n", + "vtab/cifar10 0.947 0.957 \n", + "vtab/cifar100 0.774 0.761 \n", + "vtab/clevr_closest_object_distance 0.144 0.177 \n", + "vtab/clevr_count_all 0.231 0.187 \n", + "vtab/diabetic_retinopathy 0.220 0.206 \n", + "vtab/dmlab 0.193 0.178 \n", + "vtab/dsprites_label_orientation 0.026 0.024 \n", + "vtab/dsprites_label_x_position 0.031 0.032 \n", + "vtab/dtd 0.604 0.550 \n", + "vtab/eurosat 0.630 0.638 \n", + "vtab/flowers 0.726 0.793 \n", + "vtab/kitti_closest_vehicle_distance 0.179 0.372 \n", + "vtab/pcam 0.486 0.516 \n", + "vtab/pets 0.916 0.933 \n", + "vtab/resisc45 0.678 0.642 \n", + "vtab/smallnorb_label_azimuth 0.053 0.046 \n", + "vtab/smallnorb_label_elevation 0.108 0.114 \n", + "vtab/svhn 0.406 0.589 \n", + "\n", + "model_fullname ViT-L-14-336 openai \\\n", + "dataset \n", + "cars 0.793 \n", + "country211 0.345 \n", + "fer2013 0.491 \n", + "fgvc_aircraft 0.332 \n", + "gtsrb 0.447 \n", + "imagenet-a 0.735 \n", + "imagenet-r 0.878 \n", + "imagenet1k 0.766 \n", + "imagenet_sketch 0.610 \n", + "imagenetv2 0.708 \n", + "mnist 0.778 \n", + "objectnet 0.701 \n", + "renderedsst2 0.707 \n", + "stl10 0.995 \n", + "sun397 0.692 \n", + "voc2007 0.863 \n", + "vtab/caltech101 0.933 \n", + "vtab/cifar10 0.950 \n", + "vtab/cifar100 0.747 \n", + "vtab/clevr_closest_object_distance 0.181 \n", + "vtab/clevr_count_all 0.195 \n", + "vtab/diabetic_retinopathy 0.207 \n", + "vtab/dmlab 0.171 \n", + "vtab/dsprites_label_orientation 0.025 \n", + "vtab/dsprites_label_x_position 0.032 \n", + "vtab/dtd 0.556 \n", + "vtab/eurosat 0.631 \n", + "vtab/flowers 0.786 \n", + "vtab/kitti_closest_vehicle_distance 0.374 \n", + "vtab/pcam 0.613 \n", + "vtab/pets 0.937 \n", + "vtab/resisc45 0.646 \n", + "vtab/smallnorb_label_azimuth 0.046 \n", + "vtab/smallnorb_label_elevation 0.113 \n", + "vtab/svhn 0.559 \n", + "\n", + "model_fullname ViT-g-14 laion2b_s12b_b42k \n", + "dataset \n", + "cars 0.929 \n", + "country211 0.288 \n", + "fer2013 0.481 \n", + "fgvc_aircraft 0.378 \n", + "gtsrb 0.466 \n", + "imagenet-a 0.564 \n", + "imagenet-r 0.875 \n", + "imagenet1k 0.767 \n", + "imagenet_sketch 0.652 \n", + "imagenetv2 0.696 \n", + "mnist 0.683 \n", + "objectnet 0.665 \n", + "renderedsst2 0.646 \n", + "stl10 0.986 \n", + "sun397 0.752 \n", + "voc2007 0.858 \n", + "vtab/caltech101 0.944 \n", + "vtab/cifar10 0.971 \n", + "vtab/cifar100 0.839 \n", + "vtab/clevr_closest_object_distance 0.227 \n", + "vtab/clevr_count_all 0.319 \n", + "vtab/diabetic_retinopathy 0.217 \n", + "vtab/dmlab 0.173 \n", + "vtab/dsprites_label_orientation 0.030 \n", + "vtab/dsprites_label_x_position 0.036 \n", + "vtab/dtd 0.683 \n", + "vtab/eurosat 0.645 \n", + "vtab/flowers 0.781 \n", + "vtab/kitti_closest_vehicle_distance 0.182 \n", + "vtab/pcam 0.551 \n", + "vtab/pets 0.943 \n", + "vtab/resisc45 0.726 \n", + "vtab/smallnorb_label_azimuth 0.060 \n", + "vtab/smallnorb_label_elevation 0.115 \n", + "vtab/svhn 0.568 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metric = \"mean_per_class_recall\"\n", + "pd.pivot(df, index=\"model_fullname\", columns=\"dataset\", values=metric).T.dropna()" + ] + }, + { + "cell_type": "markdown", + "id": "dba407aa-4103-44aa-bddc-3046ec73aa77", + "metadata": {}, + "source": [ + "### All results (mAP)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "99130646-f092-43a0-a657-c4e64053dcb5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_fullnameViT-B-16 laion400m_e32ViT-B-16 openaiViT-B-16-plus-240 laion400m_e32ViT-B-32 laion2b_e16ViT-B-32 laion2b_s34b_b79kViT-B-32 openaiViT-B-32-quickgelu laion400m_e32ViT-H-14 laion2b_s32b_b79kViT-L-14 laion2b_s32b_b82kViT-L-14 laion400m_e32ViT-L-14 openaiViT-L-14-336 openaiViT-g-14 laion2b_s12b_b42k
dataset
voc2007_multilabel0.7840.7890.7850.7930.7960.7600.7620.8010.8200.7850.7900.8040.807
\n", + "
" + ], + "text/plain": [ + "model_fullname ViT-B-16 laion400m_e32 ViT-B-16 openai \\\n", + "dataset \n", + "voc2007_multilabel 0.784 0.789 \n", + "\n", + "model_fullname ViT-B-16-plus-240 laion400m_e32 ViT-B-32 laion2b_e16 \\\n", + "dataset \n", + "voc2007_multilabel 0.785 0.793 \n", + "\n", + "model_fullname ViT-B-32 laion2b_s34b_b79k ViT-B-32 openai \\\n", + "dataset \n", + "voc2007_multilabel 0.796 0.760 \n", + "\n", + "model_fullname ViT-B-32-quickgelu laion400m_e32 \\\n", + "dataset \n", + "voc2007_multilabel 0.762 \n", + "\n", + "model_fullname ViT-H-14 laion2b_s32b_b79k ViT-L-14 laion2b_s32b_b82k \\\n", + "dataset \n", + "voc2007_multilabel 0.801 0.820 \n", + "\n", + "model_fullname ViT-L-14 laion400m_e32 ViT-L-14 openai \\\n", + "dataset \n", + "voc2007_multilabel 0.785 0.790 \n", + "\n", + "model_fullname ViT-L-14-336 openai ViT-g-14 laion2b_s12b_b42k \n", + "dataset \n", + "voc2007_multilabel 0.804 0.807 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# For multi-label classification tasks\n", + "metric = \"mean_average_precision\"\n", + "pd.pivot(df, index=\"model_fullname\", columns=\"dataset\", values=metric).T.dropna()" + ] + }, + { + "cell_type": "markdown", + "id": "b75cf72d", + "metadata": {}, + "source": [ + "## All results (retrieval)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "48f5ea9d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_fullnameViT-B-16 laion400m_e32ViT-B-16 openaiViT-B-16-plus-240 laion400m_e32ViT-B-32 laion2b_e16ViT-B-32 laion2b_s34b_b79kViT-B-32 openaiViT-B-32-quickgelu laion400m_e32ViT-H-14 laion2b_s32b_b79kViT-L-14 laion2b_s32b_b82kViT-L-14 laion400m_e32ViT-L-14 openaiViT-L-14-336 openaiViT-g-14 laion2b_s12b_b42k
dataset
flickr30k0.8820.8550.8890.8810.8840.8340.8550.9410.9290.9080.8720.8890.935
flickr8k0.8580.8290.8730.8570.8630.8050.8300.9280.9150.8980.8630.8800.918
mscoco_captions0.6360.5840.6620.6470.6540.5580.6080.7340.7110.6810.6110.6160.724
\n", + "
" + ], + "text/plain": [ + "model_fullname ViT-B-16 laion400m_e32 ViT-B-16 openai \\\n", + "dataset \n", + "flickr30k 0.882 0.855 \n", + "flickr8k 0.858 0.829 \n", + "mscoco_captions 0.636 0.584 \n", + "\n", + "model_fullname ViT-B-16-plus-240 laion400m_e32 ViT-B-32 laion2b_e16 \\\n", + "dataset \n", + "flickr30k 0.889 0.881 \n", + "flickr8k 0.873 0.857 \n", + "mscoco_captions 0.662 0.647 \n", + "\n", + "model_fullname ViT-B-32 laion2b_s34b_b79k ViT-B-32 openai \\\n", + "dataset \n", + "flickr30k 0.884 0.834 \n", + "flickr8k 0.863 0.805 \n", + "mscoco_captions 0.654 0.558 \n", + "\n", + "model_fullname ViT-B-32-quickgelu laion400m_e32 ViT-H-14 laion2b_s32b_b79k \\\n", + "dataset \n", + "flickr30k 0.855 0.941 \n", + "flickr8k 0.830 0.928 \n", + "mscoco_captions 0.608 0.734 \n", + "\n", + "model_fullname ViT-L-14 laion2b_s32b_b82k ViT-L-14 laion400m_e32 \\\n", + "dataset \n", + "flickr30k 0.929 0.908 \n", + "flickr8k 0.915 0.898 \n", + "mscoco_captions 0.711 0.681 \n", + "\n", + "model_fullname ViT-L-14 openai ViT-L-14-336 openai \\\n", + "dataset \n", + "flickr30k 0.872 0.889 \n", + "flickr8k 0.863 0.880 \n", + "mscoco_captions 0.611 0.616 \n", + "\n", + "model_fullname ViT-g-14 laion2b_s12b_b42k \n", + "dataset \n", + "flickr30k 0.935 \n", + "flickr8k 0.918 \n", + "mscoco_captions 0.724 " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metric = \"image_retrieval_recall@5\"\n", + "pd.pivot(df_retrieval, index=\"model_fullname\", columns=\"dataset\", values=metric).T.dropna()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cbc65601", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
model_fullnameViT-B-16 laion400m_e32ViT-B-16 openaiViT-B-16-plus-240 laion400m_e32ViT-B-32 laion2b_e16ViT-B-32 laion2b_s34b_b79kViT-B-32 openaiViT-B-32-quickgelu laion400m_e32ViT-H-14 laion2b_s32b_b79kViT-L-14 laion2b_s32b_b82kViT-L-14 laion400m_e32ViT-L-14 openaiViT-L-14-336 openaiViT-g-14 laion2b_s12b_b42k
dataset
flickr30k0.9680.9630.9710.9640.9630.9490.9410.9930.9870.9780.9740.9810.991
flickr8k0.9410.9140.9550.9320.9410.9140.9170.9730.9670.9650.9410.9390.974
mscoco_captions0.7960.7680.8100.7950.7980.7480.7680.8600.8400.8220.7920.8100.854
\n", + "
" + ], + "text/plain": [ + "model_fullname ViT-B-16 laion400m_e32 ViT-B-16 openai \\\n", + "dataset \n", + "flickr30k 0.968 0.963 \n", + "flickr8k 0.941 0.914 \n", + "mscoco_captions 0.796 0.768 \n", + "\n", + "model_fullname ViT-B-16-plus-240 laion400m_e32 ViT-B-32 laion2b_e16 \\\n", + "dataset \n", + "flickr30k 0.971 0.964 \n", + "flickr8k 0.955 0.932 \n", + "mscoco_captions 0.810 0.795 \n", + "\n", + "model_fullname ViT-B-32 laion2b_s34b_b79k ViT-B-32 openai \\\n", + "dataset \n", + "flickr30k 0.963 0.949 \n", + "flickr8k 0.941 0.914 \n", + "mscoco_captions 0.798 0.748 \n", + "\n", + "model_fullname ViT-B-32-quickgelu laion400m_e32 ViT-H-14 laion2b_s32b_b79k \\\n", + "dataset \n", + "flickr30k 0.941 0.993 \n", + "flickr8k 0.917 0.973 \n", + "mscoco_captions 0.768 0.860 \n", + "\n", + "model_fullname ViT-L-14 laion2b_s32b_b82k ViT-L-14 laion400m_e32 \\\n", + "dataset \n", + "flickr30k 0.987 0.978 \n", + "flickr8k 0.967 0.965 \n", + "mscoco_captions 0.840 0.822 \n", + "\n", + "model_fullname ViT-L-14 openai ViT-L-14-336 openai \\\n", + "dataset \n", + "flickr30k 0.974 0.981 \n", + "flickr8k 0.941 0.939 \n", + "mscoco_captions 0.792 0.810 \n", + "\n", + "model_fullname ViT-g-14 laion2b_s12b_b42k \n", + "dataset \n", + "flickr30k 0.991 \n", + "flickr8k 0.974 \n", + "mscoco_captions 0.854 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metric = \"text_retrieval_recall@5\"\n", + "pd.pivot(df_retrieval, index=\"model_fullname\", columns=\"dataset\", values=metric).T.dropna()" + ] + }, + { + "cell_type": "markdown", + "id": "e30ecf3c-40a3-4c66-836f-4fbd3e3b0e37", + "metadata": {}, + "source": [ + "## Aggregating over datasets" + ] + }, + { + "cell_type": "markdown", + "id": "b26606d9-591d-45a1-8cd9-9853bfcc5053", + "metadata": {}, + "source": [ + "See VTAB (https://arxiv.org/pdf/1910.04867.pdf, Section E) for a discussion about different aggregation \n", + "strategies and how much they correlate. They find that all aggregation strategies have high\n", + "Kendall score with the simple top-1 mean accuracy over datasets." + ] + }, + { + "cell_type": "markdown", + "id": "d14d866e-702f-4cd2-97b0-f6e2c97394d8", + "metadata": {}, + "source": [ + "### Ranking the models over mean top-1 accuracy over all datasets" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "6d0ece3a-de4d-4080-ae82-925bf563819b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
acc1acc5mean_per_class_recallmean_average_precision
meanstdmedianmeanstdmedianmeanstdmedianmeanstdmedian
model_fullname
ViT-L-14-336 openai0.5670.2870.6370.8260.2390.9260.5580.2920.6310.804NaN0.804
ViT-g-14 laion2b_s12b_b42k0.5650.2900.6480.8330.2380.9350.5630.2970.6460.807NaN0.807
ViT-H-14 laion2b_s32b_b79k0.5640.3010.6660.8360.2390.9250.5720.2980.6660.801NaN0.801
ViT-L-14 openai0.5580.2860.6350.8230.2390.9170.5500.2910.6380.790NaN0.790
ViT-L-14 laion2b_s32b_b82k0.5460.2880.5930.8200.2390.9040.5510.2900.5930.820NaN0.820
ViT-L-14 laion400m_e320.5180.2960.5960.8020.2430.9010.5220.2960.5860.785NaN0.785
ViT-B-32 laion2b_s34b_b79k0.5080.2810.5570.7830.2460.8860.4940.2850.5370.796NaN0.796
ViT-B-16-plus-240 laion400m_e320.4930.2820.5440.7800.2480.8620.5000.2800.5450.785NaN0.785
ViT-B-16 laion400m_e320.4840.2800.5150.7790.2460.8820.4880.2780.5110.784NaN0.784
ViT-B-32 laion2b_e160.4810.2800.5040.7780.2490.8580.4840.2800.5110.793NaN0.793
ViT-B-16 openai0.4750.2730.5010.7830.2330.8540.4830.2690.5060.789NaN0.789
ViT-B-32-quickgelu laion400m_e320.4580.2720.4930.7570.2540.8580.4590.2760.4940.762NaN0.762
ViT-B-32 openai0.4490.2620.4430.7640.2390.8540.4500.2670.4430.760NaN0.760
\n", + "
" + ], + "text/plain": [ + " acc1 acc5 \\\n", + " mean std median mean std median \n", + "model_fullname \n", + "ViT-L-14-336 openai 0.567 0.287 0.637 0.826 0.239 0.926 \n", + "ViT-g-14 laion2b_s12b_b42k 0.565 0.290 0.648 0.833 0.238 0.935 \n", + "ViT-H-14 laion2b_s32b_b79k 0.564 0.301 0.666 0.836 0.239 0.925 \n", + "ViT-L-14 openai 0.558 0.286 0.635 0.823 0.239 0.917 \n", + "ViT-L-14 laion2b_s32b_b82k 0.546 0.288 0.593 0.820 0.239 0.904 \n", + "ViT-L-14 laion400m_e32 0.518 0.296 0.596 0.802 0.243 0.901 \n", + "ViT-B-32 laion2b_s34b_b79k 0.508 0.281 0.557 0.783 0.246 0.886 \n", + "ViT-B-16-plus-240 laion400m_e32 0.493 0.282 0.544 0.780 0.248 0.862 \n", + "ViT-B-16 laion400m_e32 0.484 0.280 0.515 0.779 0.246 0.882 \n", + "ViT-B-32 laion2b_e16 0.481 0.280 0.504 0.778 0.249 0.858 \n", + "ViT-B-16 openai 0.475 0.273 0.501 0.783 0.233 0.854 \n", + "ViT-B-32-quickgelu laion400m_e32 0.458 0.272 0.493 0.757 0.254 0.858 \n", + "ViT-B-32 openai 0.449 0.262 0.443 0.764 0.239 0.854 \n", + "\n", + " mean_per_class_recall \\\n", + " mean std median \n", + "model_fullname \n", + "ViT-L-14-336 openai 0.558 0.292 0.631 \n", + "ViT-g-14 laion2b_s12b_b42k 0.563 0.297 0.646 \n", + "ViT-H-14 laion2b_s32b_b79k 0.572 0.298 0.666 \n", + "ViT-L-14 openai 0.550 0.291 0.638 \n", + "ViT-L-14 laion2b_s32b_b82k 0.551 0.290 0.593 \n", + "ViT-L-14 laion400m_e32 0.522 0.296 0.586 \n", + "ViT-B-32 laion2b_s34b_b79k 0.494 0.285 0.537 \n", + "ViT-B-16-plus-240 laion400m_e32 0.500 0.280 0.545 \n", + "ViT-B-16 laion400m_e32 0.488 0.278 0.511 \n", + "ViT-B-32 laion2b_e16 0.484 0.280 0.511 \n", + "ViT-B-16 openai 0.483 0.269 0.506 \n", + "ViT-B-32-quickgelu laion400m_e32 0.459 0.276 0.494 \n", + "ViT-B-32 openai 0.450 0.267 0.443 \n", + "\n", + " mean_average_precision \n", + " mean std median \n", + "model_fullname \n", + "ViT-L-14-336 openai 0.804 NaN 0.804 \n", + "ViT-g-14 laion2b_s12b_b42k 0.807 NaN 0.807 \n", + "ViT-H-14 laion2b_s32b_b79k 0.801 NaN 0.801 \n", + "ViT-L-14 openai 0.790 NaN 0.790 \n", + "ViT-L-14 laion2b_s32b_b82k 0.820 NaN 0.820 \n", + "ViT-L-14 laion400m_e32 0.785 NaN 0.785 \n", + "ViT-B-32 laion2b_s34b_b79k 0.796 NaN 0.796 \n", + "ViT-B-16-plus-240 laion400m_e32 0.785 NaN 0.785 \n", + "ViT-B-16 laion400m_e32 0.784 NaN 0.784 \n", + "ViT-B-32 laion2b_e16 0.793 NaN 0.793 \n", + "ViT-B-16 openai 0.789 NaN 0.789 \n", + "ViT-B-32-quickgelu laion400m_e32 0.762 NaN 0.762 \n", + "ViT-B-32 openai 0.760 NaN 0.760 " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.groupby(\"model_fullname\").agg(['mean', 'std', 'median']).sort_values(by=(\"acc1\", \"mean\"), ascending=False)" + ] + }, + { + "cell_type": "markdown", + "id": "4791ba73-3c54-4ef0-93a4-59b75b00378e", + "metadata": {}, + "source": [ + "### Compute rank of the model for each dataset (1 = best, lower is better), then average the ranks over the datasets" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "aa0b6dda-b531-4954-b2bd-79d8c910d96d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
meanstd
model_fullname
ViT-g-14 laion2b_s12b_b42k3.2862.295
ViT-H-14 laion2b_s32b_b79k3.7863.355
ViT-L-14 laion2b_s32b_b82k4.5292.440
ViT-L-14-336 openai4.8713.037
ViT-L-14 openai5.3433.038
ViT-L-14 laion400m_e326.8292.925
ViT-B-32 laion2b_s34b_b79k7.1143.332
ViT-B-16-plus-240 laion400m_e327.9712.285
ViT-B-16 laion400m_e328.5432.822
ViT-B-16 openai9.0292.875
ViT-B-32 laion2b_e169.0862.513
ViT-B-32 openai9.5144.111
ViT-B-32-quickgelu laion400m_e3211.1002.727
\n", + "
" + ], + "text/plain": [ + " mean std\n", + "model_fullname \n", + "ViT-g-14 laion2b_s12b_b42k 3.286 2.295\n", + "ViT-H-14 laion2b_s32b_b79k 3.786 3.355\n", + "ViT-L-14 laion2b_s32b_b82k 4.529 2.440\n", + "ViT-L-14-336 openai 4.871 3.037\n", + "ViT-L-14 openai 5.343 3.038\n", + "ViT-L-14 laion400m_e32 6.829 2.925\n", + "ViT-B-32 laion2b_s34b_b79k 7.114 3.332\n", + "ViT-B-16-plus-240 laion400m_e32 7.971 2.285\n", + "ViT-B-16 laion400m_e32 8.543 2.822\n", + "ViT-B-16 openai 9.029 2.875\n", + "ViT-B-32 laion2b_e16 9.086 2.513\n", + "ViT-B-32 openai 9.514 4.111\n", + "ViT-B-32-quickgelu laion400m_e32 11.100 2.727" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metric = \"acc1\"\n", + "df_metric = pd.pivot(df, index=\"model_fullname\", columns=\"dataset\", values=metric).T.dropna()\n", + "df_metric.rank(axis=1,ascending=False).agg([\"mean\", \"std\"]).T.sort_values(by=\"mean\",ascending=True)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/webdatasets.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/webdatasets.txt new file mode 100644 index 0000000000000000000000000000000000000000..3dd029390b7343fc25e4b680d5014babb3efc595 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/benchmark/webdatasets.txt @@ -0,0 +1,41 @@ +wds/mscoco_captions +wds/flickr8k +wds/flickr30k +wds/imagenet1k +wds/imagenetv2 +wds/imagenet_sketch +wds/imagenet-a +wds/imagenet-r +wds/imagenet-o +wds/objectnet +wds/fer2013 +wds/voc2007 +wds/voc2007_multilabel +wds/sun397 +wds/cars +wds/fgvc_aircraft +wds/mnist +wds/stl10 +wds/gtsrb +wds/country211 +wds/renderedsst2 +wds/vtab/caltech101 +wds/vtab/cifar10 +wds/vtab/cifar100 +wds/vtab/clevr_count_all +wds/vtab/clevr_closest_object_distance +wds/vtab/diabetic_retinopathy +wds/vtab/dmlab +wds/vtab/dsprites_label_orientation +wds/vtab/dsprites_label_x_position +wds/vtab/dsprites_label_y_position +wds/vtab/dtd +wds/vtab/eurosat +wds/vtab/kitti_closest_vehicle_distance +wds/vtab/flowers +wds/vtab/pets +wds/vtab/pcam +wds/vtab/resisc45 +wds/vtab/smallnorb_label_azimuth +wds/vtab/smallnorb_label_elevation +wds/vtab/svhn diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/PKG-INFO b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/PKG-INFO new file mode 100644 index 0000000000000000000000000000000000000000..806db1cb4904d61bbc2b22ae0e9256db170f6c00 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/PKG-INFO @@ -0,0 +1,517 @@ +Metadata-Version: 2.4 +Name: clip_benchmark +Version: 1.6.1 +Summary: CLIP-like models benchmarks on various datasets +Home-page: https://github.com/mehdidc/clip_benchmark +Author: Mehdi Cherti +Author-email: mehdicherti@gmail.com +License: MIT license +Keywords: clip_benchmark +Classifier: Development Status :: 2 - Pre-Alpha +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Requires-Python: >=3.6 +Description-Content-Type: text/markdown +License-File: LICENSE +License-File: AUTHORS.rst +Requires-Dist: torch>=1.8.1 +Requires-Dist: torchvision>=0.8.9 +Requires-Dist: tqdm>=2 +Requires-Dist: scikit-learn<2,>=1.0 +Requires-Dist: open_clip_torch>=0.2.1 +Requires-Dist: pycocoevalcap +Requires-Dist: webdataset>=0.2.31 +Requires-Dist: transformers +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: description-content-type +Dynamic: home-page +Dynamic: keywords +Dynamic: license +Dynamic: license-file +Dynamic: requires-dist +Dynamic: requires-python +Dynamic: summary + +# CLIP Benchmark +[![pypi](https://img.shields.io/pypi/v/clip_benchmark.svg)](https://pypi.python.org/pypi/clip_benchmark) + +The goal of this repo is to evaluate CLIP-like models on a standard set +of datasets on different tasks such as zero-shot classification and zero-shot +retrieval, and captioning. + +Below we show the average rank (1 is the best, lower is better) of different CLIP models, evaluated +on different datasets. + +![benchmark.png](benchmark.png) + +The current detailed results of the benchmark can be seen [here](benchmark/README.md) +or directly in the [notebook](benchmark/results.ipynb). + +## Features + +* Support for zero-shot classification and zero-shot retrieval, linear probing, and captioning. +* Support for [OpenCLIP](https://github.com/mlfoundations/open_clip) pre-trained models, [Japanese CLIP](https://github.com/rinnakk/japanese-clip), and [NLLB CLIP](https://arxiv.org/abs/2309.01859) for general multilingual abilities. +* Support various datasets from [torchvision](https://pytorch.org/vision/stable/datasets.html), [tensorflow datasets](https://www.tensorflow.org/datasets), and [VTAB](https://github.com/google-research/task_adaptation). +* Support for various multilingual datasets for classification and retrieval +* Support for compositionality tasks + +## How to install? + +`pip install clip-benchmark` + +## How to use? + +To evaluate we recommend to create a models.txt like +``` +ViT-B-32,openai +``` + +to get the list of datasets +``` +wget https://raw.githubusercontent.com/LAION-AI/CLIP_benchmark/main/benchmark/webdatasets.txt +``` + +Then to run + +``` +clip_benchmark eval --pretrained_model models.txt \ + --dataset "webdatasets.txt" \ + --dataset_root "https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main" \ + --output "benchmark_{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +Then to get the full table + +``` +clip_benchmark build benchmark_*.json --output benchmark.csv +``` + + +### Command line interface (CLI) + +The easiest way to benchmark the models is using the CLI, `clip_benchmark`. +You can specify the model to use, the dataset and the task to evaluate on. Once it is done, evaluation is performed and +the results are written into a JSON file. + +### Using other models than openclip + +It is possible to use other models than openclip ones. For example japanese-clip is supported + +Here is an example of use + +``` +>>> python3 clip_benchmark/cli.py eval \ + --model_type "ja_clip" \ # flag to use japanese-clip + --pretrained "rinna/japanese-cloob-vit-b-16" \ # now, we have `rinna/japanese-cloob-vit-b-16` or `rinna/japanese-clip-vit-b-16`. + --language "jp" \ + --task "zeroshot_classification" \ + --dataset "imagenet1k" \ + --dataset_root {ROOT_PATH} + +>>> cat result.json +{"dataset": "imagenet1k", "model": "ViT-B-32-quickgelu", "pretrained": "rinna/japanese-cloob-vit-b-16", "task": "zeroshot_classification", "metrics": {"acc1": 0.54636, "acc5": 0.72856, "mean_per_class_recall": 0.54522}, "language": "jp"} +``` + +### How to add other CLIP models + +Please follow these steps: +1. Add a identity file to load model in `clip_benchmark/models` +2. Define a loading function, that returns a tuple (model, transform, tokenizer). Please see `clip_benchmark/models/open_clip.py` as an example. +3. Add the function into `TYPE2FUNC` in `clip_benchmark/models/__init__.py` + +Remarks: +- The new tokenizer/model must enable to do the following things as https://github.com/openai/CLIP#usage + - `tokenizer(texts).to(device)` ... `texts` is a list of string + - `model.encode_text(tokenized_texts)` ... `tokenized_texts` is a output from `tokenizer(texts).to(device)` + - `model.encode_image(images)` ... `images` is a image tensor by the `transform` + + +### CIFAR-10 example + + Here is an example for CIFAR-10 zero-shot classification using OpenCLIP's pre-trained model on LAION-400m: + + `clip_benchmark eval --dataset=cifar10 --task=zeroshot_classification --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + + By default, the dataset is downloaded into `--dataset_root`, which by default is `root`. + +Here is the content of `result.json` after the evaluation is done: + +```json +{ + "dataset": "cifar10", "model": "ViT-B-32-quickgelu", + "pretrained": "laion400m_e32", "task": "zeroshot_classification", + "metrics": {"acc1": 0.9074, "acc5": 0.998} +} +``` + + +### VOC2007 example + +Here is another example with VOC2007, which is a multi-label classification dataset. + + `clip_benchmark eval --dataset=voc2007_multilabel --task=zeroshot_classification --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + +Here is the content of `result.json` after the evaluation is done: + +```json +{"dataset": "voc2007_multilabel", "model": "ViT-B-32-quickgelu", "pretrained": "laion400m_e32", "task": "zeroshot_classification", "metrics": {"mean_average_precision": 0.7627869844436646}} +``` + +Here, we compute the mean average precision or mAP, more details about that metric [here](https://fangdahan.medium.com/calculate-mean-average-precision-map-for-multi-label-classification-b082679d31be) in the context of multi-label classification. + +### VTAB example + +Here is an example on how to run it on [VTAB](https://github.com/google-research/task_adaptation) classification tasks. +First, you need to install VTAB's dedicated package. + +`pip install task_adaptation==0.1` + +Then, you can run it by providing the full dataset name. +Example with `eurosat`: + + `clip_benchmark eval --dataset=vtab/eurosat --task=zeroshot_classification --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + +See [clip_benchmark/datasets/builder.py#L634](clip_benchmark/datasets/builder.py#L634) for the full list of +VTAB dataset collection. + + +### TensorFlow dataset example + +Here is an example on how to run it on [Tensorflow datasets](https://www.tensorflow.org/datasets). +First, you need to install `tfds-nightly` and `timm`. + +`pip install timm tfds-nightly` + + +The name of the dataset follows the template `tfds/`. + +Example with `cifar10`: + + `clip_benchmark eval --dataset=tfds/cifar10 --task=zeroshot_classification --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + + +### COCO captions retrieval example + + Here is an example for COCO captions zero-shot retrieval: + + `clip_benchmark eval --dataset=mscoco_captions --task=zeroshot_retrieval --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64` + + Note that for using COCO, you also need to install `pycocotools` (e.g., using `pip install pycocotools`). + + +### COCO captions captioning example + + Here is an example for COCO captions captioning task: + + `clip_benchmark eval --dataset=mscoco_captions --task=captioning --model=coca_ViT-L-14 --output=result.json --pretrained mscoco_finetuned_laion2b_s13b_b90k` + + Note that for using COCO, you also need to install `pycocotools` (e.g., using `pip install pycocotools`) and `pycocoevalcap`. + +### Linear probing example + +Full linear probing on train split, evaluate on test split: + +`clip_benchmark eval --dataset=cifar10 --task=linear_probe --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64 --fewshot_lr 0.1 --fewshot_epochs 20 --batch_size 512 --train_split train --test_split test` + + +few-shot (k=5) linear probing on train split, evaluate on test split: + +`clip_benchmark eval --dataset=cifar10 --task=linear_probe --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64 --fewshot_k 5 --fewshot_lr 0.1 --fewshot_epochs 20 --batch_size 512 --train_split train --test_split test` + +Split train into train (90%), val (10%), do linear probing on train split, tune on val split, evaluate on test split: + +`clip_benchmark eval --dataset=cifar10 --task=linear_probe --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64 --fewshot_lr 0.1 --fewshot_epochs 20 --batch_size 512 --train_split train --val_proportion 0.1 --test_split test` + +For other datasets that have an official val split, one can also specify the val split: + +`clip_benchmark eval --dataset=fgvc_aircraft --task=linear_probe --pretrained=laion400m_e32 --model=ViT-B-32-quickgelu --output=result.json --batch_size=64 --fewshot_lr 0.1 --fewshot_epochs 20 --batch_size 512 --train_split train --val_split val --test_split test` + +### Multilingual evaluation + +We also provide datasets for evaluating multilingual models (see e.g. https://github.com/mlfoundations/open_clip#vit-b32-xlm-roberta-base, and https://github.com/mlfoundations/open_clip/blob/main/docs/openclip_multilingual_retrieval_results.csv) by specifying `--language`. + +For ImageNet-1k (zero-shot classification): + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=imagenet1k --output=result.json --batch_size=64 --language=`, where `` can be among `zh` (chinese), `it` (italian), `jp` (japanese), `en` (english), `ar` (arabic). +- We also support Babel ImageNet classnames and prompts (https://github.com/gregor-ge/Babel-ImageNet), which can be used as the following: `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=babel_imagenet --output=result.json --batch_size=64 --language=`, +where `` is a two letter string from the [ISO language code list](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes). Supported values for language are: `'ne', 'id', 'de', 'nl', 'af', 'he', 'sq', 'uz', 'kn', 'ku', 'ta', 'lv', 'ko', 'ug', 'br', 'el', 'su', 'kk', 'sk', 'gl', 'om', 'fa', 'jv', 'cs', 'lo', 'hy', 'xh', 'hr', 'so', 'gu', 'am', 'ar', 'sa', 'ca', 'is', 'it', 'sv', 'ga', 'bg', 'vi', 'sd', 'ur', 'km', 'pl', 'hu', 'sr', 'fr', 'hi', 'fy', 'et', 'bs', 'sw', 'az', 'mk', 'es', 'mn', 'ja', 'tl', 'tr', 'gd', 'ro', 'mg', 'mr', 'sl', 'pt', 'lt', 'no', 'yi', 'uk', 'ky', 'ka', 'bn', 'or', 'my', 'en', 'ps', 'fi', 'zh', 'da', 'ml', 'be', 'eo', 'ha', 'eu', 'as', 'te', 'th', 'cy', 'si', 'ru', 'la', 'pa', 'ms'` + +for COCO (zero-shot retrieval): + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=multilingual_mscoco_captions --output=result.json --batch_size=64 --language=`, where `` can be among `es` (spanish), `it` (italian), `jp` (japanese), `ko` (korean), `pl` (polish), `ru` (russian), `tr` (Turkish), `zh` (chinese), `en` (english), `fr` (french), `de` (german). + +For Flickr-30k (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=flickr30k --output=result.json --batch_size=64 --language=`, where `` can be among `en` (english), `zh` (chinese). + +For Flickr-8k (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=flickr8k --output=result.json --batch_size=64 --language=`, where `` can be among `en` (english), `zh` (chinese). + +For [Crossmodal-3600](https://google.github.io/crossmodal-3600/) (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=crossmodal3600 --output=result.json --batch_size=64 --language=`, see supported languages [here](https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/crossmodal3600.py#L9). + +For Flickr30k-200 dataset, which has 1000 captions from Flickr30k dataset translated to 200 languages using [NLLB-3.3B model](https://huggingface.co/facebook/nllb-200-3.3B) (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=flickr30k-200 --output=result.json --batch_size=64 --language=`, see supported languages [here](https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/flickr30k_200.py#L15). + +For XTD200 dataset, which has captions from [XTD10](https://github.com/adobe-research/Cross-lingual-Test-Dataset-XTD10) dataset translated to 200 languages using [NLLB-3.3B model](https://huggingface.co/facebook/nllb-200-3.3B) (zero-shot retrieval) + +- `clip_benchmark eval --model xlm-roberta-base-ViT-B-32 --pretrained laion5b_s13b_b90k --dataset=xtd200 --output=result.json --batch_size=64 --language=`, see supported languages [here](https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/xtd200.py#L15). + + +### Compositionality evaluation + + +For [Sugar Crepe](https://github.com/RAIVNLab/sugar-crepe): + + +`clip_benchmark eval --model ViT-B-32 --pretrained laion400m_e32 --dataset=sugar_crepe/ --output=result.json` + +where `` can be among `add_att`, `add_obj`, `replace_att`, `replace_obj`, `replace_rel`, `swap_att`, `swap_obj`. +To evaluate on all the tasks together, you can do: + +`clip_benchmark eval --model ViT-B-32 --pretrained laion400m_e32 --dataset=sugar_crepe --output=result.json` + +For [winoground](https://huggingface.co/datasets/facebook/winoground/): + +`clip_benchmark eval --model ViT-B-32 --pretrained laion400m_e32 --dataset=winoground --output=result.json` + +NB: `pip install datasets` is required for winoground. + +### Webdataset example + +Here is an example on how to run it on [webdatasets](https://github.com/webdataset/webdataset). +First, you need to install `webdataset`. + +`pip install webdataset` + +#### Creating a webdataset + +You can either convert an already supported CLIP_benchmark dataset to webdataset format, or manually create your own with the same file structure. For already supported datasets use the CLI command `clip_benchmark_export_wds` as in this example: + +``` +$ clip_benchmark_export_wds --dataset cifar10 --plit train --dataset_root DATA_DIR/ --output wds_cifar10/ +$ clip_benchmark_export_wds --dataset cifar10 --split test --dataset_root DATA_DIR/ --output wds_cifar10/ +``` + +which will convert the train and test splits for CIFAR-10 (downloaded to `DATA_DIR/`) and save the webdataset to `wds_cifar10/` (upload to Huggingface Hub must be done manually for now). Retrieval datasets are also supported with the `--retrieval` flag. + +For other datasets, data must be stored with the following file structure: + +``` +root_dir/ + train/ + nshards.txt + 0.tar + 1.tar + ... + test/ + nshards.txt + 0.tar + ... + classnames.txt + zeroshot_classification_templates.txt + dataset_type.txt +``` + +Each split should be contained in its own folder and `nshards.txt` should contain a single integer corresponding to the number of TAR files. The TAR files should follow webdataset format, with an image file (.webp, .png, or .jpg) and a label (.cls) for each example. Classnames and templates are required for zeroshot classification evaluation, with each classname or template on its own line. Dataset type is required for distinguishing zeroshot retrieval evaluation: the file should just contain the text `retrieval`. + +#### Evaluating on a webdataset + +The name of the dataset follows the template `wds/`. Note that the dataset name currently only affects the name in the results output - classnames and templates are loaded directly from the included files. The dataset root directory can be either a local path to the `root_dir` as specified above, or an HTTP URL pointing to a Huggingface Hub dataset file tree. + +Example with `vtab/cifar10` (zero-shot classification): + +- local: `clip_benchmark eval --dataset wds/vtab/cifar10 --dataset_root ROOT_DIR/wds_vtab-cifar10/` +- remote: `clip_benchmark eval --dataset wds/vtab/cifar10 --dataset_root https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main` + +Example with `mscoco_captions` (retrieval): + +- local: `clip_benchmark eval --dataset=wds/mscoco_captions --dataset_root ROOT_DIR/wds_vtab-mscoco_captions/ --task=zeroshot_retrieval` +- remote: `clip_benchmark eval --dataset=wds/mscoco_captions --dataset_root="https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main" --task=zeroshot_retrieval` + + +Example with `mscoco_captions` (captioning): + +- local: `clip_benchmark eval --dataset=wds/mscoco_captions --dataset_root ROOT_DIR/wds_vtab-mscoco_captions/ --task=captioning` +- remote: `clip_benchmark eval --dataset=wds/mscoco_captions --dataset_root="https://huggingface.co/datasets/clip-benchmark/wds_{dataset_cleaned}/tree/main" --task=captioning` + + +All other arguments remain the same as in the other examples. See `https://huggingface.co/clip-benchmark` for a full list of datasets that have already been uploaded to Huggingface. + +## Evaluate mulitple models on multiple datasets + +For the purpose of benchmarking, it is possible to run the CLI with multiple +pre-trained models on multiple datasets. + + +### Pretrained models and datasets list as arguments + +For models, we can provide list of pretrained model names in the form of 'model,pretrained' (so `model` and `pretrained` are comma separated). For datasets, we can provide a list of datasets. For languages, we can provide a list of languages. +Example: + +```bash +clip_benchmark eval --pretrained_model ViT-B-32-quickgelu,laion400m_e32 ViT-L-14,laion400m_e32 \ +--dataset cifar10 cifar100 --dataset_root "clip_benchmark_datasets/{dataset}" --language en jp \ + --output "{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +Note that `--dataset_root` and `--output` can be now in the form of a template that depends on the dataset/model/language/task (for `--output`) and dataset name (for `--dataset_root`). + +Note that If the benchmark fails at some point, it is possible to resume it by skipping already evaluated models using `--skip_existing`. + +### Pretrained models and datasets list as files + +We can also provide a path to files with models (each line is in the form of 'model,pretrained' where `model` and `pretrained` are comma separated) and datasets list (one dataset per line): + +```bash +clip_benchmark eval --pretrained_model benchmark/models.txt \ +--dataset benchmark/datasets.txt --dataset_root "clip_benchmark_datasets/{dataset}" \ + --output "{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +Examples are available in [benchmark/datasets.txt](benchmark/datasets.txt) and [benchmark/models.txt](benchmark/models.txt) + +### Multiple checkpoints from the same model + +It is also common to evaluate multiple checkpoints from the same model: + +```bash +clip_benchmark eval --model ViT-B-32 --pretrained *.pt \ +--dataset benchmark/datasets.txt --dataset_root "clip_benchmark_datasets/{dataset}" \ + --output "{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +### Model and dataset collections + +We can also provide model collection names (`openai`, `openclip_base`, `openclip_multilingual`, `openclip_full` are supported) or dataset collection names (`vtab`, `vtab+`, `retrieval`, `imagenet_robustness` are supported): + +```bash +clip_benchmark eval --pretrained_model openai openclip_base --dataset vtab+ retrieval \ +--dataset_root "clip_benchmark_datasets/{dataset}" --not quiet \ +--output "{dataset}_{pretrained}_{model}_{language}_{task}.json" +``` + +See [clip_benchmark/models.py#L6](clip_benchmark/models.py#L6) and [clip_benchmark/datasets/builder.py#L634](clip_benchmark/datasets/builder.py#L634) for more information +about the collections. + +### Custom templates / prompts / classnames + +It is also possible to use custom prompts by providing a custom template file and/or a custom classname file. +For instance: + +`clip_benchmark eval --dataset "imagenet1k" --model ViT-B-32 --pretrained laion400m_e32 --custom_template_file --custom_classname_file ` + +The template file can be either in the usual format https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/en_zeroshot_classification_templates.json or in the CuPL format https://github.com/LAION-AI/CLIP_benchmark/blob/main/clip_benchmark/datasets/cupl_prompts.json to have class-specific prompts. In the case of the CuPL format, the classnames file will not be used, thus one only needs to provide the template file `--custom_template_file`. + +For instance, the prompts from the CuPL paper https://arxiv.org/abs/2209.03320 for ImagetNet-1k can be used this way : + +`clip_benchmark eval --dataset "imagenet1k" --model ViT-B-32 --pretrained laion400m_e32 --custom_template_file cupl_prompts.json` + +### Development + +For development, you can also do this: + +```bash +git clone https://github.com/LAION-AI/CLIP_benchmark +cd CLIP_benchmark +python setup.py install +``` + +## Credits + +- Thanks to [OpenCLIP](https://github.com/mlfoundations/open_clip) authors, zero-shot accuracy code is adapted from there and pre-trained models are used in the command line interface. +- Thanks to [SLIP](https://github.com/facebookresearch/SLIP) authors, some zero-shot templates and classnames are from there. +- Thanks to [Wise-ft](https://github.com/mlfoundations/wise-ft) authors, Imagenet robustness datasets code is adapted from there +- Thanks to [LiT](https://arxiv.org/abs/2111.07991.pdf) authors, some zero-shot templates and classnames of VTAB datasets are from there. +- Thanks to [Sugar Crepe](https://github.com/RAIVNLab/sugar-crepe) authors for compositionality tasks evaluation on COCO +- Thanks to [Babel ImageNet](https://github.com/gregor-ge/Babel-ImageNet) authors for multilingual evaluation of ImageNet-1k zero-shot classification. +- Thanks to [ImageNet-W](https://github.com/facebookresearch/Whac-A-Mole) authors for ImageNet-W evaluation +- Thanks to [CuPL](https://github.com/sarahpratt/CuPL) for CuPL prompts. +- Thanks to [PyCOCOevalcap](https://github.com/salaniz/pycocoevalcap) and [@gpucce](https://github.com/gpucce) for COCO captions image captioning evaluation. +- Thanks to [@li-xirong](https://github.com/li-xirong/cross-lingual-cap) for chinese Flickr-30k/FLickr-8k. +- Thanks to [Chinese CLIP](https://github.com/OFA-Sys/Chinese-CLIP) authors for chinese ImageNet-1k classnames/prompts (zero-shot classification). +- Thanks to [@rinnakk](https://github.com/rinnakk/japanese-clip) and [@mkshing](https://github.com/mkshing) for japanese ImageNet-1k classnames/prompts (zero-shot classification) and japanese CLIP support. +- Thanks to [@KhalidAlt](https://github.com/KhalidAlt) for arabic ImageNet-1k classnames/prompts (zero-shot classification). +- Thanks to [@djghosh13](https://github.com/djghosh13) for WebDataset support. +- Thanks to [@FreddeFrallan](https://github.com/FreddeFrallan) for for multilingual COCO. +- Thanks to [@mitchellnw](https://github.com/mitchellnw) for linear probing support. +- Thanks to [@teasgen](https://github.com/teasgen) for support of validation set and tuning linear probing similar to OpenAI's CLIP. +- Thanks to [@visheratin](https://github.com/visheratin) for multilingual retrieval datasets support from . +- This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [audreyr/cookiecutter-pypackage](https://github.com/audreyr/cookiecutter-pypackage) project template. Thanks to the author. + + +## History + +### 1.6.1 + +* Fix missing sugar crepe example #119 thanks to @samarth4149 + +### 1.6.0 + + +* Fix overwritten zeroshot templates issue (https://github.com/LAION-AI/CLIP_benchmark/issues/109) +* Support new multilingual retrieval datasets: Crossmodal-3600, XTD10, Flickr30k-200, and XTD200 +* Support tuning linear probing on validation set + +### 1.5.0 + +* Custom classnames and templates +* support wds for captioning evaluation +* support imagenet-w +* support babel imagenet +* support chinese flickr30k/8k +* support sugar crepe (compositionality) +* support (optional) sharding evaluation based on rank, for parallel runs +* fix many issues + +### 1.4.0 + +* Fix silent webdataset error-handling +* Added support for wds/voc2007_multilabel +* default to float32 +* add mscoco generative benchmark + +### 1.3.0 + +* update flickr8k results, solve issue #48, thanks to @orchidmajumder +* Evaluate multiple models/datasets/languages using the CLI directly +* Support Japanese CLIP by rinna +* Add arabic imagenet +* updating CuPL prompts with more generated sentences + ensembled with openAI prompts +* put model in eval mode before evaluation +* Webdataset updates +* Make verbose the default + +### 1.2.0 + +* Added support for loading webdatasets + +### 1.1.0 + +* Added better support for multilingual eval +* Added better support for linear probing +* Added support for CuPL prompts + +### 1.0.1 + +* pypi description as markdown + +### 1.0.0 + +* Actual first release on PyPI. + + +### 0.1.0 + +* First release on PyPI. diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/SOURCES.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/SOURCES.txt new file mode 100644 index 0000000000000000000000000000000000000000..b9ae2d99791b1ac21227776eda987c1b9398dd4c --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/SOURCES.txt @@ -0,0 +1,62 @@ +AUTHORS.rst +CONTRIBUTING.rst +LICENSE +MANIFEST.in +README.md +setup.cfg +setup.py +clip_benchmark/__init__.py +clip_benchmark/cli.py +clip_benchmark/model_collection.py +clip_benchmark/webdataset_builder.py +clip_benchmark.egg-info/PKG-INFO +clip_benchmark.egg-info/SOURCES.txt +clip_benchmark.egg-info/dependency_links.txt +clip_benchmark.egg-info/entry_points.txt +clip_benchmark.egg-info/not-zip-safe +clip_benchmark.egg-info/requires.txt +clip_benchmark.egg-info/top_level.txt +clip_benchmark/datasets/__init__.py +clip_benchmark/datasets/ar_classnames.json +clip_benchmark/datasets/ar_zeroshot_classification_templates.json +clip_benchmark/datasets/babel_imagenet.json +clip_benchmark/datasets/babel_imagenet.py +clip_benchmark/datasets/builder.py +clip_benchmark/datasets/caltech101.py +clip_benchmark/datasets/cn_classnames.json +clip_benchmark/datasets/cn_zeroshot_classification_templates.json +clip_benchmark/datasets/crossmodal3600.py +clip_benchmark/datasets/cupl_prompts.json +clip_benchmark/datasets/en_classnames.json +clip_benchmark/datasets/en_zeroshot_classification_templates.json +clip_benchmark/datasets/flickr.py +clip_benchmark/datasets/flickr30k_200.py +clip_benchmark/datasets/flores_langs.py +clip_benchmark/datasets/imagenetv2.py +clip_benchmark/datasets/it_classnames.json +clip_benchmark/datasets/it_zeroshot_classification_templates.json +clip_benchmark/datasets/jp_classnames.json +clip_benchmark/datasets/jp_zeroshot_classification_templates.json +clip_benchmark/datasets/kitti.py +clip_benchmark/datasets/multilingual_mscoco.py +clip_benchmark/datasets/nllb_dist13b_prompts.json +clip_benchmark/datasets/objectnet.py +clip_benchmark/datasets/sugar_crepe.py +clip_benchmark/datasets/tfds.py +clip_benchmark/datasets/voc2007.py +clip_benchmark/datasets/winoground.py +clip_benchmark/datasets/xtd200.py +clip_benchmark/metrics/__init__.py +clip_benchmark/metrics/captioning.py +clip_benchmark/metrics/image_caption_selection.py +clip_benchmark/metrics/linear_probe.py +clip_benchmark/metrics/zeroshot_classification.py +clip_benchmark/metrics/zeroshot_retrieval.py +clip_benchmark/models/__init__.py +clip_benchmark/models/japanese_clip.py +clip_benchmark/models/nllb_clip.py +clip_benchmark/models/open_clip.py +clip_benchmark/models/open_clip_hqq.py +probe_benchmark/scaling_experiment_data2.json +probe_benchmark/scaling_experiment_data_vtab.json +tests/test_clip_benchmark.py \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/dependency_links.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/dependency_links.txt new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/entry_points.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/entry_points.txt new file mode 100644 index 0000000000000000000000000000000000000000..a49932e84e2b75c14ec353dba7c75669fcc958d1 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +clip_benchmark = clip_benchmark.cli:main +clip_benchmark_export_wds = clip_benchmark.webdataset_builder:main diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/not-zip-safe b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/not-zip-safe new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/requires.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/requires.txt new file mode 100644 index 0000000000000000000000000000000000000000..0bcadcff4e428e30a6f64c745028f63dd5facf25 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/requires.txt @@ -0,0 +1,8 @@ +torch>=1.8.1 +torchvision>=0.8.9 +tqdm>=2 +scikit-learn<2,>=1.0 +open_clip_torch>=0.2.1 +pycocoevalcap +webdataset>=0.2.31 +transformers diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/top_level.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/top_level.txt new file mode 100644 index 0000000000000000000000000000000000000000..cafb79fcf02c90457577be1f996925615a2d6777 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark.egg-info/top_level.txt @@ -0,0 +1 @@ +clip_benchmark diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/__init__.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..37a6b7bd48c8e525dacd7e02fd20d68d98763216 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/__init__.py @@ -0,0 +1,5 @@ +"""Top-level package for CLIP Benchmark.""" + +__author__ = """Mehdi Cherti""" +__email__ = 'mehdicherti@gmail.com' +__version__ = '0.1.0' diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/cli.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/cli.py new file mode 100644 index 0000000000000000000000000000000000000000..5a33a1f5a6ac8a6f3490b51d6b0c5cd0017dfad6 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/cli.py @@ -0,0 +1,474 @@ +"""Console script for clip_benchmark.""" +import argparse +import csv +import json +import os +import random +import sys +from copy import copy +from itertools import product + +import torch + +from clip_benchmark.datasets.builder import (build_dataset, dataset_collection, + get_dataset_collate_fn, + get_dataset_collection_from_file, + get_dataset_default_task) +from clip_benchmark.metrics import (captioning, image_caption_selection, + linear_probe, zeroshot_classification, + zeroshot_retrieval) +from clip_benchmark.model_collection import (get_model_collection_from_file, + model_collection) +from clip_benchmark.models import MODEL_TYPES, load_clip + + +def get_parser_args(): + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers() + + parser_eval = subparsers.add_parser('eval', help='Evaluate') + parser_eval.add_argument('--dataset', type=str, default="cifar10", nargs="+", help="Dataset(s) to use for the benchmark. Can be the name of a dataset, or a collection name ('vtab', 'vtab+', 'imagenet_robustness', 'retrieval') or path of a text file where each line is a dataset name") + parser_eval.add_argument('--dataset_root', default="root", type=str, help="dataset root folder where the datasets are downloaded. Can be in the form of a template depending on dataset name, e.g., --dataset_root='datasets/{dataset}'. This is useful if you evaluate on multiple datasets.") + parser_eval.add_argument('--split', type=str, default="test", help="Dataset split to use") + parser_eval.add_argument('--test_split', dest="split", action='store', type=str, default="test", help="Dataset split to use") + parser_eval.add_argument('--train_split', type=str, nargs="+", default="train", help="Dataset(s) train split names") + mutually_exclusive = parser_eval.add_mutually_exclusive_group() + mutually_exclusive.add_argument('--val_split', default=None, type=str, nargs="+", help="Dataset(s) validation split names. Mutually exclusive with val_proportion.") + mutually_exclusive.add_argument('--val_proportion', default=None, type=float, nargs="+", help="what is the share of the train dataset will be used for validation part, if it doesn't predefined. Mutually exclusive with val_split") + parser_eval.add_argument('--model', type=str, nargs="+", default=["ViT-B-32-quickgelu"], help="Model architecture to use from OpenCLIP") + parser_eval.add_argument('--pretrained', type=str, nargs="+", default=["laion400m_e32"], help="Model checkpoint name to use from OpenCLIP") + parser_eval.add_argument('--pretrained_model', type=str, default="", nargs="+", help="Pre-trained model(s) to use. Can be the full model name where `model` and `pretrained` are comma separated (e.g., --pretrained_model='ViT-B-32-quickgelu,laion400m_e32'), a model collection name ('openai' or 'openclip_base' or 'openclip_multilingual' or 'openclip_all'), or path of a text file where each line is a model fullname where model and pretrained are comma separated (e.g., ViT-B-32-quickgelu,laion400m_e32). --model and --pretrained are ignored if --pretrained_model is used.") + parser_eval.add_argument('--task', type=str, default="auto", choices=["zeroshot_classification", "zeroshot_retrieval", "linear_probe", "captioning", "image_caption_selection", "auto"], help="Task to evaluate on. With --task=auto, the task is automatically inferred from the dataset.") + parser_eval.add_argument('--no_amp', action="store_false", dest="amp", default=True, help="whether to use mixed precision") + parser_eval.add_argument('--num_workers', default=4, type=int) + parser_eval.add_argument('--recall_k', default=[5], type=int, help="for retrieval, select the k for Recall@K metric. ", nargs="+",) + parser_eval.add_argument('--fewshot_k', default=-1, type=int, help="for linear probe, how many shots. -1 = whole dataset.") + parser_eval.add_argument('--fewshot_epochs', default=10, type=int, help="for linear probe, how many epochs.") + parser_eval.add_argument('--fewshot_lr', default=0.1, type=float, help="for linear probe, what is the learning rate.") + parser_eval.add_argument("--skip_load", action="store_true", help="for linear probes, when everything is cached, no need to load model.") + parser_eval.add_argument("--distributed", action="store_true", help="evaluation in parallel") + parser_eval.add_argument('--seed', default=0, type=int, help="random seed.") + parser_eval.add_argument('--batch_size', default=64, type=int) + parser_eval.add_argument('--normalize', default=True, type=bool, help="features normalization") + parser_eval.add_argument('--model_cache_dir', default=None, type=str, help="directory to where downloaded models are cached") + parser_eval.add_argument('--feature_root', default="features", type=str, help="feature root folder where the features are stored.") + parser_eval.add_argument('--annotation_file', default="", type=str, help="text annotation file for retrieval datasets. Only needed for when `--task` is `zeroshot_retrieval`.") + parser_eval.add_argument('--custom_classname_file', default=None, type=str, help="use custom json file with classnames for each dataset, where keys are dataset names and values are list of classnames.") + parser_eval.add_argument('--custom_template_file', default=None, type=str, help="use custom json file with prompts for each dataset, where keys are dataset names and values are list of prompts. For instance, to use CuPL prompts, use --custom_template_file='cupl_prompts.json'") + parser_eval.add_argument('--dump_classnames', default=False, action="store_true", help="dump classnames to the results json file.") + parser_eval.add_argument('--dump_templates', default=False, action="store_true", help="dump templates to the results json file.") + + parser_eval.add_argument('--language', default="en", type=str, nargs="+", help="language(s) of classname and prompts to use for zeroshot classification.") + parser_eval.add_argument('--output', default="result.json", type=str, help="output file where to dump the metrics. Can be in form of a template, e.g., --output='{dataset}_{pretrained}_{model}_{language}_{task}.json'") + parser_eval.add_argument('--quiet', dest='verbose', action="store_false", help="suppress verbose messages") + parser_eval.add_argument('--save_clf', default=None, type=str, help="optionally save the classification layer output by the text tower") + parser_eval.add_argument('--load_clfs', nargs='+', default=[], type=str, help="optionally load and average mutliple layers output by text towers.") + parser_eval.add_argument('--skip_existing', default=False, action="store_true", help="whether to skip an evaluation if the output file exists.") + parser_eval.add_argument('--model_type', default="open_clip", type=str, choices=MODEL_TYPES, help="clip model type") + parser_eval.add_argument('--wds_cache_dir', default=None, type=str, help="optional cache directory for webdataset only") + parser_eval.add_argument("--extra_args", default=None, type=str, help="optional extra_args to support quantized model initialization") + parser_eval.set_defaults(which='eval') + + parser_build = subparsers.add_parser('build', help='Build CSV from evaluations') + parser_build.add_argument('files', type=str, nargs="+", help="path(s) of JSON result files") + parser_build.add_argument('--output', type=str, default="benchmark.csv", help="CSV output file") + parser_build.set_defaults(which='build') + + args = parser.parse_args() + return parser, args + +def main(): + parser, base = get_parser_args() + if not hasattr(base, "which"): + parser.print_help() + return + if base.which == "eval": + main_eval(base) + elif base.which == "build": + main_build(base) + +def main_build(base): + # Build a benchmark single CSV file from a set of evaluations (JSON files) + rows = [] + fieldnames = set() + def process_file(path: str): + data = json.load(open(path)) + row = {} + row.update(data["metrics"]) + row.update(data) + del row["metrics"] + row['model_fullname'] = row['model'] + ' ' + row['pretrained'] + for field in row.keys(): + fieldnames.add(field) + rows.append(row) + for path in base.files: + if os.path.isdir(path): + files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith(".json")] + for file in files: + process_file(file) + else: + process_file(path) + with open(base.output, 'w') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + writer.writeheader() + for row in rows: + writer.writerow(row) + +def main_eval(base): + # Get list of pre-trained models to evaluate + pretrained_model = _as_list(base.pretrained_model) + if pretrained_model: + models = [] + for name in pretrained_model: + if os.path.isfile(name): + # if path, read file, each line is a pre-trained model + models.extend(get_model_collection_from_file(name)) + elif name in model_collection: + # if part of `model_collection`, retrieve from it + models.extend(model_collection[name]) + else: + # if not, assume it is in the form of `model,pretrained` + model, pretrained = name.split(',') + models.append((model, pretrained)) + else: + models = list(product(base.model, base.pretrained)) + + # Ge list of datasets to evaluate on + datasets = [] + for name in _as_list(base.dataset): + if os.path.isfile(name): + # If path, read file, each line is a dataset name + datasets.extend(get_dataset_collection_from_file(name)) + elif name in dataset_collection: + # if part of `dataset_collection`, retrieve from it + datasets.extend(dataset_collection[name]) + else: + # if not, assume it is simply the name of the dataset + datasets.append(name) + + train_splits = _as_list(base.train_split) + train_splits = _single_option_to_multiple_datasets(train_splits, datasets, "train_split") + proportions, val_splits = None, None + if base.val_split is not None: + val_splits = _as_list(base.val_split) + val_splits = _single_option_to_multiple_datasets(val_splits, datasets, "val_split") + if base.val_proportion is not None: + proportions = _as_list(base.val_proportion) + proportions = _single_option_to_multiple_datasets(proportions, datasets, "val_proportion") + + dataset_info = {} + for i in range(len(datasets)): + dataset_info[datasets[i]] = { + "train_split": train_splits[i], + "val_split": val_splits[i] if val_splits is not None else None, + "proportion": proportions[i] if proportions is not None else None + } + + # Get list of languages to evaluate on + languages = _as_list(base.language) + + if base.verbose: + print(f"Models: {models}") + print(f"Datasets: {datasets}") + print(f"Languages: {languages}") + runs = product(models, datasets, languages) + if base.distributed: + local_rank, rank, world_size = world_info_from_env() + runs = list(runs) + # randomize runs so that runs are balanced across gpus + random.seed(base.seed) + random.shuffle(runs) + runs = [r for i, r in enumerate(runs) if i % world_size == rank] + for (model, pretrained), (dataset), (language) in runs: + # We iterative over all possible model/dataset/languages + args = copy(base) + args.model = model + args.pretrained = pretrained + args.dataset = dataset + args.language = language + args.train_split = dataset_info[dataset]["train_split"] + args.val_split = dataset_info[dataset]["val_split"] + args.val_proportion = dataset_info[dataset]["proportion"] + run(args) + +def _as_list(l): + if not l: + return [] + return [l] if type(l) != list else l + +def _single_option_to_multiple_datasets(cur_option, datasets, name): + cur_len = len(cur_option) + ds_len = len(datasets) + if cur_len != ds_len: + # If user wants to use same value for all datasets + if cur_len == 1: + return [cur_option[0]] * ds_len + else: + raise ValueError(f"The incommensurable number of {name}") + else: + return cur_option + +def run(args): + """Console script for clip_benchmark.""" + if torch.cuda.is_available(): + if args.distributed: + local_rank, rank, world_size = world_info_from_env() + device = 'cuda:%d' % local_rank + torch.cuda.set_device(device) + else: + device = "cuda" + args.device = device + else: + args.device = "cpu" + # set seed. + torch.manual_seed(args.seed) + task = args.task + if args.dataset.startswith("wds/"): + dataset_name = args.dataset.replace("wds/", "", 1) + else: + dataset_name = args.dataset + if task == "auto": + task = get_dataset_default_task(dataset_name) + pretrained_slug = os.path.basename(args.pretrained) if os.path.isfile(args.pretrained) else args.pretrained + pretrained_slug_full_path = args.pretrained.replace('/', '_') if os.path.isfile(args.pretrained) else args.pretrained + dataset_slug = dataset_name.replace('/', '_') + output = args.output.format( + model=args.model, + pretrained=pretrained_slug, + pretrained_full_path=pretrained_slug_full_path, + task=task, + dataset=dataset_slug, + language=args.language + ) + if os.path.exists(output) and args.skip_existing: + if args.verbose: + print(f"Skip {output}, exists already.") + return + if args.verbose: + print(f"Running '{task}' on '{dataset_name}' with the model '{args.pretrained}' on language '{args.language}'") + dataset_root = args.dataset_root.format(dataset=dataset_name, dataset_cleaned=dataset_name.replace("/", "-")) + if args.skip_load: + model, transform, collate_fn, dataloader = None, None, None, None + else: + model, transform, tokenizer = load_clip( + model_type=args.model_type, + model_name=args.model, + pretrained=args.pretrained, + cache_dir=args.model_cache_dir, + device=args.device, + **simple_parse_args_string(args.extra_args) + ) + model.eval() + if args.model.count("nllb-clip") > 0: + # for NLLB-CLIP models, we need to set the language prior to running the tests + from clip_benchmark.models.nllb_clip import set_language + + set_language(tokenizer, args.language) + dataset = build_dataset( + dataset_name=args.dataset, + root=dataset_root, + transform=transform, + split=args.split, + annotation_file=args.annotation_file, + download=True, + language=args.language, + task=task, + custom_template_file=args.custom_template_file, + custom_classname_file=args.custom_classname_file, + wds_cache_dir=args.wds_cache_dir, + ) + collate_fn = get_dataset_collate_fn(args.dataset) + if args.verbose: + try: + print(f"Dataset size: {len(dataset)}") + except TypeError: + print("IterableDataset has no len()") + print(f"Dataset split: {args.split}") + if hasattr(dataset, "classes") and dataset.classes: + try: + print(f"Dataset classes: {dataset.classes}") + print(f"Dataset number of classes: {len(dataset.classes)}") + except AttributeError: + print("Dataset has no classes.") + + if args.dataset.startswith("wds/"): + dataloader = torch.utils.data.DataLoader( + dataset.batched(args.batch_size), batch_size=None, + shuffle=False, num_workers=args.num_workers, + ) + else: + dataloader = torch.utils.data.DataLoader( + dataset, batch_size=args.batch_size, + shuffle=False, num_workers=args.num_workers, + collate_fn=collate_fn + ) + if task == "zeroshot_classification": + zeroshot_templates = dataset.templates if hasattr(dataset, "templates") else None + if args.verbose: + print(f"Zero-shot templates: {zeroshot_templates}") + classnames = dataset.classes if hasattr(dataset, "classes") else None + assert (zeroshot_templates is not None and classnames is not None), "Dataset does not support classification" + metrics = zeroshot_classification.evaluate( + model, + dataloader, + tokenizer, + classnames, zeroshot_templates, + device=args.device, + amp=args.amp, + verbose=args.verbose, + save_clf=args.save_clf, + load_clfs=args.load_clfs, + ) + elif task == "zeroshot_retrieval": + metrics = zeroshot_retrieval.evaluate( + model, + dataloader, + tokenizer, + recall_k_list=args.recall_k, + device=args.device, + amp=args.amp + ) + elif task == "image_caption_selection": + metrics = image_caption_selection.evaluate( + model, + dataloader, + tokenizer, + device=args.device, + amp=args.amp, + ) + elif task == "linear_probe": + # we also need the train and validation splits for linear probing. + train_dataset = None + train_dataset = build_dataset( + dataset_name=args.dataset, + root=dataset_root, + transform=transform, + split=args.train_split, + annotation_file=args.annotation_file, + download=True, + ) + if args.val_split is not None: + val_dataset = build_dataset( + dataset_name=args.dataset, + root=dataset_root, + transform=transform, + split=args.val_split, + annotation_file=args.annotation_file, + download=True, + ) + elif args.val_proportion is not None: + train_dataset, val_dataset = torch.utils.data.random_split(train_dataset, [1 - args.val_proportion, args.val_proportion]) + else: + val_dataset = None + train_dataloader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, + shuffle=False, num_workers=args.num_workers, + collate_fn=collate_fn, pin_memory=True, + ) + if val_dataset is not None: + val_dataloader = torch.utils.data.DataLoader( + val_dataset, batch_size=args.batch_size, + shuffle=False, num_workers=args.num_workers, + collate_fn=collate_fn, pin_memory=True, + ) + else: + val_dataloader = None + metrics = linear_probe.evaluate( + model, + train_dataloader, + dataloader, + args.fewshot_k, + args.batch_size, + args.num_workers, + args.fewshot_lr, + args.fewshot_epochs, + (args.model + '-' + args.pretrained + '-' + args.dataset).replace('/', '_'), + args.seed, + args.feature_root, + val_dataloader=val_dataloader, + device=args.device, + normalize=args.normalize, + amp=args.amp, + verbose=args.verbose, + ) + elif task == "captioning": + metrics = captioning.evaluate( + model=model, + dataloader=dataloader, + batch_size=args.batch_size, + num_workers=args.num_workers, + device=args.device, + amp=args.amp, + verbose=args.verbose, + transform=transform + ) + else: + raise ValueError("Unsupported task: {}. task should be `zeroshot_classification`, `zeroshot_retrieval`, `linear_probe`, or `captioning`".format(task)) + dump = { + "dataset": args.dataset, + "model": args.model, + "pretrained": args.pretrained, + "task": task, + "metrics": metrics, + "language": args.language, + } + if hasattr(dataset, "classes") and dataset.classes and args.dump_classnames: + dump["classnames"] = dataset.classes + if hasattr(dataset, "templates") and dataset.templates and args.dump_templates: + dump["templates"] = dataset.templates + if args.verbose: + print(f"Dump results to: {output}") + with open(output, "w") as f: + json.dump(dump, f) + return dump + + +def world_info_from_env(): + # from openclip + local_rank = 0 + for v in ('LOCAL_RANK', 'MPI_LOCALRANKID', 'SLURM_LOCALID', 'OMPI_COMM_WORLD_LOCAL_RANK'): + if v in os.environ: + local_rank = int(os.environ[v]) + break + global_rank = 0 + for v in ('RANK', 'PMI_RANK', 'SLURM_PROCID', 'OMPI_COMM_WORLD_RANK'): + if v in os.environ: + global_rank = int(os.environ[v]) + break + world_size = 1 + for v in ('WORLD_SIZE', 'PMI_SIZE', 'SLURM_NTASKS', 'OMPI_COMM_WORLD_SIZE'): + if v in os.environ: + world_size = int(os.environ[v]) + break + return local_rank, global_rank, world_size + + +def simple_parse_args_string(args_string): + """ + Parses something like + args1=val1,arg2=val2 + Into a dictionary + """ + if not args_string: + return {} + args_string = args_string.strip() + pairs = [pair for pair in args_string.split(",") if pair] + args_dict = {k: arg_str_type(v) for k, v in [pair.split("=") for pair in pairs]} + return args_dict + + +def arg_str_type(arg): + if arg.lower() == "true": + return True + elif arg.lower() == "false": + return False + elif arg.isnumeric(): + return int(arg) + try: + return float(arg) + except ValueError: + return arg + + +if __name__ == "__main__": + sys.exit(main()) # pragma: no cover diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/__init__.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/ar_classnames.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/ar_classnames.json new file mode 100644 index 0000000000000000000000000000000000000000..41fe0dfdaa6a142c137e968c9f45441a5365cf0c --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/ar_classnames.json @@ -0,0 +1,1004 @@ +{ + "imagenet1k": [ + "\u0633\u0645\u0643 \u0627\u0644\u062a\u0646\u0634", + "\u0627\u0644\u0633\u0645\u0643\u0629 \u0627\u0644\u0630\u0647\u0628\u064a\u0629", + "\u0627\u0644\u0642\u0631\u0634 \u0627\u0644\u0623\u0628\u064a\u0636 \u0627\u0644\u0643\u0628\u064a\u0631", + "\u0627\u0644\u0642\u0631\u0634 \u0627\u0644\u0628\u0628\u0631\u064a", + "\u0627\u0644\u0642\u0631\u0634 \u0627\u0644\u0645\u0637\u0631\u0642\u0629", + "\u0633\u0645\u0643 \u0627\u0644\u0631\u0639\u0627\u062f", + "\u0633\u0645\u0643 \u0627\u0644\u0631\u0642\u064a\u0637\u0629", + "\u062f\u064a\u0643", + "\u062f\u062c\u0627\u062c\u0629", + "\u0646\u0639\u0627\u0645\u0629", + "\u0627\u0644\u0634\u0631\u0634\u0648\u0631 \u0627\u0644\u062c\u0628\u0644\u064a", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u062d\u0633\u0648\u0646", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u062a\u0641\u0627\u062d\u064a \u0627\u0644\u0627\u0648\u0631\u0648\u0628\u064a", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u062c\u0646\u0643 \u062f\u0627\u0643\u0646 \u0627\u0644\u0639\u064a\u0648\u0646", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u062f\u0631\u0633\u0629 \u0627\u0644\u0633\u0645\u0627\u0648\u064a", + "\u0637\u0627\u0626\u0631 \u0627\u0628\u0648 \u0627\u0644\u062d\u0646\u0627\u0621", + "\u0628\u0644\u0628\u0644", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0642\u064a\u0642", + "\u0639\u0642\u0639\u0642 \u0637\u0627\u0626\u0631 \u0627\u0644\u0630\u064a\u0644 \u0627\u0644\u0637\u0648\u064a\u0644", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0642\u0631\u0642\u0641", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u063a\u0637\u0627\u0633", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u062d\u062f\u0623\u0629", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0639\u0642\u0627\u0628 \u0627\u0644\u0631\u062e\u0645\u0629", + "\u0646\u0633\u0631", + "\u0627\u0644\u0628\u0648\u0645\u0629 \u0627\u0644\u0631\u0645\u0627\u062f\u064a\u0629", + "\u0627\u0644\u0633\u0645\u0646\u062f\u0631 \u0627\u0644\u0646\u0627\u0631\u064a", + "\u0644\u064a\u0633\u0648\u062a\u0631\u064a\u062a\u0648\u0646 \u0641\u0648\u0644\u062c\u0627\u0631\u064a\u0633", + "\u0627\u0644\u0633\u0645\u0646\u062f\u0631 \u0627\u0644\u0645\u0627\u0626\u064a", + "\u0627\u0644\u0633\u0645\u0646\u062f\u0631 \u0627\u0644\u0645\u0631\u0642\u0637", + "\u0627\u0644\u0633\u0645\u0646\u062f\u0631 \u0627\u0644\u0645\u0643\u0633\u064a\u0643\u064a", + "\u0636\u0641\u062f\u0639 \u0627\u0644\u062b\u0648\u0631 \u0627\u0644\u0627\u0645\u0631\u064a\u0643\u064a", + "\u0636\u0641\u062f\u0639 \u0627\u0644\u0634\u062c\u0631", + "\u0627\u0644\u0636\u0641\u0627\u062f\u0639 \u0630\u0627\u062a \u0627\u0644\u0630\u064a\u0644", + "\u0627\u0644\u0633\u0644\u062d\u0641\u0627\u0629 \u0627\u0644\u0628\u062d\u0631\u064a\u0629 \u0636\u062e\u0645\u0629 \u0627\u0644\u0631\u0623\u0633", + "\u0633\u0644\u062d\u0641\u0627\u0629 \u0627\u0644\u0645\u062d\u064a\u0637 \u062c\u0644\u062f\u064a\u0629 \u0627\u0644\u0638\u0647\u0631", + "\u0633\u0644\u062d\u0641\u0627\u0629 \u0627\u0644\u0637\u064a\u0646", + "\u0627\u0644\u0633\u0644\u062d\u0641\u0627\u0629 \u0630\u0627\u062a \u0638\u0647\u0631 \u0627\u0644\u0645\u0639\u064a\u0646", + "\u0633\u0644\u062d\u0641\u0627\u0629 \u0635\u0646\u062f\u0648\u0642\u064a\u0629", + "\u0627\u0644\u0648\u0632\u063a", + "\u0627\u0644\u0625\u063a\u0648\u0627\u0646\u0629", + "\u0627\u0644\u062d\u0631\u0628\u0627\u0621 \u0627\u0644\u062e\u0636\u0631\u0627\u0621", + "\u0627\u0644\u0633\u062d\u0627\u0644\u064a \u0627\u0644\u0635\u062d\u0631\u0627\u0648\u064a\u0629", + "\u0627\u0644\u0639\u064e\u0636\u0652\u0631\u064e\u0641\u064f\u0648\u0637", + " \u0633\u062d\u0644\u064a\u0629 \u0647\u062f\u0628 \u0627\u0644\u0639\u0646\u0642", + "\u0633\u062d\u0644\u064a\u0629 \u0627\u0644\u062a\u0645\u0633\u0627\u062d", + "\u0648\u062d\u0634 \u062c\u064a\u0644\u0627", + "\u0633\u062d\u0644\u064a\u0629 \u062e\u0636\u0631\u0627\u0621", + "\u062d\u0631\u0628\u0627\u0621 \u0627\u0641\u0631\u064a\u0642\u064a\u0629", + "\u062a\u0646\u064a\u0646 \u0643\u0648\u0645\u0648\u062f\u0648", + "\u0627\u0644\u062a\u0645\u0633\u0627\u062d \u0627\u0644\u0623\u0641\u0631\u064a\u0642\u064a", + "\u062a\u0645\u0633\u0627\u062d \u0627\u0644\u0642\u0627\u0637\u0648\u0631 \u0627\u0644\u0623\u0645\u0631\u064a\u0643\u064a", + "\u0627\u0644\u062f\u064a\u0646\u0627\u0635\u0648\u0631 \u062b\u064f\u0644\u0627\u062b\u064a\u064f\u0651 \u0627\u0644\u0642\u064f\u0631\u0648\u0646", + "\u0627\u0644\u062b\u0639\u0627\u0628\u064a\u0646 \u0627\u0644\u062f\u0648\u062f\u064a\u0629", + "\u0623\u0641\u0639\u0649 \u0627\u0644\u0637\u0648\u0642", + "\u0627\u0644\u0623\u0641\u0639\u0649 \u0627\u0644\u0646\u0641\u0627\u062b\u0629 ", + "\u0627\u0644\u0623\u0641\u0639\u0649 \u0627\u0644\u062e\u0636\u0631\u0627\u0621", + "\u0627\u0644\u062b\u0639\u0628\u0627\u0646 \u0627\u0644\u0645\u0644\u0643", + "\u0623\u0641\u0639\u0649 \u0627\u0644\u0631\u0628\u0627\u0637", + "\u0627\u0641\u0639\u0649 \u0627\u0644\u0645\u0627\u0621", + "\u062b\u0639\u0628\u0627\u0646 \u0646\u0628\u0627\u062a \u0643\u0631\u0645\u0629", + "\u0627\u0644\u062b\u0639\u0628\u0627\u0646 \u0627\u0644\u0644\u064a\u0644\u064a ", + "\u062b\u0639\u0628\u0627\u0646 \u0627\u0644\u0623\u0635\u0644\u0629 \u0627\u0644\u0639\u0627\u0635\u0631\u0629", + "\u0627\u0644\u062b\u0639\u0628\u0627\u0646 \u0627\u0644\u0635\u062e\u0631\u064a", + "\u0643\u0648\u0628\u0631\u0627 \u0647\u0646\u062f\u064a\u0629", + "\u0645\u0627\u0645\u0628\u0627 \u062e\u0636\u0631\u0627\u0621", + "\u0627\u0644\u063a\u064a\u062f\u0642\u0627\u0648\u0627\u062a", + "\u0627\u0644\u0623\u0641\u0639\u0649 \u0627\u0644\u0645\u0642\u0631\u0646\u0629", + "\u0627\u0644\u0623\u0641\u0639\u0649 \u0627\u0644\u062c\u0631\u0633\u064a\u0629 \u0630\u0627\u062a \u0627\u0644\u0635\u062f\u0631 \u0627\u0644\u0645\u0627\u0633\u064a", + "\u0627\u0641\u0639\u0649 \u0644\u0627\u0641\u0651\u0629 \u0627\u0644\u062c\u0646\u0628", + "\u0645\u0641\u0635\u0644\u064a\u0627\u062a \u062b\u0644\u0627\u062b\u064a\u0629 \u0627\u0644\u0641\u0635\u0648\u0635", + "\u062d\u0634\u0631\u0629 \u0627\u0644\u0639\u0646\u0643\u0628\u0648\u062a \u0630\u0627\u062a \u0627\u0644\u0642\u0648\u0627\u0626\u0645 \u0627\u0644\u0637\u0648\u064a\u0644\u0629", + "\u0639\u0642\u0631\u0628", + "\u0639\u0646\u0643\u0628\u0648\u062a \u0627\u0644\u062d\u062f\u064a\u0642\u0629 \u0630\u0627 \u0627\u0644\u0644\u0648\u0646 \u0627\u0644\u0623\u0633\u0648\u062f \u0648\u0627\u0644\u0623\u0635\u0641\u0631 ", + "\u0639\u0646\u0643\u0628\u0648\u062a \u0627\u0644\u062d\u0638\u064a\u0631\u0629", + "\u0639\u0646\u0643\u0628\u0648\u062a \u0627\u0644\u062d\u062f\u064a\u0642\u0629 \u0627\u0644\u0623\u0648\u0631\u0628\u064a", + "\u0639\u0646\u0643\u0628\u0648\u062a \u0627\u0644\u0623\u0631\u0645\u0644\u0629 \u0627\u0644\u0633\u0648\u062f\u0627\u0621", + "\u0639\u0646\u0643\u0628\u0648\u062a \u0631\u062a\u064a\u0644\u0627\u0621 \u0630\u0627\u062a \u0623\u0631\u062c\u0644 \u062d\u0645\u0631\u0627\u0621", + "\u0627\u0644\u0639\u0646\u0643\u0628\u0648\u062a \u0627\u0644\u0630\u0626\u0628\u064a", + "\u0639\u0646\u0643\u0628\u0648\u062a \u0627\u0644\u0642\u064f\u0631\u064e\u0627\u062f", + "\u062d\u0634\u0631\u0629 \u0623\u0645 \u0623\u0631\u0628\u0639\u0629 \u0648\u0623\u0631\u0628\u0639\u064a\u0646", + "\u062f\u062c\u0627\u062c\u0629 \u0627\u0644\u0637\u0647\u064a\u0648\u062c \u0627\u0644\u0623\u0633\u0648\u062f", + "\u062f\u062c\u0627\u062c\u0629 \u062a\u0631\u0645\u062c\u0627\u0646", + "\u062f\u062c\u0627\u062c\u0629 \u0637\u064a\u0647\u0648\u062c \u0645\u0637\u0648\u0642", + "\u062f\u062c\u0627\u062c\u0629 \u0627\u0644\u0637\u0647\u0628\u0648\u062c", + "\u0627\u0644\u0637\u0627\u0648\u0648\u0633", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0633\u0645\u0627\u0646", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u062d\u062c\u0644", + "\u0627\u0644\u0628\u0628\u063a\u0627\u0621 \u0627\u0644\u0631\u0645\u0627\u062f\u064a", + "\u0628\u0628\u063a\u0627\u0621 \u0645\u0643\u0627\u0648", + "\u0628\u0628\u063a\u0627\u0621 \u0643\u0648\u0643\u0627\u062a\u0648 \u0643\u0628\u0631\u064a\u062a\u064a \u0627\u0644\u0639\u0631\u0641", + "\u0628\u0628\u063a\u0627\u0621 \u0642\u0648\u0633 \u0642\u0632\u062d", + "\u0637\u064a\u0631 \u0627\u0644\u0648\u0642\u0648\u0627\u0642 \u0643\u0648\u0643\u0627\u0644", + "\u0637\u064a\u0631 \u0648\u0631\u0648\u0627\u0631 ", + "\u0637\u064a\u0631 \u0623\u0628\u0648 \u0642\u0631\u0646", + "\u0627\u0644\u0637\u0627\u0626\u0631 \u0627\u0644\u0637\u0646\u0627\u0646", + "\u0637\u064a\u0648\u0631 \u0627\u0644\u064a\u0642\u0645\u064e\u0631", + "\u0637\u0627\u0626\u0631 \u0645\u0637\u0648\u0642", + "\u0630\u0643\u0631 \u0627\u0644\u0628\u0637", + "\u0627\u0644\u0628\u0637\u0629 \u0627\u0644\u063a\u0648\u0627\u0635\u0629 \u062d\u0645\u0631\u0627\u0621 \u0627\u0644\u0635\u062f\u0631", + "\u0625\u0648\u0632\u0629", + "\u0627\u0644\u0625\u0648\u0632\u0629 \u0633\u0648\u062f\u0627\u0621", + "\u0627\u0644\u0641\u064a\u0644", + " \u0622\u0643\u0644 \u0627\u0644\u0646\u0645\u0644 \u0627\u0644\u0634\u0648\u0643\u064a", + "\u062e\u0644\u062f \u0627\u0644\u0645\u0627\u0621", + "\u0648\u0644\u0628", + "\u0643\u0648\u0627\u0644\u0627", + "\u0627\u0644\u0648\u0645\u0628\u062a\u064a\u0627\u062a", + "\u0642\u0646\u062f\u064a\u0644 \u0628\u062d\u0631", + "\u0634\u0642\u0627\u0626\u0642 \u0646\u0639\u0645\u0627\u0646 \u0627\u0644\u0628\u062d\u0631", + "\u0645\u0631\u062c\u0627\u0646 \u0627\u0644\u062f\u0645\u0627\u063a", + "\u062f\u064a\u062f\u0627\u0646 \u0645\u0633\u0637\u062d\u0629", + "\u062f\u064a\u062f\u0627\u0646 \u0623\u0633\u0637\u0648\u0627\u0646\u064a\u0629", + "\u0645\u062d\u0627\u0631\u0629", + "\u062d\u0644\u0632\u0648\u0646", + "\u0628\u0632\u0627\u0642", + "\u062d\u0644\u0632\u0648\u0646 \u0645\u0627\u0626\u064a", + "\u0631\u062e\u0648\u064a\u0627\u062a \u0628\u062d\u0631\u064a\u0647 \u062a\u0633\u0645\u0649 \u0627\u0644\u062e\u064a\u062a\u0648\u0646", + "\u0646\u0648\u062a\u064a\u0644\u0648\u0633 \u0627\u0644\u062d\u062c\u0631\u064a", + "\u0633\u0631\u0637\u0627\u0646 \u0627\u0644\u0628\u062d\u0631", + "\u0633\u0631\u0637\u0627\u0646 \u0627\u0644\u0628\u062d\u0631 \u0627\u0644\u0623\u0637\u0644\u0633\u064a", + "\u0627\u0644\u0633\u0631\u0637\u0627\u0646 \u0627\u0644\u0639\u0627\u0632\u0641", + "\u0645\u0644\u0643 \u0627\u0644\u0633\u0644\u0637\u0639\u0648\u0646", + "\u062c\u0631\u0627\u062f \u0627\u0644\u0628\u062d\u0631 \u0627\u0644\u0623\u0645\u0631\u064a\u0643\u064a", + "\u0643\u0631\u0643\u0646\u062f \u0634\u0627\u0626\u0643", + "\u062c\u0631\u0627\u062f \u0627\u0644\u0645\u064a\u0627\u0647 \u0627\u0644\u0639\u0630\u0628\u0629", + "\u0627\u0644\u0633\u0631\u0637\u0627\u0646 \u0627\u0644\u0646\u0627\u0633\u0643", + "\u0645\u062a\u0633\u0627\u0648\u064a\u0627\u062a \u0627\u0644\u0623\u0642\u062f\u0627\u0645", + "\u0644\u0642\u0644\u0642 \u0623\u0628\u064a\u0636", + "\u0644\u0642\u0644\u0642 \u0623\u0633\u0648\u062f", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0628\u062c\u0639 \u0627\u0644\u0645\u0633\u0645\u0649 \u0623\u0628\u0648 \u0645\u0644\u0639\u0642\u0629", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0641\u0644\u0627\u0645\u064a\u0646\u063a\u0648", + "\u0637\u0627\u0626\u0631 \u0628\u0644\u0634\u0648\u0646 \u0627\u0644\u0623\u0632\u0631\u0642 \u0627\u0644\u0635\u063a\u064a\u0631", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0628\u0644\u0634\u0648\u0646 \u0627\u0644\u0623\u0628\u064a\u0636 \u0627\u0644\u0643\u0628\u064a\u0631", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0639\u062c\u0627\u062c", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0643\u0631\u0643\u064a\u0629", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0631\u0637\u0627\u0633", + "\u062f\u062c\u0627\u062c\u0629 \u0627\u0644\u0645\u0627\u0621 \u0627\u0644\u0623\u0631\u062c\u0648\u0627\u0646\u064a\u0629", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u063a\u0631 \u0627\u0644\u0623\u0645\u0631\u064a\u0643\u064a", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u062d\u0628\u0627\u0631", + "\u0637\u0627\u0626\u0631 \u0642\u0646\u0628\u0631\u0629 \u0627\u0644\u0645\u0627\u0621 \u0627\u0644\u0645\u062a\u0648\u0631\u062f", + "\u0637\u0627\u0626\u0631 \u062f\u0631\u064a\u062c\u0629 \u0623\u0644\u0628\u064a\u0629", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0637\u064a\u0637\u0648\u064a \u0623\u062d\u0645\u0631 \u0627\u0644\u0633\u0627\u0642", + "\u0639\u064e\u062f\u0651\u0627\u0621 \u0627\u0644\u0645\u0633\u062a\u0646\u0642\u0639\u0627\u062a \u0623\u0648 \u0627\u0644\u062f\u0651\u062a\u0634\u0631", + "\u0635\u0627\u0626\u062f \u0627\u0644\u0645\u062d\u0627\u0631", + "\u0628\u062c\u0639\u0629", + "\u0627\u0644\u0628\u0637\u0631\u064a\u0642 \u0627\u0644\u0645\u0644\u0643", + "\u0637\u0627\u0626\u0631 \u0627\u0644\u0642\u0637\u0631\u0633", + "\u0627\u0644\u062d\u0648\u062a \u0627\u0644\u0631\u0645\u0627\u062f\u064a \u0627\u0644\u0635\u0644\u0628", + "\u0627\u0644\u062d\u064f\u0648\u062a\u064f \u0627\u0644\u0642\u0627\u062a\u0650\u0644\u064f", + "\u0628\u0642\u0631\u0629 \u0627\u0644\u0628\u062d\u0631", + "\u0623\u0633\u062f \u0627\u0644\u0628\u062d\u0631", + "\u0643\u0644\u0628 \u0634\u064a\u0648\u0627\u0648\u0627", + "\u0643\u0644\u0628 \u0627\u0644\u0630\u0642\u0646 \u0627\u0644\u064a\u0627\u0628\u0627\u0646\u064a", + "\u0643\u0644\u0628 \u0645\u0627\u0644\u0637\u064a", + "\u0643\u0644\u0628 \u0628\u0643\u064a\u0646\u064a", + "\u0643\u0644\u0628 \u062a\u0634\u064a\u0647 \u062a\u0632\u0648 \u0627\u0644\u0635\u064a\u0646\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0645\u0644\u0643 \u062a\u0634\u0627\u0631\u0644\u0632", + "\u0643\u0644\u0628 \u0628\u0627\u0628\u064a\u0644\u0648\u0646", + "\u0643\u0644\u0628 \u0627\u0644\u062a\u0631\u064a\u0631 \u0627\u0644\u0639\u0631\u0636", + "\u0643\u0644\u0627\u0628 \u0631\u064a\u062f\u062c \u0628\u0627\u0643", + "\u0643\u0644\u0628 \u0627\u0644\u0635\u064a\u062f \u0627\u0644\u0623\u0641\u063a\u0627\u0646\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0628\u0627\u0633\u0637", + "\u0643\u0644\u0628 \u0628\u064a\u063a\u0644", + "\u0643\u0644\u0628 \u0627\u0644\u062f\u0645\u0648\u0645", + "\u0643\u0644\u0628 \u0628\u0644\u0648\u064a\u062a\u064a\u0643 \u0643\u0648\u0646\u0647\u0648\u0646\u062f", + "\u0643\u0644\u0628 \u0643\u0648\u0646\u0647\u0648\u0646\u062f \u0627\u0644\u0628\u0646\u064a \u0648\u0627\u0644\u0623\u0633\u0648\u062f", + "\u0643\u0644\u0628 \u0627\u0644\u0648\u0648\u0643\u0631", + "\u0643\u0644\u0628 \u0635\u064a\u062f \u0627\u0644\u062b\u0639\u0627\u0644\u0628 \u0627\u0644\u0625\u0646\u062c\u0644\u064a\u0632\u064a", + "\u0643\u0644\u0628 \u0631\u064a\u062f\u0628\u0648\u0646 \u0643\u0648\u0646\u0647\u0648\u0646\u062f", + "\u0643\u0644\u0628 \u0628\u0648\u0631\u0632\u0648\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0630\u0626\u0628 \u0627\u0644\u0627\u064a\u0631\u0644\u0646\u062f\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0633\u0644\u0648\u0642\u064a \u0627\u0644\u0627\u064a\u0637\u0627\u0644\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0648\u064a\u0628\u062a", + "\u0643\u0644\u0628 \u0627\u064a\u0628\u064a\u0632\u0627\u0646 \u0647\u0648\u0646\u062f", + "\u0627\u0644\u0643\u0644\u0628 \u0627\u0644\u0646\u0631\u0648\u064a\u062c\u064a", + "\u0643\u0644\u0628 \u0623\u0648\u062a\u064a\u0631 \u0647\u0627\u0648\u0646\u062f", + "\u0643\u0644\u0628 \u0633\u0644\u0648\u0642\u064a", + "\u0643\u0644\u0628 \u062f\u064a\u0631 \u0647\u0627\u0648\u0646\u062f \u0627\u0644\u0627\u0633\u0643\u062a\u0644\u0646\u062f\u064a", + "\u0643\u0644\u0628 \u0648\u0627\u064a\u0645\u0631\u064a", + "\u0643\u0644\u0628 \u0633\u062a\u0627\u0641\u0648\u0631\u062f\u0634\u0627\u064a\u0631 \u0628\u0648\u0644 \u062a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0633\u062a\u0627\u0641\u0648\u0631\u062f\u0634\u0627\u064a\u0631 \u0627\u0644\u0623\u0645\u0631\u064a\u0643\u064a", + "\u0643\u0644\u0628 \u0628\u064a\u062f\u0644\u064a\u0646\u062c\u062a\u0648\u0646 \u062a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u0628\u0648\u0631\u062f\u0631 \u062a\u064a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0643\u064a\u0631\u064a \u0628\u0644\u0648 \u062a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u062a\u0631\u064a\u0631 \u0627\u0644\u0625\u064a\u0631\u0644\u0646\u062f\u064a", + "\u0643\u0644\u0628 \u0646\u0648\u0631\u0641\u0648\u0644\u0643 \u062a\u064a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0646\u0648\u0631\u064a\u062a\u0634 \u062a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u064a\u0648\u0631\u0643 \u0634\u0627\u064a\u0631", + "\u0643\u0644\u0628 \u0648\u064a\u0631 \u0641\u0648\u0643\u0633 \u062a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0644\u064a\u0643\u0644\u0627\u0646\u062f \u062a\u064a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0633\u064a\u0627\u0644\u064a\u0647\u0627\u0645 \u062a\u064a\u0631\u064a\u0631", + "\u0643\u0644\u0627\u0628 \u0627\u0644\u0623\u0631\u062f\u064a\u0644", + "\u0643\u0644\u0628 \u0643\u064a\u0631\u0646 \u062a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u062a\u0631\u064a\u0631 \u0627\u0633\u062a\u0631\u0627\u0644\u064a", + "\u0643\u0644\u0628 \u062f\u0627\u0646\u062f\u064a \u062f\u064a\u0646\u0645\u0648\u0646\u062a", + "\u0643\u0644\u0628 \u0628\u0648\u0633\u0637\u0646 \u062a\u064a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0634\u0646\u0627\u0648\u062a\u0633\u0631 \u0645\u0646\u0645\u0646\u0645", + "\u0643\u0644\u0628 \u0634\u0646\u0627\u0648\u062a\u0633\u0631 \u0627\u0644\u0639\u0645\u0644\u0627\u0642", + "\u0643\u0644\u0628 \u0634\u0646\u0627\u0648\u062a\u0633\u0631 \u0627\u0644\u0639\u0627\u062f\u064a", + "\u0627\u0644\u0643\u0644\u0628 \u0627\u0644\u0627\u0633\u0643\u062a\u0644\u0646\u062f\u064a", + "\u0643\u0644\u0628 \u062a\u0631\u064a\u0631 \u0627\u0644\u062a\u0628\u062a", + "\u0643\u0644\u0628 \u0633\u064a\u0644\u0643\u064a \u062a\u064a\u0631\u064a\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u062a\u064a\u0631\u064a\u0631 \u0627\u0644\u0642\u0645\u062d\u064a \u0627\u0644\u0646\u0627\u0639\u0645", + "\u0643\u0644\u0628 \u0648\u064a\u0633\u062a\u064a", + "\u0643\u0644\u0628 \u0644\u0627\u0633\u0627 \u0623\u0628\u0633\u0648", + "\u0643\u0644\u0628 \u0627\u0644\u0645\u0633\u062a\u0631\u062f \u0627\u0644\u0630\u0647\u0628\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0645\u0633\u062a\u0631\u062f \u0645\u062c\u0639\u062f \u0627\u0644\u0634\u0639\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u0645\u0633\u062a\u0631\u062f \u0627\u0644\u0630\u0647\u0628\u064a", + "\u0643\u0644\u0628 \u0644\u0627\u0628\u0631\u0627\u062f\u0648\u0631 \u0631\u064a\u062a\u0631\u064a\u0641\u0631", + "\u0643\u0644\u0628 \u0634\u064a\u0633\u0628\u064a\u0643\u0627", + "\u0643\u0644\u0628 \u0628\u0648\u064a\u0646\u062a\u0631 \u0627\u0644\u0623\u0644\u0645\u0627\u0646\u064a \u0642\u0635\u064a\u0631 \u0627\u0644\u0634\u0639\u0631", + "\u0643\u0644\u0628 \u0641\u064a\u0632\u0644\u0627", + "\u0643\u0644\u0628 \u0633\u064a\u062a\u0631 \u0627\u0644\u0625\u0646\u062c\u0644\u064a\u0632\u064a", + "\u0643\u0644\u0628 \u0633\u064a\u062a\u0631 \u0627\u0644\u0625\u064a\u0631\u0644\u0646\u062f\u064a", + "\u0643\u0644\u0628 \u0633\u064a\u062a\u0631 \u0627\u0644\u062c\u0648\u0631\u062f\u0648\u0646\u064a", + "\u0643\u0644\u0628 \u0628\u0631\u064a\u062a\u0627\u0646\u064a \u0633\u0628\u0627\u0646\u064a\u0644", + "\u0643\u0644\u0628 \u0642\u0644\u0645\u0628\u0631", + "\u0643\u0644\u0628 \u0633\u0628\u0631\u064a\u0646\u063a\u0631 \u0633\u0628\u0627\u0646\u064a\u0644 \u0627\u0644\u0625\u0646\u062c\u0644\u064a\u0632\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0633\u0628\u0631\u064a\u0646\u063a\u0631 \u0627\u0644\u0648\u064a\u0644\u0632\u064a", + "\u0643\u0644\u0628 \u062f\u0644\u0644 \u0627\u0644\u0630\u0644\u064a\u0644", + "\u0643\u0644\u0628 \u0627\u0644\u0633\u0627\u0643\u0633 \u0627\u0644\u0625\u0633\u0628\u0627\u0646\u064a", + "\u0643\u0644\u0628 \u0633\u0628\u0627\u064a\u0646\u0644 \u0627\u0644\u0645\u0627\u0621 \u0627\u0644\u0625\u064a\u0631\u0644\u0646\u062f\u064a", + "\u0643\u0644\u0628 \u0643\u0648\u0641\u0627\u0632", + "\u0643\u0644\u0628 \u0634\u064a\u0628\u0631\u0643", + "\u0643\u0644\u0628 \u062c\u0631\u0648\u0646\u064a\u0646\u062f\u064a\u0644", + "\u0643\u0644\u0628 \u0645\u0627\u0644\u064a\u0646\u0648", + "\u0643\u0644\u0628 \u0628\u0631\u064a\u0627\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u0643\u0644\u064a\u0628\u064a \u0627\u0644\u0625\u0633\u062a\u0631\u0627\u0644\u064a", + "\u0643\u0644\u0628 \u0643\u0648\u0645\u0648\u0646\u062f\u0648\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u0631\u0627\u0639\u064a \u0627\u0644\u0625\u0646\u062c\u0644\u064a\u0632\u064a \u0627\u0644\u0642\u062f\u064a\u0645", + "\u0643\u0644\u0628 \u0627\u0644\u0631\u0627\u0639\u064a \u0627\u0644\u0634\u062a\u0644\u0646\u062f\u0649", + "\u0643\u0644\u0628 \u0627\u0644\u0643\u0648\u0644\u064a", + "\u0643\u0644\u0628 \u0628\u0648\u0631\u062f\u0631 \u0643\u0648\u0644\u064a", + "\u0643\u0644\u0628 \u0628\u0648\u0641\u064a \u062f\u064a \u0641\u0644\u0627\u0646\u062f\u0631", + "\u0643\u0644\u0628 \u0631\u0648\u062a \u0648\u0627\u064a\u0644\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u0631\u0627\u0639\u064a \u0627\u0644\u0623\u0644\u0645\u0627\u0646\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u062f\u0648\u0628\u064a\u0631\u0645\u0627\u0646", + "\u0643\u0644\u0628 \u0628\u064a\u0646\u0634\u0631 \u0627\u0644\u0645\u0635\u063a\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u062c\u0628\u0644 \u0627\u0644\u0633\u0648\u064a\u0633\u0631\u064a", + "\u0643\u0644\u0628 \u062c\u0628\u0644 \u0627\u0644\u0628\u0631\u0646\u064a\u0632", + "\u0643\u0644\u0628 \u0627\u067e\u064a\u0646\u0632\u064a\u0644\u064a\u0631 \u0633\u064a\u0646\u064a\u0646\u0647\u0648\u0646\u062f", + "\u0643\u0644\u0628 \u0627\u0646\u062a\u0644\u0628\u062a\u0634\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u0628\u0648\u0643\u0633\u0631", + "\u0643\u0644\u0628 \u0628\u0648\u0644 \u0645\u0627\u0633\u062a\u064a\u0641", + "\u0643\u0644\u0628 \u0627\u0644\u0645\u0627\u0633\u062a\u064a\u0641 \u0627\u0644\u062a\u064a\u0628\u062a\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0628\u0648\u0644\u062f\u0648\u063a \u0627\u0644\u0641\u0631\u0646\u0633\u064a", + "\u0627\u0644\u0643\u0644\u0628 \u0627\u0644\u062f\u0627\u0646\u0645\u0627\u0631\u0643\u064a \u0627\u0644\u0636\u062e\u0645", + "\u0643\u0644\u0628 \u0633\u0627\u0646\u062a \u0628\u0631\u0646\u0627\u0631\u062f", + "\u0643\u0644\u0628 \u0627\u0644\u0647\u0627\u0633\u0643\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0645\u0644\u0645\u0648\u062a \u0627\u0644\u0623\u0644\u0627\u0633\u0643\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0647\u0633\u0643\u064a \u0627\u0644\u0633\u064a\u0628\u064a\u0631\u064a", + "\u0643\u0644\u0628 \u062f\u0644\u0645\u0627\u0633\u064a \u0627\u0644\u0645\u0631\u0642\u0637", + "\u0643\u0644\u0628 \u0623\u0641\u064a\u0646\u0628\u064a\u0646\u0634\u0631", + "\u0643\u0644\u0628 \u0628\u0627\u0633\u0646\u062c\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u0628\u062c", + "\u0643\u0644\u0628 \u0644\u064a\u0648\u0646 \u0628\u064a\u0631\u062c\u0631", + "\u0643\u0644\u0628 \u0646\u064a\u0648\u0641\u0627\u0648\u0646\u062f\u0644\u0627\u0646\u062f", + "\u0643\u0644\u0640\u0628 \u062c\u0628\u0627\u0644 \u0627\u0644\u0628\u0631\u0627\u0646\u0633", + "\u0643\u0644\u0628 \u0633\u0627\u0645\u0648\u062f\u064a", + "\u0643\u0644\u0628 \u0628\u0648\u0645\u064a\u0631\u0627\u0646\u064a\u0627\u0646", + "\u0643\u0644\u0628 \u0627\u0644\u062a\u0634\u0627\u0648 \u062a\u0634\u0627\u0648", + "\u0643\u0644\u0628 \u0627\u0644\u0643\u064a\u0634\u0648\u0646\u062f", + "\u0643\u0644\u0628 \u0627\u0644\u062c\u0631\u064a\u0641\u0648\u0646", + "\u0643\u0644\u0628\u0628 \u0628\u064a\u0645\u0628\u0631\u0648\u0643 \u0648\u064a\u0644\u0634 \u0643\u0648\u0631\u062c\u0649", + "\u0643\u0644\u0628 \u0627\u0644\u0643\u0627\u0631\u062f\u064a\u062c\u0627\u0646", + "\u0643\u0644\u0628 \u0627\u0644\u062a\u0648\u064a \u0627\u0644\u0628\u0648\u062f\u0644", + "\u0643\u0644\u0628 \u0627\u0644\u0628\u0648\u062f\u0644 \u0627\u0644\u0635\u063a\u064a\u0631", + "\u0643\u0644\u0628 \u0627\u0644\u0628\u0648\u062f\u0644 \u0627\u0644\u0642\u064a\u0627\u0633\u064a", + "\u0627\u0644\u0643\u0644\u0628 \u0627\u0644\u0645\u0643\u0633\u064a\u0643\u064a \u0628\u0644\u0627 \u0634\u0639\u0631", + "\u0627\u0644\u0630\u0626\u0628 \u0627\u0644\u0631\u0645\u0627\u062f\u064a", + "\u0627\u0644\u0630\u0626\u0628 \u0627\u0644\u0623\u0628\u064a\u0636", + "\u0627\u0644\u0630\u0626\u0628 \u0627\u0644\u0623\u062d\u0645\u0631", + "\u0627\u0644\u0642\u064a\u0648\u0637", + "\u0627\u0644\u0643\u0644\u0628 \u0627\u0644\u0625\u0633\u062a\u0631\u0627\u0644\u064a", + "\u0643\u0644\u0628 \u0627\u0644\u062f\u0648\u0644", + "\u0627\u0644\u0643\u0644\u0628 \u0627\u0644\u0628\u0631\u064a \u0627\u0644\u0625\u0641\u0631\u064a\u0642\u064a", + "\u0627\u0644\u0636\u0628\u0639", + "\u0627\u0644\u062b\u0639\u0644\u0628 \u0627\u0644\u0623\u062d\u0645\u0631", + "\u0627\u0644\u062b\u0639\u0644\u0628 \u0627\u0644\u0642\u0632\u0645", + "\u0627\u0644\u062b\u0639\u0644\u0628 \u0627\u0644\u0642\u0637\u0628\u064a", + "\u0627\u0644\u062b\u0639\u0644\u0628 \u0627\u0644\u0631\u0645\u0627\u062f\u064a", + "\u0627\u0644\u0642\u0637\u0637 \u0627\u0644\u0646\u0645\u0631\u064a\u0629", + "\u0627\u0644\u0633\u0646\u0648\u0631 \u0627\u0644\u0645\u064f\u0631\u0642\u0637 \u0627\u0644\u0635\u063a\u064a\u0631", + "\u0642\u0637 \u0634\u064a\u0631\u0627\u0632\u064a", + "\u0627\u0644\u0642\u0637 \u0627\u0644\u0633\u064a\u0627\u0645\u064a", + "\u0642\u0637 \u0644\u064a\u0628\u064a", + "\u0623\u0633\u062f \u0627\u0644\u062c\u0628\u0627\u0644", + "\u0627\u0644\u0648\u064e\u0634\u064e\u0642", + "\u0646\u0645\u0631 ", + "\u0646\u0645\u0631 \u0627\u0644\u062b\u0644\u0648\u062c", + "\u064a\u063a\u0648\u0631", + "\u0623\u0633\u062f", + "\u0627\u0644\u0628\u0628\u0631", + "\u0627\u0644\u0641\u0647\u062f", + "\u062f\u0628 \u0628\u0646\u064a", + "\u062f\u0628 \u0623\u0633\u0648\u062f \u0623\u0645\u0631\u064a\u0643\u064a", + "\u062f\u0628 \u0642\u0637\u0628\u064a", + "\u0627\u0644\u062f\u0628 \u0627\u0644\u0643\u0633\u0644\u0627\u0646 ", + "\u0627\u0644\u0633\u0645\u0648\u0631\u064a\u0627\u062a", + "\u0633\u0631\u0642\u0627\u0637", + "\u062e\u0646\u0627\u0641\u0633 \u0646\u0645\u0631\u064a\u0629", + "\u062f\u0639\u0633\u0648\u0642\u0629", + "\u062e\u0646\u0641\u0633\u0627\u0621 \u0623\u0631\u0636\u064a\u0629", + "\u062e\u0646\u0627\u0641\u0633 \u0637\u0648\u064a\u0644\u0629 \u0627\u0644\u0642\u0631\u0648\u0646 ", + "\u062e\u0646\u0641\u0633\u0629 \u0627\u0644\u0623\u0648\u0631\u0627\u0642", + "\u062e\u0646\u0627\u0641\u0633 \u0627\u0644\u0631\u0648\u062b", + "\u062e\u0646\u0641\u0633\u0627\u0621 \u0648\u062d\u064a\u062f \u0627\u0644\u0642\u0631\u0646", + "\u0627\u0644\u0633\u064f\u0648\u0633\u064a\u0646\u0627\u062a", + "\u062d\u0634\u0631\u0629 \u0630\u0648\u0627\u062a \u0627\u0644\u062c\u0646\u0627\u062d\u064a\u0646", + "\u0646\u062d\u0644", + "\u0627\u0644\u0646\u0645\u0644", + "\u062c\u0646\u062f\u0628", + "\u062d\u0634\u0631\u0629 \u0627\u0644\u0643\u0631\u064a\u0643\u064a\u062a", + "\u0627\u0644\u062d\u0634\u0631\u0629 \u0627\u0644\u0639\u0635\u0648\u064a\u0629", + "\u0635\u0631\u0635\u0648\u0631", + "\u0641\u0631\u0633 \u0627\u0644\u0646\u0628\u064a", + "\u062d\u0634\u0631\u0629 \u0632\u064a\u0632\u064a\u0627\u062a", + "\u0642\u0627\u0641\u0632\u0627\u062a \u0627\u0644\u0623\u0648\u0631\u0627\u0642", + "\u0639\u0631\u0642\u064a\u0627\u062a \u0627\u0644\u0623\u062c\u0646\u062d\u0629", + "\u0627\u0644\u064a\u0639\u0633\u0648\u0628", + "\u0645\u0642\u062a\u0631\u0646\u0627\u062a \u0627\u0644\u0623\u062c\u0646\u062d\u0629", + "\u0641\u0631\u0627\u0634\u0629 \u0628\u0634\u0648\u0631\u0629 \u0627\u0644\u0635\u064a\u0641", + "\u0641\u0631\u0627\u0634\u0629 \u062d\u0644\u064a\u0642\u0629", + "\u0641\u064e\u0631\u064e\u0627\u0634\u0629 \u0627\u0644\u0645\u064e\u0644\u0643", + "\u0641\u0631\u0627\u0634\u0629 \u0627\u0644\u0628\u064a\u0636\u0627\u0621 \u0627\u0644\u0635\u063a\u064a\u0631\u0629", + "\u0641\u0631\u0627\u0634\u0629 \u0627\u0644\u0643\u0628\u0631\u064a\u062a", + "\u0627\u0644\u0641\u0631\u0627\u0634\u0629 \u0627\u0644\u0646\u062d\u0627\u0633\u064a\u0629", + "\u0646\u062c\u0645 \u0627\u0644\u0628\u062d\u0631", + "\u0642\u0646\u0641\u0630 \u0627\u0644\u0628\u062d\u0631", + "\u062e\u064a\u0627\u0631 \u0627\u0644\u0628\u062d\u0631", + "\u0623\u0631\u0627\u0646\u0628 \u0642\u0637\u0646\u064a\u0629 \u0627\u0644\u0630\u064a\u0644", + "\u0623\u0631\u0646\u0628 \u0628\u0631\u064a", + "\u0627\u0644\u0623\u0646\u062c\u0648\u0631\u0627", + "\u0623\u0642\u062f\u0627\u062f", + "\u0627\u0644\u0646\u064a\u0635", + "\u0633\u0646\u062c\u0627\u0628 \u062b\u0639\u0644\u0628\u064a", + "\u0627\u0644\u0645\u0631\u0645\u0648\u0637", + "\u0627\u0644\u0642\u0646\u062f\u0633", + "\u0643\u0627\u0628\u064a\u0627\u0621 \u062e\u0646\u0632\u064a\u0631\u064a\u0629", + "\u0627\u0644\u062d\u0635\u0627\u0646 \u0627\u0644\u062d\u0645\u064a\u0636", + "\u0627\u0644\u062d\u0645\u0627\u0631 \u0627\u0644\u0645\u062e\u0637\u0637", + "\u0627\u0644\u062e\u0646\u0632\u064a\u0631 \u0627\u0644\u0623\u0644\u064a\u0641 \u0623\u0648 \u0627\u0644\u062e\u0646\u0632\u064a\u0631 \u0627\u0644\u0645\u0633\u062a\u0623\u0646\u0633", + "\u0627\u0644\u062e\u0646\u0632\u064a\u0631 \u0627\u0644\u0628\u0631\u064a ", + "\u062e\u0646\u0627\u0632\u064a\u0631 \u062a\u0624\u0644\u0648\u0644\u064a\u0629", + "\u0641\u0631\u0633 \u0627\u0644\u0646\u0647\u0631", + "\u0627\u0644\u062b\u0648\u0631", + "\u062c\u0627\u0645\u0648\u0633 \u0627\u0644\u0645\u0627\u0621", + "\u0627\u0644\u0628\u064a\u0633\u0648\u0646", + "\u0630\u0643\u0631 \u0627\u0644\u062e\u0631\u0648\u0641", + "\u0643\u0628\u0634 \u0627\u0644\u062c\u0628\u0627\u0644 \u0627\u0644\u0635\u062e\u0631\u064a\u0629", + "\u0627\u0644\u0648\u0639\u0644", + "\u062b\u064a\u062a\u0644 \u0627\u0644\u0647\u0631\u062a\u0628\u064a\u0633", + "\u0625\u0645\u0628\u0627\u0644\u0629", + "\u063a\u0632\u0627\u0644", + "\u0627\u0644\u062c\u0645\u0644 \u0627\u0644\u0639\u0631\u0628\u064a", + "\u0627\u0644\u0644\u0627\u0651\u0645\u0629", + "\u0627\u0628\u0646 \u0639\u0631\u0633", + "\u0627\u0644\u0645\u0646\u0643", + "\u0627\u0644\u0633\u0641\u0634\u0629", + "\u0627\u0628\u0646 \u0645\u0642\u0631\u0636 \u0623\u0633\u0648\u062f \u0627\u0644\u0623\u0642\u062f\u0627\u0645", + "\u0642\u0636\u0627\u0639\u0629", + "\u0638\u0631\u0628\u0627\u0646", + "\u0627\u0644\u063a\u0631\u064a\u0631", + "\u0627\u0644\u0645\u064f\u062f\u064e\u0631\u064e\u0651\u0639 \u0623\u0648 \u0627\u0644\u0623\u0631\u0645\u0627\u062f\u064a\u0644\u0644\u0648", + "\u0643\u0633\u0644\u0627\u0646 \u062b\u0644\u0627\u062b\u064a \u0627\u0644\u0623\u0635\u0627\u0628\u0639", + "\u0642\u0631\u062f \u0627\u0644\u0627\u0648\u0631\u0627\u0646\u063a\u0648\u062a\u0627\u0646", + "\u0627\u0644\u063a\u0648\u0631\u064a\u0644\u0627 \u0623\u0648 \u0627\u0644\u0642\u064f\u0631\u062f\u0648\u062d", + "\u0627\u0644\u0634\u0645\u0628\u0627\u0646\u0632\u064a \u0627\u0644\u0634\u0627\u0626\u0639 \u0623\u0648 \u0627\u0644\u0628\u064e\u0639\u0627\u0645", + "\u0642\u0631\u062f \u0627\u0644\u062c\u0628\u0648\u0646", + "\u0642\u0631\u062f \u0627\u0644\u0633\u064a\u0627\u0645\u0646\u062c", + "\u0633\u0639\u062f\u0627\u0646 \u0627\u0644\u063a\u064a\u0646\u0648\u0646", + "\u0633\u0639\u062f\u0627\u0646 \u0627\u0644\u0628\u0627\u062a\u0627\u0633", + "\u0627\u0644\u0631\u064f\u0628\u064e\u0651\u0627\u062d", + "\u0642\u0631\u062f \u0627\u0644\u0645\u0643\u0627\u0643", + "\u0642\u0631\u062f \u0627\u0644\u0643\u0648\u0644\u0628\u0633\u0627\u0648\u0627\u062a", + "\u0642\u0631\u062f \u0627\u0644\u0643\u0648\u0644\u0628\u0633", + "\u0642\u0631\u062f \u0627\u0644\u0645\u0644\u0645\u0644\u0629", + "\u0642\u0631\u0648\u062f \u0627\u0644\u0642\u0634\u0629", + "\u0642\u0631\u062f \u0627\u0644\u0643\u0628\u0648\u0634\u0629 \u0623\u0628\u064a\u0636 \u0627\u0644\u0648\u062c\u0647", + "\u0633\u0639\u062f\u0627\u0646 \u0627\u0644\u0639\u0648\u0627\u0621", + "\u0642\u0631\u062f \u0633\u0639\u062f\u0627\u0646 \u0627\u0644\u062a\u064a\u062a\u064a", + "\u0627\u0644\u0633\u064e\u0651\u0639\u062f\u0627\u0646 \u0627\u0644\u0639\u0646\u0643\u0628\u0648\u062a\u064a", + "\u0627\u0644\u0633\u0639\u062f\u0627\u0646 \u0627\u0644\u0633\u0646\u062c\u0627\u0628\u064a", + "\u0644\u064a\u0645\u0648\u0631 \u062d\u0644\u0642\u064a \u0627\u0644\u0630\u064a\u0644", + "\u062d\u064a\u0648\u0627\u0646 \u0627\u0644\u0627\u0646\u062f\u0631\u064a", + "\u0641\u064a\u0644 \u0647\u0646\u062f\u064a", + "\u0641\u064a\u0644 \u0623\u0641\u0631\u064a\u0642\u064a", + "\u0627\u0644\u0628\u0627\u0646\u062f\u0627 \u0627\u0644\u0623\u062d\u0645\u0631", + "\u0627\u0644\u0628\u0627\u0646\u062f\u0627 \u0627\u0644\u0639\u0645\u0644\u0627\u0642\u0629", + "\u062b\u064a\u0631\u0633\u064a\u062a\u064a\u0627\u062a", + "\u0633\u0645\u0643 \u0627\u0644\u0627\u0646\u0642\u0644\u064a\u0633", + "\u0633\u0645\u0643 \u0627\u0644\u0643\u0648\u0647\u0648 \u0627\u0644\u0633\u064a\u0644\u0645\u0648\u0646", + "\u0633\u0645\u0643 \u0627\u0644\u062c\u0645\u0627\u0644 \u0627\u0644\u0635\u062e\u0631\u064a", + "\u0633\u0645\u0643\u0629 \u0627\u0644\u0645\u0647\u0631\u062c", + "\u0633\u0645\u0643\u0629 \u0627\u0644\u062d\u0641\u0634\u064a\u0629", + "\u0633\u0645\u0643 \u0627\u0644\u0631\u0645\u062d", + "\u0633\u0645\u0643\u0629 \u0627\u0644\u062a\u0646\u064a\u0646", + "\u0633\u0645\u0643\u0629 \u0627\u0644\u064a\u0646\u0641\u0648\u062e\u064a\u0629", + "\u0627\u0644\u0645\u0650\u0639\u0652\u062f\u064e\u0627\u062f", + "\u0627\u0644\u0639\u0628\u0627\u0621\u0629", + "\u0644\u0628\u0627\u0633 \u062a\u062e\u0631\u062c", + "\u0623\u0643\u0648\u0631\u062f\u064a\u0648\u0646", + "\u0627\u0644\u0642\u064a\u062b\u0627\u0631\u0629 \u0627\u0644\u0635\u0648\u062a\u064a\u0629", + "\u062d\u0627\u0645\u0644\u0629 \u0637\u0627\u0626\u0631\u0627\u062a", + "\u0637\u0627\u0626\u0631\u0629 \u0631\u062d\u0644\u0627\u062a", + "\u0633\u0641\u064a\u0646\u0629 \u0647\u0648\u0627\u0626\u064a\u0629", + "\u0645\u0630\u0628\u062d", + "\u0633\u064a\u0627\u0631\u0629 \u0625\u0633\u0639\u0627\u0641", + "\u0627\u0644\u0645\u0631\u0643\u0628\u0629 \u0627\u0644\u0628\u0631\u0645\u0627\u0626\u064a\u0629", + "\u0627\u0644\u0633\u0627\u0639\u0629 \u0627\u0644\u0645\u062a\u0646\u0627\u0638\u0631\u0629", + "\u0627\u0644\u0645\u0646\u062d\u0644 \u0623\u0648 \u0627\u0644\u0645\u064e\u0646\u062d\u064e\u0644\u064e\u0629", + "\u0645\u0626\u0632\u0631", + "\u062d\u0627\u0648\u064a\u0629 \u0627\u0644\u0646\u0641\u0627\u064a\u0627\u062a", + "\u0628\u0646\u062f\u0642\u064a\u0629 \u0627\u0642\u062a\u062d\u0627\u0645", + "\u062d\u0642\u064a\u0628\u0629 \u0638\u0647\u0631", + "\u0627\u0644\u0645\u062e\u0628\u0632", + "\u0639\u0627\u0631\u0636\u0629 \u0627\u0644\u062a\u0648\u0627\u0632\u0646", + "\u0627\u0644\u0628\u0627\u0644\u0648\u0646", + "\u0642\u0644\u0645 \u062d\u0628\u0631 \u062c\u0627\u0641", + "\u0636\u0645\u0627\u062f\u0629 \u0637\u0628\u064a\u0629 \u0644\u0627\u0635\u0642\u0629", + "\u0627\u0644\u0628\u0627\u0646\u062c\u0648", + "\u062f\u0631\u0627\u0628\u0632\u064a\u0646", + "\u062d\u062f\u064a\u062f\u0629 (\u0631\u0641\u0639 \u0623\u062b\u0642\u0627\u0644)", + "\u0643\u0631\u0633\u064a \u0627\u0644\u062d\u0644\u0627\u0642\u0629", + "\u0645\u062d\u0644 \u0635\u0627\u0644\u0648\u0646 \u0627\u0644\u062d\u0644\u0627\u0642\u0629", + "\u062d\u0638\u064a\u0631\u0629", + "\u0627\u0644\u0628\u0627\u0631\u0648\u0645\u062a\u0631", + "\u0627\u0644\u0628\u0631\u0645\u064a\u0644", + "\u0639\u062c\u0644\u0629 \u0627\u0644\u064a\u062f", + "\u0643\u0631\u0629 \u0627\u0644\u0642\u0627\u0639\u062f\u0629 \u0623\u0648 \u0627\u0644\u0628\u064a\u0633\u0628\u0648\u0644", + "\u0643\u0631\u0629 \u0633\u0644\u0629", + "\u0633\u0631\u064a\u0631 \u0627\u0644\u0623\u0637\u0641\u0627\u0644", + "\u0645\u0632\u0645\u0627\u0631", + "\u0642\u0628\u0639\u0629 \u0633\u0628\u0627\u062d\u0629", + "\u0645\u0646\u0634\u0641\u0629", + "\u062d\u0648\u0636 \u0627\u0644\u0627\u0633\u062a\u062d\u0645\u0627\u0645", + "\u0633\u064a\u0627\u0629 \u0648\u0627\u063a\u0646", + "\u0627\u0644\u0645\u0646\u0627\u0631\u0629 \u0623\u0648 \u0627\u0644\u0641\u0646\u0627\u0631", + "\u0643\u0648\u0628 \u0632\u062c\u0627\u062c\u064a", + "\u0642\u0628\u0639\u0629 \u0627\u0644\u062f\u0628", + "\u0632\u062c\u0627\u062c\u0629 \u0627\u0644\u0628\u064a\u0631\u0629", + "\u0643\u0623\u0633 \u062c\u0639\u0629", + "\u0628\u0631\u062c \u0627\u0644\u0646\u0627\u0642\u0648\u0633", + "\u0645\u0631\u0648\u0644\u0629", + "\u0627\u0644\u062f\u0631\u0627\u062c\u0629 \u0627\u0644\u062a\u0631\u0627\u062f\u0641\u064a\u0629", + "\u0628\u0643\u064a\u0646\u064a", + "\u0627\u0644\u0645\u062c\u0644\u062f\u0627\u062a \u0627\u0644\u062d\u0644\u0642\u064a\u0629", + "\u0627\u0644\u0645\u0650\u0646\u0652\u0638\u0627\u0631", + "\u0635\u0646\u062f\u0648\u0642 \u0627\u0644\u0639\u0634", + "\u0627\u0644\u0645\u0631\u0641\u0623", + "\u0627\u0644\u0632\u0644\u0627\u062c\u0629 \u0627\u0644\u062c\u0645\u0627\u0639\u064a\u0629", + "\u0631\u0628\u0637\u0629 \u0639\u0646\u0642 \u0628\u0648\u0644\u0648", + "\u0627\u0644\u0643\u0632\u0629", + "\u0631\u0641 \u0627\u0644\u0643\u062a\u0628", + "\u0645\u0643\u062a\u0628\u0629", + "\u063a\u0637\u0627\u0621 \u0642\u0627\u0631\u0648\u0631\u0629", + "\u0627\u0644\u0642\u0648\u0633", + "\u0623\u0631\u0628\u0629 \u0641\u0631\u0627\u0634\u064a\u0629", + "\u0644\u0627\u0641\u062a\u0629 \u062a\u0627\u0631\u064a\u062e\u064a\u0629 \u0645\u0646 \u0627\u0644\u0646\u062d\u0627\u0633", + "\u062d\u0645\u0627\u0644\u0629 \u0627\u0644\u0635\u062f\u0631", + "\u062d\u0627\u062c\u0632 \u0627\u0644\u0623\u0645\u0648\u0627\u062c", + "\u062f\u0631\u0639 \u0627\u0644\u0635\u062f\u0631", + "\u0627\u0644\u0645\u0643\u0646\u0633\u0629", + "\u0627\u0644\u062f\u0644\u0648", + "\u0645\u0631\u0628\u0637 \u0627\u0644\u062d\u0632\u0627\u0645", + "\u0627\u0644\u0633\u062a\u0631\u0629 \u0627\u0644\u0648\u0627\u0642\u064a\u0629 \u0645\u0646 \u0627\u0644\u0631\u0635\u0627\u0635", + "\u0642\u0637\u0627\u0631 \u0627\u0644\u0637\u0644\u0642\u0629", + "\u0627\u0644\u0645\u062c\u0632\u0631\u0629", + "\u0633\u064a\u0627\u0631\u0629 \u0623\u062c\u0631\u0629", + "\u062d\u0644\u0629 (\u0622\u0646\u064a\u0629)", + "\u0634\u0645\u0639\u0629", + "\u0645\u062f\u0641\u0639", + "\u0642\u0627\u0631\u0628 \u0627\u0644\u0643\u0627\u0646\u0648", + "\u0641\u0627\u062a\u062d\u0629 \u0639\u0644\u0628", + "\u0633\u062a\u0631\u0629 \u0645\u062d\u0628\u0648\u0643\u0629", + "\u0627\u0644\u0645\u0631\u0622\u0629 \u0627\u0644\u062c\u0627\u0646\u0628\u064a\u0629", + "\u062f\u0648\u0627\u0645\u0629 \u0627\u0644\u062e\u064a\u0644", + " \u0623\u062f\u0648\u0627\u062a \u0627\u0644\u0635\u064a\u0627\u0646\u0629", + "\u0635\u0646\u062f\u0648\u0642 \u0643\u0631\u062a\u0648\u0646", + "\u0627\u0644\u0625\u0637\u0627\u0631 \u0627\u0644\u0645\u0637\u0627\u0637", + "\u0627\u0644\u0635\u0631\u0627\u0641 \u0627\u0644\u0622\u0644\u064a", + "\u0627\u0644\u0634\u0631\u064a\u0637 \u0627\u0644\u0645\u062f\u0645\u062c", + "\u0627\u0644\u0645\u0633\u062c\u0644", + "\u0627\u0644\u0642\u064e\u0644\u0652\u0639\u064e\u0629", + "\u0627\u0644\u0642\u0637\u0645\u0631\u0627\u0646", + "\u062c\u0647\u0627\u0632 \u0627\u0644\u0642\u0631\u0635 \u0627\u0644\u0645\u0636\u063a\u0648\u0637", + "\u062a\u0634\u064a\u0644\u0648", + "\u0647\u0627\u062a\u0641 \u0645\u062d\u0645\u0648\u0644", + "\u0633\u0644\u0633\u0644\u0629", + "\u0633\u064a\u0627\u062c \u0645\u0634\u0628\u0643", + "\u0627\u0644\u0632\u0631\u062f", + "\u0645\u0646\u0634\u0627\u0631 \u062c\u0646\u0632\u064a\u0631\u064a", + " \u0635\u0646\u062f\u0648\u0642 \u0627\u0644\u062a\u062e\u0632\u064a\u0646", + "\u062e\u0632\u0627\u0646\u0629 \u0627\u0644\u0623\u062b\u0627\u062b", + "\u0627\u0644\u0622\u0644\u0629 \u0627\u0644\u0625\u064a\u0642\u0627\u0639\u064a\u0629 ", + "\u0627\u0644\u062e\u0632\u0627\u0646\u0629 \u0627\u0644\u0635\u064a\u0646\u064a\u0629", + "\u062c\u0648\u0631\u0628 \u0639\u064a\u062f \u0627\u0644\u0645\u064a\u0644\u0627\u062f", + "\u0643\u0646\u064a\u0633\u0629", + "\u0645\u0633\u0631\u062d \u0623\u0641\u0644\u0627\u0645", + "\u0627\u0644\u0633\u0627\u0637\u0648\u0631", + "\u0645\u0633\u0627\u0643\u0646 \u0627\u0644\u062c\u0631\u0641", + "\u0627\u0644\u0645\u0639\u0637\u0641 \u0627\u0644\u0641\u0636\u0641\u0627\u0636", + "\u0627\u0644\u0642\u0628\u0642\u0627\u0628", + "\u062e\u0627\u0644\u0637 \u0627\u0644\u0645\u0634\u0631\u0648\u0628\u0627\u062a \u0627\u0644\u0643\u062d\u0648\u0644\u064a\u0629", + "\u0643\u0648\u0632 (\u0622\u0646\u064a\u0629)", + "\u0622\u0644\u0629 \u062a\u062d\u0636\u064a\u0631 \u0627\u0644\u0642\u0647\u0648\u0629", + "\u0627\u0644\u0634\u0643\u0644 \u0627\u0644\u062d\u0644\u0632\u0648\u0646\u064a", + "\u0627\u0644\u0642\u0641\u0644 \u0627\u0644\u0631\u0645\u0632\u064a", + "\u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d", + "\u0645\u062a\u062c\u0631 \u0627\u0644\u062d\u0644\u0648\u064a\u0627\u062a", + "\u0633\u0641\u064a\u0646\u0629 \u062d\u0627\u0648\u064a\u0627\u062a", + "\u0633\u064a\u0627\u0631\u0629 \u0645\u0643\u0634\u0648\u0641\u0629", + "\u0628\u0631\u0627\u0645\u0629", + "\u0627\u0644\u0634\u064a\u0627\u0639", + "\u062c\u0632\u0645\u0629 \u0631\u0627\u0639\u064a \u0627\u0644\u0628\u0642\u0631", + "\u0642\u0628\u0639\u0629 \u0631\u0627\u0639\u064a \u0627\u0644\u0628\u0642\u0631", + "\u0627\u0644\u0645\u0647\u062f", + "\u0631\u0627\u0641\u0639\u0629", + "\u0627\u0644\u062e\u0648\u0630\u0629", + "\u062d\u0627\u0648\u064a\u0629 \u0634\u062d\u0646 \u0643\u0628\u064a\u0631\u0629", + "\u0633\u0631\u064a\u0631 \u0627\u0644\u0631\u0636\u064a\u0639", + "\u0642\u062f\u0631 \u0627\u0644\u0637\u0628\u062e \u0627\u0644\u0643\u0647\u0631\u0628\u0627\u0626\u064a", + "\u0643\u0631\u0648\u0643\u064a\u062a", + "\u0627\u0644\u0639\u0643\u0627\u0632", + "\u0643\u0648\u064a\u0631\u0633", + "\u0627\u0644\u0633\u062f", + "\u0627\u0644\u0645\u0643\u062a\u0628", + "\u062d\u0627\u0633\u0648\u0628 \u0645\u0643\u062a\u0628\u064a", + "\u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u062f\u0648\u0627\u0631", + "\u0627\u0644\u062d\u0641\u0627\u0638\u0629", + "\u0627\u0644\u0633\u0627\u0639\u0629 \u0627\u0644\u0631\u0642\u0645\u064a\u0629", + "\u0633\u0627\u0639\u0627\u062a \u0627\u0644\u064a\u062f \u0627\u0644\u0631\u0642\u0645\u064a\u0629", + "\u0627\u0644\u0645\u0646\u0636\u062f\u0629", + "\u0642\u0645\u0627\u0634 \u0627\u0644\u0623\u0637\u0628\u0627\u0642", + "\u063a\u0633\u0627\u0644\u0629 \u0635\u062d\u0648\u0646", + "\u0645\u0643\u0628\u062d \u0642\u0631\u0635\u064a", + "\u0645\u064a\u0646\u0627\u0621", + "\u0627\u0644\u0632\u0644\u0627\u062c\u0629 \u0627\u0644\u062a\u064a \u062a\u062c\u0631\u0647\u0627 \u0627\u0644\u0643\u0644\u0627\u0628", + "\u0642\u0628\u0629", + "\u0627\u0644\u062d\u0635\u064a\u0631\u0629", + "\u0645\u0646\u0635\u0629 \u062d\u0641\u0631", + "\u0627\u0644\u0637\u0628\u0644", + "\u0639\u0635\u0627 \u0627\u0644\u0637\u0628\u0644", + "\u062b\u0642\u0627\u0644\u0627\u062a \u062d\u062f\u064a\u062f", + "\u0641\u0631\u0646 \u0647\u0648\u0644\u0646\u062f\u064a", + "\u0645\u0631\u0648\u062d\u0629", + "\u0627\u0644\u062c\u064a\u062a\u0627\u0631 \u0627\u0644\u0643\u0647\u0631\u0628\u0627\u0626\u064a", + "\u0627\u0644\u0642\u0627\u0637\u0631\u0629 \u0627\u0644\u0643\u0647\u0631\u0628\u0627\u0626\u064a\u0629", + "\u0645\u0631\u0643\u0632 \u0627\u0644\u062a\u0631\u0641\u064a\u0647", + "\u0638\u0631\u0641 \u0628\u0631\u064a\u062f\u064a", + "\u0622\u0644\u0629 \u0627\u0644\u0625\u0633\u0628\u0631\u064a\u0633\u0648", + "\u0628\u0648\u062f\u0631\u0629 \u0627\u0644\u0648\u062c\u0647", + "\u0623\u0635\u0644\u0629 \u0631\u064a\u0634\u064a\u0629", + "\u062e\u0632\u0627\u0646\u0629 \u0627\u0644\u0645\u0644\u0641\u0627\u062a", + "\u0632\u0648\u0631\u0642 \u0627\u0644\u0625\u0637\u0641\u0627\u0621", + "\u0633\u064a\u0627\u0631\u0629 \u0627\u0644\u0625\u0637\u0641\u0627\u0621", + "\u0648\u0627\u0642\u064a \u0627\u0644\u0646\u0627\u0631", + "\u0633\u0627\u0631\u064a\u0629 \u0627\u0644\u0639\u0644\u0645", + "\u0627\u0644\u0641\u0644\u0648\u062a", + "\u0643\u0631\u0633\u064a \u0642\u0627\u0628\u0644 \u0644\u0644\u0637\u064a", + "\u062e\u0648\u0630\u0629 \u0643\u0631\u0629 \u0627\u0644\u0642\u062f\u0645", + "\u0631\u0627\u0641\u0639\u0629 \u0627\u0644\u062d\u0645\u0648\u0644\u0629", + "\u0627\u0644\u0646\u0627\u0641\u0648\u0631\u0629", + "\u0642\u0644\u0645 \u062d\u0628\u0631 \u0633\u0627\u0626\u0644", + "\u0627\u0644\u0633\u0631\u064a\u0631 \u0628\u0623\u0631\u0628\u0639\u0629 \u0623\u0639\u0645\u062f\u0629", + "\u0633\u064a\u0627\u0631\u0629 \u0634\u062d\u0646", + "\u0627\u0644\u0628\u0648\u0642 \u0627\u0644\u0641\u0631\u0646\u0633\u064a", + "\u0645\u0642\u0644\u0627\u0629", + "\u0627\u0644\u0645\u0644\u0627\u0628\u0633 \u0627\u0644\u0645\u0635\u0646\u0648\u0639\u0629 \u0645\u0646 \u0627\u0644\u0641\u0631\u0648\u0629", + "\u0634\u0627\u062d\u0646\u0629 \u0642\u0645\u0627\u0645\u0629", + "\u0642\u0646\u0627\u0639 \u0627\u0644\u063a\u0627\u0632", + "\u0645\u0636\u062e\u0629 \u0627\u0644\u0648\u0642\u0648\u062f", + "\u0643\u0623\u0633 \u0627\u0644\u0646\u0628\u064a\u0630", + "\u0633\u064a\u0627\u0631\u0629 \u062c\u0648 \u0643\u0627\u0631\u062a", + "\u0643\u0631\u0629 \u0627\u0644\u062c\u0648\u0644\u0641", + "\u0639\u0631\u0628\u0629 \u0627\u0644\u062c\u0648\u0644\u0641", + "\u0627\u0644\u0642\u0627\u0631\u0628 \u0627\u0644\u0637\u0648\u064a\u0644 \u0623\u0648 \u0627\u0644\u063a\u0646\u062f\u0648\u0644", + "\u0627\u0644\u0635\u0646\u062c\u0629", + "\u0627\u0644\u062b\u0648\u0628 \u0627\u0644\u0646\u0633\u0627\u0626\u064a \u0623\u0648 \u0627\u0644\u0641\u0633\u062a\u0627\u0646", + "\u0627\u0644\u0628\u064a\u0627\u0646\u0648 \u0627\u0644\u0643\u0628\u064a\u0631", + "\u0627\u0644\u062f\u0641\u064a\u0626\u0629 \u0627\u0644\u0632\u0631\u0627\u0639\u064a\u0629", + "\u0634\u0628\u0643 \u0627\u0644\u0633\u064a\u0627\u0631\u0629", + "\u0627\u0644\u0628\u0642\u0627\u0644\u0629", + "\u0627\u0644\u0645\u0642\u0635\u0644\u0629", + "\u0645\u0634\u0628\u0643 \u0644\u0644\u0634\u0639\u0631", + "\u0628\u062e\u0627\u062e \u0645\u062b\u0628\u062a \u0627\u0644\u0634\u0639\u0631", + "\u0627\u0644\u0639\u0631\u0628\u0629 \u0646\u0635\u0641 \u0627\u0644\u0645\u062c\u0646\u0632\u0631\u0629", + "\u0645\u0637\u0631\u0642\u0629", + "\u0627\u0644\u0633\u0644\u0629", + "\u0645\u062c\u0641\u0641 \u0627\u0644\u0634\u0639\u0631", + "\u062c\u0647\u0627\u0632 \u0645\u062d\u0645\u0648\u0644 \u0628\u0627\u0644\u064a\u062f", + "\u0627\u0644\u0645\u0646\u062f\u064a\u0644 \u0623\u0648 \u0627\u0644\u0645\u062d\u0631\u0645\u0629", + "\u0642\u0631\u0635 \u0635\u0644\u0628", + "\u0627\u0644\u0634\u064e\u0651\u0641\u064e\u0648\u0650\u064a\u064e\u0651\u0629", + "\u0627\u0644\u0642\u064a\u062b\u0627\u0631\u0629", + "\u0627\u0644\u062d\u0635\u0651\u0627\u062f\u0629", + "\u062e\u0635\u064a\u0646", + "\u062d\u0627\u0641\u0638\u0629 \u0627\u0644\u0645\u0633\u062f\u0633", + "\u0627\u0644\u0645\u0633\u0631\u062d \u0627\u0644\u0645\u0646\u0632\u0644\u064a", + "\u0642\u0631\u0635 \u0639\u0633\u0644", + "\u0627\u0644\u062e\u0637\u0627\u0641", + "\u0627\u0644\u062a\u0646\u0648\u0631\u0629 \u0627\u0644\u0645\u064f\u0637\u064e\u0648\u064e\u0651\u0642\u0629", + "\u0639\u0642\u0644\u0629 (\u062c\u0645\u0628\u0627\u0632)", + "\u0639\u0631\u0628\u0629 \u0627\u0644\u062e\u064a\u0648\u0644", + "\u0633\u0627\u0639\u0629 \u0631\u0645\u0644\u064a\u0629", + "\u0622\u064a \u0628\u0648\u062f", + "\u0627\u0644\u0645\u0643\u0648\u0627\u0629", + "\u0627\u0644\u0642\u0631\u0639\u0629 \u0627\u0644\u0645\u0636\u064a\u0626\u0629", + "\u0627\u0644\u062c\u064a\u0646\u0632", + "\u062c\u064a\u0628 (\u0633\u064a\u0627\u0631\u0629)", + "\u0642\u0645\u064a\u0635 \u0642\u0635\u064a\u0631 \u0627\u0644\u0643\u0645\u064a\u0646", + "\u0623\u062d\u062c\u064a\u0629 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u0642\u0637\u0648\u0639\u0629", + "\u0631\u064a\u0643\u0634\u0627", + "\u0630\u0631\u0627\u0639 \u0627\u0644\u062a\u0648\u062c\u064a\u0647", + "\u0627\u0644\u0643\u064a\u0645\u0648\u0646\u0648", + "\u0648\u0633\u0627\u062f\u0627\u062a \u0627\u0644\u0631\u0643\u0628\u0629", + "\u0627\u0644\u0639\u0642\u062f\u0629", + "\u0645\u0639\u0637\u0641 \u0627\u0644\u0645\u062e\u062a\u0628\u0631", + "\u0627\u0644\u0645\u063a\u0631\u0641\u0629", + "\u0639\u0627\u0643\u0633 \u0627\u0644\u0636\u0648\u0621", + "\u062d\u0627\u0633\u0648\u0628 \u0645\u062d\u0645\u0648\u0644", + "\u062c\u0632\u0627\u0632\u0629 \u0627\u0644\u0639\u0634\u0628", + "\u063a\u0637\u0627\u0621 \u0627\u0644\u0639\u062f\u0633\u0629", + "\u0641\u062a\u0627\u062d\u0629 \u0627\u0644\u0631\u0633\u0627\u0626\u0644", + "\u0645\u0643\u062a\u0628\u0629", + "\u0642\u0627\u0631\u0628 \u0627\u0644\u0646\u062c\u0627\u0629", + "\u0627\u0644\u0642\u064e\u062f\u064e\u0651\u0627\u062d\u064e\u0629", + "\u0627\u0644\u0644\u064a\u0645\u0648\u0632\u064a\u0646", + "\u0639\u0627\u0628\u0631\u0629 \u0645\u062d\u064a\u0637 \u0645\u0646\u062a\u0638\u0645\u0629", + "\u0623\u062d\u0645\u0631 \u0634\u0641\u0627\u0647", + "\u0627\u0644\u062d\u0630\u0627\u0621 \u0633\u0647\u0644 \u0627\u0644\u0627\u0631\u062a\u062f\u0627\u0621", + "\u063a\u0633\u0648\u0644", + "\u0645\u0643\u0628\u0631 \u0627\u0644\u0635\u0648\u062a", + "\u0639\u062f\u0633\u0629", + "\u0627\u0644\u0645\u0646\u0634\u0631\u0629", + "\u0627\u0644\u0628\u0648\u0635\u0644\u0629", + "\u062d\u0642\u064a\u0628\u0629 \u0633\u0627\u0639\u064a \u0627\u0644\u0628\u0631\u064a\u062f", + "\u0635\u0646\u062f\u0648\u0642 \u0628\u0631\u064a\u062f", + "\u0627\u0644\u062c\u0648\u0627\u0631\u0628 \u0627\u0644\u0637\u0648\u064a\u0644\u0629", + "\u0627\u0644\u0645\u0627\u064a\u0648\u0647", + "\u063a\u0637\u0627\u0621 \u0627\u0644\u0645\u0637\u0628\u0642", + "\u0622\u0644\u0629 \u0645\u0627\u0631\u0627\u0643\u0633", + "\u0627\u0644\u0645\u0627\u0631\u064a\u0645\u0628\u0627", + "\u0642\u0646\u0627\u0639", + "\u0623\u0639\u0648\u0627\u062f \u0627\u0644\u062b\u0642\u0627\u0628", + "\u0633\u0627\u0631\u064a\u0629 \u0645\u0627\u064a\u0648", + "\u0627\u0644\u0645\u062a\u0627\u0647\u0629", + "\u0643\u0648\u0628 \u0627\u0644\u0642\u064a\u0627\u0633", + "\u062e\u0632\u0627\u0646\u0629 \u0627\u0644\u0623\u062f\u0648\u064a\u0629", + "\u0627\u0644\u0622\u062b\u0627\u0631 \u0627\u0644\u0635\u062e\u0631\u064a\u0629", + "\u0627\u0644\u0644\u0627\u0642\u0637 \u0627\u0644\u0635\u0648\u062a\u064a", + "\u0641\u0631\u0646 \u0627\u0644\u0645\u064a\u0643\u0631\u0648\u064a\u0641", + "\u0627\u0644\u0632\u064a \u0627\u0644\u0639\u0633\u0643\u0631\u064a", + "\u0645\u062f\u0644\u062c\u0629", + "\u0627\u0644\u062d\u0627\u0641\u0644\u0629 \u0627\u0644\u0635\u063a\u064a\u0631\u0629", + "\u0627\u0644\u062a\u0646\u0648\u0631\u0629 \u0627\u0644\u0642\u0635\u064a\u0631\u0629", + "\u0633\u064a\u0627\u0631\u0629 \u0627\u0644\u0645\u064a\u0646\u064a \u0641\u0627\u0646 \u0627\u0644\u0639\u0627\u0626\u0644\u064a\u0629", + "\u0627\u0644\u0642\u0630\u064a\u0641\u0629 \u0627\u0644\u0645\u0648\u062c\u0647\u0629", + "\u0627\u0644\u0642\u0641\u0627\u0632 \u0645\u0644\u062a\u0635\u0642 \u0627\u0644\u0623\u0635\u0627\u0628\u0639", + "\u0637\u0628\u0642 \u062e\u0644\u0637", + "\u0627\u0644\u0645\u0646\u0632\u0644 \u0627\u0644\u0645\u062a\u0646\u0642\u0644", + "\u0641\u0648\u0631\u062f \u0645\u0648\u062f\u064a\u0644 \u062a\u064a", + "\u0627\u0644\u0645\u0648\u062f\u0645", + "\u0627\u0644\u062f\u064a\u0631", + "\u0634\u0627\u0634\u0629 \u062d\u0627\u0633\u0648\u0628", + "\u0627\u0644\u062f\u0631\u0627\u062c\u0629 \u0627\u0644\u0646\u0627\u0631\u064a\u0629 \u0627\u0644\u0635\u063a\u064a\u0631\u0629", + "\u0627\u0644\u0647\u0627\u0648\u0646 \u0648\u0627\u0644\u0645\u062f\u0642\u0629", + "\u0627\u0644\u0642\u0628\u0639\u0629 \u0627\u0644\u062c\u0627\u0645\u0639\u064a\u0629 \u0627\u0644\u0645\u0631\u0628\u0639\u0629", + "\u0645\u0633\u062c\u062f", + "\u0627\u0644\u0646\u0627\u0645\u0648\u0633\u064a\u0651\u0629", + "\u0627\u0644\u062f\u0639\u0631\u0648\u0645\u0629", + "\u0627\u0644\u062f\u0631\u0627\u062c\u0629 \u0627\u0644\u0647\u0648\u0627\u0626\u064a\u0629 \u0627\u0644\u062c\u0628\u0644\u064a\u0629", + "\u062e\u064a\u0645\u0629", + "\u0627\u0644\u0641\u0623\u0631\u0629", + "\u0645\u0635\u064a\u062f\u0629 \u0627\u0644\u0641\u0626\u0631\u0627\u0646", + "\u0633\u064a\u0627\u0631\u0627\u062a \u0634\u0631\u0643\u0629 \u0627\u0644\u0646\u0642\u0644", + "\u0643\u0645\u0627\u0645 \u0627\u0644\u0641\u0645", + "\u0645\u0633\u0645\u0627\u0631", + "\u0637\u0648\u0642 \u0627\u0644\u0639\u0646\u0642", + "\u0627\u0644\u0642\u0644\u0627\u062f\u0629", + "\u0627\u0644\u0631\u0636\u0627\u0639\u0629", + "\u062d\u0627\u0633\u0628 \u0627\u0644\u0645\u0641\u0643\u0631\u0629", + "\u0627\u0644\u0645\u0633\u0644\u0629", + "\u0622\u0644\u0629 \u0627\u0644\u0623\u0648\u0628\u0648\u0627", + "\u0623\u0643\u0631\u064a\u0646\u0629", + "\u0639\u062f\u0627\u062f \u0627\u0644\u0645\u0633\u0627\u0641\u0627\u062a", + "\u0641\u0644\u062a\u0631 \u0627\u0644\u0632\u064a\u062a", + "\u0627\u0644\u0623\u0631\u063a\u0646 \u0630\u0648 \u0627\u0644\u0623\u0646\u0627\u0628\u064a\u0628", + "\u062c\u0647\u0627\u0632 \u0631\u0627\u0633\u0645 \u0627\u0644\u0625\u0634\u0627\u0631\u0629", + "\u0627\u0644\u062a\u0646\u0648\u0631\u0629 \u0627\u0644\u062e\u0627\u0631\u062c\u064a\u0629", + "\u0639\u0631\u0628\u0629 \u064a\u062c\u0631\u0647\u0627 \u0627\u0644\u062b\u0648\u0631", + "\u0642\u0646\u0627\u0639 \u0623\u0643\u0633\u062c\u064a\u0646", + "\u0627\u0644\u062a\u063a\u0644\u064a\u0641", + "\u0627\u0644\u0645\u0650\u063a\u0652\u062f\u0627\u0641", + "\u0639\u064e\u062c\u064e\u0644\u0629 \u0627\u0644\u062a\u064e\u063a\u062f\u064a\u0641", + "\u0642\u0641\u0644 \u062d\u0644\u0642\u064a", + "\u0641\u0631\u0634\u0627\u0629 \u0627\u0644\u0631\u0633\u0645", + "\u0627\u0644\u0645\u0650\u0646\u064e\u0627\u0645\u064e\u0629\u064f", + "\u0642\u0635\u0631", + "\u0627\u0644\u0645\u0650\u0635\u0641\u0627\u0631", + "\u0645\u0646\u0634\u0641\u0629 \u0648\u0631\u0642\u064a\u0629", + "\u0645\u0650\u0638\u064e\u0644\u064e\u0651\u0629 \u0627\u0644\u0647\u0628\u064f\u0648\u0637", + "\u062c\u0647\u0627\u0632 \u0627\u0644\u0639\u0642\u0644\u0629", + "\u0645\u0642\u0639\u062f \u0639\u0627\u0645", + "\u0639\u062f\u0627\u062f \u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u0644\u0633\u064a\u0627\u0631\u0627\u062a", + "\u0639\u0631\u0628\u0629 \u0627\u0644\u0642\u0637\u0627\u0631", + "\u0627\u0644\u0641\u0646\u0627\u0621", + "\u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0639\u0645\u0648\u0645\u064a", + "\u0627\u0644\u0631\u0643\u064a\u0632\u0629", + "\u0627\u0644\u0645\u064e\u0642\u0652\u0644\u064e\u0645\u064e\u0629", + "\u0627\u0644\u0645\u0628\u0631\u0627\u0629", + "\u0627\u0644\u0639\u0637\u0631", + "\u0637\u0628\u0642 \u0628\u062a\u0631\u064a", + "\u0627\u0644\u0622\u0644\u0629 \u0627\u0644\u0646\u0627\u0633\u062e\u0629", + "\u0627\u0644\u0631\u064a\u0634\u0629 \u0627\u0644\u0645\u0648\u0633\u064a\u0642\u064a\u0629", + "\u062e\u0648\u0630\u0629 \u0628\u064a\u0643\u0644\u0647\u0627\u0648\u0628\u0647", + "\u0627\u0644\u0633\u064a\u0627\u062c \u0627\u0644\u0648\u062a\u062f\u064a", + "\u0627\u0644\u0633\u064a\u0627\u0631\u0629 \u0627\u0644\u0646\u0635\u0641-\u0646\u0642\u0644", + "\u0627\u0644\u0631\u0635\u064a\u0641 \u0627\u0644\u0628\u062d\u0631\u064a", + "\u062d\u0635\u0627\u0644\u0629", + "\u0627\u0644\u062a\u063a\u0644\u064a\u0641 \u0627\u0644\u0635\u064a\u062f\u0644\u0627\u0646\u064a", + "\u0648\u0633\u0627\u062f\u0629", + "\u0643\u0631\u0629 \u0627\u0644\u0637\u0627\u0648\u0644\u0629", + "\u0644\u0639\u0628\u0629 \u0637\u0627\u062d\u0648\u0646\u0629 \u0647\u0648\u0627\u0621", + "\u0633\u0641\u064a\u0646\u0629 \u0627\u0644\u0642\u0631\u0627\u0635\u0646\u0629", + "\u0627\u0644\u0625\u0628\u0631\u064a\u0642", + "\u0627\u0644\u0645\u0650\u0633\u0652\u062d\u064e\u062c", + "\u0627\u0644\u0642\u0628\u0629 \u0627\u0644\u0641\u0644\u0643\u064a\u0629", + "\u0643\u064a\u0633 \u0646\u0627\u064a\u0644\u0648\u0646", + "\u0631\u0641 \u062a\u0646\u0634\u064a\u0641 \u0627\u0644\u0623\u0637\u0628\u0627\u0642", + "\u0627\u0644\u0645\u062d\u0627\u0631\u064a\u062b \u0627\u0644\u062d\u0641\u0627\u0631\u0629", + "\u0627\u0644\u0645\u0643\u0628\u0633 \u0627\u0644\u063a\u0637\u064e\u0651\u0627\u0633", + "\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0627 \u0627\u0644\u0641\u0648\u0631\u064a\u0629", + "\u0627\u0644\u0639\u0645\u0648\u062f", + "\u0639\u0631\u0628\u0629 \u0627\u0644\u0634\u0631\u0637\u0629", + "\u0644\u0628\u0627\u0633 \u0627\u0644\u0628\u0646\u0634", + "\u0637\u0627\u0648\u0644\u0629 \u0627\u0644\u0628\u0644\u064a\u0627\u0631\u062f\u0648", + "\u0639\u0628\u0648\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0628\u0627\u062a", + "\u0627\u0644\u0623\u0635\u064a\u0635", + "\u0639\u062c\u0644\u0629 \u0641\u062e\u0627\u0631", + "\u0627\u0644\u0645\u0650\u062b\u0652\u0642\u064e\u0628", + "\u0633\u062c\u0627\u062f\u0629 \u0627\u0644\u0635\u0644\u0627\u0629", + "\u0627\u0644\u0637\u0627\u0628\u0639\u0629 \u0627\u0644\u062d\u0627\u0633\u0648\u0628\u064a\u0629", + "\u0627\u0644\u0633\u062c\u0646", + "\u0627\u0644\u0642\u0630\u064a\u0641\u0629", + "\u0627\u0644\u0628\u0631\u0648\u062c\u0643\u062a\u0631", + "\u0642\u0631\u0635 \u0627\u0644\u0647\u0648\u0643\u064a", + "\u0627\u0644\u0645\u0644\u0643\u0645\u0629", + "\u062d\u0642\u064a\u0628\u0629 \u064a\u062f", + "\u0627\u0644\u0631\u064a\u0634\u0629 ", + "\u0627\u0644\u0644\u0650\u062d\u064e\u0627\u0641", + "\u0633\u064a\u0627\u0631\u0629 \u0627\u0644\u0633\u0628\u0627\u0642", + "\u0645\u0636\u0631\u0628 \u0627\u0644\u062a\u0646\u0633", + "\u0645\u0634\u0639\u0627\u0639", + "\u0627\u0644\u0645\u0630\u064a\u0627\u0639", + "\u0627\u0644\u0645\u0642\u0631\u0627\u0628 \u0627\u0644\u0627\u0630\u0627\u0639\u064a", + "\u062e\u0632\u0627\u0646 \u0645\u064a\u0627\u0647 \u0627\u0644\u0623\u0645\u0637\u0627\u0631", + "\u0627\u0644\u0645\u0631\u0643\u0628\u0627\u062a \u0627\u0644\u062a\u0631\u0641\u064a\u0647\u064a\u0629", + "\u0628\u0643\u0631\u0629 \u0635\u064a\u062f", + "\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0627 \u0627\u0644\u0627\u0646\u0639\u0643\u0627\u0633\u064a\u0629", + "\u0627\u0644\u062b\u0644\u0627\u064e\u0651\u062c\u0629", + "\u062c\u0647\u0627\u0632 \u062a\u062d\u0643\u0645 \u0639\u0646 \u0628\u0639\u062f", + "\u0645\u0637\u0639\u0645", + "\u0627\u0644\u0645\u0633\u062f\u0633 \u0627\u0644\u062f\u0648\u0627\u0631", + "\u0628\u0646\u062f\u0642\u064a\u0629", + "\u0627\u0644\u0643\u0631\u0633\u064a \u0627\u0644\u0647\u0632\u0627\u0632", + "\u0627\u0644\u0645\u0634\u0648\u0627\u0629", + "\u0627\u0644\u0645\u0645\u062d\u0627\u0629", + "\u0643\u0631\u0629 \u0627\u0644\u0631\u063a\u0628\u064a", + "\u0627\u0644\u0645\u0633\u0637\u0631\u0629", + "\u0627\u0644\u062d\u0630\u0627\u0621 \u0627\u0644\u0631\u064a\u0627\u0636\u064a", + "\u0627\u0644\u062e\u0632\u0627\u0646\u0629", + "\u062f\u0628\u0648\u0633 \u0645\u0634\u0628\u0643", + "\u0639\u0644\u0628 \u0627\u0644\u0645\u0644\u062d \u0648\u0627\u0644\u0641\u0644\u0641\u0644", + "\u0627\u0644\u0635\u0646\u062f\u0644", + "\u0627\u0644\u0633\u0627\u0631\u0648\u0646\u062c", + "\u0633\u0627\u0643\u0633\u0641\u0648\u0646 \u0627\u0644\u0629 \u0646\u0641\u062e \u0645\u0648\u0633\u064a\u0642\u064a\u0629", + "\u0627\u0644\u063a\u0650\u0645\u0652\u062f \u0623\u0648 \u063a\u0650\u0645\u0652\u062f \u0627\u0644\u0633\u064a\u0641 \u0623\u0648 \u063a\u0650\u0645\u0652\u062f \u0627\u0644\u062e\u0646\u062c\u0631", + "\u0627\u0644\u0645\u064a\u0632\u0627\u0646", + "\u062d\u0627\u0641\u0644\u0629 \u0645\u062f\u0631\u0633\u064a\u0629", + "\u0627\u0644\u0645\u0631\u0643\u0628 \u0627\u0644\u0634\u0631\u0627\u0639\u064a ", + "\u0644\u0648\u062d\u0629 \u0627\u0644\u0646\u062a\u0627\u0626\u062c", + "\u0634\u0627\u0634\u0629 \u0627\u0644\u0633\u064a \u0623\u0631 \u062a\u064a", + "\u0628\u0631\u063a\u064a", + "\u0645\u0641\u0643 \u0627\u0644\u0628\u0631\u0627\u063a\u064a", + "\u062d\u0632\u0627\u0645 \u0627\u0644\u0623\u0645\u0627\u0646", + "\u0622\u0644\u0629 \u0627\u0644\u062e\u064a\u0627\u0637\u0629", + "\u0627\u0644\u062f\u0631\u0639", + "\u0645\u062a\u062c\u0631 \u0627\u0644\u0623\u062d\u0630\u064a\u0629", + "\u0645\u0642\u0633\u0645 \u0627\u0644\u063a\u0631\u0641\u0629", + "\u0633\u0644\u0629 \u0627\u0644\u062a\u0633\u0648\u0642", + "\u0639\u0631\u0628\u0629 \u0627\u0644\u062a\u0633\u0648\u0642", + "\u0627\u0644\u0645\u0650\u062c\u0652\u0631\u064e\u0641\u064e\u0629", + "\u0642\u0628\u0639\u0629 \u0627\u0644\u0627\u0633\u062a\u062d\u0645\u0627\u0645", + "\u0633\u062a\u0627\u0626\u0631 \u0627\u0644\u0627\u0633\u062a\u062d\u0645\u0627\u0645", + "\u062a\u0632\u062d\u0644\u0642 \u0639\u0644\u0649 \u0627\u0644\u062b\u0644\u062c", + "\u0642\u0646\u0627\u0639 \u0627\u0644\u062a\u0632\u0644\u062c", + "\u0643\u064a\u0633 \u0627\u0644\u0646\u0648\u0645", + "\u0627\u0644\u0645\u0633\u0637\u0631\u0629 \u0627\u0644\u062d\u0627\u0633\u0628\u0629", + "\u0627\u0644\u0628\u0627\u0628 \u0627\u0644\u0645\u0646\u0632\u0644\u0642", + "\u0645\u0627\u0643\u064a\u0646\u0629 \u0627\u0644\u062d\u0638", + "\u0627\u0644\u063a\u0637\u0633 \u062a\u062d\u062a \u0627\u0644\u0645\u0627\u0621", + "\u0639\u0631\u0628\u0629 \u0627\u0644\u062c\u0644\u064a\u062f \u0627\u0644\u0622\u0644\u064a\u0629", + "\u0643\u0627\u0633\u062d\u0629 \u062b\u0644\u0648\u062c", + "\u0645\u0648\u0632\u0639 \u0627\u0644\u0635\u0627\u0628\u0648\u0646", + "\u0643\u0631\u0629 (\u0643\u0631\u0629 \u0627\u0644\u0642\u062f\u0645)", + "\u062c\u0648\u0631\u0628", + "\u0645\u062c\u0645\u0639 \u0627\u0644\u0637\u0627\u0642\u0629 \u0627\u0644\u0634\u0645\u0633\u064a\u0629 \u0627\u0644\u062d\u0631\u0627\u0631\u064a\u0629", + "\u0627\u0644\u0635\u064e\u0645\u0652\u0628\u0631\u0650\u064a\u0631\u0629", + "\u0648\u0639\u0627\u0621 \u0627\u0644\u0634\u0648\u0631\u0628\u0629", + "\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0645\u0633\u0627\u0641\u0629", + "\u0627\u0644\u0645\u062f\u0641\u0623\u0629", + "\u0645\u0643\u0648\u0643 \u0627\u0644\u0641\u0636\u0627\u0621", + "\u0627\u0644\u0645\u0650\u0644\u0648\u064e\u0642", + "\u0627\u0644\u0642\u0627\u0631\u0628 \u0627\u0644\u0633\u0631\u064a\u0639", + "\u0634\u0628\u0643\u0629 \u0627\u0644\u0639\u0646\u0643\u0628\u0648\u062a", + "\u062e\u0634\u0628\u0629 \u0627\u0644\u0645\u063a\u0632\u0644", + "\u0627\u0644\u0633\u064a\u0627\u0631\u0629 \u0627\u0644\u0631\u064a\u0627\u0636\u064a\u0629", + "\u0628\u0642\u0639\u0629 \u0636\u0648\u0621", + "\u0633\u0637\u062d \u0627\u0644\u0645\u0633\u0631\u062d", + "\u0627\u0644\u0642\u0627\u0637\u0631\u0629 \u0627\u0644\u0628\u062e\u0627\u0631\u064a\u0629", + "\u062c\u0633\u0631 \u0645\u0642\u0648\u0633 \u0646\u0641\u0642\u064a", + "\u0627\u0644\u0637\u0628\u0644 \u0627\u0644\u0646\u062d\u0627\u0633\u064a", + "\u0627\u0644\u0633\u0645\u0627\u0639\u0629 \u0627\u0644\u0637\u0628\u064a\u0629", + "\u0627\u0644\u0644\u0650\u0641\u0627\u0639", + "\u0627\u0644\u062c\u062f\u0627\u0631 \u0627\u0644\u062c\u0627\u0641", + "\u0645\u0624\u0642\u062a", + "\u0627\u0644\u0645\u0648\u0642\u062f", + "\u0627\u0644\u063a\u0631\u0628\u0627\u0644", + "\u0627\u0644\u062a\u0631\u0627\u0645", + "\u0627\u0644\u0646\u0642\u0627\u0644\u0629", + "\u0627\u0644\u0623\u0631\u064a\u0643\u0629", + "\u0645\u0628\u0646\u0649 \u0633\u062a\u0648\u064a\u0627", + "\u0627\u0644\u063a\u0648\u0627\u0635\u0629", + "\u0627\u0644\u0628\u0630\u0644\u0629", + "\u0627\u0644\u0645\u0632\u0648\u0644\u0629", + "\u0627\u0644\u0646\u0638\u0627\u0631\u0629 \u0627\u0644\u0634\u0645\u0633\u064a\u0629", + "\u0627\u0644\u0646\u0638\u0627\u0631\u0629 \u0627\u0644\u0634\u0645\u0633\u064a\u0629", + "\u0627\u0644\u0648\u0627\u0642\u064a \u0627\u0644\u0634\u0645\u0633\u064a", + "\u0627\u0644\u062c\u0633\u0631 \u0627\u0644\u0645\u0639\u0644\u0642", + "\u0627\u0644\u0645\u0645\u0633\u062d\u0629", + "\u0627\u0644\u0642\u0645\u064a\u0635 \u0627\u0644\u062b\u0642\u064a\u0644", + "\u0627\u0644\u062a\u064f\u0628\u0651\u0627\u0646 \u0623\u0648 \u0627\u0644\u0628\u0646\u0637\u0627\u0644 \u0627\u0644\u0642\u0635\u064a\u0631\\", + "\u0627\u0644\u0623\u0631\u062c\u0648\u062d\u0629", + "\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0643\u0647\u0631\u0628\u0627\u0626\u064a", + "\u0645\u062d\u0642\u0646\u0629 \u0623\u0648 \u0627\u0644\u0625\u0628\u0631\u0629", + "\u0627\u0644\u0623\u0628\u0627\u062c\u0648\u0631\u0629", + "\u0627\u0644\u062f\u0628\u0627\u0628\u0629", + "\u0645\u0633\u062c\u0644 \u0627\u0644\u0634\u0631\u064a\u0637 \u0627\u0644\u0635\u0648\u062a\u064a", + "\u0625\u0628\u0631\u064a\u0642 \u0627\u0644\u0634\u0627\u064a", + "\u0627\u0644\u062f\u0628\u062f\u0648\u0628", + "\u0627\u0644\u0631\u0627\u0626\u064a", + "\u0643\u0631\u0629 \u062a\u0646\u0633", + "\u0627\u0644\u062a\u0633\u0642\u064a\u0641 \u0628\u0627\u0644\u0642\u0634", + "\u0627\u0644\u0633\u062a\u0627\u0631\u0629 \u0627\u0644\u0645\u0633\u0631\u062d\u064a\u0629", + "\u0627\u0644\u0643\u064f\u0634\u0652\u062a\u0650\u0628\u064e\u0627\u0646", + "\u0627\u0644\u062f\u0631\u064e\u0651\u0627\u0633\u0629", + "\u0639\u0631\u0634", + "\u0628\u0644\u0627\u0637 \u0627\u0644\u0633\u0642\u0641", + "\u0622\u0644\u0629 \u062a\u062d\u0645\u064a\u0635 \u0627\u0644\u062e\u0628\u0632", + "\u0645\u062d\u0644\u0627\u062a \u0628\u064a\u0639 \u0644\u0648\u0627\u0632\u0645 \u0627\u0644\u062a\u062f\u062e\u064a\u0646", + "\u0645\u0642\u0639\u062f \u0627\u0644\u0645\u0631\u062d\u0627\u0636", + "\u0645\u0634\u0639\u0644\u0629", + "\u0627\u0644\u0623\u064e\u0639\u0652\u0645\u0650\u062f\u064e\u0629\u064f \u0627\u0644\u0637\u064e\u0651\u0648\u0652\u0637\u064e\u0645\u0650\u064a\u064e\u0651\u0629\u0650", + "\u0634\u0627\u062d\u0646\u0629 \u0627\u0644\u0642\u0637\u0631", + "\u0645\u062a\u062c\u0631 \u0627\u0644\u0623\u0644\u0639\u0627\u0628", + "\u0633\u064a\u0627\u0631\u0629 \u0627\u0644\u062c\u0631\u0627\u0631", + "\u0634\u0627\u062d\u0646\u0629 \u0646\u0635\u0641 \u0645\u0642\u0637\u0648\u0631\u0629", + "\u0627\u0644\u0635\u064a\u0646\u064a\u0629", + "\u0645\u0639\u0637\u0641 \u0627\u0644\u062e\u0646\u062f\u0642", + "\u0627\u0644\u062f\u0631\u0627\u062c\u0629 \u062b\u0644\u0627\u062b\u064a\u0629 \u0627\u0644\u0639\u062c\u0644\u0627\u062a", + "\u0642\u0627\u0631\u0628 \u0627\u0644\u062f\u0639\u0627\u0645\u0629 \u0627\u0644\u0645\u0632\u062f\u0648\u062c\u0629", + "\u062d\u0627\u0645\u0644 \u062b\u0644\u0627\u062b\u064a", + "\u0642\u0648\u0633 \u0627\u0644\u0646\u0635\u0631", + "\u0627\u0644\u062d\u0627\u0641\u0644\u0629 \u0633\u0637\u062d\u064a\u0629 \u0627\u0644\u062a\u0645\u062f\u064a\u062f \u0627\u0644\u0643\u0647\u0631\u0628\u0627\u0626\u064a", + "\u0627\u0644\u062a\u0631\u0648\u0645\u0628\u0648\u0646", + "\u062d\u0648\u0636 \u0627\u0644\u0627\u0633\u062a\u062d\u0645\u0627\u0645", + "\u0627\u0644\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u062f\u0648\u0627\u0631\u0629", + "\u0627\u0644\u0622\u0644\u0629 \u0627\u0644\u0643\u0627\u062a\u0628\u0629", + "\u0627\u0644\u0645\u0638\u0644\u0629", + "\u0627\u0644\u062f\u0631\u0627\u062c\u0629 \u0627\u0644\u0623\u062d\u0627\u062f\u064a\u0629", + "\u0627\u0644\u0628\u064a\u0627\u0646\u0648 \u0627\u0644\u0642\u0627\u0626\u0645", + "\u0627\u0644\u0645\u0643\u0646\u0633\u0629 \u0627\u0644\u0643\u0647\u0631\u0628\u0627\u0626\u064a\u0629", + "\u0627\u0644\u0645\u0632\u0647\u0631\u064a\u0629", + "\u0627\u0644\u0642\u0646\u0637\u0631\u0629", + "\u0627\u0644\u0642\u0645\u0627\u0634 \u0627\u0644\u0645\u062e\u0645\u0644\u064a", + "\u0622\u0644\u0629 \u0627\u0644\u0628\u064a\u0639 \u0627\u0644\u0630\u0627\u062a\u064a", + "\u0627\u0644\u0635\u062f\u0627\u0631\u064a", + "\u0642\u0646\u0637\u0631\u0629 \u0645\u062a\u0639\u062f\u062f\u0629 \u0627\u0644\u0631\u0643\u0627\u0626\u0632", + "\u0627\u0644\u0643\u0645\u0627\u0646", + "\u0627\u0644\u0643\u0631\u0629 \u0627\u0644\u0637\u0627\u0626\u0631\u0629", + "\u0635\u0627\u0646\u0639\u0629 \u0627\u0644\u0648\u0627\u0641\u0644", + "\u0633\u0627\u0639\u0629 \u0627\u0644\u062d\u0627\u0626\u0637", + "\u0645\u062d\u0641\u0638\u0629", + "\u062e\u0632\u0627\u0646\u0629 \u0627\u0644\u0635\u0648\u0627\u0646", + "\u0637\u0627\u0626\u0631\u0629 \u0639\u0633\u0643\u0631\u064a\u0629", + "\u0627\u0644\u0645\u062c\u0644\u0649", + "\u0627\u0644\u063a\u0633\u0627\u0644\u0629", + "\u0642\u0627\u0631\u0648\u0631\u0629 \u0645\u0627\u0621", + "\u0625\u0628\u0631\u064a\u0642 \u0627\u0644\u0645\u0627\u0621", + "\u0628\u0631\u062c \u0627\u0644\u0645\u064a\u0627\u0647", + "\u0625\u0628\u0631\u064a\u0642 \u0627\u0644\u0643\u062d\u0648\u0644\u064a\u0627\u062a", + "\u0627\u0644\u0635\u0627\u0641\u0631\u0629", + "\u0634\u0639\u0631 \u0645\u0633\u062a\u0639\u0627\u0631", + "\u0627\u0644\u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u0648\u0627\u0642\u064a\u0629", + "\u0627\u0644\u0633\u062a\u0627\u0631 \u0627\u0644\u0644\u0641\u064e\u0651\u0627\u0641", + "\u0631\u0628\u0637\u0629 \u0639\u0646\u0642 \u0648\u0646\u062f\u0633\u0648\u0631 ", + "\u0632\u062c\u0627\u062c\u0629 \u0627\u0644\u0646\u0628\u064a\u0630", + "\u062c\u0646\u0627\u062d \u0627\u0644\u0637\u0627\u0626\u0631\u0629", + "\u0645\u0642\u0644\u0627\u0629 \u0635\u064a\u0646\u064a\u0629", + "\u0627\u0644\u0645\u0644\u0639\u0642\u0629 \u0627\u0644\u062e\u0634\u0628\u064a\u0629", + "\u0627\u0644\u0635\u0648\u0641", + "\u0627\u0644\u0633\u064a\u0627\u062c \u0627\u0644\u0645\u0646\u0642\u0633\u0645", + "\u062d\u0637\u0627\u0645 \u0627\u0644\u0633\u0641\u064a\u0646\u0629", + "\u0627\u0644\u0632\u0648\u0631\u0642 \u0627\u0644\u0634\u0631\u0627\u0639\u064a", + "\u0645\u0646\u0632\u0644 \u0627\u0644\u064a\u0648\u0631\u062a", + "\u0645\u0648\u0627\u0642\u0639 \u0627\u0644\u0648\u064a\u0628", + "\u0643\u062a\u0627\u0628 \u0631\u0633\u0648\u0645 \u0647\u0632\u0644\u064a\u0629", + "\u0627\u0644\u0643\u0644\u0645\u0627\u062a \u0627\u0644\u0645\u062a\u0642\u0627\u0637\u0639\u0629", + "\u0644\u0627\u0641\u062a\u0629 \u0645\u0631\u0648\u0631\u064a\u0629", + "\u0625\u0634\u0627\u0631\u0629 \u0627\u0644\u0645\u0631\u0648\u0631 \u0627\u0644\u0636\u0648\u0626\u064a\u0629", + "\u063a\u0644\u0627\u0641 \u0627\u0644\u062d\u0645\u0627\u064a\u0629 \u0644\u0644\u0643\u062a\u0627\u0628", + "\u0642\u0627\u0626\u0645\u0629 \u0637\u0639\u0627\u0645", + "\u0635\u062d\u0646", + "\u0642\u0646\u0628\u064a\u0637 \u0623\u062e\u0636\u0631", + "\u062d\u0633\u0627\u0621 \u0627\u0644\u0643\u0648\u0646\u0633\u0648\u0645\u064a\u0629", + "\u0627\u0644\u0648\u0639\u0627\u0621 \u0627\u0644\u0633\u0627\u062e\u0646", + "\u062a\u0631\u0627\u064a\u0641\u0644", + "\u0627\u0644\u0645\u062b\u0644\u062c\u0627\u062a", + "\u0627\u0644\u0645\u0635\u0627\u0635\u0629", + "\u0627\u0644\u062e\u0628\u0632 \u0627\u0644\u0641\u0631\u0646\u0633\u064a", + "\u062e\u0628\u0632 \u0627\u0644\u0628\u064a\u063a\u0644", + "\u0627\u0644\u0645\u062e\u0628\u0648\u0632\u0627\u062a \u0627\u0644\u0639\u064f\u0642\u0652\u062f\u0650\u064a\u064e\u0651\u0629", + "\u062a\u0634\u064a\u0632 \u0628\u0631\u062c\u0631", + "\u0627\u0644\u0646\u0642\u0627\u0646\u0642", + "\u0627\u0644\u0628\u0637\u0627\u0637\u0627 \u0627\u0644\u0645\u0647\u0631\u0648\u0633\u0629", + "\u0645\u0644\u0641\u0648\u0641", + "\u0627\u0644\u0642\u0631\u0646\u0628\u064a\u0637 \u0627\u0644\u0623\u062e\u0636\u0631", + "\u0627\u0644\u0642\u0631\u0646\u0628\u064a\u0637", + "\u0627\u0644\u0643\u0648\u0633\u0627", + "\u0645\u0639\u0643\u0631\u0648\u0646\u0629 \u0627\u0644\u0627\u0633\u0643\u0648\u0627\u0634", + "\u0642\u0631\u0639 \u0627\u0644\u0628\u0644\u0648\u0637", + "\u0642\u0631\u0639 \u0627\u0644\u062c\u0648\u0632", + "\u062e\u064a\u0627\u0631", + "\u0627\u0644\u062e\u0631\u0634\u0648\u0641 \u0627\u0644\u0634\u0648\u0643\u064a", + "\u0641\u0644\u0641\u0644 \u062d\u0644\u0648", + "\u0627\u0644\u062e\u0631\u0634\u0648\u0641 \u0627\u0644\u0633\u0643\u0648\u0644\u064a\u0645\u064a", + "\u0639\u064a\u0634 \u0627\u0644\u063a\u0631\u0627\u0628", + "\u062a\u0641\u0627\u062d \u0623\u062e\u0636\u0631", + "\u0627\u0644\u0641\u0631\u0627\u0648\u0644\u0629", + "\u0627\u0644\u0628\u0631\u062a\u0642\u0627\u0644", + "\u0627\u0644\u0644\u064a\u0645\u0648\u0646", + "\u0627\u0644\u062a\u064a\u0646", + "\u0627\u0644\u0623\u0646\u0627\u0646\u0627\u0633", + "\u0627\u0644\u0645\u0648\u0632", + "\u062c\u0627\u0643 \u0641\u0631\u0648\u062a", + "\u0642\u0634\u0637\u0629 \u0634\u0631\u064a\u0645\u0648\u0644\u064a\u0627", + "\u0627\u0644\u0631\u0645\u0627\u0646", + "\u0627\u0644\u062f\u0631\u064a\u0633", + "\u0643\u0631\u0628\u0646\u0627\u0631\u0629", + "\u0635\u0644\u0635\u0629 \u0627\u0644\u0634\u0648\u0643\u0648\u0644\u0627", + "\u0639\u062c\u064a\u0646\u0629 \u0627\u0644\u062e\u0628\u0632", + "\u0631\u063a\u064a\u0641 \u0627\u0644\u0644\u062d\u0645", + "\u0628\u064a\u062a\u0632\u0627", + "\u0641\u0637\u064a\u0631\u0629 \u0627\u0644\u0642\u062f\u0631", + "\u0628\u0648\u0631\u064a\u062a\u0648", + "\u0627\u0644\u0646\u0628\u064a\u0630 \u0627\u0644\u0623\u062d\u0645\u0631", + "\u0642\u0647\u0648\u0629 \u0625\u0633\u0628\u0631\u064a\u0633\u0648", + "\u0641\u0646\u062c\u0627\u0646 \u0627\u0644\u0634\u0627\u064a", + "\u062d\u0644\u064a\u0628 \u0627\u0644\u0628\u064a\u0636", + "\u0627\u0644\u062c\u0628\u0644", + "\u0641\u0642\u0627\u0639\u0629", + "\u0627\u0644\u062c\u0631\u0641", + "\u0627\u0644\u0634\u0639\u0627\u0628 \u0627\u0644\u0645\u0631\u062c\u0627\u0646\u064a\u0629", + "\u0627\u0644\u0641\u0648\u0627\u0631\u0629 \u0627\u0644\u062d\u0627\u0631\u0629", + "\u0627\u0644\u0636\u0641\u0629", + "\u0627\u0644\u0634\u0646\u062e\u0629", + "\u0627\u0644\u0645\u064a\u0627\u0647 \u0627\u0644\u0636\u062d\u0644\u0629", + "\u0627\u0644\u0634\u0627\u0637\u0626", + "\u0627\u0644\u0648\u0627\u062f\u064a", + "\u0628\u0631\u0643\u0627\u0646", + "\u0644\u0627\u0639\u0628 \u0643\u0631\u0629 \u0627\u0644\u0642\u0627\u0639\u062f\u0629", + "\u0627\u0644\u0639\u0631\u064a\u0633", + "\u0627\u0644\u063a\u0648\u0635 \u0628\u062c\u0647\u0627\u0632 \u0627\u0644\u062a\u0646\u0641\u0633 ", + "\u0627\u0644\u0633\u0644\u062c\u0645", + "\u0632\u0647\u0631\u0629 \u0627\u0644\u0644\u0624\u0644\u0624 ", + "\u062e\u0641 \u0627\u0644\u0633\u064a\u062f\u0629 \u0627\u0644\u0623\u0635\u0641\u0631", + "\u0627\u0644\u0630\u0631\u0629", + "\u0634\u062c\u0631\u0629 \u062b\u0645\u0631\u0629 \u0627\u0644\u0628\u0644\u0648\u0637", + "\u062b\u0645\u0631 \u0627\u0644\u0648\u0631\u062f \u0627\u0644\u0628\u0631\u064a", + "\u0628\u0630\u0648\u0631 \u0643\u0633\u062a\u0646\u0627\u0621 \u0627\u0644\u062d\u0635\u0627\u0646", + "\u0627\u0644\u0641\u0637\u0631\u064a\u0627\u062a \u0627\u0644\u0645\u0631\u062c\u0627\u0646\u064a\u0629", + "\u0641\u0637\u0631 \u063a\u0627\u0631\u064a\u0642\u0648\u0646", + "\u0641\u0637\u0631 \u062c\u0627\u0631\u0648\u0645\u064a\u062a\u0631\u0627 \u0627\u064a\u0633\u0643\u0644\u0646\u062a\u0627", + "\u0627\u0644\u0642\u0631\u0646 \u0627\u0644\u0646\u062a\u0646", + "\u0641\u0637\u0631 \u0646\u062c\u0645 \u0627\u0644\u0623\u0631\u0636", + "\u0641\u0637\u0631 \u0631\u0641 \u0627\u0644\u0643\u0628\u0631\u064a\u062a", + "\u0641\u0637\u0631 \u0627\u0644\u0628\u0648\u0644\u064a\u0637", + "\u0627\u0644\u0639\u0631\u0646\u0627\u0633", + "\u0648\u0631\u0642 \u0627\u0644\u0645\u0631\u062d\u0627\u0636" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/ar_zeroshot_classification_templates.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/ar_zeroshot_classification_templates.json new file mode 100644 index 0000000000000000000000000000000000000000..68e5d7853d1bdce0c860d7e66fe83b180d851190 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/ar_zeroshot_classification_templates.json @@ -0,0 +1,59 @@ +{ + "imagenet1k": [ + "{c}", + "\u0635\u0648\u0631\u0629 \u0633\u064a\u0626\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0633\u064a\u0626\u0629 \u062a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 {c}", + "\u0646\u062d\u062a \u0644\u0634\u0643\u0644 {c}", + "\u0646\u062d\u062a \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0630\u0627\u062a \u062c\u0648\u0648\u062f\u0629 \u0645\u0646\u062e\u0641\u0636\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0630\u0627\u062a \u062c\u0648\u0648\u062f\u0629 \u0645\u0646\u062e\u0641\u0636\u0629 \u062a\u062d\u062a\u0648\u064a {c}", + "\u0631\u0633\u0648\u0645\u0627\u062a \u062c\u062f\u0627\u0631\u064a\u0629 \u062a\u062d\u062a\u0648\u064a {c}", + "\u0631\u0633\u0648\u0645\u0627\u062a \u062c\u062f\u0627\u0631\u064a\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0645\u0642\u062a\u0637\u0639\u0629 \u062a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 {c}", + "\u0635\u0648\u0631\u0629 \u0645\u0642\u062a\u0637\u0639\u0629 \u0644\u0640 {c}", + "\u062a\u0637\u0631\u064a\u0632 {c} ", + " \u0635\u0648\u0631\u0629 \u064a\u0635\u0639\u0628 \u0641\u064a\u0647\u0627 \u0631\u0624\u064a\u0629 {c} ", + "\u0635\u0648\u0631\u0629 \u0633\u0627\u0637\u0639\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0648\u0627\u0636\u062d\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0645\u062a\u0633\u062e\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0645\u0638\u0644\u0645\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0623\u0628\u064a\u0636 \u0648\u0623\u0633\u0648\u062f {c}", + "{c} \u0641\u064a \u0644\u0642\u0637\u0629 \u0642\u0631\u064a\u0628\u0629", + "\u0635\u0648\u0631\u0629 \u0631\u0627\u0626\u0639\u0629 \u0644\u0640 {c}", + "\u0644\u0642\u0637\u0629 \u0642\u0631\u064a\u0628\u0629 \u0644\u0640 {c}", + "\u0631\u0633\u0645 \u062d\u0627\u0633\u0648\u0628\u064a \u064a\u062d\u062a\u0648\u064a {c}", + "\u0635\u0648\u0631\u0629 \u0645\u0631\u0633\u0648\u0645\u0629 \u062a\u062d\u062a\u0648\u064a {c}", + "\u0631\u0633\u0645\u0629 \u0644\u0640 {c}", + "\u0631\u0633\u0645\u0629 {c}", + "\u0631\u0633\u0645 \u064a\u062d\u062a\u0648\u064a {c} ", + "\u0635\u0648\u0631\u0629 \u0628\u0646\u0645\u0637 \u0627\u0644\u0628\u0643\u0633\u0644 \u0644\u0640 {c}", + " \u0635\u0648\u0631\u0629 \u0633\u0627\u0637\u0639\u0629 {c}", + "\u0648\u0634\u0645 {c}", + "{c} \u0641\u064a \u0627\u0644\u0635\u0648\u0631\u0629", + "\u0635\u0648\u0631\u0629 \u0645\u062a\u0633\u062e\u0629 \u062a\u062d\u062a\u0648\u064a {c}", + "\u0635\u0648\u0631\u0629 \u062a\u0627\u0644\u0641\u0629 {c}", + "\u0635\u0648\u0631\u0629 \u0636\u0628\u0627\u0628\u064a\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 {c}", + "\u0635\u0648\u0631\u0629 \u062c\u064a\u062f\u0629 \u0644\u0640 {c}", + "\u0635\u0648\u0631\u0629 \u0644\u0640 {c}", + "\u062a\u0635\u064a\u064a\u0631 \u0644\u0640 {c}", + "{c} \u0639\u0644\u0649 \u0634\u0643\u0644 \u0631\u0633\u0645 \u062d\u0627\u0633\u0648\u0628\u064a \u062b\u0646\u0627\u0626\u064a \u0623\u0648 \u062b\u0644\u0627\u062b\u064a \u0627\u0644\u0623\u0628\u0639\u0627\u062f", + "\u064a\u0648\u062c\u062f {c} \u0648\u0627\u062d\u062f \u0641\u064a \u0627\u0644\u0635\u0648\u0631\u0629", + "\u0631\u0633\u0645 \u062d\u0627\u0633\u0648\u0628\u064a \u0644\u0640 {c}", + "\u0627\u0648\u0631\u064a\u063a\u0627\u0645\u064a \u0644\u0640 {c}", + "{c} \u0645\u0635\u0646\u0648\u0639 \u0639\u0646 \u0637\u0631\u064a\u0642 \u0641\u0646 \u0637\u064a \u0627\u0644\u0648\u0631\u0642", + "{c} \u0641\u064a \u0644\u0639\u0628\u0629 \u0641\u064a\u062f\u064a\u0648", + "{c} \u0645\u0648\u062c\u0648\u062f \u0641\u064a \u0644\u0639\u0628\u0629 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", + "\u0631\u0633\u0645 \u062a\u0642\u0631\u064a\u0628\u064a \u0644\u0640 {c}", + "{c} \u0645\u0631\u0633\u0648\u0645 \u0628\u0627\u0644\u062e\u0631\u0627\u0628\u064a\u0634", + "\u0635\u0648\u0631\u0629 \u0628\u0641\u0646 \u0627\u0644\u062e\u0631\u0627\u0628\u064a\u0634 \u0644\u0640 {c}", + "\u0644\u0639\u0628\u0629 {c}", + "\u0635\u0648\u0631\u0629 \u064a\u0648\u062c\u062f \u0641\u064a\u0647\u0627 {c}", + "\u0631\u0633\u0648\u0645 \u0645\u062a\u062d\u0631\u0643\u0629 \u0644\u0640 {c} ", + "\u0635\u0648\u0631\u0629 \u0644\u0639\u062f\u062f \u0645\u0646 {c}", + "\u0635\u0648\u0631\u0629 \u064a\u0638\u0647\u0631 \u0641\u064a\u0647\u0627 {c}", + "\u0635\u0648\u0631\u0629 {c} \u0635\u063a\u064a\u0631 ", + "\u0635\u0648\u0631\u0629 {c} \u0643\u0628\u064a\u0631", + "{c} \u064a\u0638\u0647\u0631 \u0641\u064a \u0627\u0644\u0635\u0648\u0631\u0629" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/babel_imagenet.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/babel_imagenet.json new file mode 100644 index 0000000000000000000000000000000000000000..8e6c70f7c067aad4e0a11041b6602a4e108437d3 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/babel_imagenet.json @@ -0,0 +1,75436 @@ +{ + "NE": [ + [ + 1, + 10, + 11, + 16, + 23, + 48, + 63, + 71, + 78, + 79, + 98, + 99, + 105, + 107, + 111, + 112, + 113, + 127, + 128, + 139, + 140, + 141, + 146, + 151, + 244, + 274, + 276, + 277, + 280, + 288, + 289, + 291, + 292, + 294, + 295, + 296, + 298, + 308, + 309, + 310, + 319, + 334, + 336, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 360, + 362, + 385, + 387, + 388, + 398, + 407, + 418, + 426, + 427, + 431, + 437, + 438, + 456, + 459, + 462, + 463, + 464, + 468, + 483, + 487, + 489, + 497, + 498, + 508, + 525, + 555, + 558, + 580, + 583, + 591, + 604, + 610, + 612, + 614, + 620, + 632, + 642, + 643, + 650, + 655, + 657, + 668, + 673, + 697, + 701, + 711, + 719, + 721, + 730, + 742, + 743, + 748, + 750, + 762, + 763, + 769, + 778, + 786, + 787, + 792, + 797, + 806, + 823, + 830, + 832, + 839, + 847, + 857, + 866, + 879, + 893, + 897, + 916, + 938, + 939, + 957, + 958, + 961, + 963, + 971, + 972, + 979, + 980 + ], + [ + "सुनौलो माछा", + "कालोटाउके चित्रकचरी", + "रक्तमुहार पीतचरी", + "बुलबुल", + "गिद्ध", + "गोहोरो", + "गोमन", + "बिच्छी", + "किर्ना", + "खजुरो", + "कुमथोप्ले मणितुण्डक", + "पानी हाँस", + "कोअला भालु", + "जेली फिस", + "गोलो जुका", + "शंख", + "शङ्खेकिरा", + "सेतो गरुड", + "कालो गरुड", + "बगर ज्यामी", + "ठूलो जलरङ्क", + "लालखुट्टे टिमटिमा", + "अल्बाट्रोस", + "चिहुवहुवा", + "भोटे कुकुर", + "वन कुकुर", + "हुँडार", + "रातो फ्याउरो", + "खैरो स्याल", + "चितुवा", + "हिउँ चितुवा", + "सिंह", + "बाघ", + "खैरो भालु", + "अमेरिकी कालो भालु", + "ध्रुविय भालु", + "न्याउरी", + "झिँगा", + "मौरी", + "कमिला", + "गाइने कीरा", + "दुम्सी", + "मार्मट", + "गिनी पिग", + "जेब्रा", + "सुँगुर", + "बँदेल", + "जलगैंडा", + "गोरु", + "भैँसी", + "उद्र", + "रतेल", + "भारतीय हात्ती", + "हाब्रे", + "पाण्डा", + "अबाकस", + "एम्बुलेन्स", + "डटपेन", + "चापमापक यन्त्र", + "व्यारेल", + "कोक्रो", + "प्रकाशस्तम्भ", + "बिकर", + "धनुष", + "ब्रेसियर", + "झाडु", + "बाल्टिन", + "पेटी", + "ट्याक्सी", + "गढी", + "मोबाइल फोन", + "चेन लिंक फेन्स", + "चर्च", + "सिनेमा हल", + "कम्प्युटर किबोर्ड", + "बाँध", + "दमकल", + "मुरली", + "हरित गृह", + "गिलेटिन", + "रुमाल", + "बालुवा समयक", + "टि-सर्ट", + "रिक्सा", + "किमोनो", + "ल्याप्टप", + "लाउड स्पिकर", + "murchunga", + "मास्क", + "माइक्रोफोन", + "मिनिस्कर्ट", + "क्षेप्यास्त्र", + "मस्जिद", + "माउस", + "पाइजामा", + "प्यारासुट", + "अत्तर", + "खुत्रुके", + "सिरानी", + "हलो", + "प्रिन्टर", + "कारागार", + "थैली", + "सिरक", + "रेस्टुरेन्ट", + "रिभल्बर", + "नाप", + "तराजु", + "सिलाई मेसिन", + "कवच", + "बेल्चा", + "स्लिपिङ्ग ब्याग", + "मोजा", + "स्टेथेस्कोप", + "स्ट्रेचर", + "स्तूप", + "झोलुङ्गे पुल", + "ट्याङ्क", + "गडी", + "ट्रयाक्टर", + "छाता", + "पर्स", + "वासिङ मेसिन", + "वेबसाईट", + "काउली१", + "लाम्चो फर्सी", + "अनार", + "पराल", + "आटा", + "पिजा", + "बबल", + "भीर", + "उपत्यका", + "ज्वालामुखी" + ] + ], + "ID": [ + [ + 1, + 2, + 3, + 4, + 6, + 9, + 16, + 18, + 22, + 23, + 24, + 34, + 39, + 40, + 42, + 45, + 48, + 49, + 50, + 56, + 57, + 61, + 62, + 63, + 65, + 69, + 71, + 78, + 79, + 85, + 86, + 88, + 89, + 93, + 94, + 96, + 99, + 100, + 102, + 103, + 104, + 107, + 108, + 110, + 112, + 113, + 114, + 115, + 116, + 122, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 134, + 141, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 153, + 154, + 177, + 191, + 199, + 213, + 227, + 229, + 230, + 235, + 242, + 244, + 247, + 249, + 250, + 251, + 256, + 259, + 266, + 269, + 271, + 272, + 274, + 275, + 277, + 279, + 280, + 281, + 283, + 284, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 300, + 301, + 305, + 306, + 308, + 309, + 310, + 311, + 314, + 315, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 349, + 350, + 353, + 354, + 356, + 360, + 361, + 362, + 363, + 365, + 367, + 368, + 369, + 372, + 373, + 381, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 397, + 398, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 421, + 422, + 425, + 427, + 428, + 429, + 430, + 432, + 435, + 437, + 438, + 440, + 444, + 447, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 476, + 478, + 480, + 483, + 484, + 486, + 487, + 488, + 490, + 491, + 492, + 496, + 497, + 498, + 502, + 508, + 510, + 511, + 512, + 513, + 516, + 517, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 535, + 536, + 538, + 541, + 543, + 546, + 547, + 549, + 551, + 554, + 557, + 558, + 559, + 561, + 562, + 563, + 564, + 567, + 570, + 573, + 574, + 580, + 583, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 604, + 606, + 608, + 610, + 612, + 616, + 617, + 618, + 619, + 620, + 626, + 627, + 628, + 629, + 631, + 632, + 634, + 642, + 643, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 662, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 681, + 683, + 684, + 686, + 687, + 688, + 695, + 696, + 697, + 698, + 701, + 704, + 705, + 707, + 709, + 710, + 711, + 712, + 713, + 714, + 717, + 719, + 721, + 725, + 728, + 730, + 732, + 738, + 739, + 741, + 742, + 743, + 744, + 746, + 748, + 749, + 752, + 755, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 771, + 772, + 774, + 776, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 793, + 795, + 798, + 802, + 803, + 804, + 806, + 807, + 811, + 817, + 820, + 823, + 824, + 826, + 827, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 844, + 845, + 847, + 849, + 850, + 852, + 853, + 856, + 857, + 859, + 861, + 862, + 864, + 866, + 867, + 868, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 882, + 883, + 885, + 887, + 888, + 889, + 890, + 891, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 909, + 911, + 916, + 918, + 919, + 920, + 926, + 928, + 929, + 933, + 935, + 938, + 943, + 944, + 952, + 953, + 957, + 958, + 960, + 961, + 966, + 967, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 984, + 988, + 996, + 998, + 999 + ], + [ + "Ikan mas hias", + "Hiu putih", + "hiu macan", + "Hiu martil", + "ikan pari", + "burung unta", + "Merbah", + "Kucica", + "Elang botak", + "hering", + "Hantu Kelabu", + "Penyu belimbing", + "Iguana Hijau", + "Macroleptura", + "Agama (reptil)", + "Monster gila", + "komodo", + "Buaya sungai Nil", + "Aligator Amerika", + "Ular raja Amerika", + "Ular Garter", + "Ular boa pembelit", + "Franceville", + "Kobra India", + "ular laut", + "trilobit", + "kalajengking", + "Caplak", + "Lipan", + "Burung puyuh", + "Burung Partridge", + "makaw", + "Kakatua koki", + "Rangkong", + "Kolibri", + "tukan", + "angsa", + "angsa hitam", + "Landak semut", + "Ornithorhynchus", + "walabi", + "ampai-ampai", + "anemon laut", + "Cacing pipih", + "Keong", + "Siput", + "siput", + "Siput Nudibranch", + "Amphineura", + "Lobster amerika", + "Lobster berduri", + "Lobster air tawar", + "kelomang", + "Bangau putih", + "Bangau hitam", + "ibis-sendok", + "Burung flamingo", + "bangau", + "Trinil kaki-merah", + "pelikan", + "Penguin raja", + "Albatros mollymawk", + "Paus kelabu", + "paus pembunuh", + "Duyung", + "singa laut", + "chihuahua (anjing)", + "Maltese (anjing)", + "Pekines", + "Anjing pemburu rusa Skotlandia", + "Terier Airedale", + "Terrier Skotlandia", + "seter Irlandia", + "Kelpie Australia", + "anjing gembala Inggris lama", + "Anjing gembala Shetland", + "Anjing gembala jerman", + "Bokser (anjing)", + "mastif Tibet", + "St. Bernard (anjing)", + "malamut Alaska", + "husky Siberia", + "Dalmatian (anjing)", + "Anjing Newfoundland", + "Pomerania (anjing)", + "pudel kecil", + "serigala", + "Serigala maned", + "koyote", + "Ajak", + "Anjing liar Afrika", + "rubah", + "Rubah arktik", + "Rubah kelabu", + "Kucing tabby", + "Kucing persia", + "Kucing siam", + "macan tutul", + "Macan Tutul Salju", + "Jaguar (hewan)", + "singa", + "harimau", + "citah", + "beruang cokelat", + "Beruang hitam amerika", + "beruang kutub", + "garangan", + "Kumbang macan", + "kepik", + "Kumbang kotoran", + "Kumbang badak", + "lalat", + "Lebah", + "Semut", + "belalang", + "kecoa", + "Belalang sentadu", + "Belalang besar", + "capung", + "Capung jarum", + "Kupu-kupu raja", + "Bintang laut", + "landak laut", + "Teripang", + "Terwelu", + "Kelinci Angora", + "Cricetidae", + "Landak", + "Marmut", + "berang-berang", + "Tikus belanda", + "Kuda zebra", + "babi", + "babi hutan", + "kuda nil", + "lembu", + "kerbau", + "Bison (hewan)", + "Domba bertanduk besar", + "Ibex alpen", + "Gazel", + "Unta arab", + "Cerpelai", + "Berang-berang", + "sigung", + "biul", + "trenggiling", + "Orang utan kalimantan", + "simpanse", + "ungka", + "Symphalangus", + "babun", + "Makaka", + "Monyet laba-laba", + "Lemur ekor cincin", + "Gajah india", + "Gajah afrika", + "panda merah", + "Panda raksasa", + "belut", + "Ikan giru", + "Ikan Sturgeon", + "meniup ikan", + "Sempoa", + "Pakaian akademik", + "Akordion", + "gitar akustik", + "Kapal induk", + "pesawat penumpang", + "kapal udara", + "ambulans", + "Celemek", + "Tempat sampah", + "senapan serbu", + "ransel", + "bakeri", + "balok keseimbangan", + "balon terbang", + "bolpen", + "Susur tangan", + "Barbel", + "Gudang pertanian", + "Tong", + "gerobak tangan", + "Bola bisbol", + "bola basket", + "Fagot (alat musik)", + "bak mandi", + "mercusuar", + "gelas piala", + "Botol bir", + "Sepeda gandeng", + "keker", + "rak buku", + "toko buku", + "Tutup botol", + "busur", + "Dasi kupu-kupu", + "kutang", + "pemecah gelombang", + "Plastron", + "sapu", + "Ember", + "gesper", + "rompi anti peluru", + "taksi", + "kenceng", + "lilin", + "kano", + "Pembuka kaleng", + "korsel", + "karton", + "Anjungan tunai mandiri", + "kastil", + "Katamaran", + "selo", + "telepon selular", + "rantai", + "Zirah rantai", + "gergaji listrik", + "peti", + "Kaus kaki Natal", + "gereja", + "bioskop", + "geta (alas kaki)", + "papan ketik", + "kapal peti kemas", + "Kabriolet", + "kotrek", + "trompet", + "buaian", + "katrol", + "Kuiras", + "empang", + "meja tulis", + "komputer meja", + "Popok", + "jam digital", + "meja makan", + "rem cakram", + "dok (maritim)", + "kubah", + "membranofon", + "Dumbel", + "gitar elektrik", + "Lokomotif listrik", + "amplop", + "Bedak", + "Kapal pemadam", + "tiang bendera", + "suling", + "kursi lipat", + "Forklif", + "Air mancur", + "pulpen", + "Ranjang empat tiang", + "penggorengan", + "Masker gas", + "Gokar", + "Bola golf", + "rumah kaca", + "guilotin", + "Kendaraan setengah roda rantai", + "palu", + "pengering rambut", + "perangkat ginerak", + "saputangan", + "harmonika", + "harpa", + "Jam pasir", + "setrika", + "jins", + "kaus oblong", + "angkong", + "ikatan", + "Jas laboratorium", + "Sendok sayur", + "kap lampu", + "komputer jinjing", + "korek api gas", + "limusin", + "Kapal samudera", + "lipstik", + "Losion", + "pengeras suara", + "penggergajian kayu", + "Xilofon", + "masker", + "Megalit", + "mikrofon", + "Oven mikrogelombang", + "Bus kecil", + "rok mini", + "Mobil MPV", + "Peluru kendali", + "Jenis Modem", + "masjid", + "Kelambu", + "skuter", + "sepeda gunung", + "tetikus", + "Perangkap tikus", + "paku", + "kalung", + "komputer jinjing", + "obo", + "okarina", + "Saringan oli", + "organ (alat musik)", + "osiloskop", + "gembok", + "Kuas", + "piyama", + "istana", + "parasut", + "Meteran parkir", + "gerbong", + "telepon umum", + "kotak pensil", + "Rautan pensil", + "Sejarah parfum", + "Cawan Petri", + "Mesin fotokopi", + "Plektrum", + "mobil pikap", + "celengan", + "bantal", + "Takar air", + "kantong plastik", + "bajak", + "Kamera Polaroid", + "Pot bunga", + "Roda tembikar", + "sajadah", + "pencetak", + "penjara", + "proyektil", + "Keping hoki", + "dompet", + "Pena bulu", + "raket", + "Teleskop radio", + "peti es", + "pengendali jarak jauh", + "rumah makan", + "Pistol revolver", + "senapan", + "kursi goyang", + "alat panggang listrik", + "bola rugbi", + "penggaris", + "Brankas", + "peniti", + "Sendal", + "Saksofon", + "neraca", + "Bus sekolah", + "sekunar", + "mur", + "obeng", + "sabuk pengaman", + "Mesin jahit", + "perisai", + "Keranjang belanja", + "pengki", + "Kudung mandi", + "Papan ski", + "Mistar hitung", + "mobil salju", + "Bajak salju", + "Dispenser sabun", + "kaus kaki", + "Tungku surya", + "Pemanas", + "Mobil sport", + "Lokomotif uap", + "stetoskop", + "Stola", + "Jam sukat", + "kompor", + "tandu", + "Kapal selam", + "setelan jas", + "jam matahari", + "kacamata hitam", + "Tabir surya", + "Jembatan gantung", + "Pel", + "Sakelar", + "semprotan", + "kendaraan tempur lapis baja", + "Poci", + "Beruang teddy", + "Bola tenis", + "ijuk", + "Mesin perontok", + "takhta", + "Pemanggang roti", + "Kloset duduk", + "obor", + "mobil derek", + "Traktor", + "Truk semi-trailer", + "Nampan", + "roda tiga", + "Kaki-tiga", + "pelengkung kemenangan", + "Bus troli", + "trombon", + "indo", + "payung", + "sepeda roda satu", + "penyedot debu", + "Vas", + "beledu", + "Vestimentum", + "viaduk", + "biola", + "Bola voli (bola)", + "pemanggang wafel", + "Dompet", + "lemari dinding", + "Pesawat militer", + "wastafel", + "Mesin cuci", + "Botol air", + "menara air", + "Peluit", + "rambut palsu", + "wajan", + "wol", + "situs web", + "teka-teki silang", + "rambu lalu lintas", + "lampu lalu lintas", + "fondue", + "Es krim", + "Es lilin", + "burger keju", + "Kentang tumbuk", + "kembang kol", + "mentimun", + "batu lumut", + "buah ara", + "nenas", + "delima", + "Jerami hijau", + "Sirup coklat", + "adonan", + "anggur merah", + "Espreso", + "buih", + "tebing", + "terumbu karang", + "Geiser", + "pesisir", + "lembah", + "gunung berapi", + "Canola", + "buah pohon ek", + "Jamur maitake", + "Buah padi", + "tisu gulung" + ] + ], + "DE": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10, + 11, + 14, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 28, + 30, + 32, + 34, + 37, + 39, + 40, + 43, + 45, + 46, + 47, + 48, + 49, + 50, + 53, + 56, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 70, + 71, + 72, + 74, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 85, + 86, + 87, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 157, + 160, + 162, + 163, + 169, + 170, + 172, + 175, + 176, + 177, + 191, + 192, + 199, + 211, + 213, + 215, + 217, + 225, + 226, + 227, + 229, + 234, + 235, + 237, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 253, + 254, + 256, + 257, + 258, + 259, + 261, + 266, + 269, + 270, + 271, + 272, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 391, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 444, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 519, + 520, + 521, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 541, + 542, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 595, + 596, + 597, + 599, + 601, + 602, + 604, + 606, + 607, + 608, + 610, + 611, + 612, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 636, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 665, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 678, + 679, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 691, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 719, + 721, + 724, + 725, + 726, + 728, + 730, + 731, + 732, + 733, + 734, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 756, + 757, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 788, + 790, + 791, + 792, + 793, + 794, + 795, + 797, + 798, + 802, + 803, + 804, + 805, + 806, + 807, + 809, + 810, + 811, + 816, + 817, + 818, + 819, + 820, + 821, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 853, + 854, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 904, + 907, + 910, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 924, + 925, + 926, + 928, + 929, + 931, + 932, + 935, + 938, + 939, + 943, + 944, + 952, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 978, + 979, + 980, + 981, + 982, + 984, + 985, + 986, + 988, + 989, + 990, + 992, + 994, + 996, + 997, + 998, + 999 + ], + [ + "Schleie", + "Goldfisch", + "Weißer Hai", + "Tigerhai", + "Hammerhaie", + "Zitterrochenartige", + "Stachelrochen", + "Hahn", + "Strauß", + "Bergfink", + "Stieglitz", + "Indigofink", + "Wanderdrossel", + "Bülbüls", + "Elster", + "Wasseramseln", + "Milan", + "Weißkopfseeadler", + "Geier (Vogel)", + "Bartkauz", + "Flecken-Querzahnmolch", + "Amerikanischer Ochsenfrosch", + "Schwanzfrösche", + "Lederschildkröte", + "Dosenschildkröten", + "Leguane", + "Rotkehlanolis", + "Kragenechse", + "Gila-Krustenechse", + "Östliche Smaragdeidechse", + "Basiliskenchamäleon", + "Komodowaran", + "Nilkrokodil", + "Mississippi-Alligator", + "Halsbandnatter", + "Königsnattern", + "Strumpfbandnattern", + "Abgottschlange", + "Nördlicher Felsenpython", + "Brillenschlange", + "Seeschlangen", + "Wüsten-Hornviper", + "Seitenwinder-Klapperschlange", + "Trilobiten", + "Opa Langbein", + "Skorpion", + "Gold-Wespenspinne", + "Gartenkreuzspinne", + "Südliche Schwarze Witwe", + "Wolfspinne", + "Zecke", + "Tausendfüßler", + "Birkhuhn", + "Schneehuhn", + "Kragenhuhn", + "Wachtel", + "Rebhuhn", + "Graupapagei", + "Gelbhaubenkakadu", + "Lori", + "Spornkuckucke", + "Bienenfresser (Familie)", + "Nashornvogel", + "Kolibri", + "Glanzvögel", + "Tukan", + "Enterich", + "Mittelsäger", + "Gans", + "Trauerschwan", + "Keiler", + "Schnabeligel", + "Schnabeltier", + "Phascolarctos", + "Plumpbeutler", + "Medusa", + "Seeanemonen", + "Hirnkoralle", + "Plattwurm", + "Fadenwurm", + "Schneckenhorn", + "Schnecke", + "Nacktschnecke", + "Nacktkiemer", + "Käferschnecke", + "Gemeines Perlboot", + "Winkerkrabben", + "Stein- und Königskrabben", + "Amerikanischer Hummer", + "Languste", + "Krebs", + "Einsiedlerkrebse", + "Assel", + "Weißstorch", + "Schwarzstorch", + "Löffler", + "Rohrdommel", + "Kranich", + "Rallenkranich", + "Amerikanisches Blässhuhn", + "Trappe", + "Steinwälzer", + "Alpenstrandläufer", + "Rotschenkel", + "Schlammläufer", + "Austernfischer", + "Pelikane", + "Königspinguin", + "Albatros", + "Grauwal", + "Schwertwal", + "Dugonginae", + "Seelöwe", + "Chihuahua (Hunderasse)", + "Japan Chin", + "Malteser", + "Pekingpalasthündin", + "Kontinentaler Zwergspaniel", + "Afghanischer Windhund", + "Beagle (Hunderasse)", + "Bluthund", + "Barsoi", + "Irischer Wolfshund", + "Whippet (Hunderasse)", + "Otterhund", + "Persischer Windhund", + "Schottischer Hirschhund", + "Airedale-Terrier", + "Cairn-Terrier", + "Scotchterrier", + "Kurzhaariger Ungarischer Vorstehhund", + "irischer Setter", + "Bretonischer Spaniel", + "Norfolk Spaniel", + "Belgischer Schäferhund Malinois", + "Berger de Brie", + "Working Kelpie", + "altenglischer Schäferhund", + "Rottweiler Metzgerhund", + "Horand von Grafrath", + "Zwergpinscher", + "tibetanische Dogge", + "Französische Bulldogge", + "Dänische Dogge", + "St. Bernhardshund", + "Polarhund", + "Malamut", + "sibirischer Husky", + "Dalmatiner", + "Kongo-Terrier", + "Mopshund", + "Neufundländer", + "Pyrenäen-Berghund", + "Samojede", + "Deutscher Spitz", + "Holländischer Spitz", + "Kleinpudel", + "Wölfin", + "Polarwolf", + "Rotwolf", + "Kojote", + "Rothund", + "Afrikanischer Wildhund", + "Hyänen", + "Fuchs", + "Polarfuchs", + "Graufuchs", + "Tabby-Brille", + "Perserkatze", + "Siamkatze", + "Silberlöwe", + "Luchs", + "Afrikanischer Leopard", + "Irbis", + "Jaguare", + "Löwe", + "Tigerin", + "Gepard", + "Braunbär", + "Amerikanischer Schwarzbär", + "Polarbär", + "Mangusten", + "Erdmännchen", + "Sandlaufkäfer", + "Marienkäfer", + "Laufkäfer", + "Bockkäfer", + "Blattkäfer", + "Mistkäfer", + "Nashornkäfer", + "Rüsselkäfer", + "Fliege", + "Bienen", + "Ameisen", + "Heuschrecke", + "Gespenstschrecke", + "Küchenschabe", + "Fangschrecken", + "Zikade", + "Zwergzikaden", + "Großlibellen", + "Kleinlibelle", + "Brauner Waldvogel", + "Monarchfalter", + "Seesterne", + "Seeigel", + "Seegurke", + "Baumwollschwanzkaninchen", + "Echte Hasen", + "Angorakaninchen", + "Hamster Bleon UHU", + "Baumstachelschwein", + "Fuchshörnchen", + "Murmeltier", + "Biber", + "Hausmeerschweinchen", + "Tigerpferd", + "Hausschwein", + "Wildeber", + "Warzenschwein", + "Flusspferd", + "Rind", + "Wasserbüffel", + "Bisonochse", + "Schafsbock", + "Dickhornschaf", + "Alpensteinbock", + "Nordafrikanische Kuhantilope", + "Schwarzfersenantilope", + "Gazellen", + "Dromedar", + "Lama (Kamel)", + "Stinkmarder", + "Nerz", + "Ratz", + "Frettchen", + "Lutrinae", + "Stinktier", + "Dachs", + "Gürteltier", + "Weißkehl-Faultier", + "Orang-Utans", + "Internationales Jahr des Gorillas", + "Schimpanse", + "Weißhandgibbon", + "Symphalangus", + "Meerkatze", + "Husarenaffe", + "Pavian", + "Makak", + "Schlank- und Stummelaffen", + "Schwarz-weiße Stummelaffen", + "Nasenaffe", + "Marmosetten", + "Kapuzineraffe", + "Brüllaffe", + "Springaffen", + "Klammeraffen", + "Gewöhnlicher Totenkopfaffe", + "Katta", + "Asiatischer Elefant", + "Afrikanischer Elefant", + "Roter Panda", + "Bambusbär", + "Aal", + "Silberlachs", + "Stör", + "Knochenhecht", + "Feuerfisch", + "Kugelfisch", + "Abakus (Rechenhilfsmittel)", + "Abaja", + "Talar", + "Ziehharmonika", + "akustische Gitarre", + "Flugzeugträger", + "Verkehrsflugzeug", + "Luftschiff", + "Rettungswagen", + "Amphibienfahrzeug", + "Analoguhr", + "Apiarium", + "Schürze", + "Abfalleimer", + "Sturmgewehr", + "Hafersack", + "Bäckerei", + "Schwebebalken", + "Luftballon", + "Kugelschreiber", + "5-String-Banjo", + "Brüstung", + "Hantel", + "Scheune", + "Aneroid-Barometer", + "Faß", + "Schubkarre", + "Baseball (Sportgerät)", + "Basketball (Sportgerät)", + "Wiege", + "Quintfagott", + "Badekappe", + "Badetuch", + "Badewanne", + "Kombiwagen", + "Leuchtturm", + "Becherglas", + "Bärenfellmütze", + "Bierflasche", + "Tandem (Fahrrad)", + "Fernglas", + "Vogelhäuschen", + "Bootshaus", + "Bobsport", + "Bolotie", + "Haube", + "Bücherregal", + "Buchhandlung", + "Flaschenverschluss", + "Bogen", + "Schleife", + "Büstenhalter", + "Wellenbrecher", + "Brustharnisch", + "Besen", + "Eimer", + "Schnalle", + "Schutzweste", + "Hochgeschwindigkeitszug", + "Fleischerei", + "Taxe", + "Kessel", + "Kerze", + "Kanone", + "Kanadier", + "Dosenöffner", + "Strickjacke", + "Karussell", + "Karton", + "Bankautomat", + "Audiokassette", + "Festung", + "Katamaran", + "CD-Spieler", + "Cellistin", + "Funke", + "Kette", + "Maschendraht", + "Kettenrüstung", + "Kettensäge", + "Truhe", + "Kommode", + "Glocke", + "Kirche", + "Kino", + "Hackmesser", + "Holzschuh", + "Cocktail-Shaker", + "Kaffeekanne", + "Rolle", + "Zahlenschloss", + "Tastatur", + "Süßigkeit", + "Containerschiff", + "Kabriolett", + "Korkenzieher", + "Kornett (Instrument)", + "Cowboystiefel", + "Cowboyhut", + "Wiege", + "Kran", + "Kiste", + "Kinderbett", + "Schongarer", + "Gehhilfe", + "Küriss", + "Talsperre", + "Schreibtisch", + "Desktop-Computer", + "Wählscheibe", + "Windel", + "Digitaluhr", + "Digitaluhr", + "Esstisch", + "Abwaschtuch", + "Spülmaschine", + "Scheibenbremse", + "Dock (Schifffahrt)", + "Hundeschlitten", + "Kuppel", + "Türmatte", + "Membranophon", + "Trommelstock", + "Hantel", + "Elektrogitarre", + "Elektrolokomotive", + "Briefumschlag", + "Gesichtspuder", + "Boa (Schal)", + "Kartei", + "Feuerlöschboot", + "Feuerwehrfahrzeuge in Japan", + "Ofenschirm", + "Fahnenmast", + "Querflöte", + "Klappstuhl", + "Footballhelm", + "Gabelstapler", + "Springbrunnen", + "Füller", + "Himmelbett", + "Pfanne", + "Pelzmantel", + "Müllwagen", + "Gasmaske", + "Zapfsäule", + "Kelch", + "Kart", + "Physik des Golfballs", + "Golfmobil", + "Gondel", + "Gongspiel", + "Kleid", + "Flügel", + "Kinderstube", + "Lebensmittelhandlung", + "Fallschwertmaschine", + "Haarspray", + "Halbkettenfahrzeug", + "Hammerfinne", + "Deckelkorb", + "Haartrockner", + "Mobilgerät", + "Taschentuch", + "Mundorgel", + "Harfe", + "Getreidemäher", + "Beil", + "Schulterholster", + "Raumfüllung", + "Reifrock", + "Reck", + "Sanduhr", + "Bügeleisen", + "Jack mit der Laterne", + "Niethose", + "Longsleeve", + "Puzzlespiel", + "Rikscha", + "Furisode", + "Knieschoner", + "Knoten", + "Laborkittel", + "Saucenlöffel", + "Lampenschirm", + "Notebook-Rechner", + "Mahd", + "Objektivdeckel", + "Papiermesser", + "Rettungsboot (Einsatzmittel)", + "Feuerzeug", + "Stretch-Limousine", + "Schiff im Liniendienst", + "Lippenstift", + "Slipper", + "Bodylotion", + "Lautsprecher", + "Lupe", + "Sägewerk", + "Postbeutel", + "Schachtdeckel", + "Maracás", + "Xylofon", + "Maske", + "Streichholz", + "Band-Tanz", + "Irrgarten", + "Messbecher", + "Badezimmerschrank", + "Megalithik", + "Mikrofon", + "Mikrowelle", + "Minirock", + "Van", + "Lenkflugkörper", + "Fausthandschuh", + "Rührschüssel", + "Mobilheim", + "Ford Modell T", + "Funkmodem", + "Mofa", + "Doktorhut", + "Moschee", + "Moskitonetz", + "Motorroller", + "Geländewagen", + "Maus", + "Rattenfalle", + "Nagel", + "Cervicalstütze", + "Kette", + "Notebookcomputer", + "Tehen-Pfeiler", + "Wiener Oboe", + "Okarina", + "Kilometerzähler", + "Ölfilter", + "Orgel", + "Oszilloskop", + "Peplos", + "Sauerstoffmaske", + "Paddel", + "Schaufelrad", + "Vorhängeschloss", + "Pinsel", + "Nachtanzug", + "Palast", + "Längsflötenspiele", + "Küchenrolle", + "Fallschirm", + "Barren", + "Parkuhr", + "Wagen", + "Terrasse", + "Münzfernsprecher", + "Sockel", + "Federmappe", + "Griffelspitzer", + "Parfüm", + "Petrischale", + "Photokopie", + "Plektron", + "Helm mit Spitze", + "Lattenzaun", + "Pritschenwagen", + "Spartopf", + "Kissen", + "Piratenschiff", + "Wasserkrug", + "Hobel", + "Plastiktüte", + "Pflug", + "Saugglocke", + "Sofortbildkamera", + "Pfahl", + "Grüne Minna", + "Billardtisch", + "Blumentopf", + "Töpferscheibe", + "Gebetsteppich", + "Drucker", + "Bau", + "Projektil", + "Projektor", + "Scheibe", + "Boxsack", + "Portemonnaie", + "Federkiel", + "Bettdeck", + "Schläger", + "Heizkörper", + "Radioteleskop", + "Regentonne", + "Wohnmobil", + "Reflexkamera", + "Frigidaire", + "Fernbedienung", + "Gaststätte", + "Trommelrevolver", + "Gewehr", + "Schaukelstuhl", + "Spießbraten", + "Rugbyball", + "Lineal", + "Turnschuh", + "Panzerschrank", + "Sicherheitsnadel", + "Salzstreuer", + "Sandale", + "Pareo", + "Saxophon", + "Schwertscheide", + "Waage", + "Schulbus", + "Schoner", + "Anzeigetafel", + "Schraube", + "Schraubendreher", + "Sicherheitsgurt", + "Nähmaschine", + "Schild", + "Schuhladen", + "Warenkorb", + "Einkaufswagen", + "Schüppe", + "Duschhaube", + "Duschvorhang", + "Schi", + "Schlafsack", + "Rechenschieber", + "Schneemobil", + "Schneepflug", + "Seifenspender", + "Fußball", + "Strumpf", + "Solarschmelzofen", + "Suppenteller", + "Leertaste", + "Heizlüfter", + "Spindel", + "Sportwagen", + "Scheinwerfer", + "Bühne", + "Dampflokomotive", + "Bogenbrücke mit Bogen teilweise unterhalb der Fahrbahn", + "Stethoskop", + "Stola", + "Steinwand", + "Stoppuhr", + "Ofen", + "Straßenbahnsystem", + "Trage", + "U-Boot", + "Anzug", + "Sonnenuhr", + "Sonnenbrille", + "Sonnencreme", + "Hängebrücke", + "Mopp", + "Schaukel", + "Schalter", + "Spritze (Medizin)", + "Tischlampe", + "gepanzertes Militärfahrzeug", + "Teekanne", + "Teddybär", + "Strohdach", + "Hauptvorhang", + "Fingerhut", + "Dreschmaschine", + "Thron", + "Brotröster", + "Tabaktrafikant", + "WC-Brille", + "Fackel", + "Totempfahl", + "Abschleppfahrzeug", + "Spielzeugladen", + "Traktor", + "Sattelzug", + "Tablett", + "Dreirad-Auto", + "Kamerastativ", + "Triumphbogen", + "Obus", + "Sopranposaune", + "Vereinzelungsanlage", + "Regenschirm", + "Einrad", + "Pianino", + "Staubsauger", + "Blumenvase", + "Gewölbe", + "Samt", + "liturgisches Gewand", + "Viadukt", + "Violine", + "Volleyball (Sportgerät)", + "Waffeleisen", + "Wanduhr", + "Brieftasche", + "Schrank", + "Militärflugzeug", + "Waschbecken", + "Waschmaschine", + "Karaffe", + "Wasserturm", + "Pfeife", + "Perücke", + "Fenstergitter", + "Weinflasche", + "Holzlöffel", + "Wolle", + "Jurte", + "Internetauftritt", + "Comicheft", + "Kreuzworträtsel", + "Straßenschild", + "Lichtzeichenanlage", + "Schutzumschlag", + "Avocadocreme", + "Kraftbrühe", + "Feuertopf", + "Eis", + "Wassereis", + "bejgl", + "Breze", + "Kartoffelbrei", + "Blumenkohl", + "Cucurbita pepo pepo", + "Gurke", + "braunschweigisches Grün", + "Feige", + "Grenadine", + "Heu", + "Spagetti Carbonara", + "Schokoladensauce", + "Teig", + "Hackbraten", + "TK-Pizza", + "Chimichanga", + "Rotwein", + "Caffe macchiato", + "Eierlikör", + "Alm", + "Blase", + "Klippe", + "Korallenriff", + "Geysir", + "Seeuver", + "Landzunge", + "Meeresufer", + "Senke", + "aktiver Vulkan", + "Baseballerin", + "Bräutigam", + "Raps", + "Gänseblümchen", + "Gelber Frauenschuh", + "Eichel", + "Hagebutte", + "Kastanie", + "Blätterpilz", + "Stinkmorchel", + "Gemeiner Klapperschwamm", + "Röhrling", + "Ähre", + "Klopapier" + ] + ], + "NL": [ + [ + 0, + 1, + 2, + 3, + 4, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 28, + 29, + 30, + 31, + 34, + 36, + 39, + 40, + 42, + 45, + 46, + 48, + 49, + 50, + 53, + 56, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 70, + 71, + 72, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 84, + 85, + 86, + 87, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 120, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 157, + 160, + 161, + 162, + 163, + 169, + 170, + 172, + 175, + 176, + 178, + 180, + 191, + 194, + 199, + 201, + 208, + 213, + 217, + 223, + 224, + 225, + 227, + 228, + 230, + 233, + 235, + 236, + 237, + 242, + 244, + 246, + 247, + 248, + 249, + 250, + 251, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 393, + 394, + 395, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 424, + 425, + 426, + 427, + 428, + 430, + 432, + 433, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 443, + 444, + 446, + 447, + 448, + 449, + 450, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 463, + 464, + 465, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 478, + 480, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 494, + 495, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 515, + 516, + 517, + 518, + 519, + 520, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 541, + 542, + 546, + 547, + 549, + 551, + 552, + 553, + 554, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 600, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 636, + 637, + 640, + 641, + 642, + 643, + 645, + 646, + 647, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 660, + 661, + 663, + 665, + 666, + 668, + 669, + 670, + 671, + 673, + 674, + 675, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 716, + 717, + 718, + 719, + 721, + 724, + 725, + 726, + 728, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 755, + 756, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 790, + 791, + 792, + 794, + 795, + 797, + 798, + 799, + 800, + 802, + 803, + 804, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 816, + 817, + 818, + 819, + 820, + 821, + 823, + 824, + 826, + 827, + 828, + 829, + 830, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 842, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 852, + 853, + 854, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 868, + 869, + 870, + 872, + 873, + 875, + 876, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 886, + 887, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 924, + 925, + 927, + 928, + 929, + 932, + 933, + 935, + 938, + 939, + 943, + 944, + 946, + 947, + 950, + 951, + 952, + 954, + 957, + 958, + 960, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 982, + 984, + 985, + 986, + 988, + 989, + 992, + 996, + 998, + 999 + ], + [ + "zeelt", + "goudvis", + "antropofaag", + "tijgerhaai", + "hamerhaai", + "pijlstaartrog", + "haan", + "roddeltante", + "struisvogel", + "keep (vogel)", + "putter", + "kneu", + "Junco's", + "indigogors", + "roodborstlijster", + "buulbuuls", + "gaai", + "ekster", + "mees", + "waterspreeuw", + "wouwen", + "Amerikaanse zeearend", + "gieren (vogels)", + "laplanduil", + "gevlekte salamander", + "Mexicaanse wandelvis", + "brulkikker", + "boomkikvors", + "lederschildpad", + "moerasschildpad", + "leguaan", + "Roodkeelanolis", + "echte agamen", + "gilamonster", + "oostelijke smaragdhagedis", + "komodovaraan", + "Nijlkrokodil", + "Amerikaanse alligator", + "Ringnekslang", + "koningsslangen", + "kousenbandslangen", + "Afgodslang", + "Rotspython", + "Brilslang", + "zeeslangen", + "hoornadder", + "Hoornratelslang", + "trilobieten", + "hooiwagen", + "schorpioen", + "Zwartgele argiope", + "kruisspin", + "zwarte weduwe", + "vogelspin", + "wolfspinnen", + "teek", + "duizendpoot", + "korhoen", + "patrijs", + "kraaghoen", + "pauw", + "kwartel", + "hoen", + "grijze roodstaartpapegaai", + "grote geelkuifkaketoe", + "spoorkoekoeken", + "bijeneter", + "neushoornvogels", + "kolibrie", + "glansvogels", + "toekan", + "mannetjeseend", + "Middelste zaagbek", + "gans", + "zwarte zwaan", + "olifant met grote slagtanden", + "mierenegel", + "vogelbekdier", + "wallabie", + "koalabeertje", + "Wombats (hoofdbetekenis)", + "kwal", + "zeeanemonen", + "hersenkoraal", + "platwormen", + "rondworm", + "schelp", + "slak", + "slak", + "zeeslak", + "keverslakken", + "parelmoernautilus", + "wenkkrabben", + "langoest", + "rivierkreeft", + "heremietkreeft", + "pissebed", + "ooievaar", + "zwarte ooievaar", + "lepelaar", + "flamingo's", + "roerdomp", + "kraanvogel", + "Koerlan", + "Amerikaanse meerkoet", + "trapgans", + "steenloper", + "bonte strandloper", + "tureluur", + "Grijze snippen", + "scholekster", + "pelikaan", + "koningspinguïn", + "albatros", + "grijze walvis", + "orka", + "doejong", + "zeeleeuw", + "chihuahua (hond)", + "Japanse spaniël", + "maltezer", + "Pekingees", + "Shi zhu", + "épagneul nain continental", + "Afghaanse windhond", + "brak", + "snuffelaar", + "Bloedhond", + "Barzoi (hond)", + "trillen op zijn benen", + "whippet (hond)", + "hond voor jacht op otters", + "saloeki", + "Weimarse staande hond", + "pitbullterriër", + "airedaleterriër", + "Dandie Dinmont-terriër", + "Schotse terriër", + "Australische silkyterriër", + "labrador", + "Ierse setter", + "Engelse springerspaniël", + "schippersklokje", + "Groenendaeler", + "Mechelse herder", + "kelpie (hond)", + "Hongaarse herdershond", + "Shetlandsheepdog", + "Vlaamse koehond", + "Duitse herdershond", + "dobermannpincher", + "dwergpinscher", + "bokser", + "Tibetaanse mastiff", + "Duitse dog", + "Sint-Bernard", + "sledehond", + "Alaska-malamute", + "Siberische husky", + "dalmatiër", + "Hollandse bulldog", + "newfoundlander", + "Pyrenese berghond", + "Samojeed", + "Pommers", + "eten", + "Grote Keeshond", + "wolvin", + "witte wolf", + "Manenwolf", + "prairiewolf", + "Dingo (hoofdbetekenis)", + "Aziatische wilde hond", + "Afrikaanse wilde hond", + "hyena's", + "vos", + "grootoorkitvos", + "poolvos", + "grijze vos", + "Cyper", + "Pers", + "siamees", + "poema", + "los", + "luipaard", + "sneeuwpanter", + "panter", + "leeuw", + "tijger", + "jachtluipaard", + "bruine beer", + "kraagbeer", + "ijsbeer", + "mangoest", + "stokstaartje", + "zandloopkevers", + "onzelieveheersbeestje", + "loopkevers", + "boktorren", + "goudhaantje", + "mestkever", + "snuitkever", + "vlieg", + "bijen", + "mieren", + "sprinkhaan", + "krekel", + "[[wandelende]] [[tak]]", + "kakkerlak", + "bidsprinkhaan", + "cicade", + "dwergcicaden", + "gaasje", + "libel", + "juffer", + "koevinkje", + "monarchvlinder", + "zeester", + "zeeëgel", + "zeekomkommer", + "katoenstaartkonijn", + "echte hazen", + "angorakonijn", + "stekelvarken", + "Zwarte eekhoorn", + "marmotten", + "bever", + "cavia", + "zebra (dier)", + "varken", + "wild zwijn", + "wrattenzwijn", + "nijlpaard", + "os", + "karbauw", + "Europese bizon", + "dikhoornschaap", + "steenbok", + "hartenbeest", + "Aepycerotinae", + "gezelle", + "dromedaris", + "lama", + "wezel", + "nerts", + "bunzing", + "fret", + "Lutrinae", + "stinkdier", + "das", + "gordeldier", + "Kraagluiaard", + "orang-oetan(g)", + "gorilla's", + "chimpansee", + "langarmaap", + "huzaaraap", + "baviaan", + "makaak", + "slankapen", + "Zwartwitte franjeapen", + "neusaap", + "klauwaapje", + "kapucijn", + "brulaap", + "springaapjes", + "Zwarthandslingeraap", + "doodshoofdaapje", + "ringstaartmaki", + "indri (halfaap)", + "aziatische olifant", + "Savanneolifant", + "pandabeer", + "reuzenpanda", + "snoekmakreel", + "aal", + "Cohozalm", + "Clownvis", + "steur", + "geep", + "kogelvis", + "rekenraam", + "abaja", + "academisch kostuum", + "klavieraccordeon", + "akoestische gitaar", + "cargo", + "lijnvliegtuig", + "luchtschip", + "ziekenwagen", + "amfibievoertuig", + "bijenstal", + "dienschort", + "asbak", + "aanvalsgeweer", + "rugzak", + "bakkerij", + "evenwichtsbalk", + "ballon", + "balpen", + "banjospeler", + "leuning", + "halter", + "kapper", + "hooischuur", + "drukmeter", + "fust", + "kruiwagen", + "basketbal", + "fagottist", + "badmuts", + "badkuip", + "stationwagen", + "vuurtoren", + "bekerglas", + "berenmuts", + "bierfles", + "bierglas", + "borstje, salopette", + "tandem (fiets)", + "verzamelband", + "kijker", + "vogelkastje", + "botenhuis", + "bobslee", + "luifelhoed", + "boekenkast", + "boekenwinkel", + "flessendop", + "boog", + "vlinderdas", + "plateau", + "b.h.", + "golfbreker", + "borstschild", + "emmer", + "gesp", + "kogelwerend vest", + "beenhouwerij", + "taxi (vervoer)", + "kookketel", + "kaars", + "kanon", + "kano", + "blikopener", + "vest", + "mallemolen", + "karton", + "giromaat", + "steen", + "katamaran", + "cd-speler", + "Celli", + "mobiele telefoon", + "ketting", + "Gaas (materiaal)", + "maliënkolder", + "motorkettingzaag", + "kist (verpakking)", + "klok", + "porseleinkast", + "kerk", + "bioscoop", + "mes", + "klompschoen", + "cocktailshaker", + "koffiepot", + "propeller", + "nummerslot", + "klavier", + "banketbakkerij", + "containerschip", + "klapdak", + "kurketrekker", + "trompet", + "tien-gallon hat", + "wieg", + "hijskraan", + "valhelm", + "krat", + "wieg", + "kruk (hulpmiddel)", + "harnas", + "dam (waterkering)", + "lessenaar", + "desktopcomputer", + "draaitoestel", + "luier", + "vaatdoek", + "vaatwasmachine", + "schijfrem", + "dok", + "hondenslee", + "gewelf", + "voetmat", + "membranofoon", + "drumstok", + "elektrische gitaar", + "elektrische locomotief", + "briefomslag", + "poeder (make-up)", + "boa (kleding)", + "ordner", + "Blusboot", + "brandweerwagen", + "vlaggenstok", + "dwarsfluit", + "klapstoel", + "vorkheftruck", + "fonteintje", + "vulpen", + "hemelbed", + "goederenwagen", + "hoorn", + "braadpan", + "bonthandel", + "vuilniswagen", + "gasmasker", + "benzinepomp", + "Golfbal", + "golfkar", + "gondel", + "gong (muziekinstrument)", + "gewaad", + "vleugelpiano", + "kas", + "kruidenier", + "Andriana Bouwman", + "Haarlak", + "halfrupsvoertuig", + "vuist", + "sluitmand", + "föhn", + "elektronisch handapparaat", + "zakdoek", + "harddisk", + "mondharmonika", + "harp (tokkelinstrument)", + "oogster", + "hakbijl", + "revolvertas", + "val", + "rekstok", + "zandloper", + "strijkijzer", + "Pompoenlampion", + "jeansbroek", + "land Rover", + "t-shirt met lange mouwen", + "puzzel", + "riksja", + "bedieningshendel", + "knoop", + "Laboratoriumjas", + "pollepel", + "lampekap", + "schootcomputer", + "maaier", + "lenskap", + "briefopener", + "boekerij", + "vlot", + "aansteker", + "limousin", + "oceaanlijner", + "lippenrood", + "leegloper", + "bodylotion", + "luidspreker", + "loep", + "houtzagerij", + "postzak", + "brievenbus", + "riooldeksel", + "maraca (muziekinstrument)", + "xylofoon", + "masker", + "meiboom", + "gangenstelsel", + "maatbeker", + "megaliet", + "microfoon", + "magnetron", + "busje", + "minirok", + "Multiple purpose vehicle", + "raketwapen", + "want", + "stacaravan", + "T-Ford", + "klooster", + "brommer", + "mortier", + "missigit", + "klamboe", + "scooter (vervoermiddel)", + "BMX", + "computermuis", + "muizeval", + "verhuiswagen", + "nagel", + "nekkraag", + "halssnoer", + "speen", + "schootcomputer", + "obelisk (bouwkunst)", + "hobo", + "okarina", + "kilometerteller", + "oliefilter", + "orgel", + "oscilloscoop", + "ossekar", + "zuurstofmasker", + "pak", + "bat", + "Hekwiel", + "hangslot", + "penseel", + "shortama", + "paleis", + "panfluit", + "keukenrol", + "valscherm", + "brug", + "parkeermeter", + "equipage", + "terras", + "munttelefoon", + "voetstuk", + "pennenzak", + "puntenslijper", + "lekker geurtje", + "petrischaal", + "fotokopieerapparaat", + "palissade", + "pick-up (autotype)", + "strekdam", + "spaarpot", + "kussen", + "roversschip", + "lampetkan", + "schaaf", + "boodschappentas", + "ploeg", + "plopper", + "polaroidcamera", + "Pool", + "overvalwagen", + "regenponcho", + "biljart", + "bloempot", + "pottenbakkersschijf", + "gebedskleed", + "kleurenprinter", + "gevangenis", + "projectiel", + "projectieapparaat", + "puck (ijshockey)", + "stootzak", + "geldzak", + "slagpen", + "poederdons", + "racefiets", + "raket", + "verwarmingselement", + "radiotelescoop", + "regenton", + "kampeerwagen", + "koelkast", + "afstandsbesturing", + "eetcafe", + "revolver (wapen)", + "geweer", + "schommelstoel", + "gum", + "rugbybal", + "meetlat", + "sportschoen", + "brandkast", + "veiligheidsspeld", + "zoutvaatje", + "sandaal", + "saxofoon", + "schede", + "weegtoestel", + "schoener", + "scorebord", + "televisiescherm", + "schroef", + "schroevendraaier", + "veiligheidsgordel", + "naaimachine", + "bescherming", + "schoenenwinkel", + "boodschappenmandje", + "winkelwagen", + "schop", + "douchegordijn", + "ski (voortbeweging)", + "slaapzak", + "rekenliniaal", + "schuifdeur", + "gokautomaat", + "sneeuwscooter", + "sneeuwschuiver", + "zeeppomp", + "sok", + "zonnecollector", + "Sombrero (hoofdbetekenis)", + "soepkom", + "spatiebalk", + "kachel", + "shuttle", + "spindel", + "sportwagen", + "plaats", + "toneel", + "stoomlocomotief", + "boogbrug met dek door de boog", + "stethoscoop", + "stola", + "stophorloge", + "haard", + "vergiet", + "tramnet", + "frame", + "stoepa", + "onderzeeboot", + "kostuum", + "zonnewijzer", + "zonnebril", + "zonnebril", + "zonnebrandcrème", + "kettingbrug", + "zwabber", + "zwembroek", + "schommel", + "schakelaar", + "Injectiespuit", + "tafellamp", + "gevechtswagen", + "theepot", + "teddybeer", + "tennisbal", + "strodak", + "scherm", + "kous", + "dorsmachine", + "troon", + "tostiapparaat", + "sigarenmagazijn", + "wc-bril", + "toorts", + "totempaal", + "takelwagen", + "speelgoedwinkel", + "trekker", + "plateau", + "lange jas", + "kinderfiets", + "statief", + "zegeboog", + "bazuin", + "tobbe", + "tourniquet", + "paraplu", + "eenwieler", + "stofzuiger", + "bloemenvaas", + "gewelf", + "manchester", + "automaat", + "miskleed", + "viool", + "volleybal", + "wafelijzer", + "wandklok", + "portemonnee", + "kledingkast", + "gevechtsvliegtuig", + "wasbak", + "wasmachine", + "bidon", + "waterstation", + "fluitje", + "pruik", + "Hor", + "wijnfles", + "vleugel", + "wadjan", + "houten lepel", + "schapewol", + "Joert", + "webstek", + "stripboek", + "kruiswoordraadsel", + "straatnaambordje", + "verkeerslichten", + "boekomslag", + "Avocadomousse", + "Visconsomme", + "puddingtaart", + "ijs", + "ijslolly", + "zoute krakeling", + "kaasburger", + "aardappelpuree", + "bloemkool", + "Courgetten", + "komkommer", + "artisjok", + "kardoen", + "zwam", + "appelsien", + "citroen", + "vijg", + "bananengeel", + "granaatappel", + "hooi", + "Chocoladesaus", + "deeg", + "gehaktbrood", + "diepvriespizza", + "Buritto", + "rode wijn", + "espresso(-koffie)", + "advokaat", + "Alpen", + "bel", + "klip", + "koraalrif", + "geizer", + "oever", + "kaap", + "drempel", + "zeekust", + "dal (aardrijkskunde)", + "vulkaan", + "bruidegom", + "raapzaad", + "margriet", + "vrouwenschoentje", + "eikel", + "bottel", + "plaatzwam", + "Eikhaas", + "aar", + "toiletpapier" + ] + ], + "AF": [ + [ + 0, + 1, + 2, + 3, + 4, + 9, + 16, + 17, + 18, + 23, + 29, + 34, + 39, + 42, + 49, + 51, + 62, + 69, + 71, + 78, + 87, + 88, + 91, + 92, + 93, + 94, + 96, + 99, + 100, + 103, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 120, + 125, + 127, + 128, + 129, + 130, + 134, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 148, + 149, + 151, + 199, + 223, + 235, + 258, + 260, + 272, + 275, + 276, + 277, + 279, + 283, + 284, + 286, + 288, + 289, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 305, + 306, + 308, + 309, + 310, + 312, + 314, + 315, + 319, + 320, + 327, + 328, + 329, + 334, + 336, + 338, + 340, + 341, + 343, + 344, + 345, + 350, + 352, + 353, + 354, + 355, + 360, + 362, + 363, + 365, + 367, + 368, + 372, + 376, + 381, + 385, + 386, + 387, + 388, + 390, + 393, + 398, + 400, + 401, + 403, + 404, + 405, + 407, + 411, + 412, + 417, + 418, + 420, + 422, + 428, + 435, + 436, + 437, + 447, + 450, + 453, + 454, + 456, + 459, + 460, + 462, + 463, + 468, + 470, + 472, + 473, + 474, + 480, + 483, + 486, + 487, + 488, + 490, + 491, + 492, + 497, + 498, + 502, + 508, + 509, + 510, + 511, + 513, + 516, + 517, + 524, + 526, + 529, + 534, + 535, + 536, + 541, + 543, + 547, + 553, + 557, + 558, + 561, + 562, + 567, + 577, + 587, + 591, + 593, + 606, + 610, + 611, + 612, + 616, + 617, + 619, + 620, + 621, + 623, + 632, + 642, + 643, + 649, + 650, + 651, + 655, + 657, + 658, + 668, + 673, + 674, + 677, + 679, + 683, + 687, + 688, + 693, + 694, + 698, + 701, + 708, + 710, + 711, + 717, + 724, + 726, + 730, + 735, + 742, + 743, + 745, + 746, + 748, + 755, + 760, + 761, + 762, + 763, + 764, + 769, + 774, + 776, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 798, + 806, + 812, + 820, + 823, + 827, + 833, + 834, + 835, + 839, + 843, + 844, + 847, + 856, + 863, + 869, + 870, + 874, + 875, + 879, + 880, + 882, + 883, + 885, + 889, + 893, + 897, + 916, + 918, + 920, + 927, + 928, + 933, + 935, + 938, + 943, + 944, + 953, + 966, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 981, + 988, + 989, + 998, + 999 + ], + [ + "Seelt", + "Goudvis", + "Withaai", + "Tierhaai", + "Hammerkophaaie", + "volstruis", + "tiptolle", + "Gaai", + "Ekster", + "aasvoël", + "Axoloti", + "Leerskilpad", + "likkewaan", + "Koggelmander", + "Nylkrokodil", + "Trikeratops", + "Afrika-rotsluislang", + "Trilobiet", + "skerpioen", + "Bosluis", + "Gryspapegaai", + "ara pappegaai", + "Loeries", + "Byvreter", + "Bucerotiformes", + "Kolibrie", + "reënboogvoël", + "gans", + "Swartswaan", + "eendbekdier", + "Jellievis", + "Seeanemone", + "Platwurm", + "Rondewurms", + "Slak", + "Naakslak", + "Seenaakslakke", + "Kewerslak", + "Vioolspelerkrap", + "Kluisenaarskrap", + "Witooievaar", + "Grootswartooievaar", + "Lepelaar", + "flamink", + "Kraanvoël", + "Wildepou", + "Steenloper", + "Bontstrandloper", + "Rooipootruiter", + "Tobies", + "Pelikaan", + "Koningpikkewyn", + "Malmokke", + "Moordvis", + "Doegong", + "Chihuahua (hond)", + "Skotse terriër", + "Skiepertjie", + "Duitse Herdershond", + "Samojeed (hond)", + "Tjou-tjou", + "prêriewolf", + "Wildehond", + "Hiëna", + "vos", + "Poolvos", + "Persiese kat", + "Siamese kat", + "bergleeu", + "Luiperd", + "Sneeuluiperd", + "leeu", + "Tier", + "jagluiperd", + "Bruinbeer", + "Amerikaanse swartbeer", + "ysbeer", + "Muishond", + "Graatjiemeerkat", + "liewenheersbesie", + "Miskruier", + "Renosterkewer", + "Tweevlerkiges", + "by", + "Mier", + "kriek", + "Blattodea", + "Hotnotsgot", + "Naaldekoker", + "Waterjuffer", + "Seester", + "seekastaiing", + "Seekomkommer", + "ystervark", + "malmok", + "marmotjie", + "sebra", + "vark", + "Vlakvark", + "Seekoei", + "Os", + "steenbok", + "Swartrooibok", + "wildsbok", + "dromedaris", + "lama", + "Lutrinae", + "das", + "pantserdier", + "Orangoetang", + "sjimpansee", + "langarmaap", + "bobbejaan", + "neusaap", + "slingeraap", + "Asiatiese olifant", + "Savanne-olifant", + "Rooi panda", + "Ailuropoda", + "aal", + "Anemoonvis", + "telraam", + "Akademiese drag", + "trekklavier", + "Vliegdekskip", + "Passasiersvliegtuig", + "Lugskip", + "ambulans", + "voorskoot", + "vuilisdrom", + "ballon", + "balpuntpen", + "informasie oor hoe om n banjo te bou", + "barbeel", + "Kruiwa", + "bad", + "Stasiewa", + "vuurtoring", + "verkyker", + "Bobslee", + "boekrak", + "boekwinkel", + "boog", + "Brasserie", + "breekwater", + "besem", + "emmer", + "huurmotor", + "kers", + "kano", + "blikskêr", + "Knooptrui", + "Kitsbank", + "Kasteel", + "tjello", + "sellulêre telefoon", + "ketting", + "Maliekolder", + "Kettingsaag", + "kis", + "kerk", + "flieksaal", + "Geta (skoeisel)", + "sleutelbord", + "lekkergoed", + "houerskip", + "afslaandak", + "Trompet", + "wieg", + "Hysertoestel", + "Kuras", + "skryftafel", + "babadoek", + "skottelgoedwasser", + "Skyfremme", + "Droogdok", + "Membranofoon", + "gewig", + "Elektriese lokomotief", + "lêer", + "vlagpaal", + "fluit", + "Vurkhyser", + "Fontein", + "eierpan", + "ghong", + "Hamer", + "sakdoek", + "Mondfluitjie", + "strykyster", + "T-hemp", + "legkaart", + "Riksja", + "Knoop", + "Witjas", + "lampskerm", + "Skootrekenaar", + "grassnyer", + "briewemes", + "Luidspreker", + "xilofoon", + "African Masks", + "Megaliet", + "mikrofoon", + "Mikrogolfoond", + "minirok", + "Missiel", + "moffie", + "Moskee", + "muis", + "muisval", + "spyker", + "halssnoer", + "hobo", + "orrel", + "Ossilloskoop", + "Roeispaan", + "skepwiel", + "paleis", + "Valskerm", + "voetstuk", + "Skerpmaker", + "Reukwater", + "bakkie (voertuig)", + "seerowerskip", + "Skaafgereedskap", + "Ploeg", + "Ponsjo", + "rekenaardrukker", + "Tronk", + "projektor", + "Hokkiekabouter", + "beursie", + "radioteleskoop", + "yskas", + "afstandbeheer", + "eetplek", + "Rewolwer", + "Geweer", + "liniale", + "Sandale", + "saxofoon", + "skoolbus", + "Skoener", + "neuk", + "skroewedraaier", + "Veiligheidsgordel", + "naaimasjien", + "skild", + "Trollie", + "graaf", + "rekenliniaal", + "Sokkies", + "ruimtependeltuig", + "Stoomlokomotief", + "stetoskoop", + "verwarmer", + "Duikboot", + "pak klere", + "Sonwyser", + "Hangbrug", + "swaai", + "skakel", + "tenk", + "Dorsmasjien", + "Totempaal", + "Soldatejas", + "driewiel", + "Trolliebus", + "Tromboon", + "Sambreel", + "Eenwielfiets", + "stofsuier", + "Vaas", + "Fluweel", + "Viool", + "portemonnee", + "wasmasjien", + "webwerf", + "blokkiesraaisel", + "verkeerslig", + "koekstruif", + "Roomys", + "kaasburger", + "kapokaartappels", + "blomkool", + "komkommer", + "Varinggroen", + "pynappel", + "Rooiwyn", + "bel", + "Krans", + "Koraalrif", + "Geiser (bron)", + "kaap", + "Kuslyn", + "dal", + "Vulkaan", + "bofbalspeler", + "akker", + "Roosbottel", + "aar", + "toiletpapier" + ] + ], + "HE": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 9, + 10, + 11, + 13, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 32, + 34, + 37, + 39, + 40, + 42, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 56, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 71, + 77, + 78, + 79, + 80, + 82, + 84, + 85, + 86, + 87, + 88, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 114, + 115, + 116, + 121, + 122, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 157, + 160, + 162, + 163, + 169, + 172, + 176, + 178, + 191, + 199, + 211, + 213, + 217, + 223, + 227, + 228, + 229, + 230, + 233, + 234, + 235, + 236, + 237, + 242, + 243, + 246, + 247, + 249, + 250, + 251, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 305, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 319, + 320, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 391, + 393, + 394, + 395, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 423, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 435, + 436, + 437, + 438, + 439, + 444, + 445, + 447, + 448, + 449, + 450, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 490, + 491, + 492, + 496, + 497, + 498, + 499, + 502, + 503, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 519, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 532, + 534, + 536, + 537, + 538, + 541, + 543, + 546, + 547, + 549, + 551, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 566, + 567, + 569, + 570, + 571, + 572, + 574, + 576, + 577, + 578, + 580, + 582, + 583, + 585, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 595, + 597, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 616, + 618, + 619, + 620, + 621, + 623, + 626, + 627, + 628, + 629, + 631, + 632, + 633, + 634, + 640, + 641, + 642, + 643, + 647, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 660, + 661, + 662, + 663, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 678, + 679, + 682, + 683, + 684, + 685, + 687, + 688, + 691, + 692, + 694, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 731, + 732, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 757, + 758, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 794, + 795, + 797, + 798, + 802, + 803, + 804, + 806, + 807, + 808, + 810, + 812, + 816, + 817, + 818, + 819, + 820, + 823, + 825, + 826, + 827, + 828, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 844, + 845, + 847, + 849, + 850, + 851, + 852, + 854, + 855, + 857, + 859, + 861, + 862, + 863, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 909, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 924, + 925, + 926, + 927, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 950, + 952, + 953, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 988, + 999 + ], + [ + "טינקה", + "דג זהב", + "עמלץ לבן", + "כריש טיגריסי", + "פטישניים", + "חשמלנאים", + "יען", + "פרוש הררי", + "קרדואליס חוחית אירופאית", + "גיבתונית גונקו", + "פאסרינה כחול כהה", + "קיכלי אדום-חזה", + "בולבול‎", + "עורבני", + "עקעקים", + "אמודאי", + "דיות", + "עיטם לבן-ראש", + "נשר", + "לילית אפורה גדולה", + "פרוטיאוסיים", + "צפרדע שור אמריקנית", + "אסקפיים", + "צב ים גילדי", + "צב סגיר", + "איגואנה (סוג)", + "אנוליסיים", + "חרדון (סוג)", + "הלודרמה מרירית", + "לְטָאָה אִזְמָרַגְדִּית", + "זיקית סאהלית", + "כוח ענק", + "תנין היאור", + "אליגטור אמריקני", + "טריצרטופס", + "זעמן אלמוגי", + "נחש בירית", + "נָחָשׁ בָּרִיחַ‎", + "פיתון סלעים אפריקני", + "קוברה הודית", + "פתני הים", + "עכן חרטומים", + "עכסן עכני", + "טרילוביט‎", + "עקרב", + "זאבניים", + "קרציות", + "נָדָל‎", + "שכווי שחור", + "שכווי הצווארון", + "!טַוָּס", + "שלווים", + "חוגלות", + "אפרור אפריקני", + "מקאו", + "קקדו צהוב-ציצית", + "קוקל", + "שרקרקיים", + "קלאונאים", + "קוֹלִיבְּרִי‎", + "יקמראים", + "טוּקָן‎", + "מרגון בינוני", + "אווז", + "ברבור שחור", + "קיפודניים", + "ברווזן", + "וולבי", + "קואלה", + "וומבטיים", + "מדוזה", + "שׁוֹשַׁנַּת יָם‎", + "אלמוגניים (אלמוגים)", + "תולעים שטוחות", + "תולעים נימיות", + "קונכייה", + "חשופיות", + "חשופיות ים", + "רב-לוחיתאים", + "סרטן מלכותי", + "לובסטר אמריקני", + "לובסטרים קוצניים", + "סרטני נהרות", + "סרטנים נזירים", + "חסידה לבנה", + "חסידה שחורה", + "כפן", + "פלמינגו", + "אנפיות", + "עגור", + "ארמוס עגור בוכה", + "אגמייה אמריקאית", + "חובתיים", + "ארנריה אדמונית", + "חופית אלפינית", + "ביצנית לבנת כנף", + "חרטומנית", + "שלצדפיים", + "שקנאי", + "פינגווין מלכותי", + "אלבטרוסיים", + "לווייתן אפור", + "קטלן", + "תחש המשכן", + "אריות ים", + "צ'יוואווה‎", + "צ'ין יפני", + "כלב מלטזי", + "פקינז", + "שי טסו", + "פפיון", + "כלב אפגני‎", + "ביגל", + "כלב דם", + "בורזוי", + "ויפט", + "סלוקי", + "ויימרנר", + "איירדייל טרייר", + "סקוטיש טרייר", + "ויסלה", + "סטר אירי", + "ספרינגר ספניאל אנגלי", + "סכיפרקה", + "קלפי אוסטרלי", + "קומונדור‎", + "כלב צאן אנגלי עתיק", + "כלב רועים שלטי", + "בוביה דה פלאנדר", + "רוטוויילר", + "רועה גרמני", + "דוברמן פינצ'ר‎", + "פינצ'ר ננסי‎", + "בּוֹקְסֶר‎", + "בול מסטיף", + "דני ענק", + "סן ברנרד", + "אלסקן מלמוט", + "האסקי סיבירי‎", + "דלמטי", + "בסנג'י", + "פאג", + "ניופאונדלנד (כלב)", + "כלב הרים פירנאי", + "סמויד", + "פומרניאן", + "צ'או צ'או", + "קייסהונד", + "זאב", + "זאב ארקטי", + "זאב אדום", + "זאב ערבות", + "דינגו", + "דול מצוי", + "זְאֵב טָלוּא‎", + "צבועיים", + "שׁוּעָל", + "שועל שלג", + "שועל אפור מצוי", + "חתול טאבי", + "חתול פרסי", + "חתול סיאמי", + "פומת ההרים", + "שונר", + "נמר", + "נמר השלג", + "יגואר", + "אריה", + "טיגריס", + "ברדלס", + "דוב חום", + "דוב שחור אמריקני", + "דוב קוטב", + "נמייתיים", + "סוריקטה", + "גדיתים", + "מושית", + "רצניתיים", + "יקרוניתיים", + "חיפושיות זבל", + "חדקוניתיים", + "זבובאים", + "דבורים", + "נמליים", + "!חַרְגּוֹל", + "צרצר", + "תיקנים", + "גמלי שלמה", + "ציקדות", + "שפיריות", + "שפריריות", + "דנאית מלכותית", + "כוכבי־ים", + "קיפודי ים", + "מלפפוני-ים", + "ארנבון יער", + "ארנבת", + "ארנבון אנגורה", + "אוגרים", + "דורבן", + "סנאי השועל", + "מרמיטה", + "בונה", + "קביה‎", + "זברה", + "חזיר", + "חֲזִיר בָּר‎", + "חזיר יבלות מצוי", + "היפופוטם", + "תאו מים", + "ביזון", + "אַיִל‎", + "כבש גדול-קרניים", + "יעל האלפים", + "בובאל איילי", + "אימפלה", + "צבי", + "כרכרה", + "למה מצויה", + "סמור", + "חורפן", + "סמור הבר האירופי", + "חָמוֹס‎", + "לוּטְרָה‎", + "בואש", + "גיריות", + "אַרְמָדִיל‎", + "עַצְלָנִיִּים", + "אורנגאוטן", + "גורילה", + "שימפנזה", + "גיבון לבן-יד", + "סיאמנג", + "פרש אדום", + "בבון", + "מקוק", + "קולובים", + "קולובוס", + "קוף חוטמני", + "מרמוסט", + "שאגן", + "טיטים", + "קוף עכביש שחור-יד", + "קוף סנאי מצוי", + "למור זנב-טבעת", + "אינדרי", + "פיל הודי", + "פיל אפריקני", + "פנדה אדומה‎", + "פנדה ענק", + "צלופחאים", + "אלתית כסופה", + "שושנונים", + "חדקניים", + "דגי תנין", + "חשבונייה", + "עבאיה", + "לבוש אקדמי", + "אָקּוֹרְדִּיּוֹן‎", + "גיטרה אקוסטית", + "נושאת מטוסים", + "מטוס נוסעים", + "ספינת אוויר", + "חישפוזית‎", + "כלי רכב אמפיבי", + "כּוֶּרֶת‎", + "סינר", + "פח אשפה", + "רובה סער", + "תיק גב", + "מאפייה", + "קורה (התעמלות)", + "כדור פורח", + "עט כדורי", + "בנג'ו", + "מעקה", + "כיסא ספרים", + "אסם", + "ברומטר", + "חבית", + "מריצה", + "בייסבול (כדור)", + "כדור כדורסל", + "עריסה", + "בסון", + "כובע ים", + "אמבטיה", + "מכונית סטיישן", + "משואה", + "כוס כימית", + "שאקו (כובע)", + "אופני טנדם", + "בִּיקִינִי‎", + "מִשְׁקֶפֶת‎", + "שׁוֹבָךְ", + "בֵּית סִירוֹת‎", + "מזחלות", + "כוננית", + "חֲנוּת סְפָרִים‎", + "פקק", + "קֶשֶת", + "עניבת פרפר", + "חזייה", + "שובר גלים", + "שִׁרְיוֹן‎", + "מטאטא", + "דלי", + "אבזם", + "אפוד מגן", + "מונית", + "יורה (כלי)", + "נר", + "קאנו", + "פותחן קופסות", + "קרדיגן", + "סחרחרה", + "קופסת קרטון", + "כספומט", + "קָסֶטָה‎", + "טירה", + "קטמרן", + "צ'לו", + "טלפון נייד", + "שַׁרְשֶׁרֶת‎", + "שריון טבעות", + "מסור שרשרת", + "אַרְגָּז‎", + "גרב חג המולד", + "כנסיה", + "בית קולנוע", + "קופיץ", + "נעל עץ", + "שייקר", + "מנעול צירופים", + "מקלדת", + "חנות ממתקים", + "אוניית מכולות", + "קבריולה", + "חולץ פקקים", + "קורנית", + "מגפי בוקרים", + "כובע קאובוי", + "עֲרִיסָה‎", + "עגורן", + "ארגז", + "סיר לבישול איטי", + "קב (אביזר)", + "קיראס", + "סֶכֶר‎", + "שולחן", + "מחשב שולחני", + "חיתול", + "שֻׁלְחָן", + "מדיח כלים", + "מבדוק", + "מזחלת כלבים", + "כיפה", + "ממברנופוניים", + "משקולית", + "גיטרה חשמלית", + "קטר חשמלי", + "מַעֲטָפָה‎", + "פודרה", + "כבאית", + "מוֹט הַדֶגֶל‎", + "חליל", + "כיסא מתקפל", + "מַלְגֵּזָה‎", + "מזרקה", + "עט נובע", + "קֶרֶן", + "מַחֲבַת‎", + "רכב לפינוי אשפה", + "מסכת סינון אוויר", + "משאבת דלק", + "גָּבִיעַ‎", + "כדור גולף", + "גונדולה", + "גונג", + "שִׂמְלַת-עֶרֶב", + "חממה", + "מכולת", + "גיליוטינה", + "תרסיס לשיער", + "זחל\"ם", + "פטיש", + "מייבש שיער", + "מכשיר נייד", + "מִמחָטָה‎", + "מפוחית פה", + "נבל", + "מקצרה", + "!נַרְתִּיק", + "מתח (מתקן)", + "שעון חול", + "מגהץ", + "ג'ק-או-לנטרן", + "גִּ׳ינְס‎", + "גִ׳יפּ‎", + "חולצת טי", + "תצרף‎", + "ריקשה", + "קימונו", + "קשר", + "מצקת", + "אהיל", + "מחשב נייד‎", + "מכסחת דשא", + "סכין לפתיחת מכתבים", + "אש‎", + "לימוזינה", + "אוניית קו אוקיינית", + "שְׂפָתוֹן", + "קרם גוף", + "רַמְקוֹל‎", + "לופ (מכשיר)", + "מנסרה", + "מכסה כוות כניסה", + "מאראקס", + "קְסִילוֹפוֹן", + "צָעִיף‎", + "מְשׂוּרָה‎", + "מגלית", + "מיקרופון", + "מיקרו", + "מיניבוס", + "חצאית מיני", + "מיניוואן", + "טיל", + "בית נייד", + "פורד מודל T", + "מודם", + "!מִנְזָר", + "טוסטוס", + "מַכְתֵּשׁ", + "כובע בוגרים", + "מסגד", + "כילה", + "קטנוע", + "אופני הרים", + "עכבר", + "מלכודת עכברים", + "מסמר", + "צווארון", + "שרשרת‎", + "אובליסק", + "אבוב", + "אוקרינה", + "אודומטר", + "עוגב", + "אוסילוקופ‎", + "מסכת חמצן", + "חֲבִילָה‎", + "גַּלְגַל מְשׁוֹטוֹת‎", + "מִבְרֶשֶׁת‎", + "פיג'מה", + "ארמון", + "חליל פאן", + "מגבת נייר", + "מצנח", + "מקבילים (התעמלות)", + "מדחן‎", + "קרון נוסעים‎", + "פטיו", + "טלפון ציבורי", + "כַּן‎", + "קלמר", + "מחדד", + "בושם", + "צלחת פטרי", + "מכונת צילום", + "מפרט‎", + "פיקלהאובה", + "טנדר", + "קופת חיסכון", + "כרית", + "קנקן", + "מקצוע‎", + "שקית פלסטיק", + "מחרשה", + "פומפה", + "מצלמת פיתוח מיידי", + "פונצ'ו", + "שולחן סנוקר", + "עציץ", + "אובניים", + "מחצלת תפילה", + "מדפסת", + "בית סוהר", + "!טִיל", + "מקרן", + "שַׂק חֲבָטוֹת‎", + "תיק-יד", + "קולמוס", + "שמיכת טלאים", + "מחבט", + "רדיאטור", + "רדיו-טלסקופ", + "רכב RV", + "!סְלִיל", + "מקרר", + "שלט רחוק", + "מסעדה", + "אקדח תופי", + "רוֹבֶה‎", + "כיסא נדנדה", + "אסכלה", + "מַחַק", + "סרגל", + "כספת", + "סיכת ביטחון", + "מלחייה", + "סנדלים", + "סארונג", + "סקסופון", + "נרתיק‎", + "מאזניים", + "אוטובוס תלמידים", + "סקונר", + "בורג", + "מברג", + "חגורה", + "מכונת תפירה", + "באקלר", + "עגלת קניות", + "אֵת חֲפִירָה", + "וִילוֹן-מִקְלַחַת", + "סקי‎", + "שק שינה", + "סרגל חישוב", + "אופנוע שלג", + "מפלסת שלג", + "מתקן לסבון נוזלי", + "גֶּרֶב", + "כבשן סולארי", + "סוֹמְבְּרֶרוֹ‎", + "מקש רווח", + "מעבורת חלל‎", + "פֶּלֶך‎", + "מכונית ספורט", + "זְרַקּוֹר‎", + "במה", + "קַטַּר קִיטוֹר‎", + "מסכת (מכשיר רפואי)", + "קיר אבן", + "שעון עצר", + "תַּנּוּר‎", + "מִסְנֶנֶת", + "חַשְׁמַלִּית", + "אלונקה", + "צוללת", + "חליפה", + "שעון שמש‎", + "משקפי שמש", + "קרם הגנה", + "גשר תלוי", + "סמרטוט", + "מפסק", + "מזרק", + "טנק", + "תֵּיוֹן", + "דוב צעצוע", + "טֶלֶבִיזְיָה", + "כדור טניס", + "מסך", + "אצבעון", + "כס", + "תנור מקלה", + "מושב אסלה", + "לפיד", + "עמוד טוטם", + "טרקטור", + "משאית סמי-טריילר", + "מגש", + "מעיל גשם", + "תְּלַת אוֹפַן‎", + "חצובה", + "שער ניצחון‎", + "טרוליבוס", + "טרומבון", + "מחסום כניסה מסתובב", + "מטרייה", + "חד-אופן", + "שואב אבק", + "אֲגַרטֵל‎", + "קמרון", + "קטיפה", + "ויאדוקט", + "כינור", + "כַּדּוּרְעָף", + "דפוס אפיפיות", + "שְׁעוֹן קִיר‎", + "ארנק", + "ארון", + "כלי טיס צבאי", + "כִּיּוֹר‎", + "מכונת כביסה", + "בקבוק מים", + "מגדל מים‎", + "משרוקית", + "פאה נכרית", + "ווק", + "יער", + "יוּרְט‎", + "אתר אינטרנט", + "חוברת קומיקס", + "תשבץ", + "שלט רחוב", + "רמזור", + "גוואקמולי", + "קונסומה", + "הוט פוט", + "טרייפל", + "גלידה", + "שלגון", + "כעך", + "בייגלה", + "צ'יזבורגר", + "מחית תפוחי אדמה", + "!כְּרוּבִית", + "קישוא", + "מלפפון", + "תַּפּוּז", + "תְּאֵנָה‎", + "אננס", + "רִימֹּונֵא‎‎", + "חציר‎", + "קרבונרה", + "סירופ שוקולד", + "בצק", + "קציץ בשר", + "פיצה", + "בוריטו", + "יין אדום‎", + "אספרסו", + "אדבוקט", + "בועה‎", + "צוק", + "שונית אלמוגים", + "גייזר", + "שן יבשה", + "קו חוף", + "עמק", + "הר געש", + "חָתָן", + "לפתית", + "בלוט", + "נְיַר טוֹאָלֵט‎" + ] + ], + "SQ": [ + [ + 1, + 2, + 9, + 10, + 11, + 16, + 22, + 23, + 39, + 46, + 49, + 51, + 61, + 71, + 75, + 78, + 79, + 86, + 94, + 99, + 100, + 103, + 105, + 107, + 111, + 113, + 114, + 122, + 123, + 130, + 134, + 144, + 146, + 147, + 148, + 149, + 150, + 235, + 269, + 272, + 275, + 277, + 279, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 296, + 298, + 299, + 301, + 309, + 310, + 312, + 314, + 319, + 327, + 328, + 331, + 333, + 337, + 338, + 341, + 342, + 344, + 346, + 347, + 348, + 350, + 353, + 354, + 355, + 356, + 358, + 359, + 360, + 362, + 365, + 366, + 368, + 369, + 371, + 383, + 385, + 386, + 387, + 388, + 390, + 394, + 398, + 401, + 402, + 403, + 407, + 411, + 412, + 414, + 415, + 418, + 421, + 425, + 426, + 428, + 430, + 435, + 436, + 437, + 447, + 453, + 454, + 456, + 460, + 461, + 462, + 463, + 468, + 470, + 471, + 472, + 481, + 483, + 484, + 486, + 487, + 488, + 490, + 492, + 497, + 498, + 499, + 502, + 508, + 509, + 513, + 516, + 517, + 525, + 526, + 527, + 534, + 541, + 546, + 549, + 557, + 558, + 562, + 567, + 570, + 572, + 576, + 580, + 583, + 587, + 589, + 591, + 594, + 606, + 608, + 618, + 619, + 620, + 626, + 632, + 642, + 643, + 650, + 651, + 662, + 665, + 668, + 670, + 673, + 677, + 679, + 681, + 682, + 683, + 685, + 688, + 692, + 697, + 698, + 701, + 706, + 710, + 719, + 721, + 725, + 726, + 730, + 733, + 738, + 741, + 742, + 745, + 748, + 749, + 750, + 755, + 760, + 761, + 762, + 764, + 766, + 769, + 771, + 774, + 776, + 777, + 778, + 780, + 783, + 784, + 786, + 787, + 792, + 806, + 816, + 823, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 840, + 845, + 847, + 849, + 850, + 857, + 862, + 866, + 870, + 879, + 882, + 883, + 884, + 885, + 889, + 893, + 894, + 897, + 915, + 916, + 918, + 919, + 920, + 928, + 933, + 935, + 938, + 939, + 943, + 957, + 958, + 960, + 961, + 963, + 966, + 971, + 972, + 974, + 978, + 979, + 980, + 998, + 999 + ], + [ + "Peshku i kuq", + "Peshkaqeni i bardhë", + "struci", + "borës i bjeshkëve", + "kryeartëz", + "bilbili", + "Shqiponja kokëbardhë", + "shkaba", + "Iguania", + "Zhapiku u gjelbër evropian", + "Krokodili i Nilit", + "Triceratopsi", + "Boa shtrënguese", + "akrep", + "Vejushja e zezë", + "Rriqrat", + "njëqindkëmbëshi", + "thëllëza", + "Kolibri me sqepë në formë të shpatës", + "gatë", + "Mjellma e zezë", + "Sqepori", + "koal", + "Kandili i detit", + "Krimbat Cilindrike", + "Kërmill", + "ligavec", + "karavidhe amerikane", + "karkalec i madh deti", + "Flamingot", + "lejlek", + "laradash", + "Albatrosi", + "Balena e hirtë", + "Orka", + "Dugongu", + "Luanët e detit", + "qen pastori gjerman", + "ujk", + "kojotë", + "Qeni i egër Afrikan", + "dhelpër", + "Dhelpra artike", + "luqërbull", + "Leopardi", + "Leopardi i dëborës", + "Jaguari", + "luan", + "tigër", + "gepard", + "Ariu i murrmë", + "Ariu polar", + "Mongozi", + "Merkati", + "nuse pashke", + "mjalcë", + "Milingona", + "bulkth", + "kacabu", + "pilivesë", + "Ylli detar", + "iriq deti", + "Lepuri", + "lloj brejtësi", + "kastori", + "gini thi", + "thi", + "derri i egër", + "Kali i Nilit", + "Buallica", + "Bizoni", + "dash", + "dhia e shkëmbinjve", + "Gazela", + "gamilja", + "Lama", + "Nuselalat", + "Qelbësi evropian", + "qelbës", + "vidër", + "vjedhullë", + "Orangutanët", + "Gorilat", + "Giboni lar", + "Siamangu", + "Majmuni patas", + "Lemur me bisht unaze", + "Elefanti indian", + "Elefanti afrikan", + "Panda e kuqe", + "panda gjigande", + "ngjalë", + "Blini", + "Abakusi", + "fizarmonikë", + "Kitara akustike", + "aeroplanmbajtëse", + "autoambulancë", + "përparëse", + "Koshi i plehrave", + "çantë shpine", + "dyqan buke", + "stilolaps", + "Kangjella", + "hambar", + "Barometri", + "karrocë dore", + "basketboll", + "vaskë", + "motokarro plazhi", + "fanar", + "dylbi", + "raft librash", + "librari", + "hark", + "Valëthyesi", + "parzmore", + "fshesë", + "kovë", + "taksi", + "Qiriu", + "Puska", + "kaike", + "kasetë", + "kala", + "Katamarani", + "celo", + "telefon celular", + "zinxhir", + "zhguall", + "Sënduku", + "kisha", + "Kino", + "Hanxhari", + "Geta (këpucë)", + "tastierë", + "Ëmbëltorja", + "bori", + "djep", + "vinç", + "digë", + "tryezë shkrimi", + "Desktopi", + "pjatalarëse", + "tambur", + "Kitara elektrike", + "zarf", + "shtizë flamuri", + "Flauti", + "Çezma", + "fërterë", + "Gazmaska", + "kupë", + "gondolë", + "Serra", + "Gijotina", + "çekan", + "tharëse flokësh", + "shami", + "harpë", + "ujti", + "xhins", + "Garuzhdë", + "Abazhuri", + "laptopi", + "Çakmaku", + "Altoparlanti", + "ksilofon", + "maskë", + "mikrofon", + "mikrovalë", + "Modemi", + "biçikletë me motorr", + "xhami", + "motor skuter", + "miush", + "gozhdë", + "gjerdan", + "laptopi", + "Obelisku", + "Oboa", + "odometr", + "Oshiloskopi", + "pako", + "pizhamë", + "pallat", + "parashutë", + "ballkon", + "mprehës lapsash", + "kumbara", + "Jastëk", + "kënatë", + "zdrukth", + "Parmenda", + "shtyllë", + "vazo", + "Qilimi i lutjes", + "Printeri", + "Projektori", + "kuletë", + "Penda", + "Jorgani", + "Radio teleskopi", + "Frigoriferi", + "digitron", + "gjellëtore", + "pushkë", + "pulë e pjekur", + "Vizorja", + "kasafortë", + "sandale", + "Saksafoni", + "mill", + "Peshorja", + "skunë", + "vidhë", + "kaçavida", + "makinë qepëse", + "mburojë", + "Lopata", + "çorap", + "bosht", + "stetoskop", + "sobë", + "tramvaj", + "barelë", + "Nëndetësja", + "kostum", + "meridian", + "syze dielli", + "shtupë", + "shiringë", + "Tanku", + "Çajniku", + "arush pelushi", + "Froni", + "Pishtari", + "Traktori", + "triçikël", + "Ombrella", + "fshesë me korent", + "vazo", + "kupolë", + "kadifja", + "Violinë", + "portofol", + "dollap në mur", + "lavatricja", + "jurta", + "vënd i rrjetës", + "Fjalëkryqi", + "sinjali rrugore", + "semafor", + "akullorja", + "burger djathi", + "pure patatesh", + "lulelakër", + "tungulli", + "kastravec", + "shegë", + "sanë", + "shurup çokollate", + "Brumi", + "pica", + "verë e kuqe", + "flluskë", + "shkrep", + "Gejzeri", + "Bregdeti", + "val", + "Vullkani", + "kalli", + "letër higjienike" + ] + ], + "UZ": [ + [ + 1, + 2, + 5, + 9, + 22, + 23, + 42, + 49, + 63, + 69, + 71, + 79, + 87, + 93, + 98, + 99, + 102, + 103, + 105, + 106, + 108, + 114, + 130, + 134, + 138, + 144, + 146, + 148, + 149, + 150, + 235, + 269, + 272, + 274, + 276, + 277, + 287, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 303, + 308, + 309, + 310, + 312, + 315, + 319, + 327, + 328, + 329, + 334, + 336, + 337, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 348, + 352, + 353, + 354, + 357, + 359, + 360, + 362, + 363, + 372, + 379, + 385, + 390, + 398, + 402, + 405, + 407, + 411, + 415, + 417, + 418, + 420, + 425, + 426, + 428, + 430, + 431, + 435, + 437, + 447, + 450, + 456, + 460, + 462, + 463, + 464, + 468, + 469, + 470, + 472, + 473, + 481, + 483, + 484, + 486, + 487, + 488, + 492, + 497, + 498, + 508, + 510, + 512, + 513, + 516, + 521, + 523, + 525, + 534, + 538, + 541, + 546, + 547, + 549, + 557, + 558, + 562, + 563, + 567, + 570, + 574, + 580, + 587, + 591, + 594, + 606, + 608, + 610, + 614, + 618, + 619, + 620, + 626, + 627, + 632, + 642, + 643, + 650, + 651, + 668, + 673, + 674, + 677, + 679, + 683, + 685, + 692, + 695, + 697, + 698, + 701, + 707, + 709, + 710, + 711, + 714, + 719, + 725, + 726, + 730, + 736, + 738, + 741, + 743, + 745, + 746, + 748, + 750, + 755, + 760, + 762, + 764, + 769, + 771, + 772, + 774, + 776, + 777, + 778, + 780, + 783, + 784, + 786, + 787, + 792, + 795, + 798, + 806, + 807, + 816, + 819, + 820, + 822, + 823, + 826, + 827, + 830, + 833, + 834, + 835, + 838, + 839, + 844, + 845, + 849, + 850, + 857, + 862, + 866, + 882, + 883, + 884, + 885, + 889, + 891, + 893, + 896, + 897, + 915, + 916, + 919, + 920, + 927, + 928, + 929, + 933, + 943, + 952, + 957, + 958, + 961, + 963, + 971, + 973, + 974, + 979, + 980, + 984, + 999 + ], + [ + "Oltin baliq", + "Yirik oq akulalar", + "Elektrli skatlar", + "tuyaqush", + "Oq boshli burgut", + "jo'rchi", + "Agamalar", + "Nil timsohi", + "Koʻzoynakli ilon", + "Trilobitalar", + "Chayonlar", + "mingoyoq", + "Bo`z to`ti", + "Karkidon qushlar", + "O'rta merganser", + "gʻoz", + "yexidna", + "Oʻrdakburun", + "Xaltali Ayiq", + "vombat", + "Aktiniyalar", + "shilliqqurt", + "Qizilg'oz", + "Turnalar", + "Tuvaloqlar", + "Saqoqushlar", + "Albatrossimonlar", + "Kosatka", + "Dyugon", + "Dengiz arslonlari", + "Nemis ovcharkasi", + "boʻri", + "Koyot", + "Qizil boʻri", + "Sirtlonlar", + "tulki", + "silovsin", + "ilvirs", + "Yaguar", + "sher", + "Yoʻlbars", + "gepard", + "Qoʻngʻir ayiq", + "Amerika qora ayigʻi", + "Oq ayiq", + "Yogʻochkesar qoʻngʻizlar", + "Ikki qanotlilar", + "Asalari", + "Chumolilar", + "qora chigirtka", + "Beshiktervatarlar", + "ninachi", + "Dengiz yulduzlari", + "Dengiz tipratikanlari", + "Dengiz bodringlari", + "jayra", + "sugʻur", + "qunduz", + "zebralar", + "Choʻchqa", + "Toʻngʻiz", + "suv oti", + "hoʻkiz", + "Buyvollar", + "Bizon", + "qoʻchqor", + "Импала", + "Gʻizollar", + "Dromedar", + "Norkalar", + "sassiqkuzan", + "qunduz", + "boʻrsiq", + "bronenosets", + "Babuin", + "Baqiroq maymunlar", + "Osiyo fili", + "Ugorsimonlar", + "Abak", + "Akustik gitara", + "Dirijabl", + "tez yordam", + "fartuk", + "Non sanoati", + "Havo shari", + "ruchka", + "班卓琴", + "omborxona", + "Barometr", + "tachka", + "basketbol", + "Beshik", + "Vanna", + "mayak", + "binokl", + "Bobsley", + "kamon", + "Brekvater", + "supurgi", + "chelak", + "to'qa", + "Taksi", + "qozon", + "sham", + "Kanoe", + "ochgʻich", + "kasseta", + "Qalʼa", + "Katamaran", + "violonchel", + "mobil telefon", + "zanjir", + "sandiq", + "cherkov", + "Kinoteatr", + "klaviatura", + "konteyner kemasi", + "Shtopor", + "truba", + "beshik", + "Sekin qaynatgich", + "Qo‘ltiqtayoq", + "damba", + "idish yuvish mashinasi", + "Gumbaz", + "baraban", + "Elektrogitara", + "Elektrovoz", + "konvert", + "flagshtok", + "Fleyta", + "Favvora", + "favvora qalam", + "Tova", + "Gazniqob", + "Golf to'pi", + "Issiqxona", + "Bolg‘a", + "roʻmolcha", + "Arfa", + "Dazmol", + "jinsi", + "Futbolka", + "Кимоно", + "Cho‘mich (oshxona anjomi)", + "Abajur", + "Noutbuk", + "Yondirgich", + "Limuzin", + "Radiokarnay", + "ksilofon", + "Niqob", + "mikrofon", + "Mikroto'lqinli pech", + "machit", + "kompyuter sichqoni", + "Sichqon qopqoni", + "mix", + "marjon", + "Goboy", + "odometr", + "paket", + "osma qulf", + "pijama", + "Saroy (qasr)", + "Parashut", + "Taksofon", + "Penal", + "qalam charx", + "Atir", + "Noxun (musiqa)", + "gʻaladon", + "Koʻza", + "Randa", + "Plug", + "Bilyard stoli", + "guldon", + "Joynamoz", + "Turma", + "Projektor", + "shayba", + "hamyon", + "koʻrpa", + "Radioteleskop", + "xolodilnik", + "restoran", + "miltiq", + "chizgʻich", + "seyf", + "bulavka", + "shippak", + "Saksofon", + "gʻilof", + "Tarozi", + "shxuna", + "shurup", + "otvyortka", + "Tikuv mashinasi", + "qalqon", + "Bel (mehnat quroli)", + "changʻi", + "Logarifmik lineyka", + "noski", + "Quyosh pechi", + "yig", + "Sahna", + "Parovoz", + "Po‘lat baraban", + "stetoskop", + "Sekundomer", + "pechka", + "zambil", + "Suv osti kemasi", + "kostyum", + "Quyosh soati", + "quyosh kremi", + "Osma koʻprik", + "vikluchatel", + "shprits", + "choynak", + "Oʻyinchoq ayiq", + "Taxt", + "mashʻal", + "Traktor", + "Changyutgich", + "guldon", + "gumbaz", + "Baxmal", + "skripka", + "Vafli qolipi", + "kartmon", + "umivalʼnik", + "Kir yuvish mashinasi", + "Oʻtov", + "vebsayt", + "yoʻl belgisi", + "svetofor", + "Trayfl", + "morojniy", + "Mevali muz", + "Chizburger", + "bodring", + "anjir", + "anor", + "pichan", + "Xamir", + "pitsa", + "pufak", + "Marjon riflari", + "Geyzerlar", + "Vodiy", + "vulqon", + "Raps", + "Tualet qogʻozi" + ] + ], + "KN": [ + [ + 1, + 16, + 23, + 61, + 63, + 65, + 71, + 78, + 79, + 92, + 93, + 94, + 100, + 102, + 103, + 104, + 105, + 108, + 111, + 113, + 116, + 133, + 134, + 145, + 146, + 149, + 162, + 235, + 254, + 273, + 274, + 276, + 277, + 279, + 286, + 288, + 289, + 290, + 291, + 292, + 293, + 296, + 298, + 308, + 309, + 310, + 323, + 327, + 329, + 334, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 352, + 353, + 360, + 365, + 366, + 374, + 381, + 385, + 390, + 393, + 395, + 398, + 403, + 407, + 415, + 425, + 426, + 427, + 428, + 437, + 438, + 447, + 454, + 459, + 460, + 462, + 463, + 468, + 470, + 480, + 487, + 497, + 508, + 516, + 525, + 534, + 538, + 541, + 551, + 558, + 562, + 567, + 570, + 577, + 578, + 580, + 582, + 583, + 587, + 591, + 610, + 612, + 618, + 620, + 643, + 650, + 651, + 668, + 669, + 677, + 679, + 682, + 685, + 696, + 697, + 698, + 710, + 711, + 719, + 721, + 726, + 730, + 742, + 743, + 750, + 760, + 762, + 769, + 771, + 774, + 776, + 778, + 783, + 786, + 787, + 820, + 821, + 823, + 830, + 833, + 843, + 845, + 857, + 862, + 879, + 883, + 885, + 889, + 897, + 902, + 916, + 918, + 924, + 928, + 939, + 943, + 952, + 958, + 961, + 963, + 971, + 972, + 974, + 978, + 979, + 980, + 998 + ], + [ + "ಗೋಲ್ಡ್ ಫಿಷ್", + "ಪಿಕಳಾರ", + "ರಣಹದ್ದು", + ". ಬೋಅ ಕಂಸ್ಟಿರಿಕ್ಟರ್", + "ನಾಗರಹಾವು", + "ಹೈಡ್ರೋಫೈನಿ", + "ಚೇಳು, ವೃಶ್ಚಿಕ", + "ಉಣ್ಣಿ", + "ಜರಿ", + "ಜೇನುಹುಳು ಭಕ್ಷಕ", + "ಮಂಗಟ್ಟೆ", + "ಹಮ್ಮಿಂಗ್ ಬರ್ಡ್", + "ಕಪ್ಪು ಹಂಸ", + "ಎಕಿಡ್ನ", + "plAtypas", + "ವಲ್ಲಬಿ", + "ಕೊವಾಲಾ", + "ಕಡಲ ಹೂ", + "ದುಂಡುಹುಳು", + "ಬಸವನ ಹುಳು", + "ಉಭಯ ನರಹುರಿ ಪ್ರಾಣಿಗಳು", + "ಬಿಟರ್ನ್", + "cranes", + "ಕಿಂಗ್ ಪೆಂಗ್ವಿನ್", + "ಕಡಲುಕೋಳಿ ಆಲ್ಬಟ್ರಾಸ್", + "ಡುಗಾಂಗ್", + "ಬೀಗಲ್‌", + "ಜರ್ಮನ್ ಶೆಫರ್ಡ್", + "ಪಗ್ ನಾಯಿ", + "ಡಿಂಗೋ", + "ಕೆನ್ನಾಯಿ", + "ಕತ್ತೆಕಿರುಬ", + "ಒಕ್ಷ್", + "ಹಿಮ ನರಿ", + "ಕೂಗರ್", + "ಚಿರತೆ", + "ಹಿಮ ಚಿರತೆ", + "ಜಾಗ್ವಾರ್", + "ಸಿಂಹ", + "ಹುಲಿ", + "ಚೀತಾ", + "ಹಿಮಕರಡಿ", + "ಮುಂಗುಸಿ", + "ಡಿಪ್ಟರ", + "ದುಂಬಿ", + "ಇರುವೆ", + "ಮೊನಾರ್ಕ್", + "ನಕ್ಷತ್ರಮೀನು", + "ಕಡಲ ಸೌತೆ", + "ಮುಳ್ಳುಹಂದಿ", + "ಗಿನಿಯಿಲಿ", + "ಝೀಬ್ರಾ", + "ಹಂದಿ", + "ಕಾಡುಹಂದಿ", + "ಹಿಪಪಾಟಮಸ್", + "ಎತ್ತು", + "ಎಮ್ಮೆ", + "ಕಾಡು ಕೋಣ", + "ಇಂಪಾಲ", + "ಗೆಜೆಲ್", + "ಲುತ್ರಿನಾಯಿ", + "ಒರಾಂಗೂಟಾನ್", + "ಗೊರಿಲ್ಲ", + "ಕೊಲೊಬಿನೆ", + "ಜೇಡ ಕೋತಿ", + "ಭಾರತದ ಆನೆ", + "ನೀರಹಾವು", + "ಕ್ಲೌನ್ ಮೀನು", + "ಗಾರ್ಪೈಕ್", + "ಅಬ್ಯಾಕಸ್", + "ವಿಮಾನವಾಹಕ ನೌಕೆ", + "ಆಂಬ್ಯುಲೆನ್ಸ್", + "ಬೇಕರಿ", + "ಕಣಜ", + "ವಾಯುಭಾರ ಮಾಪಕ", + "ಪೀಪಾಯಿ", + "ಚಕ್ರದ ಕೈಬಂಡಿ ಯಾ ತಳ್ಳುಬಂಡಿ", + "ಕಡಲಬೆಳಕು", + "ಚುಂಚುಪಾತ್ರೆ", + "ಬೈನಾಕ್ಯುಲರ್ಸ್", + "ಪುಸ್ತಕದಂಗಡಿಯ", + "ಕಂಚುಕ", + "ಅಲೆತಡೆ", + "ಪೊರಕೆ", + "ಬಕೆಟ್", + "ಟ್ಯಾಕ್ಸಿ", + "ಮೋಂಬತ್ತಿ", + "ಎಟಿಎಂ", + "ಮೊಬೈಲ್ ಫೋನ್", + "ಚರ್ಚು", + "ಫ್ಲೆಕ್ಸಿಬಲ್ (ಬಾಗಿಸಬಲ್ಲ) ಕೀಬೋರ್ಡ್‌", + "ತೊಟ್ಟಿಲು", + "ಕಟ್ಟೆ", + "ಪಾತ್ರೆ ತೊಳೆಯುವ ಯಂತ್ರ", + "ಗುಮ್ಮಟ", + "ಮೆಂಬ್ರಾನೋಫೋನ್", + "ಫೇಸ್‍ಪೌಡರ್", + "ಕೊಳಲು", + "ಕಾರಂಜಿ", + "ಬಾಣಲೆ", + "ಅನಿಲದ ಮೊಗವಾಡ", + "ಜಾಗಟೆ", + "ಗೌನ್", + "ಹಸಿರುಮನೆ", + "ಕಿರಾಣಿ ಅಂಗಡಿ", + "ಗಿಲೊಟೀನ್", + "ಸುತ್ತಿಗೆ", + "ಕರವಸ್ತ್ರ", + "ಟಿ ಶರ್ಟ್", + "ರಿಕ್ಷಾ", + "ಸೌಟು", + "ಮಡಿಲಗಣಕ ಅಥವಾ ಲ್ಯಾಪ್‌ಟಾಪ್", + "ಮುಖವಾಡ", + "ಮೈಕ್ರೊಫೋನ್", + "ಮೈಕ್ರೋವೇವ್ ಓವನ್", + "ಮಸೀದಿ", + "ಸೊಳ್ಳೆಪರದೆ", + "ಮೊಳೆ", + "ಪಟ್ಟಡೆ", + "ಒಬೆಲಿಸ್ಕ್‌", + "ಓಡೋಮೀಟರ್", + "ಕುಂಚ", + "ಪಾಯಿಜಾಮ", + "ಅರಮನೆ", + "ಪೆನ್ಸಿಲ್ ಸಾಣೆ", + "ಸುಗಂಧ ದ್ರವ್ಯ", + "ಹಂದಿಹುಂಡಿ", + "ದಿಂಬು", + "ತೋಪಡ", + "ನೇಗಿಲು", + "ಪ್ರಿಂಟರ್", + "ಕಾರಾಗೃಹ", + "ಕ್ವಿಲ್ಟ್", + "ಶೀತಕಯಂತ್ರ", + "ರೆಸ್ಟೋರೆಂಟ್", + "ಅಳತೆ ಪಟ್ಟಿ", + "ತಿಜೋರಿ", + "ಕೆರ", + "ಸ್ಯಾಕ್ಸೋಫೋನ್", + "ತಕ್ಕಡಿ", + "ತಿರುಪು", + "ಹೊಲಿಗೆಯಂತ್ರ", + "ಡಾಲು", + "ಉಗಿಬಂಡಿ", + "ಥ್ರೂ ಆರ್ಚ್ ಬ್ರಿಡ್ಜ್", + "ಬಡಿತ ಆಲಿಸುಕ", + "ಗರ್ನ್ಸಿ", + "ಜಲಾಂತರ್ಗಾಮಿ ನೌಕೆ", + "ಉಯ್ಯಾಲೆ", + "ಸಿರಿಂಜ್", + "ಸಿಂಹಾಸನ", + "ಪಂಜು", + "ಕೊಡೆ", + "ಹೂದಾನಿ", + "ಮಕಮಲ್ಲು", + "ಪಿಟೀಲು", + "ವಾಶಿಂಗ್ ಮಷೀನ್", + "ಸೀಟಿ", + "ಜಾಲತಾಣ", + "ಪದಬಂಧ", + "ಗ್ವಾಕಮೋಲೆ", + "ಐಸ್ ಕ್ರೀಂ", + "ಜ಼ುಕೀನಿ", + "ಸೌತೆಕಾಯಿ", + "ಅಂಜೂರ", + "ಒಣಗಿಸಿರುವ ಮೇವು", + "ಕಣಕ", + "ಪೀಟ್ಸಾ", + "ಮರಳು", + "ಕಡಿಬಂಡೆ", + "ಗೀಸರ್", + "ಕರಾವಳಿ", + "ಕಣಿವೆ", + "ಜ್ವಾಲಾಮುಖಿ", + "ತೆನೆ" + ] + ], + "KU": [ + [ + 11, + 45, + 48, + 63, + 71, + 78, + 85, + 86, + 99, + 102, + 103, + 105, + 107, + 127, + 128, + 141, + 144, + 150, + 276, + 277, + 286, + 288, + 289, + 291, + 292, + 293, + 301, + 308, + 309, + 310, + 315, + 319, + 338, + 341, + 342, + 344, + 346, + 353, + 358, + 360, + 372, + 390, + 426, + 428, + 456, + 457, + 459, + 468, + 487, + 497, + 525, + 526, + 534, + 551, + 563, + 567, + 583, + 587, + 590, + 591, + 606, + 626, + 628, + 629, + 643, + 649, + 650, + 654, + 668, + 673, + 677, + 697, + 711, + 721, + 742, + 743, + 760, + 762, + 779, + 787, + 792, + 806, + 827, + 849, + 856, + 866, + 870, + 874, + 879, + 882, + 883, + 889, + 893, + 897, + 916, + 917, + 928, + 933, + 963, + 980, + 988 + ], + [ + "Zengilok", + "Cinawira Gîlayê", + "Ejdehayê Komodoyê", + "Kobrayê Hindistanê", + "Dûpişk (kêzî)", + "Qijnîk", + "Heyal", + "kew", + "qaz", + "Gêrejûj", + "Pozmişk", + "Hirçolek", + "medûsa", + "Legleg", + "Leglega reş", + "Çîqsor", + "Kellk", + "Şêrê avê", + "Keftar", + "Rovî (ajal)", + "Kûgar", + "Pars", + "Parsa berfîn", + "Şêr", + "Piling (Panthera tigris)", + "Şîpa nêçirvan", + "xalxalok", + "Mêş", + "Mêşhingiv", + "Morî", + "Koşkar (ajal)", + "Serteşî", + "Kaviyayê berazî", + "Berazê kedî", + "Berazê kovî", + "Hespê çemî", + "Gamêş", + "Ask", + "Bûkink", + "Kûzeyê avî", + "Babûn", + "Marmasî", + "Barometro", + "Destgere", + "kevan", + "Belîtang", + "Bersing", + "Taksî", + "telefona gerok", + "dêr", + "bendav", + "mase", + "firaqşok", + "Spiyaw", + "Stîlo", + "Rûnbirêşk", + "meşneqe", + "keçûç", + "Komputera destî", + "Çiftexas", + "Deqaq", + "Heste", + "Transatlantîk", + "Soravk", + "Rûpoş", + "Megalît", + "Dengkêş", + "mînîbus", + "Mizgeft", + "mişk", + "Mix", + "Bêceme", + "Parfûm", + "Balgeh", + "Çaper", + "Girtîgeh", + "Sarinc (alav)", + "Xwaringeh", + "Busa dibistanê", + "Mertal", + "bêr", + "Gore", + "Sobe", + "Qûre", + "Patoz", + "Traktor", + "Sêçerxe", + "Troleybus", + "Sîwan", + "Gêziya ceryanê", + "Guldank", + "keman", + "Cizdan", + "Cilşok", + "Malper", + "Xêzeroman", + "Bestenî", + "Penîrbûrger", + "Pîza", + "Volkan", + "Pelût" + ] + ], + "TA": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 16, + 18, + 21, + 22, + 23, + 34, + 39, + 45, + 48, + 49, + 57, + 63, + 65, + 71, + 77, + 78, + 79, + 85, + 88, + 89, + 91, + 92, + 93, + 94, + 96, + 99, + 100, + 101, + 103, + 104, + 105, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 120, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 134, + 138, + 139, + 141, + 143, + 144, + 145, + 146, + 148, + 149, + 150, + 151, + 162, + 176, + 234, + 235, + 246, + 251, + 254, + 259, + 269, + 270, + 272, + 273, + 274, + 276, + 277, + 279, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 296, + 298, + 299, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 314, + 315, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 352, + 353, + 355, + 356, + 359, + 360, + 365, + 366, + 367, + 368, + 375, + 380, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 395, + 398, + 399, + 401, + 403, + 405, + 407, + 410, + 412, + 413, + 415, + 416, + 418, + 425, + 426, + 427, + 428, + 430, + 431, + 435, + 437, + 438, + 439, + 445, + 447, + 449, + 456, + 459, + 460, + 462, + 463, + 464, + 468, + 469, + 470, + 471, + 473, + 480, + 483, + 484, + 486, + 487, + 488, + 490, + 497, + 498, + 508, + 509, + 510, + 513, + 516, + 517, + 520, + 525, + 527, + 529, + 534, + 538, + 541, + 546, + 555, + 557, + 558, + 562, + 563, + 566, + 576, + 577, + 580, + 582, + 583, + 587, + 589, + 591, + 593, + 594, + 600, + 602, + 604, + 606, + 610, + 611, + 614, + 616, + 618, + 620, + 621, + 626, + 629, + 632, + 642, + 643, + 646, + 649, + 650, + 651, + 657, + 662, + 668, + 669, + 670, + 673, + 677, + 679, + 681, + 682, + 683, + 685, + 688, + 693, + 696, + 698, + 701, + 711, + 713, + 714, + 721, + 725, + 726, + 728, + 730, + 732, + 742, + 743, + 744, + 749, + 755, + 760, + 761, + 762, + 763, + 764, + 769, + 772, + 774, + 776, + 778, + 780, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 797, + 798, + 802, + 806, + 811, + 819, + 820, + 823, + 827, + 833, + 835, + 839, + 843, + 844, + 845, + 847, + 850, + 853, + 856, + 862, + 863, + 866, + 868, + 879, + 882, + 885, + 888, + 889, + 890, + 894, + 895, + 897, + 902, + 915, + 916, + 917, + 918, + 920, + 928, + 943, + 952, + 953, + 958, + 961, + 963, + 966, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 982, + 984, + 985, + 998, + 999 + ], + [ + "டென்ச்சு மீன்", + "தங்கமீன்", + "வெள்ளைச் சுறா", + "புலிச்சுறா", + "கொம்பன் சுறா", + "மின்திருக்கை", + "சேவல்", + "நெருப்புக்கோழி", + "கொண்டைக்குருவி", + "மேக்பை", + "பருந்து", + "வெண்தலைக் கழுகு", + "பிணந்தின்னிக் கழுகு", + "பேராமை", + "அமெரிக்கப் பேரோந்தி", + "கிலா அரக்கப் பல்லி", + "கொமோடோ டிராகன்", + "நைல் முதலை", + "கார்ட்டர் பாம்பு", + "இந்திய நாகம்", + "கடல் பாம்பு", + "தேள்", + "ஓநாய் சிலந்தி", + "தட்டுதல்", + "பூரான்", + "காடை", + "பஞ்ச வண்ணக்கிளி", + "மஞ்சள்கொண்டை கிளி", + "செம்பகம் (பேரினம்)", + "பஞ்சுருட்டான் (குடும்பம்)", + "இருவாய்ச்சி", + "ஓசனிச்சிட்டு", + "தூக்கான்", + "வாத்து", + "கறுப்பு அன்னம்", + "ஆர்வம்", + "வாத்தலகி", + "வாலாபி", + "கோவாலா", + "பயிற்சி", + "கடற்சாமந்தி", + "தட்டைப் புழு", + "உருளைப்புழு", + "சங்கு (பேரினம்)", + "நத்தை", + "ஓடில்லா நத்தை", + "கைகாட்டி நண்டு", + "சிங்கி இறால்", + "சந்தடி", + "துறவி நண்டு", + "செங்கால் நாரை", + "கரும் நாரை", + "துடுப்பு வாயன்", + "பூநாரை", + "கொக்கு", + "பஸ்டார்ட்", + "கல்திருப்பி உள்ளான்", + "பவளக்காலி", + "கிளிஞ்சல் பிடிப்பான்", + "கூழைக்கடா", + "அரசப் பென்குயின்", + "அல்பட்ரோசு", + "ஓர்க்கா திமிங்கலம்", + "ஆவுளியா", + "கடல் சிங்கம்", + "சியூவாவா", + "பீகல்", + "சலுக்கி", + "ராட்வைலர்", + "ஜெர்மானிய மேய்ப்பன் நாய்", + "கிரேட் டேன்", + "டால்மேசன் (நாய்)", + "பக் நாயினம்", + "பொமரேனியன் நாய்", + "ஓநாய்", + "ஆர்க்டிக் ஓநாய்", + "அமெரிக்கக் குள்ளநரி", + "டிங்கோ நாய்", + "செந்நாய்", + "கழுதைப்புலி", + "நரி", + "ஆர்க்டிக் நரி", + "சிறுத்தை", + "லின்க்ஸ் பூனை", + "சிறுத்தை", + "பனிச்சிறுத்தை", + "ஜாகுவார்", + "சிங்கம்", + "புலி", + "சிவிங்கிப்புலி", + "துருவக் கரட", + "கீரி", + "பாலைவனக் கீரி", + "சாணி வண்டு", + "காண்டாமிருக வண்டு", + "நீள்மூஞ்சி வண்டு", + "இருசிறகிப் பூச்சிகள்", + "அந்தோபிலா", + "எறும்பு", + "வெட்டுக்கிளி", + "கரப்பான்", + "கும்பிடுபூச்சி", + "தும்பி", + "ஊசித்தட்டான்", + "அரசன் (பட்டாம்பூச்சி)", + "கடல் விண்மீன்", + "மூரை", + "கடலட்டை", + "முயல்", + "வெள்ளெலி", + "முள்ளம்பன்றி", + "மர்மோட்", + "பீவர்", + "கினி எலி", + "வரிக்குதிரை", + "பன்றி", + "காட்டுப்பன்றி", + "ஆப்பிரிக்கக் காட்டுப்பன்றி", + "நீர்யானை", + "எருது", + "எருமை (கால்நடை)", + "காட்டெருது", + "ஆப்பிரிக்கச் சிறுமான்", + "வனப்புமிக்க சிறுமான்", + "இலாமா", + "மரநாய்", + "மரநாய் வகை", + "நீர்நாய்", + "மனிதக்குரங்கு", + "கொரில்லா", + "சிம்ப்பன்சி", + "கிப்பன்", + "கொலோபசுக் குரங்கு", + "துள்ளுகுரங்கு", + "சிலந்திக் குரங்கு", + "அணில் குரங்கு", + "வரிவால் லெமூர்", + "இந்திய யானை", + "ஆப்பிரிக்க யானை", + "சிவப்பு பாண்டா", + "பாண்டா கரடி", + "விலாங்குமீன்", + "கோமாளி மீன்", + "கடல் ஊசி மீன்", + "எண்சட்டம்", + "அபாயா", + "அக்கார்டியன்", + "வானூர்தி தாங்கிக் கப்பல்", + "வான்கப்பல்", + "நோயாளர் ஊர்தி", + "தேனீ வளர்ப்பு", + "குப்பைத் தொட்டி", + "தாக்குதல் மரைகுழல் துப்பாக்கி", + "அடுமனை", + "சமநிலை விட்டம்", + "குமிழ்முனைப் பேனா", + "கொட்டில்", + "காற்றழுத்தமானி", + "பீப்பாய்", + "ஒற்றைச் சில்லு வண்டி", + "கூடைப்பந்து", + "தொட்டில்", + "குளியல் தொட்டி", + "கலங்கரை விளக்கம்", + "முகவை", + "கரடித்தோல் தொப்பி", + "நீச்சலுடை", + "இருகண் நோக்கி", + "படகுவீடு", + "வில்", + "மார்புக்கச்சை", + "கடல் சுவா்", + "காட்டி", + "வாளி", + "ஆடைப்பட்டயம்", + "டாக்ஸி", + "வரலாற்றாசிரியர்", + "மெழுகுவர்த்தி", + "பீரங்கி", + "தகரவெட்டி", + "அநியாயமான", + "கோட்டை", + "கட்டுமரம்", + "செல்லோ", + "நகர்பேசி", + "சங்கிலி", + "அஞ்சல்", + "தேவாலய", + "திரையரங்கு", + "விசைப்பலகை", + "மிட்டாய்", + "கொள்கலக் கப்பல்", + "ஊதுகொம்பு", + "தொட்டில்", + "பாரந்தூக்கி", + "கட்டில்", + "அணை", + "மேசைக் கணினி", + "அணையாடை", + "பாத்திரம்கழுவி", + "குவிமாடம்", + "தோற்கருவி", + "மின் கிதார்", + "தீயணைப்பு வாகனம்", + "கொடிக்கம்பம்", + "புல்லாங்குழல்", + "நீரூற்று", + "ஊற்று எழுதுகோல்", + "கொம்பு", + "கொண்டோலா", + "சேமக்கலம்", + "பசுமைக்குடில்", + "மளிகைக் கடை", + "கில்லட்டின்", + "சுத்தியலால்", + "மயிர் உலர்த்தி", + "கைக்குட்டை", + "சுபிலம்", + "யாழ்", + "பொறி", + "கிடைச் சட்டம் (சீருடற்பயிற்சி)", + "மணல் கடிகாரம்", + "அழுத்தி", + "தீ-சட்டை", + "திருகு வெட்டுப் புதிர்", + "கிமோனோ", + "முடிச்சு", + "குழிபறிக்கின்ற", + "மடிக்கணினி", + "புல் அறுப்பி", + "ஒளி", + "உதட்டுச் சாயம்", + "ஒலிபெருக்கி", + "சுரம் இசைவி", + "முகமூடி", + "சிக்கல் வழி", + "பெருங்கற்காலம்", + "ஒலிவாங்கி", + "முனையப் போன்மி", + "ஏவுகணை", + "இணக்கி", + "மசூதி", + "கொசு வலை", + "சுற்றுப்புறம்", + "சுண்டெலி", + "ஆணி", + "அட்டிகை", + "மடிக்கணினி", + "கல் தூபி", + "ஓபோ", + "தூரமானி", + "அலைவுகாட்டி", + "மோசமான", + "தூரிகை", + "கடத்தல்காரர்", + "வான்குடை", + "பரிமளம்", + "நகலி", + "கிதார் மீட்டுக்கட்டை", + "தலையணை", + "முறைசார் மொழி", + "சீவுளி", + "நெகிழிப் பை", + "ஏர்", + "போலராய்டுகள்", + "கணினி அச்சுப்பொறி", + "சிறைச்சாலை", + "எறியம்", + "இறகு பேனா", + "வானொலி அதிர்வெண் தொலைநோக்கி", + "குளிர்சாதனப் பெட்டி", + "தொலை", + "உணவகம்", + "சுழல் கைத்துப்பாக்கி", + "துப்பாக்கி", + "அளவுகோல்", + "ஊக்கு", + "கோடிஸ்வரன்", + "சாக்சபோன்", + "அளவு", + "இசுக்கூனர்", + "திருகாணி", + "திருப்புளி", + "இருக்கை பட்டை", + "தையல் இயந்திரம்", + "கவசம்", + "வண்டி", + "அளறுகள்", + "உறக்கப்பை", + "நழுவு சட்டம்", + "பனி உந்தி", + "காலுறை", + "சூடேற்றி", + "மேடை", + "நீராவி உந்துப் பொறி", + "இதயத்துடிப்பு மானி", + "அடுப்பு", + "நீர்மூழ்கிக் கப்பல்", + "சூரிய மணிகாட்டி", + "தொங்கு பாலம்", + "ஊஞ்சல்", + "நிலைமாற்றி", + "மருந்தூசி", + "தொட்டி", + "டெடி கரடிக்குட்டி", + "மாறுமை", + "கதிர் அடி இயந்திரம்", + "பந்தம்", + "குலக்குறிக் கம்பம்", + "உழவு இயந்திரம்", + "தாம்பாளம்", + "குடை", + "தூசுறிஞ்சி", + "வதந்தி", + "ஏதண்டம்", + "வயலின்", + "கையுந்து பந்து", + "துணிமணிகள்", + "படைத்துறை வானூர்தி", + "துணி துவைப்பி", + "ஊதல்", + "யூர்ட்", + "வலைத்தளம்", + "கேலி", + "குறுக்கெழுத்துப் புதிர்", + "சைகை விளக்கு", + "குளிர்களி", + "வெள்ளரிக்காய்", + "கெட்டிப்படுத்து", + "அன்னாசி", + "கூஜா", + "பிசைந்த மாவு", + "பீஸ்ஸா", + "திராட்சைச் செங்கள்", + "குமிழி", + "செங்குத்துப் பாறை", + "பவளப் பாறைகள்", + "வெந்நீர்ஊற்று", + "கடற்கரையில்", + "பள்ளத்தாக்கு", + "எரிமலை", + "மணமகன்", + "கற்பழித்தல்", + "வெளிராதவப்பூ", + "மின்துள்ளல்", + "கழிவறை துடைத்தாள்" + ] + ], + "LV": [ + [ + 0, + 1, + 2, + 9, + 10, + 11, + 14, + 15, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 48, + 49, + 51, + 69, + 71, + 78, + 79, + 80, + 82, + 86, + 87, + 89, + 92, + 93, + 94, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 115, + 116, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 148, + 149, + 150, + 151, + 162, + 169, + 172, + 177, + 178, + 208, + 235, + 251, + 253, + 254, + 259, + 269, + 270, + 271, + 272, + 274, + 275, + 276, + 277, + 279, + 280, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 307, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 319, + 320, + 327, + 328, + 329, + 330, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 350, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 362, + 365, + 366, + 367, + 368, + 372, + 373, + 375, + 383, + 385, + 386, + 387, + 388, + 390, + 394, + 398, + 401, + 402, + 403, + 404, + 405, + 407, + 410, + 411, + 414, + 415, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 429, + 430, + 432, + 435, + 436, + 437, + 438, + 447, + 450, + 453, + 454, + 456, + 459, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 476, + 480, + 481, + 483, + 486, + 487, + 488, + 491, + 492, + 497, + 498, + 506, + 508, + 510, + 511, + 512, + 513, + 516, + 517, + 525, + 534, + 538, + 541, + 543, + 546, + 549, + 557, + 558, + 561, + 562, + 563, + 567, + 569, + 570, + 573, + 580, + 583, + 587, + 589, + 591, + 593, + 594, + 604, + 606, + 608, + 610, + 611, + 619, + 620, + 626, + 627, + 632, + 634, + 642, + 643, + 650, + 651, + 654, + 658, + 661, + 662, + 665, + 667, + 668, + 673, + 677, + 679, + 683, + 684, + 685, + 687, + 688, + 692, + 696, + 697, + 698, + 701, + 702, + 708, + 710, + 711, + 714, + 717, + 719, + 721, + 726, + 730, + 732, + 742, + 743, + 745, + 746, + 748, + 750, + 755, + 760, + 762, + 763, + 764, + 769, + 771, + 774, + 776, + 777, + 778, + 780, + 782, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 797, + 798, + 802, + 806, + 816, + 817, + 820, + 823, + 824, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 839, + 843, + 844, + 845, + 847, + 849, + 856, + 862, + 863, + 866, + 870, + 873, + 874, + 875, + 877, + 879, + 882, + 883, + 884, + 885, + 888, + 889, + 893, + 897, + 900, + 902, + 911, + 915, + 916, + 918, + 919, + 920, + 928, + 933, + 938, + 939, + 943, + 952, + 953, + 957, + 958, + 961, + 963, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 984, + 986, + 992, + 997, + 998, + 999 + ], + [ + "līnis", + "Zelta zivtiņa", + "lielā baltā haizivs", + "strauss", + "ziemas žubīte", + "dadzītis", + "indigo stērste", + "ceļotājstrazds", + "žagata", + "Ūdensstrazdi", + "Kliju apakšdzimta", + "Baltgalvas ērglis", + "maitas putni", + "Ziemeļpūce", + "Aksolotls", + "Komodo varāns", + "Nīlas krokodils", + "Triceratopss", + "trilobīti", + "skorpioni", + "ērce", + "simtkāji", + "Rubenis", + "apkakles mežirbe", + "Irbes", + "Pelēkais papagailis", + "Lielais dzeltencekula kakadū", + "Bišu dzeņu dzimta", + "Degunragputni", + "Kolibri", + "tukāns", + "pīļtēviņš", + "garknābja gaura, melgāle", + "zoss", + "melnais gulbis", + "ehidnu dzimta", + "pīļknābis", + "Phascolarctos", + "vombatu dzimta", + "medūza", + "Jūras anemones", + "Plakantārpi", + "velteniskie tārpi", + "Gliemezis", + "Kailžaungliemeži", + "Bruņgliemeži", + "vientuļniekvēži", + "baltais stārķis", + "melnais stārķis", + "karošknābji", + "flamingi", + "dumpis", + "dzērve", + "klibiķis", + "Amerikas laucis", + "sīgu dzimta", + "Akmeņtārtiņš", + "parastais šņibītis", + "pļavu tilbīte", + "jūras žagatas", + "Pelikāni", + "Karaliskais pingvīns", + "Albatrosi", + "zobenvalis", + "jūrasgovs", + "Lauvroņu apakšdzimta", + "čivava (suņu šķirne)", + "bīgls", + "krievu kurts", + "vipets", + "dirhaunds", + "Veimārietis", + "Labradoras retrīvers", + "vācu aitu suns", + "dalmācietis", + "Basendži", + "mopsis", + "Punduršpics", + "vilks", + "Polārais vilks", + "sarkanais vilks", + "koijots", + "Sarkanais suns", + "Hiēnsuns", + "Hiēnu dzimta", + "lapsa", + "polārlapsa", + "Pelēkā lapsa", + "siāmas kaķis", + "Kalnu lauva", + "lūsis", + "Leopardi", + "Sniega leopards", + "pantera", + "lauva", + "tīģeris", + "gepards", + "brūnais lācis", + "Amerikas melnais lācis", + "polārlācis", + "Mangustu dzimta", + "surikats", + "Smilšvaboļu dzimta", + "mārīte", + "skrejvaboļu dzimta", + "Koksngraužu dzimta", + "lapgraužu dzimta", + "Smecernieku dzimta", + "divspārņi", + "bites", + "skudru dzimta", + "circenis", + "prusaks", + "dievlūdzēji", + "Cikāžu virsdzimta", + "dažādspārnu spāres", + "vienādspārnu spāres", + "jūras zvaigznes", + "jūras eži", + "Jūras gurķi", + "Baltastes truši", + "Zaķi", + "kāmji", + "dzeloņcūka", + "murkšķis", + "bebrs", + "Jūrascūciņa", + "tuksneša zebras", + "cūka", + "meža cūka", + "Kārpcūka", + "hipopotams", + "vērsis", + "ūdens bifeļu", + "Bizoni", + "tekulis", + "Alpu kalnu kaza", + "parastā impala", + "gazeles", + "dromedārs", + "lama", + "sermuļi", + "Ūdeles", + "Meža sesks", + "sesks", + "ūdri", + "āpsis", + "orangutani", + "Gorillini", + "šimpanze", + "gibonu dzimta", + "paviāni", + "makaki", + "kolobi", + "kaķu lemurs", + "Āzijas zilonis", + "Āfrikas savannas zilonis", + "sarkanā panda", + "Lielais panda", + "zutis", + "Storu dzimta", + "skaitīkļi", + "akordeons", + "akustiskā ģitāra", + "aviācijas bāzes kuģis", + "gaisa laineris", + "dirižablis", + "neatliekamās palīdzības mašīna", + "drava", + "priekšauts", + "mugursoma", + "ceptuve", + "gaisa balons", + "lodīšu pildspalva", + "bandžo", + "balustrâde", + "svaru stienis", + "klēts", + "barometrs", + "muca", + "ķerra", + "beisbola bumbiņa", + "basketbols", + "fagots", + "vanna", + "universālis", + "bāka", + "vārglāze", + "binoklis", + "bobslejs", + "grāmatskapis", + "grāmatnīca", + "loks", + "krūšturis", + "krūšu aizsegs", + "slota", + "spainis", + "sprādze", + "bruņuveste", + "taksis", + "Katls", + "svece", + "kanu laiva", + "karuselis", + "bankas automāts", + "kasete", + "pils", + "čells", + "mobilais telefons", + "ķēde", + "motorzāģis", + "kaste", + "baznīca", + "kinoteātris", + "ritulis", + "tastatūra", + "Konteinerkuģis", + "Kabriolets", + "korķviļķis", + "vargāns", + "šūpulis", + "celtnis", + "aizsprosts", + "trauku mazgājamā mašīna", + "kupols", + "bungas", + "hantele", + "elektriskā ģitāra", + "aploksne", + "karoga kārts", + "flauta", + "Dakšu iekrāvējs", + "strūklaka", + "tintes pildspalva", + "panna", + "atkritumu vedējs", + "Gāzmaska", + "gokarts", + "siltumnīca", + "giljotīna", + "āmurs", + "fens", + "kabatlakats", + "mutes harmonikas", + "arfa", + "Smilšu pulkstenis", + "Gludeklis", + "džinsi", + "t krekls", + "puzle", + "abažūrs", + "klēpjdators", + "šķiltavas", + "limuzīns", + "reproduktors", + "kokzāģētava", + "ksilofons", + "maska", + "mikrofons", + "mikroviļņu krāsns", + "mikroautobuss", + "dūrainis", + "Ford Т", + "Modēms", + "mopēds", + "Izlaiduma cepure", + "mošeja", + "pele", + "Nagla", + "krelles", + "oboja", + "okarīna", + "odometrs", + "ērģeles", + "osciloskops", + "paciņa", + "sarene", + "pidžama", + "pils", + "izpletnis", + "līdztekas", + "pjedestāls", + "Zīmuļu asināmais", + "smaržas", + "braucis", + "pikaps", + "krājkasīte", + "spilvens", + "ēvele", + "Arkls", + "tūlītējo fotogrāfiju kamera", + "printeris", + "cietums", + "projektors", + "Ripa (sports)", + "maks", + "vatēta sega", + "radioteleskops", + "ledusskapis", + "restorāns", + "revolveris", + "šautene", + "Lineāls", + "Dross", + "sandale", + "saksofons", + "maksts", + "svari", + "šoneris", + "Kineskops", + "skrūve", + "skrūvgriezis", + "drošības josta", + "šujmašīna", + "šķīda", + "lāpsta", + "slēpe", + "guļammaiss", + "Logaritmiskais lineāls", + "Sniega motocikls", + "zeķe", + "vārpsta", + "sporta auto", + "tvaika lokmotīve", + "Stetoskops", + "stola", + "krāsns", + "tramvaju tīkls", + "nestuves", + "zemūdene", + "kostīms", + "saules pulkstenis", + "saulesbrilles", + "iekārtais tilts", + "šūpoles", + "slēdzis", + "šļirce", + "tanki", + "tējkanna", + "kuļmašīna", + "lāpa", + "Totēmstabs", + "traktors", + "tricikls", + "triumfa arka", + "Trolejbuss", + "Trombons", + "Turnikets", + "lietussargs", + "puteklu sucejs", + "vāze", + "velve", + "samts", + "viadukts", + "vijole", + "naudasmaks", + "Veļasmašīna", + "ūdenstornis", + "svilpe", + "dzija", + "jurta", + "tīmekļa vietne", + "Krustvārdu mīkla", + "ceļazīme", + "luksofors", + "saldējums", + "siera burgers", + "ziedkāposts", + "parastais ķirbis", + "gurķis", + "vīģe", + "ananass", + "granāts", + "gulta", + "mīkla", + "pica", + "sarkanvīns", + "espreso", + "olu liķieris", + "burbulis", + "klints", + "koraļļu rifs", + "geizers", + "piekraste", + "ieleja", + "vulkāns", + "rapsis", + "Dzeltenā dzegužkurpīte", + "lapiņu sēnes", + "baravika", + "vārpa", + "tualetes papīrs" + ] + ], + "KO": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 16, + 18, + 20, + 22, + 23, + 24, + 29, + 30, + 32, + 34, + 39, + 40, + 45, + 48, + 49, + 50, + 51, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 71, + 75, + 78, + 79, + 80, + 85, + 87, + 88, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 121, + 122, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 138, + 139, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 157, + 160, + 162, + 163, + 169, + 172, + 176, + 177, + 178, + 180, + 191, + 194, + 199, + 201, + 206, + 211, + 213, + 215, + 217, + 223, + 226, + 228, + 229, + 230, + 231, + 233, + 234, + 235, + 236, + 242, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 305, + 306, + 307, + 308, + 309, + 310, + 312, + 313, + 314, + 315, + 316, + 319, + 320, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 391, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 429, + 430, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 445, + 447, + 448, + 450, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 497, + 498, + 499, + 502, + 503, + 505, + 508, + 510, + 511, + 512, + 513, + 515, + 516, + 517, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 532, + 533, + 534, + 535, + 536, + 538, + 541, + 543, + 546, + 547, + 549, + 554, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 567, + 569, + 570, + 573, + 574, + 575, + 576, + 577, + 578, + 580, + 582, + 583, + 585, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 596, + 599, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 634, + 641, + 642, + 643, + 644, + 646, + 647, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 661, + 662, + 665, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 691, + 692, + 693, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 717, + 719, + 721, + 724, + 725, + 726, + 728, + 730, + 731, + 732, + 735, + 738, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 757, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 795, + 797, + 798, + 802, + 803, + 806, + 807, + 808, + 810, + 811, + 816, + 817, + 819, + 820, + 823, + 824, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 847, + 849, + 850, + 852, + 855, + 856, + 857, + 859, + 861, + 862, + 863, + 864, + 865, + 866, + 868, + 869, + 870, + 873, + 874, + 875, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 904, + 909, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 924, + 925, + 926, + 927, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 944, + 948, + 949, + 952, + 953, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 975, + 976, + 978, + 979, + 980, + 981, + 982, + 984, + 988, + 989, + 996, + 999 + ], + [ + "유럽잉어", + "금붕어", + "백상아리", + "뱀상어", + "귀상어과", + "나르키네과", + "매가오리아목", + "타조", + "되새", + "오색방울새", + "직박구리과", + "까치", + "물까마귀과", + "대머리독수리", + "독수리류", + "북방올빼미", + "아홀로틀", + "황소개구리", + "꼬리개구리", + "장수거북", + "녹색이구아나", + "녹색아놀도마뱀", + "미국독도마뱀", + "코모도왕도마뱀", + "나일악어", + "미시시피악어", + "트리케라톱스", + "가터뱀속", + "왕뱀", + "아프리카비단뱀", + "인도코브라", + "바다뱀아과", + "사막뿔살무사", + "사이드와인더", + "삼엽충", + "전갈", + "남부검은과부거미", + "진드기", + "순각류", + "검은뇌조", + "메추라기류", + "회색앵무", + "금강앵무", + "큰유황앵무", + "코칼류", + "벌잡이새류", + "코뿔새과", + "벌새", + "자카마류", + "큰부리새류", + "기러기", + "흑고니", + "가시두더지", + "오리너구리", + "왈라비", + "코알라", + "웜뱃", + "해파리", + "말미잘", + "편형동물", + "선형동물", + "고둥", + "달팽이", + "민달팽이", + "갯민숭달팽이", + "다판류", + "황제앵무조개", + "던지니스게", + "왕게과", + "미국바닷가재", + "닭새우과", + "가재", + "소라게", + "홍부리황새", + "먹황새", + "저어새아과", + "홍학", + "알락해오라기", + "학", + "두루미사촌", + "느시과", + "꼬까도요", + "붉은발도요", + "긴부리도요속", + "검은머리물떼새류", + "사다새과", + "임금펭귄", + "신천옹과", + "귀신고래", + "범고래", + "듀공", + "바다사자", + "치와와", + "친", + "말티즈", + "페키니즈", + "시추", + "파피용", + "아프간 하운드", + "비글", + "블러드하운드", + "보르조이", + "휘핏", + "살루키", + "스코티시 디어하운드", + "와이마라너", + "핏불 테리어", + "에어데일 테리어", + "댄디 딘몬트 테리어", + "스코티시 테리어", + "오스트레일리안 실키 테리어", + "컬리 코티드 리트리버", + "비즐라", + "아이리시 세터", + "브리트니 (개)", + "잉글리시 스프링어 스패니얼", + "스키퍼키", + "브리아드", + "코몬도르", + "올드 잉글리시 시프도그", + "셔틀랜드 시프도그", + "콜리", + "부비에 데 플랑드르", + "로트바일러", + "셰퍼드", + "도베르만", + "복서", + "불마스티프", + "티베탄 마스티프", + "그레이트 데인", + "세인트 버나드", + "알래스칸 맬러뮤트", + "시베리안 허스키", + "달마티안", + "아펜핀셔", + "바센지", + "퍼그", + "뉴펀들랜드", + "그레이트 피레네", + "사모예드견", + "포메라니안", + "차우차우", + "늑대", + "알래스카툰드라늑대", + "갈기늑대", + "코요테", + "딩고", + "승냥이", + "리카온", + "하이에나속", + "여우", + "북극여우", + "회색여우", + "범무늬 고양이", + "페르시안", + "샴", + "퓨마", + "스라소니", + "표범", + "눈표범", + "재규어", + "사자", + "호랑이", + "치타", + "큰곰", + "아메리카흑곰", + "북극곰", + "몽구스", + "미어캣", + "길앞잡이류", + "무당벌레", + "딱정벌레과", + "하늘소", + "쇠똥구리아과", + "장수풍뎅이아과", + "바구미", + "파리목", + "벌", + "개미", + "귀뚜라미", + "대벌레", + "바퀴벌레", + "사마귀목", + "매미", + "잠자리", + "실잠자리아목", + "제왕나비", + "불가사리", + "성게", + "해삼", + "솜꼬리토끼", + "산토끼속", + "앙고라토끼", + "햄스터", + "산미치광이", + "여우다람쥐", + "마멋", + "비버", + "기니피그", + "얼룩말", + "돼지", + "멧돼지", + "혹멧돼지", + "하마", + "물소", + "들소", + "숫양", + "큰뿔양", + "아이벡스", + "사슴영양", + "임팔라", + "가젤", + "단봉낙타", + "라마", + "족제비속", + "밍크", + "긴털족제비", + "검은발족제비", + "수달아과", + "스컹크", + "오소리", + "아르마딜로", + "갈기세발가락나무늘보", + "오랑우탄", + "고릴라", + "침팬지속", + "긴팔원숭이", + "큰긴팔원숭이", + "파타스원숭이", + "개코원숭이", + "마카크", + "콜로부스아과", + "콜로부스", + "코주부원숭이", + "마모셋", + "고함원숭이", + "티티원숭이아과", + "거미원숭이", + "커먼다람쥐원숭이", + "호랑꼬리여우원숭이", + "인드리", + "아시아코끼리", + "아프리카코끼리속", + "레서판다", + "판다", + "장어", + "은연어", + "흰동가리아과", + "철갑상어", + "레피소스테우스과", + "쏠배감펭", + "복어", + "수판", + "아바야", + "대학 예복", + "아코디언", + "통기타", + "항모", + "여객기", + "비행선", + "앰뷸런스", + "수륙양용차", + "양봉장", + "앞치마", + "쓰레기통", + "돌격소총", + "배낭", + "제과점", + "평균대", + "기구", + "볼펜", + "밴조", + "란간", + "역기", + "헛간", + "기압계", + "통 (그릇)", + "손수레", + "야구공", + "롱구", + "바순", + "수영모", + "목욕 수건", + "욕조", + "스테이션 왜건", + "등대", + "비커", + "비키니", + "쌍안경", + "새장", + "봅슬레이", + "보닛", + "책장", + "서점", + "병뚜껑", + "활", + "나비 넥타이", + "브래지어", + "방조제", + "아이기스", + "빗자루", + "양동이", + "버클", + "방탄복", + "총알고속열차", + "택시", + "솥", + "초", + "카누", + "캔따개", + "카디건", + "회전목마", + "종이갑", + "현금 자동 입출금기", + "카세트", + "성곽", + "CD 플레이어", + "비올론첼로", + "휴대 전화", + "사슬", + "철망", + "쇄자갑", + "체인톱", + "불교 용어 목록 (구)", + "교회", + "영화관", + "클리버", + "게타", + "칵테일 셰이커", + "커피포트", + "글쇠판", + "컨테이너선", + "컨버터블", + "마개뽑이", + "트럼펫", + "카우보이모자", + "요람", + "기중기", + "전기찜솥", + "목발", + "흉갑", + "댐", + "책상", + "데스크톱 컴퓨터", + "기저귀", + "식탁", + "행주", + "식기세척기", + "디스크 브레이크", + "선거 (조선)", + "돔", + "북", + "아령", + "전기 기타", + "전기 기관차", + "봉투", + "소방선", + "소방차", + "깃대", + "플루트", + "접의자", + "지게차", + "분수", + "만년필", + "프라이팬", + "쓰레기차", + "방진 마스크", + "고카트", + "골프공", + "골프 카트", + "곤돌라", + "공", + "가운", + "온실", + "식료품점", + "단두대", + "헤어스프레이", + "반궤도차", + "망치", + "드라이기", + "모바일 장치", + "손수건", + "하모니카", + "하프", + "손도끼", + "벌집", + "철봉", + "모래시계", + "화두", + "잭오랜턴", + "진", + "지프", + "티셔츠", + "직소 퍼즐", + "인력거", + "기모노", + "무릎보호대", + "매듭", + "실험복", + "국자", + "램프셰이드", + "랩톱", + "예취기", + "구조선 (선박)", + "불", + "리무진", + "원양 정기선", + "립스틱", + "단화", + "로션", + "스피커", + "제재소", + "마라카스", + "실로폰", + "탈", + "성냥", + "미궁", + "계량컵", + "거석기념물", + "마이크", + "전자레인지", + "미니버스", + "미니스커트", + "미니밴", + "미사일", + "벙어리 장갑", + "포드 모델 T", + "모뎀", + "모페드", + "학사모", + "모스크", + "모기장", + "스쿠터", + "산악 자전거", + "마우스", + "쥐덫", + "못", + "목걸이", + "노트북", + "오벨리스크", + "오보에", + "오카리나", + "오도미터", + "오일 필터", + "오르간", + "오실로스코프", + "산소 마스크", + "패킷", + "로", + "맹꽁이자물쇠", + "화필", + "파자마", + "궁전", + "팬파이프", + "페이퍼 타월", + "낙하산", + "평행봉", + "객차", + "테라스", + "공중전화", + "주추", + "필통", + "연필깎이", + "향수", + "샬레", + "복사기", + "피크", + "피켈하우베", + "픽업 트럭", + "저금통", + "베개", + "해적선", + "주전자", + "대패", + "비닐봉투", + "쟁기", + "뚫어뻥", + "즉석사진기", + "폰초", + "화분", + "프린터", + "교도소", + "발사체", + "영사기", + "퍽", + "샌드백", + "지갑", + "깃펜", + "누비", + "라켓", + "라디에이터", + "전파 망원경", + "레크리에이션 차량", + "반사식 카메라", + "냉장고", + "원격 조종", + "음식점", + "리볼버", + "소총", + "흔들의자", + "회전구이", + "럭비공", + "자", + "금고", + "핀", + "소금병", + "샌들", + "사롱", + "색소폰", + "대검집", + "저울", + "통학버스", + "스쿠너", + "스코어보드", + "나사", + "나사돌리개", + "좌석 벨트", + "재봉틀", + "방패", + "쇼핑 카트", + "삽", + "스키판", + "침낭", + "계산자", + "설상차", + "제설차", + "양말", + "태양로", + "솜브레로", + "스페이스 바", + "히터", + "방추", + "스포츠카", + "무대", + "증기 기관차", + "청진기", + "영대", + "스톱워치", + "난로", + "전차", + "들것", + "탑파", + "잠수함", + "洋服", + "해시계", + "선글라스", + "자외선 차단제", + "현수교", + "자루 걸레", + "스웨트셔츠", + "그네", + "개폐기", + "주사기", + "장갑전투차량", + "주전자", + "테디 베어", + "테니스공", + "골무", + "탈곡기", + "어좌", + "토스터", + "변좌", + "횃불", + "토템폴", + "견인차", + "장난감 가게", + "트랙터", + "트레이", + "트렌치코트", + "세발자전거", + "개선문", + "트롤리버스", + "트롬본", + "개집표기", + "우산과 양산", + "외발자전거", + "진공청소기", + "화병", + "궁륭", + "벨벳", + "전례복", + "고가교", + "피들", + "배구공", + "와플기", + "지갑", + "벽장", + "군용기", + "대야", + "세탁기", + "물통", + "급수탑", + "호루라기", + "가발", + "방충망", + "확", + "털실", + "유르트", + "웹사이트", + "만화책", + "십자말", + "교통표지", + "신호등", + "과카몰레", + "콩소메", + "훠궈", + "트라이플", + "아이스크림", + "막대 아이스크림", + "베이글", + "브레첼", + "치즈버거", + "매시트 포테이토", + "꽃양배추", + "주키니호박", + "오이", + "옥", + "그래니스미스", + "딸기색", + "무화과", + "파인애플", + "석류", + "건초", + "카르보나라", + "초콜릿 시럽", + "도", + "미트로프", + "피자", + "부리토", + "적포도주", + "에스프레소", + "아드보카트", + "거품", + "절벽", + "산호초", + "간헐천", + "호숫가", + "헤드랜드", + "연안", + "골짜기", + "화산", + "야구 선수", + "신랑", + "유채", + "에이콘", + "해당화", + "잎새버섯", + "휴지" + ] + ], + "UG": [ + [ + 9, + 71, + 79, + 94, + 99, + 102, + 103, + 105, + 106, + 269, + 276, + 277, + 287, + 288, + 289, + 291, + 292, + 294, + 296, + 309, + 310, + 331, + 334, + 337, + 338, + 341, + 342, + 344, + 348, + 350, + 362, + 387, + 388, + 398, + 401, + 411, + 435, + 437, + 454, + 456, + 459, + 462, + 463, + 468, + 470, + 481, + 483, + 486, + 487, + 488, + 497, + 498, + 516, + 525, + 534, + 541, + 549, + 558, + 587, + 591, + 606, + 614, + 643, + 651, + 668, + 677, + 683, + 713, + 726, + 741, + 742, + 746, + 748, + 760, + 762, + 764, + 769, + 777, + 783, + 784, + 787, + 806, + 812, + 816, + 830, + 833, + 845, + 849, + 862, + 882, + 883, + 885, + 889, + 893, + 897, + 915, + 919, + 926, + 928, + 957, + 958, + 963, + 967, + 971, + 979, + 980 + ], + [ + "تۆگىقۇش‎", + "چايان‎", + "كىركەك قۇرۇت‎", + "ھەرە قۇش‎", + "غاز", + "يېخىدنا‎", + "ئۆردەكتۇمشۇق‎", + "دەرەخ خالتىلىق ئېيىقى", + "خالتىلىق ئېيىق‎", + "قۇرت", + "Sirtlan", + "تۈلكە", + "سۈلەيسۈن‎", + "قاپلان", + "يىلپىز", + "ئارسلان", + "بارس", + "قوڭۇر ئېيىق", + "شىمالىي قۇتۇپ ئېيىقى", + "ھەرە‎", + "چۈمۈلە", + "ياۋا توشقان", + "جەيرە‎", + "قۇندۇز‎", + "دېڭىز چوشقىسى‎", + "چوشقا", + "ياۋا توڭگۇز", + "سۇ ئېتى‎", + "قوچقار‎", + "تاغ ئۆچكىسى", + "بورسۇق‎", + "كىچىك مۈشۈكئېيىق", + "مۈشۈكئېيىق", + "چوت‎", + "ئاككوردىيون‎", + "پەرتۇق‎", + "ۋاننا‎", + "ماياك‎", + "كىتابخانا‎", + "يا‎", + "لىپتىك", + "سۈپۈرگە‎", + "چېلەك‎", + "تاكسى‎", + "شام‎", + "كاسېتا‎", + "قەلئە‎", + "چوڭ ئىسكىروپكا", + "يانفون‎", + "زەنجىر‎", + "ئىبادەتخانا‎", + "كىنوخانا", + "بۆشۈك‎", + "دامبا‎", + "قاچا يۇيۇش ماشىنىسى‎", + "دۇمباق‎", + "كونۋېرت‎", + "ئۇزۇن نەي‎", + "بولقا", + "قول ياغلىق‎", + "دەزمال‎", + "كىمونو", + "ماسكا‎", + "مىكرو دولقۇنلۇق ئوچاق‎", + "جامى‎", + "مىخ‎", + "گوبوي‎", + "نۇسخىئالغۇ", + "رەندە‎", + "جايناماز‎", + "خەتباسقۇ (پىرىنتىر)", + "شايبا‎", + "ھەميان‎", + "توڭلاتقۇ‎", + "رېستوران‎", + "مىلتىق‎", + "سىزغۇچ‎", + "قىن‎", + "ۋىنتا", + "ئەتۋىركە‎", + "قالقان‎", + "پايپاق‎", + "ئالەم ئايرۇپىلانى‎", + "يىك‎", + "زەمبىل‎", + "سۇ ئاستى كېمىسى", + "شپىرىس‎", + "چەينەك‎", + "مەشئەل‎", + "چاڭ-توزان سۈمۈرگۈچ‎", + "لوڭقا‎", + "دۇخاۋا‎", + "ئىسكىرىپكا‎", + "پۇلدان‎", + "كىرئالغۇ", + "كىگىز ئۆي‎", + "يول بەلگىسى‎", + "يەل قازان‎", + "ماروژنا‎", + "ئانار‎", + "خەس‎", + "پىسسا‎", + "ئەسپرەسسو (تېز قەھۋە)", + "ماغزاپ‎", + "ۋادى‎", + "Yanardag" + ] + ], + "BR": [ + [ + 1, + 2, + 3, + 6, + 9, + 10, + 11, + 13, + 15, + 17, + 20, + 21, + 22, + 23, + 24, + 28, + 29, + 30, + 34, + 39, + 46, + 48, + 49, + 50, + 51, + 71, + 78, + 80, + 82, + 86, + 87, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 107, + 108, + 113, + 114, + 123, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 150, + 151, + 215, + 235, + 250, + 254, + 256, + 269, + 271, + 272, + 273, + 274, + 275, + 277, + 279, + 280, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 299, + 301, + 305, + 309, + 310, + 319, + 327, + 328, + 331, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 350, + 352, + 353, + 354, + 355, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 366, + 367, + 369, + 371, + 372, + 373, + 376, + 383, + 385, + 386, + 387, + 388, + 390, + 395, + 401, + 403, + 407, + 411, + 412, + 414, + 417, + 428, + 430, + 431, + 432, + 435, + 437, + 447, + 452, + 456, + 457, + 459, + 462, + 463, + 468, + 469, + 470, + 483, + 486, + 488, + 490, + 492, + 497, + 502, + 508, + 509, + 513, + 516, + 517, + 525, + 526, + 529, + 535, + 536, + 538, + 541, + 546, + 557, + 558, + 562, + 564, + 567, + 576, + 583, + 587, + 589, + 591, + 594, + 604, + 610, + 611, + 618, + 621, + 626, + 641, + 642, + 646, + 655, + 668, + 671, + 673, + 677, + 679, + 683, + 684, + 687, + 696, + 697, + 698, + 699, + 701, + 708, + 709, + 713, + 714, + 719, + 721, + 726, + 728, + 730, + 738, + 742, + 743, + 748, + 750, + 752, + 760, + 761, + 762, + 764, + 774, + 778, + 783, + 784, + 785, + 787, + 797, + 806, + 812, + 823, + 824, + 830, + 833, + 835, + 837, + 845, + 847, + 849, + 855, + 856, + 857, + 859, + 862, + 866, + 870, + 873, + 875, + 879, + 882, + 883, + 884, + 885, + 889, + 893, + 894, + 902, + 911, + 916, + 918, + 919, + 920, + 928, + 935, + 943, + 953, + 958, + 961, + 966, + 971, + 972, + 978, + 979, + 980, + 982, + 988, + 989, + 999 + ], + [ + "Pesk-aour", + "Rinkin gwenn", + "Rinkin-tigr", + "dasyatis", + "struskańval", + "Pint an hanternoz", + "Pabor kanaber", + "Junko", + "Moualc'h-Amerika", + "Kegin (evn)", + "Dourlaouig", + "Barged", + "Morerer penn gwenn", + "Gup", + "Kaouenn lapon", + "Sourd brizhellek", + "Aksolotl", + "Ran-darv Amerika", + "Baot lêrek", + "Igwan boutin", + "Gurlaz", + "Varan Komodo", + "Krokodil an Nil", + "Aligator Amerika", + "Triseratops", + "Krug", + "Tarlask", + "Skilgog du", + "Koadyar frezennek", + "klujar", + "Peroked gris Afrika", + "Kaketou kupenn aour", + "Koukal", + "Gwespetaer", + "Kalao", + "evnedigoù-lufr", + "Jakamar", + "toukan", + "Heskenneg kuch", + "gwaz", + "Alarc'h du", + "Ekidne", + "Ornitorink", + "wallabi", + "blonegenn-vor", + "bronn-vor", + "Melc'hwed-krogennek", + "Melc'hwed", + "grilh-mor", + "C'hwibon wenn", + "C'hwibon du", + "Spanell", + "Flammeg", + "Bongorz", + "Garan", + "Kourlan", + "Jualenn-Amerika", + "Otiz", + "Morfedenn driliv", + "Sourouc'han boutin", + "Strelleg pavioù ruz", + "Stankioc'h", + "Morbig", + "Pilikant", + "Mank roueel", + "Albatroz", + "Balum gris", + "Skoazog", + "Morleon", + "Chihuahua (ki)", + "Spagnol Breizh", + "Mesaer-deñved alaman", + "huski Siberia", + "Ki togn", + "Douar-Nevez (ki)", + "bleiz", + "Bleiz moueek", + "Koiot", + "Dingo (loen)", + "ki gouez Azia", + "Ki gouez Afrika", + "louarn", + "Louarn Arktik", + "Louarn gris", + "Kougar", + "liñs", + "Panterenn", + "loupard an erc'h", + "jagoar", + "leon", + "Tigr", + "Kazh-ki", + "arzh gell", + "Arzh du Amerika", + "Arzh gwenn", + "Surikat", + "buoc'hig-Doue", + "Bleiz-bouzel", + "gwenan", + "Merien", + "nadoz-aer", + "Stered-mor", + "kistin-mor", + "Gad", + "Hoc'h-dreinek", + "Gwiñver gellrous", + "Moregan", + "avank eurazia", + "Razh-Indez", + "roudenneg", + "pemoc’h m moc'h", + "Hoc'h-gouez", + "Fakoker", + "dourvarc'h", + "Ejen", + "Bual Azia", + "Bizon", + "tourz", + "kragvouc’h an alpoù", + "Aepycerotinae", + "Gazelenn", + "dremedal", + "Lama (bronneg)", + "Pudask", + "fured", + "dourgi", + "Pudask", + "broc'h", + "tatou", + "Lezireg moueek", + "Gorilh", + "chimpanze", + "Symphalangus", + "Erythrocebus", + "babouz", + "Makak", + "Marmouz friek", + "Lemur lost gwalennek", + "Olifant Azia", + "Olifant Afrika", + "Panda ruz", + "Panda bras", + "silienn", + "Aguilh", + "Akordeoñs", + "Douger-nijerezioù", + "klañvgarr", + "tavañjer", + "Lastez", + "Sac'h-kein", + "baloñs", + "kravazh-rodellek", + "mell basketball", + "Kavell (gwele)", + "bason", + "kibelladenn", + "tour-tan", + "Gevellunedenn", + "Boned", + "gwareg", + "Skoulm-papilhorig", + "Brennidenn", + "balaenn", + "Kelorn", + "blenier taksi", + "per", + "Kantol", + "Kastell-kreñv", + "violoñsell", + "chadenn", + "Sae-vailhek", + "Mal", + "iliz", + "Botez-koad", + "klavier", + "madig", + "trompilh", + "kavell", + "gavr", + "Stankell", + "Burev", + "lien-revr", + "starderez-pladennoù", + "poull", + "koupolenn", + "taboulin", + "Gitar tredan", + "gwern", + "fleüt-treuz", + "feunteun", + "Gwele-stel", + "Paelon", + "kondolenn", + "dibennerez", + "morzhol", + "sec'herez-vlev", + "Mouchouer-godell", + "Telenn", + "Eurier-traezh", + "Rochedig", + "Miltamm", + "Kloge", + "Gwilcherez", + "kleuzeur", + "Marakas", + "Zilofon", + "Milendall", + "Brozh verr", + "moskeenn", + "Marc'h-houarn Treuz Bro (MTB)", + "Logodenn (stlenneg)", + "tach", + "tro-c'houzoug", + "Oboell", + "Okarina", + "ograou", + "Barr-livañ", + "pijama", + "Palez", + "Fleüt Pan", + "harz-lamm", + "mas", + "Sac'higell", + "Luc'heilerez", + "skraberig", + "pod-espern", + "Goubenner", + "Rabod", + "Sac'h plastik", + "arar", + "Pod-bleunioù", + "Moullerez", + "Toull-bac'h", + "yalc'h", + "Plueg", + "Paliked", + "Yenerez", + "pellurzhier", + "preti", + "karabinenn", + "Sandalenn", + "Pouezerez", + "Biñs", + "Tro-viñs", + "bodriell", + "Skoed", + "sac'h-kousket", + "Berrloer", + "egorvulzunoù", + "Selaouenner", + "Stol", + "Kravazh", + "Lestr-spluj", + "Horolaj-heol", + "Lunedoù-heol", + "strinkell", + "Tank (karbed milourel)", + "Pod-te", + "Beskenn", + "dornerez", + "Tron", + "krazerez-vara", + "Flammerenn", + "Traktor", + "Teirrodeg", + "Bolz-enor", + "Trombon stirellek", + "Disglavier", + "sunerez-poultr", + "lestr", + "Bolz", + "voulouz", + "Biolin", + "doug-bilhedoù", + "Armel-voger", + "C'hwitell", + "gloan", + "lec'hienn", + "Gerioù-kroaz", + "plakenn-straed", + "gouleier tremenerezh", + "skornenn", + "flastrenn avaloù-douar", + "kokombrezenn", + "aval anna", + "foenn", + "Toaz", + "Gwin ruz", + "lagadenn", + "Tornaod", + "Aod", + "Saonenn", + "Menez-tan", + "gwaz nevez", + "mezenn", + "Hogan", + "paper-privezioù" + ] + ], + "EL": [ + [ + 0, + 1, + 2, + 3, + 4, + 9, + 10, + 11, + 15, + 17, + 18, + 22, + 23, + 29, + 30, + 34, + 39, + 45, + 47, + 48, + 49, + 50, + 51, + 57, + 69, + 71, + 78, + 79, + 80, + 81, + 85, + 86, + 87, + 88, + 92, + 94, + 96, + 97, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 116, + 122, + 123, + 124, + 125, + 127, + 128, + 130, + 134, + 138, + 139, + 141, + 143, + 144, + 145, + 146, + 148, + 149, + 150, + 151, + 153, + 154, + 160, + 162, + 177, + 178, + 180, + 213, + 215, + 231, + 234, + 235, + 236, + 242, + 246, + 247, + 248, + 250, + 251, + 253, + 254, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 301, + 305, + 308, + 309, + 310, + 312, + 313, + 314, + 315, + 316, + 319, + 323, + 327, + 328, + 329, + 330, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 350, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 365, + 366, + 367, + 368, + 369, + 372, + 373, + 381, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 398, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 417, + 418, + 420, + 421, + 425, + 426, + 427, + 428, + 430, + 432, + 435, + 436, + 437, + 438, + 441, + 445, + 447, + 448, + 450, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 479, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 496, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 515, + 516, + 517, + 519, + 520, + 524, + 525, + 526, + 527, + 528, + 529, + 534, + 535, + 536, + 538, + 541, + 542, + 545, + 546, + 549, + 551, + 553, + 554, + 555, + 557, + 558, + 561, + 562, + 563, + 565, + 567, + 568, + 569, + 570, + 576, + 577, + 578, + 579, + 580, + 582, + 583, + 585, + 587, + 589, + 590, + 591, + 593, + 594, + 595, + 600, + 601, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 615, + 616, + 618, + 619, + 620, + 621, + 623, + 625, + 626, + 627, + 628, + 629, + 631, + 632, + 634, + 635, + 637, + 642, + 643, + 649, + 650, + 651, + 655, + 657, + 662, + 663, + 665, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 687, + 688, + 692, + 693, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 710, + 711, + 712, + 713, + 714, + 717, + 718, + 719, + 721, + 725, + 726, + 730, + 733, + 738, + 739, + 740, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 754, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 794, + 795, + 797, + 802, + 806, + 808, + 810, + 813, + 816, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 826, + 827, + 828, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 850, + 851, + 853, + 855, + 856, + 859, + 860, + 862, + 866, + 868, + 870, + 872, + 873, + 874, + 875, + 876, + 878, + 879, + 881, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 903, + 905, + 907, + 908, + 909, + 911, + 915, + 916, + 918, + 919, + 920, + 924, + 925, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 944, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 961, + 963, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 984, + 987, + 988, + 989, + 990, + 991, + 994, + 997, + 998, + 999 + ], + [ + "Γλήνι", + "Χρυσόψαρο", + "λευκός καρχαρίας", + "καρχαρίας τίγρης", + "Σφυροκέφαλος", + "στρουθοκάμηλος", + "χειμωνόσπινος", + "καρδερίνα", + "Αμερικανικός Κοκκινολαίμης", + "κίσσα", + "καρακάξα", + "λευκοκέφαλος θαλασσαετός", + "γύπας", + "Αξολότλ", + "Αμερικανικός βουβαλοβάτραχος", + "δερματοχελώνα", + "Πράσινο Ιγκουάνα", + "Σαύρα Χίλα", + "Αφρικανικός χαμαιλέοντας", + "Δράκος του Κομόντο", + "κροκόδειλος του Νείλου", + "Αμερικάνος αλιγάτορας", + "Τρικεράτωψ", + "Θαμνόφις", + "τριλοβίτης", + "σκορπιός", + "οικογένεια ixodoide", + "Σαρανταποδαρούσα", + "λυροπετεινός", + "βουνοχιονόκοτα", + "χαμοπέρδικα", + "πέρδικα", + "αφρικανικός γκρίζος παπαγάλος", + "μακάο", + "Μελισσοφάγος", + "κολιμπρί", + "τουκάν", + "αρσενική πάπια", + "χήνα", + "μαύρος κύκνος", + "ταχυγλωσσίδες", + "πλατύπους", + "γουάλαμπι", + "κοάλα", + "φασκωλόμυς", + "μέδουσα", + "Ανεμώνη της θάλασσας", + "σκουλήκι φύλλου Chaetognath", + "νηματόζωο", + "σαλιγκάρι", + "λείμαξ", + "χιτώνας", + "αμερικανικός αστακός", + "καραβίδα", + "Καραβίδα", + "Πάγουρος", + "λευκοπελαργός", + "Μαυροπελαργός", + "φοινικόπτερος", + "γερανός", + "ωτίδα", + "χαλικοκυλιστής", + "κοκκινοσκέλης", + "Αιματόπους", + "Πελεκάνος", + "βασιλικός πιγκουίνος", + "αλμπατρός", + "όρκα", + "Ντιγκόνγκ", + "Θαλάσσιος λέοντας", + "Τσιουάουα", + "Μαλτέζ", + "Πεκινουά", + "αφγανικός λαγωνικός", + "Μπιγκλ (σκύλος)", + "ελαφόσκυλο", + "Βάιμαρ", + "Πιτ Μπουλ", + "Ιρλανδικό Σέττερ", + "Σπάνιελ μπρετόν", + "κόλεϊ", + "Ροτβάιλερ", + "γερμανικός ποιμενικός", + "ντόμπερμαν", + "μπόξερ", + "Γερμανικός Μολοσσός", + "Σκύλος Αγίου Βερνάρδου", + "χάσκυ", + "σιβηρικό χάσκυ", + "δαλματικός σκύλος", + "Μπασέντζι", + "μπουλντόγκ", + "Πομεράνιαν", + "τσάου", + "λύκος", + "λευκός λύκος", + "κόκκινος λύκος", + "λύκος canis latrans", + "ντίγκο", + "Ασιατικό αγριόσκυλο", + "Λυκάων", + "Ύαινα", + "αλεπού", + "αρκτική αλεπού", + "Γκρίζα αλεπού", + "Γάτα Τάμπι", + "γάτα του Σιάμ", + "πούμα", + "λύγκας", + "Γατόπαρδος", + "ίρβις", + "ιαγουάρος", + "λιοντάρι", + "τίγρη", + "γατόπαρδος", + "καφέ αρκούδα", + "Αμερικάνικη μαύρη αρκούδα", + "πολική αρκούδα", + "βραδυκίνητη αρκούδα", + "ερπηστής", + "ερπηστής", + "πασχαλίτσα", + "σκαθάρι της κοπριάς", + "μύγα", + "μέλισσα", + "Μυρμήγκι", + "γρύλος", + "φασματώδη", + "κατσαρίδες", + "Μαντώδη", + "τζίτζικας", + "Λιβελούλη", + "Πεταλούδα μονάρχης", + "αστερίας", + "αχινός", + "Ολοθουροειδή", + "κουνέλι γένους sylvilagus", + "λαγός", + "Χάμστερ", + "ακανθόχοιρος", + "μαρμότα", + "κάστορας", + "Ινδικό χοιρίδιο", + "ζέβρα", + "γουρούνι", + "Αγριόχοιρος", + "Φακόχοιρος ο Κοινός", + "ιπποπόταμος", + "βόδι", + "νεροβούβαλος", + "βίσωνας", + "κριάρι", + "Ίβηξ των Άλπεων", + "ιμπάλα", + "γαζέλα", + "δρομάς", + "λάμα", + "κουνάβι", + "βιζόν", + "νυφίτσα", + "νυφίτσα mustela nigripes", + "βίδρα", + "μεφίτιδα", + "ασβός", + "δασύπους", + "ουρακοτάγκος", + "γορίλας", + "χιμπατζής", + "γίββωνας", + "Συμφάλαγγος", + "βαβουίνος", + "Μακάκος", + "Μαϊμού-αράχνη", + "κερκοπίθηκος με δακτυλίους", + "Ίντρι", + "Ινδικός ελέφαντας", + "Αφρικανικός ελέφαντας", + "Κόκκινο πάντα", + "Γιγαντιαίο Πάντα", + "χέλι", + "οξυρρυγχίδες", + "ζαργάνα", + "άβακας", + "ακκορδεόν", + "ακουστική κιθάρα", + "αεροπλανοφόρο", + "επιβατηγό αεροσκάφος", + "πηδαλιουχούμενο", + "ασθενοφόρο", + "Αμφίβιο όχημα", + "μελισσοκομείο", + "ποδιά", + "κάδος απορριμμάτων", + "Τουφέκι εφόδου", + "ταγάρι", + "αρτοπωλείο", + "μπαλόνι", + "στυλό διαρκείας", + "μπάντζο", + "κουπαστή", + "αχυρώνας", + "βαρόμετρο", + "βαρέλι", + "Καρότσι", + "μπάλα μπάσκετ", + "φαγκότο", + "λουτήρας", + "στέισον βάγκον", + "φάρος", + "ποτήρι ζέσεως", + "ποτήρι μπύρας", + "μπικίνι", + "κιάλια", + "πτηνοτροφείο", + "αγωνιστικό έλκηθρο", + "σκούφος", + "βιβλιοθήκη (έπιπλο)", + "βιβλιοπωλείο", + "πώμα φιάλης", + "τόξο", + "παπιγιόν", + "πλακέτα", + "σουτιέν", + "κυματοθραύστης", + "θώρακας", + "σκούπα", + "κάδος", + "αγκράφα", + "αλεξίσφαιρο γιλέκο", + "χασάπικο", + "Ταξί", + "καζάνι", + "κερί", + "κανονιοβολισμός", + "Κανό", + "ανοιχτήρι", + "κάρντιγκαν", + "καρουζέλ", + "τροχός", + "αυτόματη ταμειακή μηχανή", + "κασέτα", + "κάστρο", + "Καταμαράν", + "συσκευή CD", + "βιολοντσέλο", + "κινητό", + "άλυσος", + "συρματόπλεγμα", + "αλυσιδωτή πανοπλία", + "αλυσοπρίονο", + "σεντούκι", + "σιφονιέρα", + "είδος μεταλλικού σημάντρου", + "Κάλτσες των δώρων", + "ναός", + "κινηματογράφος", + "μπαλτάς", + "ξυλοπάπουτσο", + "σέικερ", + "μπρίκι", + "κοχλίας (μαλάκιο)", + "συνδυασμός κλειδαριάς", + "πληκτρολόγιο", + "ζαχαροπλαστείο", + "κοντέινερ (πλοίο)", + "καμπριολέ", + "τιρμπουσόν", + "τρομπέτα", + "καουμπόικο καπέλο", + "κούνια", + "γερανός", + "Καφάσι", + "κούνια", + "θώρακας", + "φράγμα", + "γραφείο", + "επιτραπέζιος υπολογιστής", + "τηλέφωνο", + "πάνα", + "πλυντήριο πιάτων", + "δισκόφρενο", + "δεξαμενή ναυπηγείου", + "τρούλος", + "τύμπανο", + "μπαγκέτα", + "ηλεκτρικός ανεμιστήρας", + "ηλεκτρική κιθάρα", + "φάκελος", + "πούδρα προσώπου", + "αρχείο", + "Πυροσβεστικό (πλοίο)", + "πυροσβεστικό όχημα", + "κοντάρι σημαίας", + "φλάουτο", + "Περονοφόρο ανυψωτικό όχημα", + "πίδακας", + "πένα", + "φορτηγό βαγόνι", + "τηγάνι", + "γουνοδέρματα", + "απορριμματοφόρο", + "αντιασφυξιογόνος μάσκα", + "γόνδολα", + "γκονγκ", + "τουαλέτα", + "γκραντ πιάνο", + "θερμοκήπιο", + "μπακάλικο", + "γκιλοτίνα", + "λακ", + "σφυρί", + "πιστολάκι", + "κινητή συσκευή", + "μαντήλι", + "φυσαρμόνικα", + "άρπα", + "θεριστική μηχανή", + "γάντζος", + "φούστα στεφάνης", + "Κλεψύδρα", + "σίδερο", + "τζακ ο' λάντερν", + "τζιν", + "τζιπ", + "κοντομάνικη μπλούζα", + "παζλ", + "δίτροχη χειράμαξα", + "κιμονό", + "επιγονατίδα", + "κόμπος", + "κουτάλα", + "αμπαζούρ", + "φορητός υπολογιστής", + "θερισμός", + "χαρτοκόπτης", + "σωστική λέμβος", + "Αναπτήρας", + "λιμουζίνα", + "υπερωκεάνειο", + "κραγιόν", + "λοσιόν", + "μεγάφωνο", + "πριστήριο", + "μαγνητική πυξίδα", + "γραμματοκιβώτιο", + "ξυλόφωνο", + "προσωπίδα", + "μεγάλιθος", + "μικρόφωνο", + "φούρνος μικροκυμάτων", + "Μίνι φούστα", + "Πύραυλος", + "μόντεμ", + "μοναστήρι", + "μηχανάκι", + "τέμενος", + "κουνουπιέρα", + "σκούτερ", + "ποδήλατο βουνού", + "ποντίκι", + "ποντικοπαγίδα", + "Καρφί", + "κολιέ", + "θηλή", + "φορητός υπολογιστής", + "οβελίσκος", + "οξύαυλος", + "οκαρίνα", + "οδόμετρο", + "εκκλησιαστικό όργανο", + "παλμογράφος", + "πακέτο", + "κουπί", + "λουκέτο", + "χρωστήρας", + "πιτζάμα", + "παλάτι", + "αυλός του Πανός", + "χαρτί κουζίνας", + "αλεξίπτωτο", + "μπάρα", + "παρκόμετρο", + "βαγόνι επιβατών", + "πλακόστρωτος χώρος", + "κερματοτηλέφωνο", + "βάθρο", + "ξύστρα", + "άρωμα", + "τρυβλίο Πέτρι", + "φωτοτυπικό", + "πένα", + "φορτηγάκι", + "βάση γέφυρας", + "κουμπαράς", + "μαξιλάρι", + "κανάτα", + "πλάνη", + "Άροτρο", + "στύλος", + "γλάστρα", + "Τόρνος (αγγειοπλαστική)", + "κομπρεσέρ", + "εκτυπωτής", + "φυλακή", + "βλήμα", + "προβολέας", + "σφαίρα", + "σάκος πυγμαχίας", + "πορτοφόλι", + "πένα γραφής", + "πάπλωμα", + "ρακέτα", + "ασύρματη επικοινωνία", + "ραδιοτηλεσκόπιο", + "τροχόσπιτο", + "Ψυγείο", + "τηλεχειριστήριο", + "εστιατόριο", + "περίστροφο", + "τουφέκι", + "κουνιστή καρέκλα", + "σούβλισμα", + "Κανόνας", + "χρηματοκιβώτιο", + "παραμάνα", + "αλατιέρα", + "πέδιλο", + "σαρόνγκ", + "σαξόφωνο", + "θηκάρι", + "ζυγαριά", + "σχολικό λεωφορείο", + "ημιολία", + "κοχλίας", + "κατσαβίδι", + "ζώνη ασφαλείας", + "ραπτομηχανή", + "ασπίδα", + "κατάστημα παπουτσιών", + "καροτσάκι", + "φτυάρι", + "κουρτίνα ντους", + "χιονοπέδιλα", + "σλίπινγκ-μπαγκ", + "ατομικό όχημα χιονιού", + "κάλτσα", + "σομπρέρο", + "πλήκτρο διαστήματος", + "σπάτουλα", + "αδράχτι", + "σημειακός προβολέας", + "εξέδρα", + "ατμάμαξα", + "τοξοειδής γέφυρα", + "τύμπανο καραϊβικής", + "στηθοσκόπιο", + "σάρπα", + "Χρονόμετρο", + "θερμάστρα", + "σουρωτήρι", + "σύστημα τραμ", + "φορείο", + "υποβρύχιο", + "ενδυμασία", + "ηλιακό ρολόϊ", + "γυαλιά ηλίου", + "αντιηλιακό", + "κρεμαστή γέφυρα", + "σφουγγαρίστρα", + "κούνια", + "διακόπτης", + "σύριγγα", + "τανκ", + "τσαγιέρα", + "παιδικό αρκουδάκι", + "τηλεόραση", + "αχυροσκεπή", + "δαχτυλίθρα", + "αλωνιστής", + "τοστιέρα", + "καπνοπωλείο", + "δάδα", + "τρακτέρ", + "δίσκος", + "τρίκυκλο", + "τρίποδο", + "αψίδα θριάμβου", + "τρόλεϊ", + "τρομπόνι", + "κάδος", + "πληκτρολόγιο γραφομηχανής", + "ομπρέλα", + "όρθιο πιάνο", + "ηλεκτρική σκούπα", + "βάζο", + "θολωτή κατασκευή", + "βελούδο", + "άμφια", + "οδογέφυρα", + "βιολί", + "μπάλα πετοσφαίρισης", + "βαφλιέρα", + "ρολόι τοίχου", + "πορτοφόλι", + "ντουλάπα", + "Στρατιωτικό αεροσκάφος", + "νιπτήρας", + "Πλυντήριο ρούχων", + "μπουκάλα για νερό", + "Περούκα", + "παραθυρόφυλλο", + "μπουκάλι του κρασιού", + "πτέρυγα", + "γουόκ", + "έριο", + "Γιούρτα", + "δικτυακός τόπος", + "σταυρόλεξο", + "πινακίδα", + "φωτεινός σηματοδότης", + "Γουακαμόλε", + "κονσομέ", + "παγωτό", + "παγωτό ξυλάκι", + "μπέγκελ", + "μπρέτσελ", + "τσίζμπεργκερ", + "Πουρές", + "κουνουπίδι", + "κολοκύθι", + "αγγούρι", + "αγκινάρα", + "αγριαγκινάρα", + "μανιτάρι", + "μήλο Granny Smith", + "φράουλα", + "πορτοκάλι", + "λεμόνι", + "σύκο", + "ανανάς", + "μπανάνα", + "αρτόκαρπος", + "καρπός κέδρου", + "ρόδι", + "άχυρο", + "καρμπονάρα", + "ζύμη", + "Πίτσα", + "μπουρίτο", + "ερυθρός οίνος", + "εσπρέσο", + "έγκνογκ", + "φυσαλίδα", + "βράχος", + "κοραλλιογενής ύφαλος", + "θερμοπίδακας", + "ακρολιμνιά", + "ακρωτήριο", + "προσάμμωση", + "ακτή", + "κοιλάδα (γεωγραφία)", + "ηφαίστειο", + "ελαιοκράμβη", + "αραποσίτι", + "βελανίδι", + "συγκάρπιο τριανταφυλλιάς", + "καρπός δέντρου γένους aesculus", + "κοραλλιογενής μύκητας", + "μύκητας τάξης Phallales", + "μανιτάρι γένους boletus", + "κεφάλιον", + "χαρτί υγείας" + ] + ], + "SU": [ + [ + 1, + 39, + 48, + 51, + 71, + 79, + 94, + 99, + 111, + 125, + 274, + 288, + 291, + 292, + 296, + 298, + 308, + 309, + 310, + 312, + 314, + 315, + 319, + 327, + 340, + 341, + 342, + 344, + 346, + 360, + 365, + 368, + 373, + 390, + 398, + 407, + 418, + 426, + 459, + 462, + 463, + 468, + 470, + 487, + 497, + 498, + 525, + 577, + 587, + 591, + 593, + 606, + 612, + 618, + 620, + 629, + 632, + 643, + 649, + 650, + 668, + 673, + 674, + 677, + 679, + 705, + 711, + 721, + 725, + 730, + 741, + 744, + 760, + 764, + 769, + 774, + 778, + 784, + 787, + 792, + 806, + 823, + 827, + 833, + 834, + 839, + 849, + 868, + 879, + 889, + 893, + 909, + 916, + 918, + 928, + 929, + 972, + 984 + ], + [ + "Koki", + "Iguana héjo", + "komodo", + "Triseratop", + "Langir", + "babakaur", + "Kolibri", + "soang", + "Nématoda", + "Umang", + "Ajag", + "Maung tutul", + "singa jalu", + "lodaya", + "Biruang kutub", + "Lasun", + "Laleur", + "nyiruan", + "Sireum", + "jangkrik", + "cucunguk", + "Congcorang", + "Papatong", + "Béntang laut", + "Zébra", + "Bagong", + "Céléng", + "Kuda nil", + "munding", + "Séro", + "Mayas", + "Owa", + "Beruk", + "Lubang", + "Sipoah", + "Ambulan", + "Pulpén", + "barométer", + "Kutang", + "sapu", + "Émbér", + "Taksi", + "Lilin", + "telepon keupeul", + "Garéja", + "Bioskop", + "Waduk", + "Goong", + "Palu", + "Carécét", + "Harmonika", + "Istrikaan", + "Béca", + "Sinduk", + "Léptop", + "Lipen", + "Lawong", + "Kedok", + "Mégalitikum", + "Mikropon", + "Masigit", + "beubeuritan", + "Sentég", + "Paku", + "kangkalung", + "Karéta panumpang", + "Minyak seungit", + "Bantal", + "Buyung", + "Wuluku", + "Sajadah", + "Proyéktil", + "Kulkas", + "bedil", + "Jidar", + "Sendal", + "Dacin", + "Obèng", + "Taméng", + "Pengki", + "Kaos kaki", + "Stétoskop", + "hawu", + "Kapal silem", + "Jas", + "ᮞᮞᮊ᮪ ᮌᮔ᮪ᮒᮥᮀ", + "Téko", + "Baki", + "Payung", + "Biola", + "Dompét", + "Katél", + "Ramatloka", + "Tarucing cakra", + "Éskrim", + "És lilin", + "Gawir", + "Rapa" + ] + ], + "KK": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 9, + 10, + 11, + 16, + 20, + 23, + 29, + 34, + 45, + 48, + 51, + 69, + 71, + 75, + 77, + 79, + 80, + 89, + 92, + 94, + 96, + 98, + 99, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 117, + 124, + 127, + 128, + 129, + 130, + 134, + 135, + 138, + 139, + 140, + 141, + 142, + 144, + 145, + 146, + 147, + 148, + 151, + 160, + 235, + 243, + 248, + 251, + 260, + 269, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 283, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 302, + 303, + 304, + 305, + 308, + 309, + 310, + 312, + 315, + 319, + 320, + 327, + 328, + 329, + 332, + 333, + 334, + 336, + 337, + 340, + 341, + 342, + 344, + 345, + 348, + 349, + 350, + 352, + 353, + 354, + 356, + 359, + 360, + 362, + 363, + 364, + 365, + 366, + 368, + 372, + 373, + 376, + 386, + 387, + 388, + 390, + 394, + 395, + 398, + 399, + 401, + 403, + 405, + 407, + 410, + 411, + 413, + 415, + 417, + 418, + 425, + 426, + 428, + 430, + 432, + 435, + 436, + 437, + 444, + 445, + 447, + 450, + 456, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 476, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 490, + 492, + 497, + 498, + 508, + 511, + 513, + 516, + 517, + 524, + 525, + 527, + 530, + 534, + 536, + 538, + 541, + 547, + 549, + 551, + 555, + 557, + 558, + 561, + 562, + 563, + 567, + 570, + 580, + 583, + 587, + 589, + 591, + 594, + 602, + 604, + 606, + 608, + 610, + 612, + 614, + 618, + 619, + 620, + 627, + 631, + 632, + 641, + 642, + 643, + 646, + 650, + 651, + 654, + 655, + 657, + 662, + 665, + 668, + 670, + 673, + 674, + 677, + 679, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 691, + 692, + 696, + 697, + 701, + 706, + 707, + 710, + 712, + 713, + 714, + 717, + 719, + 721, + 725, + 726, + 730, + 732, + 738, + 741, + 742, + 743, + 746, + 748, + 750, + 753, + 755, + 760, + 762, + 763, + 764, + 769, + 771, + 775, + 776, + 777, + 778, + 780, + 782, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 802, + 806, + 810, + 816, + 819, + 820, + 823, + 826, + 827, + 830, + 833, + 834, + 835, + 839, + 843, + 844, + 845, + 847, + 849, + 859, + 862, + 866, + 869, + 870, + 873, + 874, + 875, + 882, + 883, + 884, + 885, + 888, + 889, + 891, + 893, + 894, + 895, + 897, + 900, + 903, + 911, + 915, + 916, + 919, + 920, + 925, + 928, + 939, + 943, + 957, + 958, + 961, + 963, + 965, + 966, + 967, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 981, + 984, + 986, + 988, + 989, + 999 + ], + [ + "Оңғақ", + "Алтын балық", + "Үлкен ақ акула", + "Жолбарыс акула", + "Балға акуласы", + "Гнюсотектестер", + "түйеқұс", + "Кезеген торғай", + "Кәдімгі пайыз", + "Бюльбюль сайрауықтары", + "Сушылқаралар", + "Құмайлар", + "Аксолотль", + "Терілі тасбақа", + "Утіс", + "Комодо кеселі", + "Трицератопс", + "Трилобиттер", + "шаян", + "Жесір қара өрмекші", + "Қасқыр-өрмекші", + "қырықаяқ", + "Құр", + "Айдарлы какаду", + "Арасақ тұқымдастар", + "Колибри", + "тукан", + "Секпілтөс бейнарық", + "қаз", + "Түрпітәрізділер", + "үйректұмсық", + "Коала", + "вомбат", + "Медуза", + "Актиния", + "Жалпақ құрттар", + "жұмыр құрт", + "Ұлулар", + "Жалаңаш шырыш", + "Нудибранк", + "Сауытты жұмсақденелілер", + "Наутилустер кемешіктер", + "Өзен шаяны", + "Ақ дегелек", + "Қара дегелек", + "Жалбағайлар туысы", + "Қоқиқаздар", + "тырна", + "Арама", + "Дуадақтар тұқымдасы", + "Тасшарлаған", + "Қаратөс құмдауық", + "Шөпілдек", + "Тарбаң шырғалдақтар туысы", + "Бірқазандар", + "Корольдік пингвин", + "Альбатростылар", + "Сұр кит", + "Косатка", + "Чихуахуа", + "ауған тазысы", + "неміс овчаркасы", + "Бульмастиф", + "Хаски", + "Далматин", + "Чау-чау", + "бөрі", + "Жалды қасқыр", + "шалғын қасқыры", + "Динго", + "Қызыл қасқыр", + "қорқау ит", + "Қорқаулар", + "түлкі", + "Ақ түлкі", + "парсы мысығы", + "Пума", + "сілеусін", + "леопард", + "алан", + "ягуар", + "арыстан", + "Жолбарыс", + "Қабылан", + "қоңыр аю", + "Барибал", + "ақ аю", + "Мангуст тұқымдасы", + "Сурикат", + "Ызылдақ қоңыздар", + "Сүген қоңыздар", + "Жапырақ жемірі", + "Қиқоңыздар", + "Қосқанаттылар", + "Пчела", + "Құмырсқа", + "қара шегіртке", + "Дәуіт", + "инелік", + "инелік", + "Теңіз жұлдыздары", + "Теңіз кірпілері", + "Голотурийлер", + "Ангора қояны", + "Атжалман", + "жайра", + "Суыр", + "қамшат", + "Зебра", + "Үй шошқасы", + "Жабайы шошқа", + "бегемот", + "өгіз", + "қой", + "Сабау қой", + "Альпі тауешкісі", + "Импала", + "Газел", + "нар", + "Күзендер", + "күзен", + "қамшат", + "борсық", + "сауытты аң", + "Жалқауаң", + "Орангутандар", + "Гориллалар", + "Ұзын қол мешіндер", + "Павиандар", + "Макактар", + "Носач", + "Африка пілдері", + "Кіші панда", + "Үлкен панда", + "Жыланбалықтәрізділер", + "бекіре", + "Сауытты шортан", + "Абак", + "Абайя", + "Аккордеон", + "ұшақ тасығыш", + "дирижабль", + "жедел жәрдем", + "Омарта", + "алжапқыш", + "Автомат қару", + "наубайхана", + "Әуе шары", + "қаламсап", + "сарай", + "Барометр", + "тәшке", + "баскетбол", + "фагот", + "Ванна", + "Әмбебап", + "Шамшырақ", + "Тандем велосипеді", + "бикини", + "бинокль", + "Бобслей", + "тағзым", + "Эгида", + "сыпырғыш", + "Бакет", + "айылбас", + "оқ өтпейтін кеудеше", + "Такси", + "қазан", + "шам", + "Каноэ", + "Карусель", + "Банкомат", + "кассета", + "қамал", + "Катамаран", + "виолончель", + "ұялы телефон", + "шынжыр", + "Аймауыт", + "Сандық", + "Шіркеу", + "Кинотеатр", + "Пернетақта", + "Кабриолет", + "Труба", + "бесік", + "Көтергіш кран", + "сауыт", + "бөгет", + "Үстелдік компьютер", + "Электронды сағат", + "Ыдыс-аяқ жуу машинасы", + "Док", + "Күмбез", + "Барабан аспабы", + "Электровоз", + "конверт", + "Опа", + "Өрт сөндіру техникасы", + "жалаусап", + "Флейта", + "Айырлы тиегіш", + "Су бұрқақ", + "Құс қалам", + "таба", + "Респиратор", + "Жылыжай", + "Гильотина", + "балға", + "Фен", + "қол орамал", + "Арфа", + "белтемір", + "Құм сағат", + "Үтік", + "джинс", + "Футболка", + "Рикша", + "Кимоно", + "ожау", + "Абажур", + "Ноутбук", + "өкілеттік лимузин", + "Лосьон", + "Дыбыс зорайтқыш", + "Маракас", + "Ксилофон", + "маска", + "лабиринт", + "микрофон", + "микротолқынды пеш", + "Кіші класты автобус", + "қысқа белдемше", + "Ракеталық қару", + "Модем", + "мопед", + "мешіт", + "мотороллер", + "Тышқан (компьютер)", + "тышқан қақпан", + "Шеге", + "алқа", + "Обелиск", + "Гобой", + "Тастауық", + "Одометр", + "Май сүзгі", + "Орган", + "Осциллограф", + "оттегі маскасы", + "будақ", + "қылқалам", + "пижама", + "Парашют", + "Терасса", + "Таксофон", + "Ұштағыш", + "Петри тостағаны", + "Еселегіш құрылғы", + "Плектр", + "Пикап", + "жинақ сандықша", + "жастық", + "Графин", + "жонғы", + "Соқа", + "Поляроид", + "қыш құмыра", + "Жайнамаз", + "Принтер", + "Абақты", + "шайба", + "әмиян", + "құрақ көрпе", + "Радиатор", + "Радиотелескоп", + "Мұздатқыш", + "Мейрамхана", + "Револьвер", + "мылтық", + "сызғыш", + "сейф", + "Саронг", + "Саксофон", + "қынап", + "Таразы", + "шхуна", + "Кинескоп", + "бұранда", + "бұрағыш", + "Қауіпсіздік белбеуі", + "тігін машинасы", + "Қалқан", + "күрек", + "шаңғы", + "Қарда жүргіш", + "ұйық", + "Бос орын пернесі", + "ұршық", + "Сахна", + "Паровоз", + "Стетоскоп", + "Секундөлшер", + "пеш", + "зембіл", + "Сүңгуір қайық", + "костюм", + "күн сағаттары", + "Аспалы көпір", + "әткеншек", + "айырғыш", + "шприц", + "Танк", + "шайнек", + "тостер", + "алау", + "Трактор", + "Тренч", + "Трицикл", + "Салтанат қақпасы", + "троллейбус", + "Тромбон", + "шаңсорғыш", + "Гүлдесте", + "күмбез", + "Мақпал", + "виадук", + "Скрипка", + "Вафли пісіргіш", + "шилан", + "шкаф", + "Әскери қызметтегі ұшақтар", + "кір жуғыш машина", + "Су айдауыш мұнара", + "Парик", + "жүн", + "киіз үй", + "сайт", + "жол белгілері", + "бағдаршам", + "Консоме", + "Балмұздақ", + "цуккини", + "бәдірен", + "анар", + "пішен", + "қамыр", + "пицца", + "Бурито", + "Қызыл таң шарабы", + "эспрессо", + "көбік", + "Клиф", + "Маржан жарлауыты", + "Гейзерлер", + "Жағалау", + "Аңғар", + "Жанартау", + "бейсболшы", + "Рапс", + "Кәдімгі шолпанкебіс", + "Емен жаңғақ", + "Итмұрын", + "dárethana qaǵazy" + ] + ], + "SK": [ + [ + 1, + 2, + 3, + 4, + 9, + 10, + 11, + 14, + 15, + 18, + 22, + 23, + 24, + 29, + 39, + 46, + 48, + 49, + 50, + 56, + 61, + 62, + 63, + 69, + 71, + 75, + 78, + 79, + 80, + 81, + 82, + 87, + 88, + 89, + 93, + 94, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 114, + 116, + 127, + 128, + 130, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 151, + 154, + 160, + 162, + 163, + 169, + 170, + 172, + 178, + 191, + 201, + 208, + 211, + 213, + 229, + 230, + 231, + 234, + 235, + 242, + 244, + 246, + 247, + 249, + 250, + 251, + 252, + 254, + 256, + 258, + 259, + 260, + 261, + 269, + 271, + 272, + 273, + 275, + 276, + 277, + 279, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 299, + 300, + 301, + 303, + 304, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 319, + 320, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 336, + 337, + 338, + 341, + 342, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 353, + 354, + 355, + 357, + 358, + 359, + 360, + 362, + 363, + 364, + 365, + 367, + 368, + 369, + 372, + 373, + 376, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 394, + 398, + 399, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 410, + 411, + 412, + 413, + 414, + 415, + 417, + 418, + 420, + 421, + 425, + 426, + 427, + 428, + 430, + 432, + 435, + 436, + 437, + 441, + 445, + 447, + 450, + 452, + 453, + 454, + 455, + 456, + 458, + 459, + 460, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 476, + 478, + 479, + 480, + 481, + 483, + 485, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 494, + 497, + 498, + 499, + 502, + 503, + 505, + 508, + 510, + 511, + 513, + 516, + 517, + 523, + 525, + 526, + 527, + 529, + 531, + 533, + 534, + 535, + 537, + 538, + 541, + 543, + 545, + 546, + 547, + 549, + 553, + 555, + 557, + 558, + 561, + 562, + 563, + 567, + 568, + 570, + 573, + 578, + 579, + 580, + 582, + 583, + 587, + 589, + 590, + 591, + 593, + 600, + 604, + 606, + 608, + 609, + 610, + 616, + 618, + 619, + 620, + 621, + 623, + 626, + 627, + 628, + 632, + 634, + 642, + 643, + 644, + 645, + 646, + 649, + 650, + 651, + 652, + 654, + 656, + 657, + 660, + 663, + 668, + 670, + 671, + 673, + 675, + 677, + 679, + 681, + 683, + 684, + 687, + 688, + 692, + 693, + 696, + 697, + 698, + 701, + 702, + 705, + 706, + 708, + 711, + 712, + 714, + 716, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 732, + 733, + 734, + 736, + 737, + 738, + 740, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 752, + 753, + 754, + 755, + 757, + 760, + 761, + 762, + 764, + 769, + 771, + 773, + 774, + 776, + 777, + 778, + 780, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 795, + 797, + 798, + 799, + 802, + 803, + 806, + 807, + 810, + 813, + 816, + 817, + 819, + 820, + 823, + 826, + 827, + 828, + 829, + 830, + 831, + 833, + 834, + 835, + 837, + 838, + 839, + 843, + 844, + 845, + 847, + 849, + 850, + 851, + 852, + 855, + 856, + 857, + 862, + 866, + 870, + 873, + 874, + 875, + 876, + 878, + 879, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 907, + 908, + 911, + 915, + 916, + 918, + 919, + 920, + 921, + 928, + 932, + 938, + 939, + 943, + 949, + 951, + 952, + 953, + 954, + 957, + 958, + 961, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 981, + 982, + 984, + 986, + 988, + 989, + 992, + 998, + 999 + ], + [ + "karas striebristý", + "žralok belasý", + "žralok tigrí", + "Sfyrnovité", + "pštros", + "pinka severská", + "stehlík", + "pápežík indigový", + "drozd sťahovavý", + "straka", + "orol bielohlavý", + "sup", + "sova tmavá", + "Axolotl mexický", + "Leguán zelený", + "Jašterica zelená", + "Varan komodský", + "krokodíl nílsky", + "aligátor severoamerický", + "Hadiarka", + "Veľhad kráľovský", + "pytón písmenkový", + "Kobra okuliarnatá", + "Trilobity", + "škorpión", + "Snovačka jedovatá", + "kliešť", + "stonôžky", + "tetrov hoľniak", + "tetrov obyčajný", + "jariabok hrivnatý", + "Psittacus", + "Ara (papagáj)", + "Kakadu zlatochochlatý", + "dutinovce", + "kolibrík", + "tukan", + "káčer", + "potápač prostredný", + "hus", + "labuť čierna", + "ježura", + "vtákopysk", + "Koala medvedíkovitá", + "vombat", + "medúza", + "Sasanky", + "Koral mozgovitý", + "ploskavce", + "Hlístovce", + "slimák", + "Chitóny", + "bocian biely", + "bocian čierny", + "Plameniakotvaré", + "žeriav", + "kurlan chriaštelí", + "lyska popolavá", + "Dropotvaré", + "kamenár strakatý", + "pobrežník čiernozobý", + "kalužiak červenonohý", + "lastúrničiar", + "pelikánovité", + "Tučniak veľký", + "Albatrosovité", + "Veľrybovec sivý", + "Kosatka dravá", + "Dugong morský", + "čivava", + "pekinéz", + "afganský chrt", + "Bígl", + "bloohound", + "ruský chrt", + "írsky vlkodav", + "Vipet", + "Weimarský stavač", + "airedalský teriér", + "Austrálsky hodvábny teriér", + "labradorský retríver", + "Maďarský stavač", + "írsky seter", + "staroanglický ovčiak", + "šeltia", + "kólia", + "rotvajler", + "nemecký ovčiak", + "boxer (pes)", + "tibetská doga", + "nemecká doga", + "svätobernardský pes", + "aljašský malamut", + "sibírsky husky", + "Dalmatínsky pes", + "opičí pinč", + "mopslík", + "novofunlandský pes", + "Samojed", + "Nemecký špic trpasličí", + "Čau-čau", + "Nemecký špic vlčí", + "vlk", + "vlk hrivnatý", + "kojot", + "dingo austrálsky", + "pes hyenovitý", + "hyenovité", + "líška", + "líška polárna", + "Perzská mačka", + "Siamská mačka", + "puma americká", + "Rys", + "leopard škvrnitý", + "Leopard snežný", + "Jaguár americký", + "lev", + "tiger džungľový", + "gepard", + "medveď hnedý", + "Medveď baribal", + "Medveď biely", + "surikata vlnkavá", + "Svižníky", + "lienka", + "fuzáčovité", + "liskavkovité", + "mucha", + "včela", + "Mravcovité", + "kobylkovité", + "kriket", + "švábovité", + "kudlanka", + "vážka", + "Šidielka", + "morská hviezdica", + "ježovky", + "holotúrie", + "divoký králik", + "zajac", + "angorský králik", + "Škrečok", + "svišť", + "bobor", + "Morča domáce", + "prasa", + "diviak lesný", + "Hroch obojživelný", + "vôl", + "Byvol arni", + "Zubor", + "baran", + "ovca hruborohá", + "kozorožec", + "Gazela", + "dromedár", + "lama", + "Norok", + "tchor tmavý", + "fretka", + "vydra", + "Jazvec", + "pásavec", + "Leňoch trojprstý", + "orangutan bornejský", + "šimpanz", + "Gibon lar", + "gibon siamang", + "pavián", + "makak", + "Nasalis", + "Saimiri vevericovitý", + "lemur kata", + "lemur indri", + "Slon ázijský", + "slon africký", + "panda červená", + "panda veľká", + "úhor", + "jeseter", + "abakus (počítacia tabuľka)", + "Aba (odev)", + "harmonika", + "akustická gitara", + "materská lietadlová loď", + "dopravné lietadlo", + "vzducholoď", + "oltár", + "Sanitka", + "včelín", + "zástera", + "Smetník", + "Útočná puška", + "ruksak", + "pekáreň", + "balón", + "guľôčkové pero", + "Bendžo", + "zábradlie", + "stodola", + "barometer (fyzika)", + "sud", + "fúrik", + "basketbal", + "Fagotista", + "vaňa", + "kombi", + "maják", + "pohár na pivo", + "bikiny", + "ďalekohľad", + "boby", + "čepiec (pokrývka hlavy)", + "knižnica", + "kníhkupectvo", + "uzáver fľaše", + "luk", + "plaketa", + "podprsenka", + "prístavná hrádza", + "Metla", + "vedro", + "sponka", + "nepriestrelná vesta", + "Taxislužba", + "kotlisko", + "sviečka", + "Kanoe", + "Otvárač na konzervy", + "kolotoč", + "škatuľa", + "koleso osobného automobilu", + "pokladničný automat", + "kazeta", + "hrad", + "CD prehrávač", + "violončelo", + "mobilný telefón", + "reťaz", + "drôtená košeľa", + "reťazová píla", + "truhlica", + "skriňa", + "zvonkohra", + "kostol", + "kino", + "sekáčik", + "Dreváky", + "šejker (koktail)", + "kanvica na kávu", + "klávesnica", + "Kontajnerová loď", + "kabriolet", + "Trúbka", + "kolíska", + "žeriav", + "barla", + "hrádza", + "pracovný stôl", + "stolný počítač", + "Plienka", + "digitálne hodinky", + "vecheť", + "umývačka riadu", + "kotúčová brzda", + "Psie záprahy", + "kupola", + "bubon", + "Jednoručná činka", + "ventilátor", + "elektrická gitara", + "Elektrický rušeň", + "obálka", + "kartotéka", + "hasičský automobil", + "stožiar", + "flauta", + "vysokozdvižný vozík", + "fontána", + "plniace pero", + "panvica", + "kožušníctvo", + "Respirátor", + "motokára", + "šaty", + "klavír typu grand piano", + "škôlka", + "potraviny", + "gilotína", + "kladivo", + "fén", + "Mobilné zariadenie", + "vreckovka", + "Fúkacia harmonika", + "háčik", + "presýpacie hodiny", + "hladidlo", + "džínsy", + "džíp", + "tričko", + "uzol", + "naberačka", + "tienidlo", + "počítač", + "kosenie", + "nôž na listy", + "zapaľovač (založenie ohňa)", + "limuzína", + "zaoceánsky parník", + "reproduktor", + "Píla", + "xylofón", + "maska", + "zápalka", + "máj (symbolický strom)", + "bludisko", + "Megalit", + "mikrofón", + "mikrovlnná rúra", + "vojenská uniforma", + "mikrobus", + "viacúčelové vozidlo", + "strela", + "Modulové domy", + "mužský kláštor", + "mešita", + "Skúter", + "Horský bicykel", + "myš", + "sťahovacie auto", + "klinec", + "náhrdelník", + "prenosný počítač", + "hoboj", + "Okarína", + "píšťalový organ", + "Osciloskop", + "balíček", + "pádlo", + "štetec", + "pyžamo", + "palác", + "padák", + "bradlá", + "cestovný vozeň", + "terasa", + "piedestál", + "voňavka", + "Petriho miska", + "Brnkadlo", + "ohrada", + "pick-up", + "prasiatko", + "vankúš", + "kanvica", + "Hoblík", + "Igelitová taška", + "Pluh", + "Okamžitá fotografia", + "tyčka", + "policajná dodávka", + "Biliardový stôl", + "fľaša so sódovkou", + "kvetináč", + "strojová vŕtačka", + "tlačiareň", + "väznica", + "riadená strela", + "premietací prístroj", + "puk", + "boxovacie vrece", + "peňaženka", + "brko", + "raketa", + "Radiátor", + "rádio", + "radioteleskop", + "vozidlo pre rekreáciu", + "ľadnička", + "diaľkový ovládač", + "reštaurácia", + "puška", + "Pravítko", + "trezor", + "soľnička", + "sandál", + "Saxofón", + "pošva", + "váhy (prístroj)", + "škuner", + "displej", + "skrutka", + "skrutkovač", + "bezpečnostný pás", + "Šijací stroj", + "Bakler", + "obuv", + "Nákupný vozík", + "lopata", + "lyže", + "spací vak", + "logaritmické pravítko", + "posuvné dvere", + "snežný skúter", + "snežný pluh", + "ponožka", + "Slnečná pec", + "medzerník", + "špachtľa", + "vreteno", + "športový automobil", + "Javisko", + "parný rušeň", + "stetoskop", + "stopky", + "sporák", + "hrubý filter", + "trolejbus", + "nosidlá", + "váľanda", + "ponorka", + "oblečenie", + "slnečné hodiny", + "slnečné okuliare", + "Ochranný prípravok pred slnečným žiarením", + "visutý most", + "hojdačka", + "spínač", + "striekačka", + "tank (vozidlo)", + "čajník", + "medvedík", + "televízia", + "Tenisová loptička", + "Náprstok", + "mláťačka", + "trón", + "fakľa", + "traktor", + "trojkolka", + "slavobrána", + "trolejbus", + "Pozauna", + "vaňa", + "klávesnica písacieho stroja", + "dáždnik", + "vysávaè", + "váza", + "klenba", + "zamat", + "predajný automat", + "Liturgické rúcho", + "viadukt (súčasnosť)", + "husle", + "nástenné hodiny", + "peňaženka", + "skriňa", + "Vojenské lietadlo", + "umývadlo", + "Práčka", + "poľná fľaša", + "Vodná veža", + "píšťala", + "Parochňa", + "vínna fľaša", + "krídlo", + "vlna", + "jurta", + "internetová stránka", + "krížovka", + "dopravná značka", + "semafor", + "obal knihy", + "zmrzlina", + "praclík", + "karfiol", + "tekvica obyčajná", + "uhorka", + "jahoda", + "citrón", + "figa", + "ananás", + "banán", + "granátové jablko", + "Seno", + "cesto", + "víno červené", + "espreso (káva)", + "vaječný koňak", + "alpy", + "bublina", + "strmá skala", + "koralový útes", + "gejzír", + "mys", + "breh, morský", + "dolina", + "sopka", + "bejzbalový hráč", + "ženích", + "repka olejná", + "črievičník papučkový", + "žaluď", + "šípka", + "pečiarka", + "klas", + "hajzlpapír" + ] + ], + "GL": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 16, + 17, + 18, + 20, + 23, + 24, + 25, + 29, + 34, + 48, + 49, + 50, + 51, + 61, + 65, + 69, + 71, + 76, + 78, + 79, + 80, + 82, + 84, + 85, + 86, + 92, + 93, + 94, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 146, + 147, + 148, + 149, + 150, + 151, + 153, + 161, + 163, + 219, + 235, + 242, + 244, + 246, + 250, + 251, + 254, + 269, + 271, + 272, + 275, + 276, + 277, + 279, + 280, + 284, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 305, + 308, + 309, + 310, + 312, + 313, + 314, + 315, + 316, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 333, + 334, + 337, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 348, + 350, + 351, + 352, + 353, + 354, + 357, + 358, + 359, + 360, + 362, + 364, + 365, + 367, + 368, + 370, + 372, + 373, + 381, + 383, + 385, + 386, + 387, + 388, + 390, + 391, + 393, + 394, + 395, + 398, + 401, + 403, + 404, + 405, + 407, + 408, + 409, + 410, + 411, + 412, + 414, + 415, + 417, + 418, + 420, + 421, + 422, + 424, + 425, + 426, + 427, + 428, + 430, + 431, + 435, + 436, + 437, + 438, + 444, + 447, + 453, + 454, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 476, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 497, + 498, + 502, + 505, + 508, + 509, + 511, + 512, + 513, + 516, + 517, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 534, + 536, + 538, + 541, + 543, + 546, + 549, + 555, + 557, + 558, + 561, + 562, + 563, + 567, + 570, + 572, + 575, + 578, + 580, + 582, + 583, + 587, + 589, + 590, + 591, + 593, + 594, + 604, + 606, + 610, + 611, + 613, + 614, + 615, + 616, + 618, + 620, + 621, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 632, + 634, + 636, + 639, + 642, + 643, + 645, + 646, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 662, + 663, + 665, + 668, + 669, + 670, + 671, + 673, + 677, + 679, + 681, + 682, + 683, + 685, + 687, + 688, + 695, + 696, + 697, + 698, + 701, + 704, + 706, + 708, + 710, + 712, + 713, + 716, + 717, + 719, + 721, + 724, + 725, + 727, + 730, + 738, + 742, + 743, + 745, + 746, + 750, + 752, + 755, + 760, + 762, + 763, + 764, + 765, + 769, + 770, + 771, + 773, + 774, + 776, + 777, + 778, + 781, + 782, + 783, + 784, + 786, + 787, + 792, + 795, + 806, + 810, + 813, + 814, + 816, + 817, + 819, + 820, + 822, + 823, + 825, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 845, + 847, + 849, + 851, + 855, + 857, + 858, + 859, + 862, + 863, + 868, + 870, + 871, + 872, + 873, + 875, + 876, + 877, + 879, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 893, + 897, + 900, + 902, + 908, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 923, + 928, + 929, + 938, + 943, + 947, + 948, + 949, + 951, + 952, + 953, + 954, + 957, + 958, + 965, + 966, + 967, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 984, + 985, + 987, + 988, + 992, + 998, + 999 + ], + [ + "Tenca", + "Carpa vermella", + "Tiburón branco", + "Tiburón tigre", + "Esfírnidos", + "estruga", + "estinga", + "avestruz", + "Pimpín real", + "xílgaro", + "Picnonótidos", + "gralla", + "pega", + "Cínclidos", + "voitre", + "Avelaiona lapona", + "píntega común", + "axolote", + "Tartaruga de coiro", + "Dragón de Komodo", + "Crocodilo do Nilo", + "Xacaré americano", + "Tricerátopo", + "Boa constritora", + "serpe mariña", + "Trilobitomorpha", + "Escorpións", + "tarántula", + "Carracha", + "cempés", + "Galo lira común", + "Bonasa", + "pavón", + "paspallás", + "perdiz", + "abellaruco", + "Bucerótidos", + "Colibrí", + "tucano", + "Mergo cristado", + "ganso", + "Cisne negro", + "equidna", + "ornitorrinco", + "Ualabí", + "Phascolarctos", + "Vombátidos", + "Medusa", + "anemone de mar", + "platelminto", + "Nematodos", + "Bucina", + "caracol", + "limacha", + "Lesma de mar", + "Poliplacóforo", + "náutilo", + "Palinúridos", + "Cangrexo de río", + "Paguroideos", + "Cegoña branca", + "Cegoña negra", + "Plataleínos", + "Flamengo", + "abetouro", + "grúa", + "Galiñola negra americana", + "Otídidos", + "Píldora raiada", + "Pilro común", + "Bilurico común", + "Hematopódidos", + "pelicano", + "albatros", + "balea cincenta", + "alcandorca", + "Dugongo", + "León mariño", + "chihuahua (can)", + "Bichon maltès", + "básset", + "can de presa", + "cócker", + "Pastor alemán", + "Bóxer (can)", + "dogo do Tibet", + "Gran Danés", + "husky siberiano", + "dálmata", + "cadeliño", + "lobo", + "Lobo de crina", + "Coiote", + "Licaón", + "Hiénidos", + "raposo", + "Raposo ártico", + "Raposo gris", + "Gato siamés", + "lobicán", + "Leopardo", + "Leopardo das neves", + "xaguar", + "león", + "Tigre", + "Guepardo", + "Oso pardo", + "Oso negro americano", + "Oso polar", + "Herpéstidos", + "suricato", + "xoaniña", + "Carábidos", + "Cerambícidos", + "Crisomélidos", + "escarabajo pelotero", + "Dípteros", + "Abella", + "Formiga", + "grilo", + "insecto pau", + "Cascuda", + "Mantodeos", + "carricanta", + "libélula", + "Zigópteros", + "bolboreta monarca", + "gradicela", + "ourizo de mar", + "Holoturoideos", + "lebre", + "hámster", + "porco espiño", + "befre", + "Cobaia", + "cebra", + "porco", + "xabaril", + "Hipopótamo", + "boi", + "Búfalo", + "Bisonte", + "borro", + "cabra montesa", + "Alcélafo común", + "Aepycerotinae", + "Gacela", + "dromedario", + "Visón", + "Furón bravo", + "furón", + "lóndrega", + "teixugo", + "Bradipódidos", + "Orangután de Borneo", + "chimpancé", + "xibón", + "cercopiteco", + "babuíno", + "Macaco", + "Mono araña", + "Lémure de cola anelada", + "Elefante indio", + "Elefante africano de sabana", + "Panda vermello", + "Oso panda", + "airoa", + "Salmón coho", + "Peixe pallaso", + "Acipenséridos", + "Agulla", + "ábaco", + "acordeón", + "Portaavións", + "Avión comercial", + "dirixible", + "ambulancia", + "Vehículo anfibio", + "reloxo analóxico", + "colmear", + "sabelo", + "borralleira", + "mochila", + "forno", + "globo", + "Bolígrafo", + "Banxo", + "pasamáns", + "pesa", + "perruquería", + "celeiro", + "barómetro", + "Barril", + "Carretilla", + "baloncesto", + "Berce", + "bañeira", + "furgoneta", + "faro", + "Vaso de precipitados", + "Tándem", + "prismáticos", + "biblioteca", + "libraría", + "arco", + "Gravata de lazo", + "Apertador", + "quebraondas", + "loriga", + "coaña", + "briol", + "fibela", + "chaleco antibalas", + "taxista", + "ral", + "Candea", + "canoa", + "Abrelatas", + "carrusel", + "caixeiro automático", + "casete", + "castelo (fortificación)", + "Catamarán", + "violonchelo", + "teléfono móbil", + "cadea", + "loriga", + "motoserra", + "arca", + "Cómoda", + "igrexa", + "Sala de cinema", + "Zoca", + "cafeteira", + "teclado de ordenador", + "Docería", + "Cabriolé", + "sacarrollas", + "trompeta", + "rolo", + "guindastre", + "muleta", + "coiraza", + "presa de encoro", + "Escritorio", + "Computadora de escritorio", + "Cueiro", + "reloxo dixital", + "mesa de xantar", + "lavalouza", + "Dársena", + "cúpula", + "tambor", + "Haltere", + "guitarra eléctrica", + "sobre", + "Coche de bombeiros", + "mastro", + "frauta traveseira", + "carretilla elevadora", + "fonte", + "estilográfica", + "tixela", + "Máscara", + "copa", + "Bugui", + "traxe", + "invernadoiro", + "supermercado", + "guillotina", + "Martelo", + "secador de cabelo", + "dispositivo móbil", + "pano", + "Harmónica", + "arpa", + "Reloxo de area", + "Ferro de pasar", + "camiseta", + "Crebacabezas", + "panca de mando", + "Quimono", + "xeonlleira", + "Nó", + "Cullerón", + "portátil", + "Cortacéspede", + "abrecartas", + "biblioteca", + "bote salvavidas", + "chisqueiro", + "limusina", + "transatlántico", + "lapis labial", + "altofalante", + "Serradoiro", + "valixa", + "traxe de baño", + "xilófono", + "Careta", + "Festa dos maios", + "labirinto", + "Megalitismo", + "micrófono", + "Forno de microondas", + "minibús", + "minifaldra", + "Monovolume", + "mísil", + "mitón", + "Módem", + "mosteiro", + "ciclomotor", + "mesquita", + "mosquiteiro", + "lambretta", + "Bicicleta de montaña", + "rato", + "Cravo", + "colar", + "portátil", + "obelisco", + "óboe", + "hodómetro", + "Órgano", + "osciloscopio", + "Cadeado", + "pincel", + "pixama", + "Palacio", + "paracaídas", + "parquímetro", + "terraza", + "Plinto", + "Afialapis", + "Placa de Petri", + "fotocopiadora", + "valo", + "camioneta", + "Peto (recipiente)", + "Traveseiro", + "barco pirata", + "Xerra", + "planetario", + "arado", + "testo", + "Impresora", + "Centro penitenciario", + "proxector", + "disco", + "edredón", + "raqueta", + "Radiotelescopio", + "frigorífico", + "restaurante", + "revólver", + "fusil", + "arrendeeira", + "Regra", + "Zapato deportivo", + "caixa forte", + "saleiro", + "sandalia", + "Saxofón", + "vaíña", + "Balanza", + "taboleiro", + "pantalla", + "parafuso", + "desaparafusador", + "Máquina de coser", + "escudo", + "paa", + "esquí", + "calcetín", + "barra espaciadora", + "escumadeira", + "lancha", + "fuso", + "Automóbil deportivo", + "escenario", + "locomotora a vapor", + "Tambores metálicos de Trinidad e Tobago", + "Estetoscopio", + "valado de pedra", + "cronómetro", + "estufa", + "tranvía", + "angarellas", + "estupa", + "submarino", + "traxe", + "reloxo de sol", + "lentes de sol", + "protector solar", + "Ponte colgante", + "fregona", + "randeeira", + "xiringa", + "Carro de combate", + "teteira", + "sistema de televisión", + "alferga", + "Trono", + "tellado", + "torradora", + "facha", + "Tótem", + "bandexa", + "triciclo", + "trimarán", + "trepia", + "Arco de triunfo", + "trombón", + "cuba", + "torniquete", + "paraugas", + "aspiradora", + "vaso", + "Bóveda", + "Veludo", + "máquina expendedora", + "vestimenta", + "viaduto", + "Violín", + "billeteira", + "lavadora", + "Torre de auga", + "chifre", + "á", + "la", + "Iurta", + "sitio web", + "cómic", + "Encrucillado", + "placa de rúa", + "semáforo", + "fonte", + "Xeado", + "Polo (xeado)", + "coliflor", + "cogombro", + "chouparro", + "mazá verde", + "morote", + "limón", + "figo", + "ananás", + "plátano", + "milgranda", + "feno", + "Taco de fariña", + "tinto", + "café expreso", + "gurgulla", + "cantil", + "Arrecife de coral", + "Géyser", + "beira da lagoa", + "promontorio", + "banco de area", + "beiramar", + "val", + "Volcán", + "beisbolista", + "noivo", + "colza", + "margarida", + "millo", + "landra", + "agárico", + "Espiga", + "papel hixiénico" + ] + ], + "OM": [ + [ + 144, + 292, + 309, + 340, + 398, + 428, + 447, + 462, + 468, + 470, + 472, + 668, + 677, + 762, + 792, + 893, + 958, + 979 + ], + [ + "aallaattii", + "Qeerransa", + "kaanniissa", + "Harree diidoo", + "abakaas", + "gaarii", + "naaduraa", + "hartuu", + "taaksii", + "dungoo", + "bidiruu", + "masgiida", + "bismaara", + "mana nyaataa", + "akaafaa", + "korojoo", + "hookaa", + "Sulula" + ] + ], + "FA": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 13, + 14, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 32, + 33, + 34, + 37, + 39, + 40, + 42, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 53, + 56, + 57, + 60, + 61, + 63, + 65, + 66, + 69, + 70, + 71, + 72, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 84, + 85, + 86, + 87, + 88, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 118, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 133, + 134, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 153, + 154, + 155, + 157, + 160, + 162, + 163, + 169, + 170, + 176, + 180, + 191, + 192, + 199, + 201, + 213, + 215, + 217, + 226, + 229, + 230, + 234, + 235, + 236, + 237, + 242, + 243, + 246, + 247, + 248, + 249, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 317, + 319, + 320, + 321, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 391, + 393, + 394, + 395, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 435, + 436, + 437, + 438, + 439, + 444, + 445, + 447, + 448, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 497, + 498, + 499, + 501, + 502, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 515, + 516, + 517, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 534, + 535, + 536, + 537, + 538, + 541, + 543, + 545, + 546, + 547, + 549, + 551, + 553, + 554, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 565, + 567, + 568, + 570, + 572, + 574, + 576, + 577, + 579, + 580, + 582, + 583, + 585, + 587, + 589, + 590, + 591, + 593, + 594, + 595, + 596, + 597, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 625, + 626, + 627, + 628, + 629, + 631, + 632, + 633, + 634, + 637, + 640, + 641, + 642, + 643, + 645, + 646, + 647, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 660, + 661, + 662, + 665, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 690, + 691, + 692, + 695, + 696, + 697, + 698, + 699, + 701, + 702, + 704, + 705, + 706, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 721, + 725, + 726, + 727, + 728, + 730, + 731, + 734, + 735, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 783, + 784, + 785, + 786, + 787, + 788, + 792, + 795, + 797, + 798, + 799, + 802, + 803, + 806, + 807, + 808, + 810, + 813, + 816, + 817, + 818, + 819, + 820, + 823, + 824, + 826, + 827, + 828, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 847, + 849, + 850, + 852, + 855, + 856, + 857, + 859, + 860, + 862, + 863, + 866, + 868, + 870, + 872, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 893, + 894, + 895, + 897, + 898, + 900, + 902, + 903, + 905, + 909, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 924, + 925, + 928, + 929, + 931, + 932, + 933, + 934, + 935, + 937, + 938, + 939, + 943, + 944, + 947, + 948, + 949, + 952, + 953, + 954, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 986, + 988, + 989, + 996, + 998, + 999 + ], + [ + "لای‌ماهی", + "ماهی طلایی", + "کوسه سفید بزرگ", + "کوسه ببری", + "کوسه سرچکشی", + "سفره‌ماهی برقی", + "لقمه‌ماهی", + "شترمرغ", + "سهره دمگاه‌سفید", + "سهره", + "سازونشین", + "زردپره نیلی", + "سینه سرخ", + "شباهنگ‎", + "زاغ", + "زیر آبروک", + "کورکور", + "عقاب گر", + "کرکس", + "جغد خاکستری بزرگ", + "اکسولوتل", + "گاوغوک آمریکایی", + "قورباغه دم‌دار", + "لاک پشت دریایی", + "لاک‌پشت چرمی", + "لاک‌پشت لولادار", + "ایگوانا", + "آنول کارولینا", + "آگاما", + "هیولای هیلا", + "مارمولک سبز اروپایی", + "آفتاب‌پرست آفریقایی", + "اژدهای کومودو", + "تمساح نیل", + "تمساح آمریکایی", + "تریسراتوپس", + "مار سرحلقه‌ای", + "شه‌مار", + "مار بندجورابی", + "مار شب", + "بوآی کانستریکتور", + "کبرای هندی", + "دریاماران", + "افعی شاخدار بیابانی", + "تریلوبیت", + "دروگر", + "عقرب", + "عنکبوت باغی", + "بیوه سیاه جنوبی", + "عنکبوت‌های گرگی", + "کنه", + "صد پا", + "سیاه‌خروس سیاه", + "باقرقره", + "سیاه‌خروس یالدار", + "خرامیدن", + "بلدرچین", + "کبک (نوع)", + "کاسکو", + "طوطی دم‌بلند", + "کاکاتو کاکل زرد", + "میخ‌پنجه", + "زنبورخوار", + "منقارشاخی", + "مرغ مگس خوار", + "رنگین‌تاب (پرنده)", + "طوفان", + "مرغابی نر", + "اردک ماهی‌خوار کاکلی", + "غاز", + "قوی سیاه", + "مورچه‌خورک", + "ارنی ترنگ", + "والابی", + "کوآلا", + "وامبت", + "عروس دریایی", + "شقایق دریایی", + "مرجان مغزی", + "کرم‌های پهن", + "انگل روده", + "صدف حلزونی", + "حلزون", + "راب‎", + "لیسه دریایی", + "گهواره دریایی", + "خرچنگ دانجنس", + "خرچنگ ویولن‌زن", + "خرچنگ شاهی", + "شاه‌میگوی آمریکایی", + "شاه‌میگوی تیغی", + "خارچنگ", + "خرچنگ هرمیت", + "برابر پای", + "لک‌لک سفید", + "لک‌لک سیاه", + "کفچه‌نوک", + "فلامینگو", + "بوتیمار", + "کلنگان", + "چنگر آمریکایی", + "هوبره", + "مرغ ریگ سرخ", + "تلیله شکم‌سیاه", + "آبچلیک پاسرخ معمولی", + "گل‌نورد", + "صدف‌خوار", + "پلیکان", + "شاه‌پنگوئن", + "آلباتروس‌های پشت‌سیاه", + "نهنگ خاکستری", + "گاو ماهی", + "فیل دریایی", + "شیر دریایی", + "شیهواهوا", + "مالتز", + "پکینز", + "شیتزو", + "پاپیلون", + "افغان هاند‎", + "بیگل (نژاد سگ)", + "سگ شکاری سنت اوبر", + "سگ گرگ", + "سگ تازی ایرلندی‎", + "سلوکی", + "پیت بول", + "تریر آیردال", + "توده سنگ", + "تریر اسکاتلندی", + "سیلکی تریر استرالیایی", + "ستر ایرلندی", + "بریتانی", + "اسپرینگر اسپانیل انگلیسی", + "بریارد", + "سگ گله انگلیسی قدیمی", + "سگ گله شتلند", + "روتوایلر (سگ)", + "ژرمن شپرد", + "دوبرمن", + "مینیاتور پینچر‎", + "باکسر", + "بول‌ماستیف", + "گریت دین", + "سنت برنارد", + "هاسکی", + "مالاموت", + "دالماسین (سگ)", + "آفنپینشر", + "باسنجی", + "کندن", + "نیوفاندلند (سگ)", + "سگ کوهستانی پیرنه", + "ساموید (سگ)", + "پامرانین (سگ)", + "چو چو", + "keesh hound", + "گرگ", + "گرگ شمالگان", + "گرگ سرخ", + "کایوت", + "دینگو", + "سگ وحشی آسیایی", + "سگ وحشی آفریقایی", + "کفتار", + "روباه", + "روباه قطبی", + "روباه خاکستری", + "گربه ایرانی", + "گربه سیامی", + "شیر کوهی", + "سیاه گوش", + "پلنگ", + "اونس", + "پلنگ خالدار امريكايی", + "شير", + "ببر‎", + "یوز‎", + "خرس قهوه‌ای", + "خرس سیاه آمریکایی", + "خرس قطبی", + "خدنگ", + "میرکت", + "سوسک ببری", + "کفشدوزک‎", + "سوسک‌های زمینی", + "سوسک‌های شاخک‌دراز", + "سوسک برگ", + "سرگین‌غلتان", + "سوسک‌های کرگدنی", + "سوسه", + "مگس", + "زنبور عسل‎", + "مورچه", + "زنجره", + "سوسریان", + "آخوندک‎", + "زنجره‌واران", + "زنجرک", + "آسیابک", + "سنجاقک", + "فرمانده", + "چشمک‌بال", + "سلطان", + "ستاره دریایی", + "توتیای دریایی‎", + "حلزون دریایی", + "خرگوش‌های دم‌پنبه‌ای", + "خرگوش صحرایی", + "همستر", + "تشی", + "سنجاب روباهی", + "مارموت‎", + "سگ آبی", + "خوکچه هندی‎", + "گورخر", + "خوک", + "گراز", + "گراز زگیل‌دار", + "اسب آبی‎", + "گاو نر", + "گاومیش", + "بیزون", + "شاخ قوچ", + "گوسفند بزرگ‌شاخ", + "مرال", + "گاوگوزن", + "ایمپالا", + "غزال‎", + "شتر", + "لاما", + "راسو", + "مینک", + "قاقم دورنگ اروپایی", + "موش خرما", + "سمور آبی‎", + "گربه قطبی", + "گورکن", + "آرمادیلو‎", + "تنبل سه‌پنجه", + "اورانگوتان بورنئویی", + "گوریل", + "شمپانزه", + "میمون دراز دست", + "غبغبی", + "میمون پاتاس", + "عنتر دم‌کوتاه", + "ماکاک", + "شست‌بریدگان", + "میمون بی‌شست سیاه و سفید", + "میمون دماغ‌دراز", + "مارموست", + "میمون جیغ‌کش", + "میمون‌های جهنده", + "میمون عنکبوتی جفری", + "خزمیمون‎", + "لمور دم‌حلقه‌ای", + "ایندری‎", + "فیل آسیایی", + "فیل آفریقایی", + "پاندای سرخ", + "پاندا", + "مارماهی", + "ماهی آزاد کوهو", + "دلقک‌ماهی", + "ماهیان خاویاری", + "ماهی سرسوسماری", + "پف کننده", + "چرتکه", + "چادر عربی", + "لباس دانشگاهی", + "آکوردئون", + "گیتار آکوستیک", + "ناو هواپیمابر", + "هواپیمای مسافربری", + "قابل هدایت", + "بیمار کش‎", + "وسیله نقلیه آبی خاکی", + "کندو", + "پيش بند", + "سطل آشغال", + "تفنگ تهاجمی", + "کوله‌پشتی", + "نانوایی", + "چوب موازنه", + "بادکنک", + "خودکار", + "بانجو‎", + "نرده", + "هالتر", + "انبار غله", + "فشارسنج", + "بشکه", + "فرقان", + "بازی بیس بال", + "بازی بسکتبال", + "گهواره", + "فاگوت", + "وان‎", + "استیشن واگن", + "فانوس دریایی‎", + "پیاله", + "پوست خرس", + "دو اسبه", + "بیکینی‎", + "دوربین‎", + "قفس", + "بابسلد", + "شمشیر", + "درپوش", + "قفسه کتابخانه", + "کتابفروشی", + "تشتک", + "کمان", + "پاپیون", + "لوحه", + "روبان", + "دیواره سد", + "ایجس", + "جارو", + "دلو", + "چپ راست", + "جلیقه ضدگلوله", + "گلوله", + "تاکسی", + "پاتیل", + "شمع‎", + "بلم", + "قوطی‌بازکن", + "ژاکت پشمی", + "چرخ فلک", + "جعبه مقوایی", + "عابر بانک", + "تابوت", + "قلعه‌", + "قایق دوبدنه", + "سی‌دی پلی‌یر", + "ویلونسل", + "تلفن همراه", + "زنجیر‎", + "سیم توری", + "جوشن", + "اره برقی", + "صندوق‎", + "کمد", + "کلیسا", + "سینما", + "ساطور", + "خرقه", + "کفش چوبی", + "واپیچه", + "قفل رمزی", + "صفحه کلید", + "قنادی", + "کشتی کانتینری", + "خودروی کروکی", + "چوب‌پنبه‌بازکن", + "کورنت", + "کلاه گاو چرانی", + "گهواره‎", + "جر ثقیل", + "آرام‌پز", + "عصای زیر بغل", + "بگتر‎", + "آببند‎", + "میز", + "رایانه رومیزی", + "پوشک", + "ساعت دیجیتالی", + "میز ناھار خوری‎", + "ماشین ظرف‌شویی", + "ترمز دیسکی", + "حوضچه خشک", + "سورتمه سگ", + "گنبد", + "طبل", + "دمبل (ابزار ورزشی)", + "وزنده", + "گیتار الکتریک", + "لوکوموتیو برقی", + "لفاف‎", + "پودر صورت", + "پرونده", + "کشتی آتش‌نشانی", + "ماشین آتش‌نشانی", + "تیر پرچم", + "فلوت", + "صندلی تاشو", + "لیفتراک", + "آب‌نما", + "خودنویس", + "واگن باری", + "ماهی تابه", + "تاجر خز", + "ماسک گاز", + "ساغر", + "توپ گلف", + "گوندولا", + "گونگ", + "پیانوی بزرگ‎", + "گلخانه", + "بقالی", + "گیوتین", + "افشانه مو", + "چکش", + "سشوار", + "وسیله سیار", + "دستمال‎", + "سازدهنی", + "چنگ", + "درو گر", + "تیشه", + "جلد", + "بارفیکس‎", + "ساعت شنی", + "اطو", + "کدوی هالووین", + "لی‎", + "جیپ", + "تی‌شرت", + "پازل‎", + "ریکشا", + "کیمونو", + "گره", + "روپوش سفید", + "کفچه‎", + "آباژور‎", + "لپتاپ‎", + "علف‌بر", + "درپوش لنز", + "چاقوی پاکت نامه", + "قایق نجات", + "فندک", + "لیموزین", + "کشتی اقیانوس‌پیما", + "رژ لب", + "لوسیون", + "بلندگو", + "لوپ", + "کارخانه چوب‌بری", + "صندوق پست", + "دریچه منهول", + "ماراکا", + "زیلوفون", + "صورتک", + "تیرک ماه می", + "شکنج", + "پیمانه", + "سنگ بزرگ", + "میکروفن", + "ریز موج", + "مینی‌بوس", + "مینی ژوپ‎", + "مینی‌ون", + "پرتابه", + "خانه متحرک", + "فورد مدل تی", + "مودم‎", + "موتور گازي", + "مسجد‎", + "پشه‌بند", + "اسکوتر (موتور)", + "دوچرخه کوهستان", + "موشواره", + "تله‌موش", + "میخ", + "گردن بند", + "دفتر یادداشت", + "ابلیسک", + "ابوا‎", + "اکارینا", + "کیلومترشمار", + "فیلتر هیدرولیک", + "ارگ (ساز)", + "اسیلوسکوپ", + "گاری‎", + "ماسک اکسیژن", + "بسته‎", + "قفل آویز", + "قلم‌مو", + "لباس خواب", + "کاخ", + "زامپونیا", + "چتر نجات", + "میله پارالل", + "پارکومتر", + "واگن‎", + "پاسیو", + "پایه‎", + "جامدادی", + "تراش‎", + "عطر", + "پتری دیش", + "دستگاه فتوکپی", + "زخمه", + "پیکلهاب", + "نرده", + "وانت", + "اسکله", + "قلک", + "بالش", + "ابریق", + "رنده‎", + "افلاک نما", + "کیسه پلاستیکی", + "گاوآهن", + "لوله بازکن", + "اتومبیل پلیس", + "کت بارانی", + "گلدان‎", + "چرخ سفالگری‎", + "جانماز‎", + "چاپگر", + "زندان", + "پرتابه", + "فراتاب", + "توپ هاکی (پاک هاکی)", + "کیسه بوکس", + "کیسه", + "قلم پر", + "بالاپوش", + "راکت (ابزار ورزشی)", + "رادیاتور", + "رادیو تلسکوپ", + "ماشین کاروان", + "یخچال", + "کنترل از دور", + "غذاخوری", + "هفت تیر", + "تفنگ", + "صندلی تاب", + "سیخ‌گردانی", + "خطکش‎", + "کفش ورزشی", + "گاوصندوق", + "سنجاق قفلی‎", + "نمکدان", + "صندل‎", + "سارونگ", + "ساکسوفون", + "غلاف شمشیر", + "ترازو", + "اتوبوس مدرسه‎", + "پیچ", + "پيچ گوشتی", + "كمربند ايمني", + "چرخ خیاطی", + "مژن‎", + "کفش‌فروشی", + "بیل‎", + "اسکی", + "کیسه خواب", + "خط‌کش محاسبه", + "در کشویی (خودرو)", + "برف‌رو", + "برف روب", + "درست", + "کوره خورشیدی", + "سمبررو", + "کلید فاصله", + "کفگیر", + "دوک‎", + "خودرو اسپورت", + "چراغ نورافکن", + "منصة", + "لوکوموتیو بخار", + "گوشی طبی", + "خرقه", + "کرنومتر", + "بخاری", + "پالایش کننده", + "واگن برقی", + "برانکار", + "گنبد", + "زیردریایی", + "کت شلوار‎", + "ساعت آفتابی‎", + "عینک آفتابی", + "کرم ضدآفتاب", + "پل معلق", + "کف‌شوی", + "سویتشرت‎", + "تاب‎", + "سویچ‎", + "سرنگ", + "تانک", + "قوری چای", + "تدی خرسه", + "توپ تنیس", + "انگشتانه", + "خرمن‌کوب", + "اورنگ", + "تستر‎", + "توتونچی", + "مشعل", + "تیرک خویشاوندی", + "تراکتور", + "طبق", + "سه چرخه", + "سه پایه", + "طاق نصرت‎", + "اتوبوس برقی", + "ترومبون", + "خم", + "دروازۀ گردان", + "چتر", + "یک‌چرخه", + "جارو برقی", + "ظرف", + "گنبد", + "مخمل", + "لباس رسمی", + "پل چنددهانه", + "ویولن", + "بازی والیبال", + "اتو وافل", + "کیف پول", + "اشکاف", + "هواپیمای جنگی", + "ماشین رخت‌شویی", + "بطری آب", + "برج آب", + "سوت (وسیله)", + "موی مصنوعی", + "پرده", + "ووک (تابه)", + "کاموا", + "خیمه‎", + "مکان", + "کتاب کمیک", + "جدول کلمات متقاطع", + "علامت ترافیک‎", + "چراغ ترمز", + "روکش جلد", + "فهرست خوراک", + "گوآکاموله", + "کنسومه", + "بستنی‎", + "بستنی چوبی", + "باگل", + "چوب شور", + "چیزبرگر", + "تفته", + "پوره سیب‌زمینی", + "نوعی گل کلم", + "گل کلم", + "کدو تخم پوست کاغذی", + "خیار", + "کنگر فرنگی", + "قارچ", + "سیب سبز گرنی اسمیت", + "توت فرنگی", + "انجیر", + "آناناس", + "موز", + "درخت انار", + "تختخواب", + "کاربونارا", + "سس شکلات", + "خمیر", + "میتلف", + "پیتزا", + "پای ظرفی", + "بوریتو", + "شراب قرمز‎", + "اسپرسو", + "اگ ناگ", + "جوشيدن‌", + "صخره", + "صخره‌های مرجانی", + "آتشفشان", + "راس", + "ساحل دریا", + "دره", + "کوه آتشفشان", + "داماد", + "کلزا", + "ارکیده دارزی", + "ميوه تيره درختان بلوط", + "میوه گل رز", + "قارچ مرغ چوب", + "خوشه", + "دستمال توالت" + ] + ], + "JV": [ + [ + 1, + 2, + 3, + 4, + 16, + 34, + 39, + 48, + 50, + 71, + 79, + 85, + 88, + 94, + 99, + 102, + 104, + 107, + 108, + 114, + 125, + 129, + 130, + 144, + 146, + 148, + 149, + 151, + 235, + 269, + 277, + 279, + 283, + 287, + 288, + 289, + 291, + 292, + 295, + 298, + 299, + 305, + 308, + 309, + 310, + 312, + 315, + 319, + 320, + 327, + 329, + 331, + 334, + 336, + 338, + 341, + 342, + 344, + 346, + 348, + 360, + 368, + 385, + 386, + 387, + 390, + 393, + 398, + 405, + 415, + 418, + 427, + 435, + 437, + 447, + 455, + 459, + 462, + 463, + 465, + 468, + 470, + 472, + 478, + 483, + 487, + 491, + 496, + 497, + 498, + 503, + 508, + 513, + 521, + 525, + 529, + 533, + 534, + 546, + 551, + 558, + 580, + 582, + 585, + 587, + 589, + 593, + 594, + 606, + 610, + 612, + 618, + 626, + 629, + 643, + 647, + 651, + 657, + 668, + 673, + 677, + 679, + 695, + 698, + 710, + 719, + 721, + 726, + 728, + 730, + 732, + 738, + 741, + 742, + 743, + 752, + 760, + 762, + 769, + 772, + 774, + 776, + 778, + 784, + 786, + 787, + 792, + 806, + 820, + 826, + 827, + 833, + 838, + 844, + 849, + 859, + 875, + 879, + 889, + 891, + 893, + 897, + 898, + 902, + 903, + 909, + 916, + 920, + 924, + 928, + 929, + 933, + 935, + 943, + 960, + 961, + 962, + 964, + 966, + 967, + 969, + 973, + 980 + ], + [ + "Iwak mas", + "Hiu putih", + "Hiyu macan", + "Hiu martil", + "cucak", + "Penyu belimbing", + "Iguana ijo", + "menyawak komodho", + "Aligator Amerika", + "Kalajengking", + "Klabang", + "Puyuh", + "Makaw", + "Kolibri", + "Banyak liar", + "Ekidna", + "Walabi", + "Ubur-ubur", + "Anémon segara", + "Gejiba", + "Pong-pongan", + "Ibis-sendok", + "Plaminggu", + "Pelikan", + "Albatros", + "Paus pembunuh", + "Duyung", + "Chihuahua (asu)", + "asu herder Jerman", + "mbaung", + "Gagarangan abang", + "Rubah Arktik", + "Kucing Pèrsia", + "Lingkes", + "Macan tutul", + "Macan tutul salju", + "Singa", + "sima", + "Bruwang ireng Amerika", + "garangan", + "Mirkat", + "Kutis", + "Laler", + "Tawon", + "Semut", + "jangkrik", + "Walang kadung", + "Kinjeng", + "Kinjeng dom", + "Bintang laut", + "Teripang", + "Truwèlu", + "Landak", + "Marmut", + "Tikus walanda", + "Babi", + "Cèlèng", + "Jaran nil", + "kebo", + "bandhot", + "Berang-berang", + "Uwa-uwa", + "Gajah Asia", + "Gajah semak Afrika", + "Panda abang", + "welut", + "Iwak badhut", + "Simpoa", + "palwa anggegana", + "Toko roti", + "Pulpèn", + "Tong", + "Jedhing", + "mercusuar", + "Kèker", + "Tutup botol", + "Kutang", + "sapu", + "Èmbèr", + "Rompi Anti Peluru", + "Taksi", + "lilin", + "Kano", + "Karton", + "Kastil", + "tilpun sélulèr", + "Graji mesin", + "Kaos kaki Natal", + "greja", + "biyoskup", + "Pangocok koktail", + "papan tutul", + "Trompèt", + "Pamasak alon-alon", + "Dam / Bendungan", + "Popok", + "Pangelap korah-korah", + "Mesin pangumbah piring", + "gitar listrik", + "Wedhak", + "Suling", + "Omah kaca", + "Toko kelontong", + "Semprot rambut", + "gandhèn", + "Panggaring rambut", + "Harmonika", + "Harpa", + "Setrika", + "Kaos oblong", + "Bécak", + "Irus", + "Rèk gas", + "Béngés", + "Topèng", + "Gelas taker", + "Oven gelombang mikro", + "Pluru kendhali", + "masjid", + "tetikus", + "paku", + "kalung", + "kontholan", + "Kadhaton", + "Pengasah potlot", + "cèlèngan", + "Bantal", + "Pasah", + "Kanthong kresek", + "Waluku", + "Kamera Polaroid", + "Pot tanduran", + "Sajadah", + "Pencetak", + "Pakunjaran", + "Rakèt", + "Kulkas", + "Réstoran", + "Penggaris", + "Peniti", + "Sandhal", + "Saksofon", + "Timbangan", + "Drèi", + "Mesin jait", + "Tébéng", + "Cikrak", + "Kaus kaki", + "Sepur uwab", + "Jam sukat", + "Tungku", + "Prau silem", + "Tabir surya", + "Saklar", + "Téko", + "Pamanggang roti", + "Trombon", + "Payung", + "Piyul", + "Wajan wafel", + "Dhompèt", + "Mesin cuci", + "Botol banyu", + "Sempritan", + "Rambut palsu", + "Wajan", + "Situs jaringan", + "Lampu Bang-jo", + "Guacamolé", + "Ès krim", + "Es lilin", + "Burger kèju", + "Kenthang uleg", + "timun", + "Sirup soklat", + "Adhonan", + "Lembar daging", + "Pai pot", + "Anggur abang", + "Espreso", + "Endhognog", + "Terumbu karang", + "gunung geni" + ] + ], + "CS": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 32, + 34, + 36, + 39, + 40, + 45, + 46, + 48, + 49, + 50, + 53, + 56, + 61, + 62, + 63, + 68, + 69, + 71, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 85, + 86, + 87, + 89, + 90, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 114, + 115, + 116, + 117, + 122, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 151, + 152, + 153, + 154, + 155, + 160, + 162, + 163, + 164, + 165, + 169, + 170, + 172, + 173, + 175, + 176, + 178, + 191, + 194, + 199, + 201, + 206, + 208, + 211, + 213, + 215, + 217, + 223, + 227, + 229, + 230, + 231, + 233, + 234, + 235, + 236, + 242, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 306, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 336, + 337, + 338, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 357, + 358, + 359, + 360, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 379, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 398, + 399, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 430, + 432, + 433, + 435, + 436, + 437, + 438, + 439, + 440, + 444, + 445, + 447, + 450, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 497, + 498, + 499, + 502, + 503, + 506, + 507, + 508, + 510, + 511, + 512, + 513, + 516, + 517, + 520, + 523, + 524, + 525, + 526, + 527, + 529, + 534, + 535, + 536, + 537, + 538, + 541, + 543, + 546, + 547, + 549, + 551, + 553, + 555, + 557, + 558, + 561, + 562, + 563, + 566, + 567, + 568, + 569, + 570, + 573, + 574, + 576, + 578, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 595, + 602, + 604, + 606, + 608, + 609, + 610, + 611, + 612, + 616, + 617, + 618, + 619, + 620, + 621, + 625, + 626, + 627, + 628, + 629, + 632, + 634, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 649, + 650, + 651, + 655, + 656, + 657, + 658, + 660, + 661, + 662, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 683, + 684, + 685, + 687, + 688, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 701, + 702, + 704, + 705, + 706, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 731, + 732, + 738, + 739, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 793, + 795, + 797, + 798, + 802, + 803, + 806, + 807, + 808, + 810, + 816, + 817, + 819, + 820, + 823, + 824, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 841, + 843, + 844, + 845, + 847, + 849, + 850, + 852, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 864, + 865, + 866, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 890, + 893, + 894, + 895, + 896, + 897, + 900, + 902, + 903, + 907, + 909, + 910, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 926, + 927, + 928, + 932, + 935, + 938, + 939, + 943, + 952, + 956, + 957, + 958, + 960, + 961, + 962, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 986, + 988, + 989, + 996, + 997, + 998, + 999 + ], + [ + "lín obecný", + "karas zlatý", + "lidožravá zvířata", + "žralok tygrovaný", + "kladivounovití", + "parejnoci", + "rejnok", + "pštros", + "pěnkava jikavec", + "stehlík", + "Papežík indigový", + "drozd stěhovavý", + "bulbulovití", + "sojka", + "straka", + "skorec", + "luňák", + "orel bělohlavý", + "sup", + "puštík vousatý", + "axolotl mexický", + "skokan volský", + "ocasatka", + "kožatka velká", + "želva", + "leguán zelený", + "Anolis rudokrký", + "korovec jedovatý", + "ještěrka zelená", + "varan komodský", + "krokodýl nilský", + "aligátor severoamerický", + "Užovka tečkovaná", + "korálovky", + "hroznýš královský", + "krajta písmenková", + "brejlovec", + "chřestýš rohatý", + "trilobiti", + "štír", + "snovačka jedovatá", + "slíďákovití", + "klíšť", + "stonožky", + "tetřívek obecný", + "bělokur", + "jeřábek kanadský", + "křepelka", + "koroptve", + "papoušek šedý", + "kakadu žlutočečelatý", + "lori", + "vlhovití", + "zoborožcovití", + "kolibřík", + "leskovcovití", + "tukan", + "morčák prostřední", + "husa", + "labuť černá", + "ježura", + "ptakopysk", + "medvídek koala", + "vombat", + "medůza", + "sasanky", + "ploštěnci", + "hlístice", + "nazí plži", + "nahožábří", + "Chroustnatky", + "loděnka hlubinná", + "humr americký", + "langusta", + "raci", + "rak poustevníček", + "čáp bílý", + "čáp černý", + "kolpík", + "plameňák", + "bukač", + "jeřáb", + "kurlan chřástalovitý", + "lyska americká", + "dropovití", + "kameňáček pestrý", + "jespák obecný", + "vodouš rudonohý", + "ústřičník", + "pelikán", + "tučňák patagonský", + "Albatrosové", + "plejtvákovec šedý", + "kosatka dravá", + "dugong indický", + "čivava", + "Japan-chin", + "Maltézský psík", + "Pekingský palácový psík", + "Šicu", + "afgánský chrt", + "bígl", + "Svatohubertský pes", + "Modrý coonhound", + "černo-tříslový coonhound", + "Barzoj", + "irský vlkodav", + "Vipet", + "ibizský podenco", + "Vydrař", + "saluka", + "Výmarský ohař", + "Airedale teriér", + "dandie dinmont teriér", + "Skotský teriér", + "Silky teriér", + "Kudrnatý retrívr", + "labradorský retrívr", + "Maďarský ohař krátkosrstý", + "Irský setr", + "Bretaňský ohař", + "anglický špringršpaněl", + "šiperka", + "australská kelpie", + "staroanglický ovčák", + "Shetlandský ovčák", + "kolie", + "flanderský bouvier", + "rotvajler", + "německý ovčák", + "Dobrman", + "německý boxer", + "Bullmastif", + "tibetský mastif", + "německá doga", + "Bernardýn", + "aljašský malamut", + "sibiřský husky", + "dalmatin", + "opičí pinč", + "Basenži", + "mopsl", + "Novofundlandský pes", + "Pyrenejský horský pes", + "samojed", + "Německý špic trpasličí", + "čau-čau", + "vlčice", + "vlk arktický", + "vlk rudohnědý", + "kojot", + "Pes dingo", + "dhoul", + "pes hyenovitý", + "hyenovití", + "liška", + "liška polární", + "liška šedá", + "perská kočka", + "Siamská kočka", + "puma americká", + "rys", + "levhart skvrnitý", + "irbis", + "jaguár", + "lev", + "tygr", + "gepard štíhlý", + "medvěd hnědý", + "medvěd baribal", + "polární medvěd", + "promykovití", + "surikata", + "svižníkovití", + "beruška", + "střevlíkovití", + "tesaříkovití", + "mandelinkovití", + "nosorožíci", + "dvoukřídlí", + "včela", + "mravencovití", + "saranče", + "cvrček", + "šváb", + "Kudlanky", + "cikáda", + "vážka", + "motýlice", + "okáč prosíčkový", + "monarcha stěhovavý", + "hvězdice", + "mořský ježek", + "sumýši", + "zajíc", + "Angorský králík", + "křečci praví", + "dikobraz", + "svišť", + "bobr", + "morče domácí", + "prase", + "prase divoké", + "prase savanové", + "hroch obojživelný", + "vůl", + "buvol domácí", + "bizon", + "beran", + "ovce tlustorohá", + "kozorožec", + "buvolec stepní", + "impaly", + "gazela", + "dromedár", + "lama", + "norek", + "tchoř tmavý", + "tchoř černonohý", + "vydra", + "jezevec", + "pásovec", + "lenochodovití tříprstí", + "orangutan bornejský", + "Gorillini", + "šimpanz", + "gibonovití", + "gibon siamang", + "kočkodan", + "kočkodan husarský", + "pavián", + "makak", + "Hulmani", + "gueréza", + "kahau nosatý", + "kosman", + "vřešťan", + "chápan středoamerický", + "kotul veverovitý", + "lemur kata", + "slon indický", + "slon africký", + "panda malá", + "panda velká", + "úhoř", + "jeseter", + "Jehlice rohozobá", + "počítadlo", + "abája", + "harmonika", + "akustická kytara", + "letadlová loď", + "dopravní letoun", + "vzducholoď", + "sanitka", + "obojživelné vozidlo", + "včelín", + "zástěra", + "nádoba na odpad", + "útočná puška", + "batoh", + "pekárna", + "kladina", + "balónek", + "propiska", + "bendžo", + "balustráda", + "činka", + "hospodářská budova", + "barometr", + "sud", + "ruční vozík", + "basketbal", + "Fagotista", + "plavecká čepice", + "vana", + "kombi", + "maják", + "Kádinka", + "čáka", + "pivní láhev", + "tandemové kolo", + "bikiny", + "dalekohled", + "boby", + "knihovna", + "knihkupectví", + "víčko lahve", + "luk", + "motýlek (oděvní doplněk)", + "podprsenka", + "vlnolam", + "kyrys", + "koště", + "kbelík", + "spona", + "neprůstřelná vesta", + "taxík", + "kotel", + "svíčka", + "kánoe", + "otvírák na konzervy", + "kardigan", + "kolotoč", + "karton", + "Automated Tteller Machine", + "kazeta", + "hrad", + "Katamaran", + "CD přehrávač", + "violoncellista", + "mobilní telefon", + "řetěz", + "drátěné pletivo", + "kroužkové brnění", + "motorová pila", + "truhla", + "kostel", + "kino", + "sekáček na maso", + "dřeváky", + "šejkr", + "spirála", + "zámek na heslo", + "klávesnice", + "kontejnerová loď", + "kabriolet", + "vývrtka", + "kornet", + "kolébka", + "jeřáb", + "postýlka", + "berla", + "kyrys", + "přehrada", + "psací stůl", + "stolní počítač", + "plenka", + "myčka", + "Kotoučová brzda", + "dok", + "psí spřežení", + "kupole", + "membranofon", + "činka jednoruční", + "elektrická kytara", + "elektrická lokomotiva", + "obálka", + "Pudr", + "pořadač", + "hasičský automobil", + "žerď", + "příčná flétna", + "vysokozdvižný vozík", + "fontána", + "plnicí pero", + "Lovecká trubka", + "pánev", + "kožešnictví", + "popelářský vůz", + "polomaska", + "motokára", + "golfový míček", + "gondoly", + "šaty", + "křídlo", + "skleník", + "koloniál", + "gilotina", + "Lak na vlasy", + "polopásové vozidlo", + "kladivo", + "koš", + "fén", + "mobilní zařízení", + "kapesník", + "harmonika", + "Harfista", + "sekáč", + "hrazda", + "přesýpací hodiny", + "žehlička", + "džíny", + "džíp", + "tričko", + "pucle", + "rikša", + "uzel", + "laboratorní plášť", + "naběračka", + "stínítko", + "přenosný počítač", + "sekačka na trávu", + "záchranná loď", + "zapalovač", + "limuzína", + "zaoceánská loď", + "rtěnka", + "reproduktor", + "pila", + "poklop šachty", + "rumba koule", + "xylofon", + "maska", + "zápalka", + "máje", + "bludiště", + "odměrka", + "megalit", + "mikrofon", + "mikrovlnná trouba", + "minisukně", + "minidodávka", + "střela", + "palcová rukavice", + "Mobilní dům", + "Plechová Líza", + "faxmodem", + "mešita", + "moskytiéra", + "skútr", + "horské kolo", + "myš", + "past na myši", + "hřebík", + "náhrdelník", + "hoboj", + "okarína", + "odometr", + "varhany", + "osciloskop", + "balíček", + "pádlo", + "lopatkové koleso", + "visací zámek", + "štětec", + "pyžamo", + "palác", + "Panova flétna", + "padák", + "bradla", + "parkovné", + "osobní vůz", + "terasa", + "piedestal", + "penál", + "ořezávátko", + "parfém", + "Petriho miska", + "kopie", + "trsátko", + "piklhaubna", + "plaňkový plot", + "pick-up", + "prasátko", + "polštář", + "džbán", + "struh", + "Igelitová taška", + "pluh", + "zvon (nástroj)", + "Instantní fotoaparát", + "květináč", + "hrnčířský kruh", + "tiskárna", + "věznice", + "projektil", + "promítací přístroj", + "puk", + "boxovací pytel", + "peněženka", + "psací brk", + "quiltování", + "raketa (sport)", + "radiátor", + "radioteleskop", + "obytný vůz", + "lednička", + "dálkové øízení", + "restauraci", + "Kolt", + "puška", + "houpací křeslo", + "pravítko", + "trezor", + "Spínací špendlík", + "solnička", + "sandál", + "saxofon", + "pochva", + "váhy", + "školní autobusová linka", + "škuner", + "šroub", + "šroubovák", + "bezpečnostní pás", + "šicí stroj", + "štít", + "vozík", + "lopata", + "koupací čepice", + "lyže", + "spací pytel", + "logaritmické pravítko", + "sněžný skútr", + "sněžný pluh", + "ponožka", + "sluneční pec", + "Mexický klobouk", + "mezerník", + "vřeteno", + "sportovní automobily", + "jeviště", + "parní lokomotiva", + "stetoskop", + "Štóla", + "stopky", + "kamna", + "tramvajová doprava", + "Nosítka", + "ponorka", + "oblek", + "sluneční hodiny", + "sluneční brýle", + "opalovací krém", + "visutý most", + "mikina", + "houpačka", + "spínač", + "injekční stříkačka", + "obrněné vozidlo", + "čajník", + "plyšový medvídek", + "tenisový míč", + "Náprstek", + "mlátička", + "trůn", + "toustovač", + "trafika (prodejna)", + "záchodové prkénko", + "pochodeň", + "odtahové vozidlo", + "hračkářství", + "traktor", + "podnos", + "trenčkot", + "trojkolka", + "Stativ", + "vítězný oblouk", + "trolejbus", + "pozoun", + "turniket", + "deštník", + "monocykl", + "vysavač", + "váza", + "klenba", + "samet", + "viadukt", + "housle", + "volejbalový míč", + "portmonka", + "skříň", + "vojenské letadlo", + "lavabo (umyvadlo)", + "pračka", + "vodárenská věž", + "píšťalka", + "paruka", + "láhev na víno", + "pánev wok", + "vařečka", + "vlna", + "jurta", + "internetová stránka", + "komiksová kniha", + "křížovka", + "uliční tabule", + "semafor", + "knižní obálka", + "Chuo-kuo", + "piškotový moučník", + "zmrzlina", + "preclík", + "bramborová kaše", + "květák", + "cuketa", + "okurka", + "fík", + "láhevník", + "granátové jablko", + "seno", + "čokoládový sirup", + "těsto", + "sekaná", + "červené víno", + "Preso", + "vaječný likér", + "bublina", + "útes", + "útes korálový", + "gejzír", + "mys", + "pobřeží", + "dolina", + "sopka", + "ženich", + "řepka olejná", + "střevíčník pantoflíček", + "žalud", + "šípek", + "trsnatec lupenitý", + "hřib", + "klas", + "toaletní papír" + ] + ], + "LO": [ + [ + 71, + 79, + 99, + 104, + 105, + 114, + 150, + 269, + 276, + 277, + 290, + 291, + 292, + 298, + 309, + 312, + 316, + 319, + 327, + 334, + 340, + 341, + 344, + 346, + 347, + 355, + 360, + 367, + 368, + 390, + 398, + 407, + 411, + 415, + 418, + 425, + 428, + 430, + 437, + 447, + 453, + 454, + 456, + 462, + 463, + 464, + 468, + 469, + 470, + 472, + 473, + 476, + 478, + 481, + 483, + 487, + 488, + 497, + 508, + 516, + 525, + 534, + 541, + 549, + 555, + 557, + 558, + 563, + 577, + 591, + 606, + 608, + 612, + 618, + 619, + 629, + 632, + 643, + 650, + 651, + 662, + 668, + 669, + 673, + 677, + 679, + 684, + 690, + 692, + 695, + 697, + 701, + 717, + 742, + 748, + 760, + 762, + 764, + 769, + 771, + 774, + 777, + 783, + 784, + 786, + 787, + 792, + 795, + 797, + 806, + 816, + 832, + 833, + 834, + 835, + 837, + 844, + 845, + 849, + 862, + 866, + 882, + 883, + 885, + 889, + 893, + 911, + 916, + 919, + 920, + 926, + 928, + 943, + 952, + 957, + 958, + 963, + 965, + 967, + 971, + 979 + ], + [ + "ແມງງອດ", + "ຈີ່ເຂັບ", + "ຫ່ານ", + "ໜູຖົງຊາຍ", + "ໝີໄຮ້ຫາງ", + "ທາກ", + "ວົງຍ່ອຍສິງທະເລ", + "ໝາປ່າ", + "ໝາແຜງ", + "ຈິກຈອກ", + "ເສືອອາເມລິກາ", + "ສິງໂຕ", + "ເສືອ", + "ວົງຈອນພອນ", + "ພະມະຣະ", + "ຈີ່ລໍ່", + "ຈັກຈັ່ນ", + "ແມງປໍ", + "ດາວທະເລ", + "ເໝັ້ນ", + "ມ້າລາຍ", + "ໝູ", + "ຊ້າງນ້ຳ", + "ຄວາຢ", + "ງົວປ່າອາເມລິກາ", + "ອູດແກະໃຫຍ່", + "ນາກ", + "ລີງຊິມແພນຊີ", + "ທະນີ", + "ຕົວອ່ຽນ", + "ລູກຄິດ", + "ລົດໂຮງໝໍ", + "ຜ້າກັນເປື້ອນ", + "ຮ້ານຂາຍເຂົ້າຈີ່", + "ສໍປາກກາ", + "ອູ່", + "ລໍ້", + "ບານບ້ວງ", + "ປະພາຄານ", + "ກ້ອງ", + "ຮ້ານ", + "ຮ້ານຂາຍຫນັງສື", + "ຄັນທະນູ", + "ລິ້ວຕາດ", + "ຄຸ", + "ຜູກຄຽນແອວ", + "ລົດຕັກຊີ", + "ໝໍ້", + "ທຽນ", + "ເຮືອຄານູ", + "ອັນໄຂກະປ໋ອງ", + "ມ້າໝຸນ", + "ຫີບເຈັ້ຍ", + "ກາແຊັດ", + "ມຸນທຽນ", + "ໂທລະສັບມືຖື", + "ໂສ້", + "ໂບດ", + "ຄີບອດ", + "ເປ", + "ຝາຍ", + "ຈັກລ້າງຖ້ວຍ", + "ກອງ", + "ຊອງຫນັງສື", + "ລົດອັກຄີໄຟ", + "ເສົາທຸງ", + "ຂຸ່ຍ", + "ສໍປາກກາ", + "ຄ້ອງ", + "ຜ້າເຊັດໜ້າ", + "ເຕົາຮີດ", + "ໂສ້ງຄາບອຍ", + "ຣົຖລາກ", + "ຈອງ", + "ເກີ້ງ", + "ລິບສະຕິກ", + "ລຳໂພງ", + "ໜ້າກາກ", + "ໄມໂຄຣໂຟນ", + "ເຕົາໄມໂຄເວຟ", + "ໂມເດັມ", + "ສຸເຫຣົ່າ", + "ມຸ້ງ", + "ເມົາສ໌", + "ຕະປູ", + "ປອກຄໍ", + "ໂອກາລິນາ", + "ກວຽນ", + "ຫໍ່", + "ຮູບກຸນແຈ", + "ສົ້ງເສື້ອນຸ່ງນອນ", + "ຈ້ອງໂດດ", + "ລົດກະບະ", + "ຈັກພິມ", + "ກະເປົາໃສ່ເງິນ", + "ຕູ້ເຢັນ", + "ຮ້ານອາຫານ", + "ປືນ", + "ໄມ້ບັນທັດ", + "ກຳປັ່ນ", + "ເກີບຊັງດ້ານ", + "ຝັກ", + "ກຽວ", + "ໄຂຄວງ", + "ຈັກຫຍິບເຄື່ອງ", + "ແສງ", + "ຊວ້ານ", + "ສະກີ", + "ຖົງນອນ", + "ຖົງເທົ້າ", + "ໄນຫລາ", + "ເຈດີ", + "ເຮືອດຳນ້ຳ", + "ຊຸດ", + "ນາລິກາແດດ", + "ແວ່ນຕາກັນແດດ", + "ສວິດໄຟ", + "ກ້ອງສີດຢາ", + "ເຕົ້ານ້ຳຊາ", + "ທວນໄຟ", + "ລົດແກ່", + "ຈັກດູດຝຸ່ນ", + "ໂຖດອກໄມ້", + "ກຳມະຫຍີ່", + "ຊຸງ", + "ກະເປົາເງິນ", + "ຂົນສັດ", + "ເວັບໄຊຕ໌", + "ປ້າຍຈໍລະຈອນ", + "ໄຟສັນຍານຈໍລະຈອນ", + "ຊີ້ນດາດ", + "ກະແລມ", + "ໝາກແຕງ", + "ໝາກເດື່ອ", + "ໝາກພິລາ", + "ເຟືອງ", + "ພິດຊ່າ", + "ແປ້ງມ້ວນເມັກຊິກ", + "ເອສເປຣສໂຊ", + "ຟອງ", + "ຫຸບເຂົາ" + ] + ], + "HY": [ + [ + 2, + 3, + 9, + 10, + 11, + 18, + 20, + 21, + 22, + 23, + 37, + 39, + 46, + 48, + 49, + 56, + 63, + 65, + 66, + 69, + 71, + 77, + 78, + 86, + 87, + 92, + 94, + 96, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 112, + 114, + 116, + 117, + 124, + 127, + 128, + 129, + 130, + 133, + 134, + 137, + 138, + 141, + 143, + 144, + 145, + 148, + 150, + 151, + 153, + 154, + 155, + 162, + 163, + 176, + 180, + 211, + 229, + 231, + 234, + 235, + 236, + 242, + 246, + 247, + 248, + 249, + 251, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 319, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 348, + 350, + 352, + 353, + 354, + 355, + 357, + 359, + 360, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 372, + 373, + 381, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 394, + 398, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 417, + 418, + 420, + 421, + 425, + 426, + 427, + 428, + 430, + 432, + 435, + 436, + 437, + 445, + 447, + 450, + 451, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 476, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 490, + 491, + 492, + 497, + 498, + 506, + 508, + 511, + 512, + 513, + 516, + 517, + 525, + 526, + 529, + 532, + 534, + 537, + 538, + 541, + 543, + 546, + 549, + 551, + 555, + 557, + 558, + 562, + 563, + 567, + 570, + 572, + 576, + 577, + 580, + 582, + 583, + 587, + 588, + 589, + 591, + 593, + 594, + 595, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 618, + 619, + 620, + 627, + 629, + 631, + 632, + 642, + 643, + 644, + 646, + 649, + 650, + 651, + 655, + 657, + 658, + 662, + 665, + 668, + 670, + 673, + 677, + 679, + 682, + 683, + 684, + 687, + 691, + 692, + 696, + 697, + 698, + 701, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 713, + 714, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 746, + 748, + 749, + 752, + 755, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 771, + 773, + 774, + 776, + 777, + 778, + 780, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 797, + 798, + 806, + 816, + 817, + 819, + 820, + 823, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 850, + 852, + 854, + 856, + 857, + 859, + 862, + 866, + 867, + 869, + 873, + 874, + 875, + 879, + 882, + 883, + 884, + 885, + 888, + 889, + 893, + 894, + 895, + 896, + 900, + 903, + 909, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 924, + 926, + 927, + 928, + 929, + 932, + 933, + 935, + 938, + 939, + 943, + 948, + 952, + 953, + 957, + 958, + 959, + 961, + 963, + 965, + 966, + 967, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 988, + 989, + 998, + 999 + ], + [ + "Սպիտակ շնաձուկ", + "Վագրային շնաձուկ", + "ջայլամ", + "սովորական սերինոս", + "Կարմրակատար", + "կաչաղակ", + "Ջրաճնճղուկներ", + "ցիներ", + "սպիտակագլուխ ծովարծիվ", + "անգղ", + "Արկղի կրիաներ", + "իգուանա", + "Կանաչ մողես", + "կոմոդյան վարան", + "Նեղոսյան կոկորդիլոս", + "Արքայական օձեր", + "Հնդկական գոպրա", + "Ծովային օձեր", + "Եղջերավոր իժ", + "Տրիլոբիտներ", + "կարիճ", + "մորմ", + "Տզեր", + "կաքավ", + "աֆրիկյան մոխրագույն թութակ", + "Մեղվակերներ", + "Կոլիբրի", + "տուկան", + "Սղոցակտուց բադ", + "ղազ", + "Սև կարապ (թռչուն)", + "եքիդնա", + "բադակտուց", + "կոալա", + "վոմբաթ", + "մեդուզա", + "Ակտինիաներ", + "տափակ որդեր", + "կլոր որդեր", + "խեցի", + "շողուկ", + "Խիտոններ", + "Наутилус помпилиус (моллюск)", + "Գետային խեցգետիններ", + "սպիտակ արագիլ", + "սև արագիլ", + "Տարգալակտուց", + "ֆլամինգո", + "ջրցուլ", + "կռունկ", + "Ամերիկյան ջրահավ", + "Արոսներ", + "Կարմրաոտ կտցար", + "կտցար կաչաղակներ", + "Հավալուսն", + "թագավորական պինգվին", + "Խոյադելֆին", + "ծովառյուծներ", + "Չիհուահուա", + "Մալտեզիա (շուն)", + "Պեկինես", + "Շի-տցու", + "Բիգլ", + "Բլադհաունդ", + "Սալյուկի", + "Պիտբուլ (շուն)", + "Հունգարական քերծե", + "Բոբթեյլ", + "Քոլլի", + "Ռոթվայլեր", + "գերմանական հովվաշուն", + "դոբերման", + "Գերմանական բոքսյոր", + "Գերմանական բուլդոգ", + "Սենբեռնար", + "Հասկի", + "Ալյասկյան մալամուտ", + "Դալմատին", + "Բասենջի", + "Գերմանական մաստիֆ", + "Նյուֆաունդլենդ", + "Պիրենեյան լեռնային շուն", + "Սամոյեդ", + "Պոմերանյան շպից", + "Չաու-չաու", + "գայլ", + "արկտիկական գայլ", + "բաշավոր գայլ", + "դաշտագայլ", + "Դինգո", + "կարմիր գայլ", + "աֆրիկական վայրի շուն", + "բորենի", + "աղվես", + "Բևեռաղվես", + "Գորշ աղվես", + "Պարսկական կատու", + "Սիամական կատու", + "Պումա", + "լուսան", + "ընձառյուծ", + "Ձյունահովազ", + "յագուար", + "առյուծ", + "վագր", + "վագրակատու", + "գորշ արջ", + "ամերիկյան սև արջ", + "սպիտակ արջ", + "Մանգուստներ", + "սուրիկատ", + "զատիկ", + "գնայուկ բզեզներ", + "Երկարաբեղիկներ", + "տերևակերներ", + "Երկթևանիներ", + "Մեղուներ", + "մրջյուններ", + "ծղրիդ", + "ուտիճ", + "աղոթարարներ", + "ցիկադա", + "ճպուռ", + "ծովային աստղ", + "ծովոզնիներ", + "Հոլոթուրիաներ", + "Ամերիկյան ճագարներ", + "Նապաստակներ", + "Անգորական ճագար", + "Համստերներ", + "խոզուկ", + "Աղվեսանման սկյուռ", + "Արջամուկ", + "կուղբ", + "Ծովախոզուկ", + "Վագերաձի", + "խոզ", + "վարազ", + "Կոծիծավոր խոզ", + "բեգեմոտ", + "եզ", + "խոյ", + "այծքաղ", + "Իմպալա", + "Վիթեր", + "Միասապատավոր ուղտ", + "Լամա", + "ջրաքիսներ", + "ժանտաքիս", + "ջրասամույր", + "փորսուղ", + "զրահակիր", + "համրուկներ", + "Օրանգուտան", + "գորիլլա", + "շիմպանզե", + "գիբոններ", + "Պավիաններ", + "Մակակներ", + "Սարդանման կապիկներ", + "Կատվային լեմուր", + "Ինդրին", + "ասիական փիղ", + "Աֆրիկյան փղեր", + "Փոքր պանդա", + "մեծ պանդա", + "օձաձուկ", + "Թառափ", + "Աբակ (տախտակ)", + "Ակադեմիական հագուստ", + "ակորդեոն", + "Ակուստիկ կիթառ", + "ավիակիր", + "ուղեւորատար ինքնաթիռ", + "Դիրիժաբլ", + "շտապօգնության մեքենա", + "ամֆիբիա", + "Մեղվանոց", + "գոգնոց", + "Աղբի բեռնարկղ", + "Գրոհային հրացան", + "Ուսապարկ", + "փուռ", + "Օդապարիկ", + "գնդիկավոր գրիչ", + "բանջո", + "ճաղաշար", + "Գոմ", + "Բարոմետր", + "տակառ", + "ձեռնասայլակ", + "բասկետբոլի գնդակ", + "Ֆագոտ", + "վաննա", + "Ունիվերսալ (թափք)", + "փարոս", + "բիկինի", + "Հեռադիտակ", + "Բոբսլեյ", + "Բոլո փողկապ", + "գրապահարան", + "գրախանութ", + "Շշի խցան", + "աղեղ", + "Փողկապ-թիթեռնիկ", + "կրծկալ", + "ծովապատնեշ", + "ավել", + "Դույլ", + "ճարմանդ", + "զրահաբաճկոն", + "տաքսի", + "կաթսա", + "Սվեչա", + "Կանոե", + "Կարուսել", + "բանկոմատ", + "կասետա", + "ամրոց", + "Կատամարան", + "թավջութակ", + "բջջային հեռախոս", + "շղթա", + "օղազրահ", + "բենզասղոց", + "սնդուկ", + "եկեղեցի", + "կինոթատրոն", + "գալար", + "ստեղնաշար", + "Կաբրիոլետ", + "խցանահան", + "շեփոր", + "օրոցք", + "վերամբարձ կռունկ", + "ամբարտակ", + "գրասեղան", + "Տակդիր", + "ճաշասեղան", + "աման լվացող սարք", + "Շնասահնակ", + "գմբեթ", + "թմբուկ", + "Մարզագնդեր", + "Էլեկտրակիթառ", + "ծրար", + "Դիմափոշի", + "Հրշեջ տեխնիկա", + "դրոշակաձող", + "լայնակի ֆլեյտա", + "շատրվան", + "ինքնահոս գրիչ", + "թավա", + "Հակագազ", + "գավաթ", + "գոնդոլ", + "Գոնգ", + "Ջերմատուն", + "մթերային խանութ", + "Գիլիոտին", + "մուրճ", + "կողով", + "Վարսահարդարիչ", + "թաշկինակ", + "Շրթհարմոն", + "տավիղ", + "Խոտհար մեքենա", + "Զուգափայտ", + "ավազի ժամացույց", + "հարթուկ", + "Դդմից լապտեր", + "ջինս", + "ջիպ", + "Մարզաշապիկ", + "Փազլ", + "ռիքշա", + "Կիմոնո", + "շերեփ", + "լուսամփոփ", + "Նոթբուք", + "լիմուզին", + "Շրթներկ", + "Լոսյոն", + "բարձրախոս", + "քսիլոֆոն", + "դիմակ", + "լուցկի", + "Լաբիրինթոս", + "Մեգալիթյան կառույցներ", + "Խոսափող", + "միկրոալիքային վառարան", + "Մինի կիսաշրջազգեստ", + "Հրթիռային զենք", + "թաթպան", + "մոդեմ", + "մոպեդ", + "մզկիթ", + "Մոտոռոլլեր", + "մուկ", + "մեխ", + "մանյակ", + "կոթող", + "հոբոյ", + "օկարինա", + "երգեհոն", + "թթվածնային դիմակ", + "կապոց", + "Վրձին", + "ննջազգեստ", + "պալատ", + "պարաշյուտ", + "վագոն", + "դարավանդ", + "Տաքսաֆոն", + "Պատվանդան", + "Գրչատուփ", + "Սրիչ", + "Օծանելիք", + "Պատճենահան ապարատ", + "Կնտնտոց", + "փիքափ", + "խնայատուփ", + "բարձ", + "կուժ", + "ռանդա", + "ցելոֆան", + "Գութան", + "Պոնչո", + "Բիլիարդի սեղան (Բիլիարդ)", + "ծաղկաման", + "դուրգ", + "Աղոթագորգ", + "տպիչ", + "բանտ", + "շայբա", + "դրամապանակ", + "Սագի փետուր", + "Գնդաթի", + "ռադիոաստղադիտարան", + "Սառնարան", + "հեռակառավարման վահանակ", + "ռեստորան", + "Պտտագլոր (Ռևոլվեր)", + "հրացան", + "ճոճաթոռ", + "Քանոն", + "սեյֆ", + "աղաման", + "սանդալ", + "սաքսոֆոն", + "պատյան", + "կշեռք", + "Երկկայմ առագաստանավ", + "Պտուտակ", + "պտուտակահան", + "ամրագոտի", + "Կարի մեքենա", + "Վահան", + "թիակ", + "դահուկ", + "Քնապարկ", + "Լոգարիթմական քանոն", + "գուլպա", + "իլիկ", + "Սպորտային ավտոմեքենա", + "Բեմ", + "Շոգեքարշ", + "ստետոսկոպ", + "վայրկենաչափ", + "Վառարան", + "տրամվայի համակարգ", + "Պատգարակ", + "Սուզանավ", + "Դասական կոստյում", + "Արեգակնային ժամացույց", + "արեւային ակնոց", + "արեւապաշտպան քսուք", + "կախովի կամուրջ", + "պոլի փեդ", + "ճոճանակ", + "բանալի", + "Ներարկիչ", + "տանկ", + "թեյնիկ", + "Տեդդի արջուկ", + "Թենիսի գնդակ", + "Վարագույր", + "Կալսիչ", + "Գահ", + "Տոստեր", + "ջահ", + "տրակտոր", + "Կցանք", + "Թռենչքոթ", + "հաղթակամար", + "տրոլեյբուս", + "տրոմբոն", + "Հովանոց (պարագա)", + "պիլասոս", + "սկահակ", + "Թաղ (ճարտարապետություն)", + "թավիշ", + "Ուղանցույց", + "ջութակ", + "դրամապանակ", + "պահարան", + "ռազմական օդանավ", + "լվացարան", + "Ջրհան աշտարակներ և ջրամբարներ", + "կեղծամ", + "վոկ", + "բուրդ", + "յուրդի", + "վեբ կայքը", + "կոմիքսների գիրք", + "խաչբառ", + "երթևեկության նշան", + "Լուսափոր", + "Գուակամոլե", + "Հուոկուո", + "Թրայֆլ", + "պաղպաղակ", + "Մրգային սառույց", + "բրեցել", + "Չիզբուրգեր", + "Կարտոֆիլի պյուրե", + "ծաղկակաղամբ", + "Դդմիկ", + "վարունգ", + "Գրեննի Սմիթ", + "թուզ", + "անանաս", + "նուռ", + "չոր խոտ", + "Կարբոնարա", + "Խմոր", + "պիցցա", + "Բուրիտո", + "Կարմիր գինի", + "Էսպրեսո", + "պղպջակ", + "քարափ", + "Կորալային խութեր", + "գեյզեր", + "հրվանդան", + "Ծովափ", + "հովիտ", + "Հրաբուխ", + "փեսա", + "Սևուկ", + "Կաղին", + "մասուր", + "հասկ", + "զուգարանի թուղթ" + ] + ], + "XH": [ + [ + 71, + 235, + 275, + 291, + 292, + 309, + 310, + 334, + 340, + 341, + 344, + 372, + 390, + 398, + 407, + 417, + 426, + 462, + 463, + 486, + 508, + 512, + 513, + 519, + 525, + 562, + 591, + 673, + 677, + 697, + 728, + 806, + 897, + 982, + 988 + ], + [ + "unomadudwane", + "Inja eluhlobo lweGermanshep1", + "ixhwili", + "Ingonyama", + "ingwe", + "inyosi", + "imbovane", + "incanda", + "Iqwarhashe", + "Ihagu", + "imvubu", + "imfene", + "Umlenga", + "I-abacus", + "iambulansi", + "ibhaloni", + "ibharometa", + "umtshayelo", + "iemele", + "icello", + "I-keyboard", + "Ujiko lokutsala isiciko sewayini", + "ixilongwana", + "I-crate", + "Idami", + "I-Fountain", + "iqhiya", + "i-mouse yekhompyutha", + "Isikhonkwane", + "Iipijama", + "ingxowa yeplastikhi", + "kawusi", + "Umatshini wokwenza ivasi", + "umyeni", + "imbewu yomoki" + ] + ], + "HR": [ + [ + 0, + 1, + 2, + 4, + 9, + 11, + 18, + 20, + 22, + 23, + 24, + 29, + 34, + 39, + 46, + 48, + 49, + 50, + 61, + 65, + 69, + 71, + 77, + 78, + 79, + 86, + 87, + 92, + 93, + 94, + 95, + 97, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 116, + 123, + 125, + 127, + 128, + 130, + 134, + 135, + 144, + 145, + 146, + 147, + 148, + 150, + 151, + 153, + 154, + 213, + 234, + 235, + 247, + 248, + 249, + 251, + 258, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 305, + 308, + 309, + 310, + 312, + 315, + 317, + 319, + 323, + 327, + 328, + 329, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 346, + 347, + 349, + 350, + 352, + 353, + 354, + 355, + 356, + 358, + 360, + 361, + 362, + 365, + 366, + 367, + 368, + 372, + 374, + 379, + 381, + 383, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 398, + 399, + 401, + 402, + 403, + 404, + 405, + 408, + 410, + 413, + 414, + 417, + 418, + 420, + 426, + 427, + 428, + 429, + 436, + 437, + 438, + 447, + 450, + 456, + 459, + 462, + 468, + 469, + 470, + 472, + 476, + 483, + 484, + 486, + 487, + 491, + 492, + 497, + 498, + 508, + 510, + 511, + 513, + 517, + 525, + 529, + 534, + 535, + 538, + 541, + 546, + 547, + 551, + 555, + 558, + 561, + 562, + 563, + 567, + 568, + 578, + 580, + 583, + 587, + 591, + 593, + 602, + 604, + 606, + 610, + 611, + 612, + 614, + 618, + 619, + 620, + 626, + 628, + 629, + 631, + 632, + 634, + 642, + 643, + 645, + 649, + 650, + 651, + 656, + 668, + 669, + 670, + 671, + 673, + 677, + 681, + 683, + 684, + 685, + 686, + 687, + 688, + 697, + 698, + 699, + 701, + 705, + 708, + 711, + 712, + 713, + 717, + 721, + 725, + 728, + 730, + 742, + 743, + 744, + 745, + 746, + 749, + 755, + 760, + 761, + 762, + 764, + 769, + 774, + 776, + 778, + 780, + 783, + 784, + 786, + 787, + 792, + 795, + 797, + 798, + 803, + 806, + 807, + 819, + 820, + 825, + 829, + 833, + 834, + 835, + 847, + 849, + 850, + 857, + 859, + 862, + 863, + 866, + 873, + 874, + 875, + 879, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 897, + 900, + 902, + 903, + 915, + 916, + 918, + 920, + 928, + 932, + 939, + 943, + 958, + 961, + 966, + 967, + 972, + 973, + 974, + 978, + 979, + 980, + 982, + 984, + 986, + 988, + 989, + 996, + 999 + ], + [ + "Linjak", + "zlatna ribica", + "velika bijela psina", + "Mlatovke", + "noj", + "češljugar", + "svraka", + "Brljci", + "Bjeloglavi orao", + "Supovi", + "laponska sova", + "aksolotl", + "Sedmopruga usminjača", + "zelena iguana", + "Zelembać", + "komodski varan", + "nilski krokodil", + "Američki aligator", + "Šarena boa", + "morske zmije", + "triloboti", + "Štipavci", + "vučji pauci", + "Krpelji", + "Strige", + "jarebica", + "Žako", + "Pčelarice", + "kljunorošci", + "Kolibri", + "Jakamari", + "patak", + "guska", + "Crni labud", + "ješci", + "čudnovati kljunaš", + "koale", + "vombat", + "Meduze", + "Moruzgve", + "Plošnjaci", + "Oblići", + "hitoni", + "jastog", + "rak samac", + "Bijela roda", + "Crna roda", + "Plamenci", + "ždralovi", + "Guarauna", + "pelikani", + "Kraljevski pingvin", + "Albatrosi", + "Sivi kitovi", + "Orka", + "morski lavovi", + "Chihuahua (pas)", + "maltezer", + "pekinezer", + "irski seter", + "rotvajler", + "njemački ovčar", + "Bernardinac", + "haski", + "aljaški malamut", + "Dalmatinski pas", + "Samojed", + "vuk", + "Polarni vuk", + "Grivasti vuk", + "Kojot", + "Australski dingo", + "Azijski divlji pas", + "Afrički divlji pas", + "Hijene", + "crvena lisica", + "arktička lisica", + "siva lisica", + "Prugasta mačka", + "perzijska mačka", + "Sijamska mačka", + "Planinski lav", + "ris", + "snježni leopard", + "Jaguar (divlja mačka)", + "lav", + "tigar", + "Gepard", + "smeđi medvjed", + "američki crni medvjed", + "Polarni medvjed", + "Mungosi", + "Suricata", + "bubamara", + "trčci", + "strizibube", + "zlatice", + "Kotrljan", + "dvokrilci", + "pčele", + "Mravi", + "cvrčak", + "Bogomoljke", + "Cikade", + "Nejednakokrilci", + "Monarh", + "zvjezdače", + "ježinci", + "trpovi", + "zec", + "Hrčci", + "dikobraz", + "Svisci", + "dabar", + "domaći zamorčić", + "zebre", + "svinja", + "Divlja svinja", + "bradavičasta svinja", + "Nilski konj", + "vodeni bivol", + "Bizon", + "Američki muflon", + "Alpski kozorog", + "Aepycerotinae", + "gazele", + "dromedar", + "Ljama", + "lasice", + "tvor", + "vidre", + "tvȏr", + "Jazavci", + "Bornejski orangutan", + "Gorile", + "čimpanza", + "Giboni", + "pavijani", + "Sakati majmuni", + "Urlikavci", + "Majmuni pauci", + "Prstenastorepi lemur", + "Azijski slon", + "Afrički slon", + "crveni panda", + "veliki panda", + "jegulja", + "Jesetra", + "iglica (riba)", + "Abak", + "aba (odjeća)", + "harmonika", + "akustična gitara", + "nosač zrakoplova", + "linijski putnički zrakoplov", + "Zračni brod", + "amfibija (kopneno vozilo)", + "pčelinjak", + "Jurišna puška", + "ruksak", + "balon", + "Kemijska olovka", + "Bendžo", + "barometar", + "bačva", + "tačke", + "Bejzbolska loptica", + "karavan", + "svjetionik", + "Laboratorijska čaša", + "dvogled", + "Bob (šport)", + "luk", + "grudnjak", + "Metla", + "Taksi", + "kotao (posuda)", + "Svijeća", + "kanu", + "vrtuljak", + "dvorac", + "katamaran", + "violončelo", + "mobilni telefon", + "motorna pila", + "Škrinja", + "crkva", + "Kino", + "tipkovnica", + "kontejnerski brod", + "kabriolet", + "truba", + "dizalica", + "brana", + "pelene", + "perilica posuđa", + "Pločasta kočnica", + "Kupola", + "Bubanj", + "električna gitara", + "električna lokomotiva", + "Puder", + "vatrogasna vozila", + "flauta", + "viličar", + "fontana", + "penkalo", + "tava", + "kr̀znar", + "Haljina", + "Staklenik", + "giljotina", + "čekić", + "maramica", + "usna harmonika", + "Preča", + "pješčani sat", + "glačalo", + "Majica", + "Slagalica", + "Rikša", + "keikogi", + "kuhača", + "abàžūr", + "prijénosnīk", + "Upaljač", + "prekooceanski brod", + "Ruž za usne", + "losion", + "Zvučnik", + "Pilana", + "Ksilofon", + "maska", + "Majalos", + "megalit", + "mikrofon", + "mikrovalna pećnica", + "jednovolumen", + "džamija", + "Komarnik", + "skuter", + "Brdski biciklizam", + "miš", + "Čavao", + "prijénosnīk", + "oboa", + "okarina", + "Mjerni kotač", + "Filtar ulja", + "orgulje", + "Katodni osciloskop", + "pidžáma", + "palača", + "Panova frula", + "Padobran", + "putnički vagon", + "plinta", + "parfem", + "Petrijeva zdjelica", + "Fotokopiranje", + "pick-up", + "jastuk", + "ibrik", + "Plastična vrećica", + "Plug", + "pisač", + "zatvor", + "Projektil", + "Projektor", + "pločica (šport)", + "pisaće pero", + "radioteleskop", + "hladnjak", + "daljinski upravljač", + "Restoran", + "puška", + "ravnalo", + "Sandale", + "Saksofon", + "vaga", + "Škuna", + "Vijak", + "odvijač", + "šivaći stroj", + "štit", + "lopata", + "skije", + "vreća za spavanje", + "računalo", + "Snježni plug", + "čarapa", + "Sunčeva peć", + "pozornica", + "parna lokomotiva", + "Suhozid", + "tramvaj", + "Podmornica", + "odijelo", + "sunčani sat", + "tenk", + "čajnik", + "Plišani medo", + "prijestolje", + "Toster", + "baklja", + "Totem", + "Traktor", + "Slavoluk", + "trolejbus", + "Trombon", + "Kišobran", + "Usisivač", + "Vaza", + "svod", + "baršun", + "Odežda", + "vijadukt", + "violinist", + "perilica rublja", + "vodotoranj", + "Zviždaljka", + "Perika", + "Jurta", + "mrežno sjedište", + "Križaljka", + "semafor", + "Sladoled", + "perec", + "bundeva", + "krastavac", + "Sijeno", + "Tijesto", + "crno vino", + "Espresso kava", + "litica", + "Koraljni greben", + "gejzir", + "obala", + "dolina", + "Vulkan", + "žènīk", + "Uljana repica", + "Gospina papučica", + "žir", + "šipak (plod)", + "Zec gljiva", + "toaletni papir" + ] + ], + "SO": [ + [ + 9, + 23, + 71, + 78, + 79, + 112, + 144, + 275, + 276, + 291, + 292, + 293, + 309, + 310, + 340, + 341, + 344, + 345, + 353, + 366, + 367, + 399, + 412, + 427, + 428, + 459, + 462, + 468, + 470, + 497, + 508, + 523, + 525, + 541, + 555, + 587, + 610, + 620, + 668, + 677, + 706, + 711, + 762, + 775, + 786, + 792, + 806, + 833, + 857, + 866, + 928, + 943, + 952, + 953, + 971, + 978, + 979, + 980 + ], + [ + "gorayo", + "Coomaade", + "dabaqaroof", + "Shillin (dulin)", + "Farabadne", + "Caroog", + "Boolo", + "Weer", + "Waraabe", + "Libaax", + "Shabeel", + "Haramcad", + "Shini", + "Quraansho", + "Dameer farow", + "Doofaar", + "jeer", + "Dibi", + "Golcas", + "Goriila", + "korow", + "Cabaayad (dhar)", + "Duruf", + "Foosto", + "gaari gacan", + "Rajabeeto", + "minfiiq", + "Taksi", + "Shumac", + "Kaniisad", + "Kiiboodhka (kumbuyuutar)", + "Bakoorad", + "Biyoxidheen", + "Durbaan", + "Dab Damis", + "Burris", + "Funaanad", + "Kombuyuuterka Dhabta", + "Masaajid", + "Musmaar", + "Dadab", + "Cadar", + "Maqaaxi", + "Macawiis", + "harqaan", + "Badeel", + "Sharabaado", + "Gujis", + "Carshiga", + "Gaariga Beeraha", + "Jalaato", + "qajaar", + "tiin", + "cananaas", + "xumbo", + "Xeeb", + "Doox", + "Fulkaano" + ] + ], + "GU": [ + [ + 1, + 23, + 34, + 71, + 99, + 112, + 114, + 127, + 130, + 139, + 144, + 146, + 151, + 162, + 269, + 274, + 288, + 291, + 292, + 293, + 296, + 307, + 309, + 310, + 327, + 334, + 338, + 340, + 344, + 345, + 346, + 354, + 366, + 367, + 387, + 390, + 398, + 403, + 407, + 417, + 418, + 426, + 428, + 437, + 447, + 463, + 468, + 470, + 480, + 487, + 497, + 498, + 508, + 525, + 529, + 549, + 580, + 582, + 583, + 589, + 591, + 612, + 618, + 620, + 626, + 629, + 650, + 662, + 668, + 669, + 673, + 677, + 679, + 695, + 698, + 726, + 730, + 739, + 742, + 743, + 760, + 761, + 762, + 778, + 783, + 784, + 823, + 833, + 837, + 843, + 844, + 845, + 882, + 885, + 893, + 916, + 928, + 943, + 953, + 957, + 963, + 971, + 973, + 979, + 980, + 982 + ], + [ + "ગોલ્ડફિશ", + "ગીધ", + "લેધરબેક કાચબો", + "વિંછી (પ્રાણી)", + "હંસની માદા", + "શંખ", + "ગોકળગાય", + "સફેદ ઢોંક", + "બળા", + "કાચબરંગી", + "પેણ", + "આલ્બાટ્રૉસ", + "ચિહુઆહુઆ", + "બીગલ", + "ભેડીયો", + "જંગલી કૂતરો", + "દિપડો", + "કેસરી", + "વાઘ", + "ચિત્તો", + "ધ્રુવીય રીંછ", + "ઈયળ", + "મધમાખી", + "કીડી", + "તારા માછલી", + "શાહુડી", + "ગિનિ પિગ", + "ઝીબ્રા", + "હિપોપોટેમસ", + "બળદ", + "ભેંસ", + "સાંઢણી", + "ગોરીલા", + "ચિમ્પેન્ઝ઼ી", + "રાતો પાંડા", + "બામ માછલી", + "મણકાઘોડી", + "વિમાનવાહક જહાજ", + "એમ્બુલેંસ", + "ફુગ્ગો", + "બોલપેન", + "બેરોમીટર", + "ઠેલો", + "દીવાદાંડી", + "બાઇનૉક્યુલર", + "ડોલ", + "ટેક્સી", + "મીણબત્તી", + "સ્વચાલિત ગણક યંત્ર", + "મોબાઇલ ફોન", + "દેવળ", + "ચલચિત્રપટ", + "કોમ્પ્યુટર કીબોર્ડ", + "જળબંધ", + "ડાઇપર", + "પરબીડિયું", + "ગ્રીન હાઉસ", + "કરિયાણાની દુકાન", + "ગિલોટીન", + "હેઅર-ડ્રાયર", + "હાથરૂમાલ", + "રીક્ષા", + "કડછો", + "લેપટોપ", + "દીવો", + "લાલી", + "માઇક્રફોન", + "મોડમ", + "મસ્જિદ", + "મચ્છરદાની", + "કોમ્પ્યુટર માઉસ", + "ખીલો", + "કંઠી", + "તાળું", + "મહેલ", + "રંદો", + "હળ", + "ચાકડો", + "કમ્પ્યુટર પ્રિન્ટર", + "કારાગૃહ", + "શીતપેટી", + "રિમોટ કન્ટ્રોલ", + "ભોજનાલય", + "તુલા", + "સ્ક્રૂ", + "પેચીયું", + "સ્ટેથોસ્કોપ", + "સબમરીન", + "તડકાનાં ચશ્માં", + "સ્વિંગ", + "કળ", + "સિરિંજ", + "વેક્યૂમ ક્લીનર", + "મખમલ", + "પાકીટ", + "જાળસ્થળ", + "દૂધઠાર", + "કાકડી", + "અનેનાસ", + "દાડમ", + "પીત્ઝા", + "બબલ", + "પરવળાનો ટાપુ", + "ખીણ", + "જ્વાળામુખી", + "વર" + ] + ], + "AM": [ + [ + 23, + 71, + 99, + 105, + 110, + 111, + 113, + 275, + 276, + 277, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 296, + 298, + 308, + 309, + 310, + 312, + 334, + 340, + 341, + 342, + 343, + 344, + 345, + 351, + 360, + 362, + 366, + 368, + 372, + 388, + 428, + 445, + 461, + 462, + 463, + 468, + 470, + 480, + 486, + 487, + 497, + 498, + 513, + 525, + 557, + 563, + 587, + 594, + 608, + 620, + 634, + 643, + 661, + 668, + 673, + 677, + 679, + 698, + 730, + 760, + 762, + 776, + 783, + 786, + 787, + 806, + 879, + 916, + 928, + 943, + 952, + 957, + 963, + 971, + 979, + 980 + ], + [ + "አሞራ", + "ጊንጥ", + "ዝይ", + "ኮዋላ", + "ጥፍጥፍ ትል", + "ድቡልቡል ትል", + "ቀንድ አውጣ", + "ኣውሬ ውሻ", + "ዥብ", + "ቀይ ቀበሮ", + "የተራራ አንበሣ", + "ነበራርት", + "ግሥላ", + "አመዳይ ነብር", + "የዱር ድመት", + "አንበሳ", + "ነብር", + "ኣቦ ሸማኔ", + "ቡናማ ድብ", + "የዋልታ ድብ", + "ፋሮ", + "ዝንብ", + "ንብ", + "ጉንዳን", + "ዋዝንቢት", + "ዣርት", + "የሜዳ አህያ", + "ኣሳማ", + "እሪያ", + "ከርከሮ", + "ጉማሬ", + "በሬ", + "ቆርኬ", + "ኣቆስጣ", + "መጣጤ", + "ገመሬ", + "ጊቦን", + "ኣንኮ", + "ታላቅ ፓንዳ", + "ኩርኩር", + "ቢኪኒ", + "ጥሩር", + "መጥረጊያ", + "ባልዲ", + "ታክሲ", + "ሻማ", + "ኤቲኤም", + "ቫዮሊን", + "ተንቀሳቃሽ ስልክ", + "ቤተክርስቲያን", + "ሲኒማ", + "ትራምፔት", + "ግድብ", + "የባንዲራ መስቀያ", + "ብዕር", + "መዶሻ", + "በገና", + "ጂንስ", + "ላፕቶፕ", + "እንጨት መቁረጪያ", + "ጭምብል", + "ፎርድ ሞዴል ቲ", + "መስጊድ", + "አይጦ", + "ሚስማር", + "ድሪ", + "ቤተ መንግስት", + "ማረሻ", + "ማቀዝቀዣ", + "ሬስቶራንት", + "ሳክሶፎን", + "ብሎን", + "ልብስ ስፌት መኪና", + "ጋሻ", + "ካልስ", + "ጃንጥላ", + "ዌብሳይት", + "አይስ ክሬም", + "ኪያር", + "በለስ", + "ሩማን", + "ፒዛ", + "አረፋ", + "ሸለቆ", + "እሳተ ገሞራ" + ] + ], + "AR": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 13, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 34, + 37, + 39, + 40, + 42, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 53, + 56, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 71, + 73, + 75, + 77, + 78, + 79, + 80, + 82, + 85, + 86, + 87, + 88, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 113, + 114, + 115, + 116, + 120, + 121, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 153, + 154, + 155, + 162, + 163, + 169, + 172, + 176, + 180, + 191, + 199, + 227, + 234, + 235, + 236, + 242, + 246, + 247, + 248, + 249, + 250, + 251, + 254, + 258, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 393, + 394, + 395, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 430, + 432, + 433, + 435, + 436, + 437, + 438, + 439, + 444, + 445, + 447, + 450, + 451, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 497, + 498, + 499, + 502, + 506, + 508, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 523, + 525, + 526, + 527, + 529, + 530, + 532, + 534, + 535, + 536, + 538, + 541, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 566, + 567, + 569, + 570, + 576, + 577, + 580, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 595, + 596, + 600, + 601, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 616, + 617, + 618, + 619, + 620, + 621, + 625, + 626, + 627, + 628, + 629, + 631, + 632, + 634, + 641, + 642, + 643, + 645, + 646, + 647, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 660, + 661, + 662, + 665, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 678, + 679, + 681, + 682, + 683, + 684, + 686, + 687, + 688, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 731, + 732, + 733, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 754, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 795, + 797, + 798, + 802, + 803, + 804, + 806, + 807, + 808, + 810, + 811, + 816, + 817, + 819, + 820, + 821, + 822, + 823, + 825, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 850, + 852, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 866, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 909, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 924, + 926, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 948, + 952, + 953, + 954, + 957, + 958, + 959, + 960, + 961, + 963, + 965, + 966, + 967, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 985, + 986, + 988, + 989, + 992, + 998, + 999 + ], + [ + "تنش", + "سمك ذهبي", + "قرش أبيض كبير", + "قرش ببري", + "القرش المطرقة", + "أسماك الرعاد", + "ستينغري", + "نعامة", + "شرشور جبلي", + "حسون أوراسي", + "جنك", + "سمنة أمريكي شمالي", + "بلبل", + "قيق", + "عقعق", + "دنقلة (طائر)", + "حدأة", + "عقاب رخماء", + "نسر", + "البومة الرمادية", + "عفريت الماء", + "ضفدع الثور", + "سلحفاة المحيط جلدية الظهر", + "سلحفاة صندوقية", + "إغوانة خضراء", + "إصبعيات", + "حرذون", + "وحش جيلا", + "سحلية خضراء أوروبية", + "حرباء افريقية", + "تنين كومودو", + "تمساح النيل", + "قاطور أمريكي", + "تريسيراتوبس", + "أفعى الطوق", + "الثعبان الملك", + "غرطر", + "أصلة عاصرة", + "أصلة صخرية أفريقية", + "كوبرا هندية", + "غيدقاوات", + "أفعى المقرنة", + "صوندر", + "ثلاثيات الفصوص", + "عقرب", + "عنكبوت الحظيرة", + "أرملة سوداء جنوبية", + "العنكبوت الذئب", + "لبوديات الشكل", + "مئويات الأقدام", + "طيهوج أسود", + "طيهوج مطوق", + "سمان", + "حجل", + "ببغاء رمادي أفريقي", + "مكاو (طائر)", + "كوكاتو كبريتي العرف", + "كوكال", + "وَرْوَار‎", + "أبو قرن", + "طنان", + "يقمريات", + "طُوقَان‎", + "بطة غواصة حمراء الصدر", + "وزة", + "تم أسود", + "إِيكِيدْنَا‎", + "خلد الماء", + "ولب", + "كوالا", + "ومبت", + "قنديل البحر", + "شقائق نعمان البحر", + "مرجان المخ", + "ديدان مسطحة", + "ديدان أسطوانية", + "حلزون", + "بزاق", + "عاريات الخيشوم", + "خيتون", + "سرطان كماني", + "سلطعون الملك", + "كركند شائك", + "جراد البحر", + "السرطان الناسك", + "لقلق أبيض", + "لقلق أسود", + "أبو ملعقة", + "نحام وردي", + "الواق", + "كركي", + "رطاس", + "غرة أمريكية", + "حباريات", + "قنبرة الماء المتورد", + "دريجة ألبية", + "طيطوي أحمر الساق", + "عداء المستنقعات", + "صائد المحار", + "بجعة", + "بطريق ملك", + "قطرس أحمق", + "حوت رمادي صلب", + "حوت قاتل", + "أطوم", + "أسد البحر", + "شِيوَاوَا‎", + "كلب مالطي", + "بكيني", + "تشيه تزو", + "بيغل", + "دموم", + "بُورْزُوي‎", + "كلب الويبت", + "سلوقي‎", + "بيتبول", + "أرديل", + "الكلب الاسكتلندي", + "كالب أسترالي", + "روت فايلر‎", + "كَلْب اَلرَّاعِي اَلْأَلْمَانِيّ‎", + "دوبرمان", + "كلب البوكسر", + "الكلب الدانماركي الضخم", + "سانت برنارد (كلب)", + "كلب الهاسكي", + "ملموت ألاسكي", + "هَسْكِي سِيبِيرِيّ‎", + "كلب دلماسي", + "بَاك‎", + "سامودي", + "(سلالة كلاب) بوميرانيان", + "كلب التشاو تشاو", + "ذِئْبٌ", + "ذئب القطب الشمالي", + "الذئب ذو العرف", + "قيوط", + "كلب أسترالي", + "كلب الدول", + "كلب بري إفريقي‎", + "ضبع", + "ثعلب", + "ثعلب قطبي", + "ثعلب رمادي", + "قط عتابي", + "قط شيرازي", + "قِطّ سِيَامِيّ‎", + "أسد الجبال", + "وَشَق‎", + "نمر", + "نِمْر اَلثُّلُوج‎", + "نوع من أنواع النّمور", + "أَسَد", + "بَبْر‎", + "فهد", + "دب بني", + "دب أسود أمريكي", + "دب قطبي", + "سموريات", + "سرقاط", + "خنافس نمرية", + "خنفساء", + "خنفساء أرضية", + "خنافس طويلة القرون", + "خنفسة الأوراق", + "خنافس الروث", + "خنفساء وحيد القرن", + "سوسينات", + "ذوات الجناحين", + "نحل", + "نمل", + "صُرْصُر‎", + "صرصور", + "فرس النبي (حشرة)", + "زيزيات", + "قافزات الأوراق", + "يعسوب", + "مقترنات الأجنحة", + "فراشة ملكية", + "نجم البحر", + "قُنْفُذ البَحْر‎", + "خيار البحر", + "أرانب قطنية الذيل", + "قواع", + "ارنب انجورا", + "أقداد", + "نَيْص‎", + "سنجاب ثعلبي", + "مرموط", + "قندس", + "كابياء خنزيرية", + "حمار الزرد", + "حلوف", + "خنزير بري", + "خنزير وحشي", + "فرس النهر", + "ثور", + "جاموس الماء", + "بيسون", + "كَبْش‎", + "كبش الجبال الصخرية", + "وعل ألبي", + "ثيتل الهرتبيس", + "إمبالة", + "غزال", + "جمل عربي", + "لاما", + "ابن عرس", + "منك", + "ابن عرس أوروبي", + "ابن مقرض أسود الأقدام", + "قضاعة (حيوان)", + "ظربان", + "غُرَيْر‎", + "مُدَرَّع‎", + "كسلان شاحب الحنجرة", + "إنسان الغاب البورنيوي", + "غوريلا", + "شمبانزي", + "جبون", + "قرد السيامنج", + "سعدان الباتاس", + "بابون", + "قرد المكاك", + "كولبساوات", + "كولبس", + "قرد الململة", + "قرود القشة", + "سعدان العواء", + "تيتي (سعدان)", + "سعدان عنكبوتي", + "سعدان سنجابي", + "ليمور حلقي الذيل", + "إندري شائع", + "فيل آسيوي", + "فيل أفريقي", + "باندا أحمر", + "باندا عملاقة", + "ثيرسيتيات", + "أَنْكَلِيس‎", + "سمكة المهرج", + "حفشية", + "جارفيش", + "أَسْمَاك بَالُون‎", + "مِعَد‎", + "عباءة", + "لباس تخرج", + "أكورديون", + "قيثارة صوتية", + "حاملة طائرات", + "طائرة رحلات", + "سفينة هوائية", + "سيارة إسعاف", + "مركبة برمائية", + "منحل", + "مريول", + "حاوية نفايات", + "بُنْدُقِيَّة هُجُومِيَّة‎", + "حقيبة ظهر", + "مَخْبِز‎", + "عارضة التوازن", + "بالون", + "قلم حبر", + "بَانْجُو‎", + "دَرَابْزُون‎", + "حديدة", + "حضِيرة", + "مقياس ضغط جوي", + "برميل", + "عربة يدوية صغيرة", + "كُرَة اَلسَّلَّة‎", + "زمخر‎", + "قبعة سباحة", + "مغطس", + "عربة نقْل", + "مرشد لاسلكي", + "كأس زجاجي", + "قبعة الدب", + "الدراجة الترادفية", + "بِيكِينِي‎", + "مِنْظَار‎", + "زلاجة جماعية", + "ربطة عنق بولو", + "خِزَانَة اَلْكُتُب‎", + "مَكْتَبَة‎", + "غطاء قارورة", + "قوس", + "ربطة عنق الفراشة", + "مشد صدر", + "مصد الأمواج", + "أيغيس", + "مكنسة", + "دلو", + "إبزيم", + "سترة واقية من الرصاص", + "سيارة أجرة", + "حلة (آنية)", + "شمعة", + "قَارِب الْكَانُو‎", + "فتاحة", + "سترة محبوكة", + "دوامة خيل", + "كرتون (علبة)", + "ماكينة الصراف الآلي", + "كَاسِيت‎", + "قلعة", + "قطمران", + "مَشْغَل CD‎", + "تشيلو", + "الهاتف المحمول", + "سِلْسِلَة‎", + "سياج مشبك", + "زردية", + "منشار جنزيري", + "صَنْدُوق‎", + "كومود", + "كنِيْسة", + "سينما", + "ساطور", + "قبقاب", + "مِلَفّ‎", + "لوحة مفاتيح", + "سفينة حاويات", + "سيارة مكشوفة", + "مبرام", + "بُوق", + "جزمة راعي البقر", + "قبعة رعاة البقر", + "مَهْد‎", + "مِرْفاع", + "عكاز", + "سد", + "مكتب", + "حاسوب مكتبي", + "حفاظة", + "ساعة رقمية", + "سُفْرَة‎", + "غَسَّالَة صُحُون‎", + "مكبح قرصي", + "حوض سفن", + "قبّة", + "طبل", + "ثقالات حديد", + "جيتار كهربائي", + "قاطرة كهربائية", + "لِفَافَة‎", + "بودرة وجه", + "أصلة الريش", + "ملف", + "سيارة إطفاء", + "سَارِيَةْ العَلَم‎", + "فلوت", + "كرسي قابل للطي", + "رَافِعَةٌ شَوْكِيَّةٌ‎", + "نافورة", + "قلم حبر سائل", + "بُوق فرنْسِي", + "مقلاة", + "شاحنة قمامة", + "قناع غاز", + "غندول", + "جونج", + "مشْتل زُجاجي", + "دُكَّان بِقَالة", + "مقصلة", + "سبراي مثبت الشعر", + "نصف مجنزرة", + "مطرقة", + "سبت (سلة)", + "مُجفِّف شعر", + "جهاز محمول باليد", + "مَحْرَمَة‎", + "هارمونيكا", + "قيثار", + "حصّادة", + "خصين", + "خُطَّاف", + "تنورة مطوقة", + "عقلة (جمباز)", + "ساعة رملية", + "مكواة كهربائية", + "قرعة مضيئة", + "جِينْز‎", + "سيْارة جِيب", + "قميص قصير الكمين", + "أحجية الصور المقطوعة", + "رِيكْشَا‎", + "كيمونو", + "عقدة", + "معطف المختبر", + "مغرفة", + "أَبَاجُور‎", + "حاسوب محمول", + "جزازة العشب", + "قارب نجاة", + "قدّاحة", + "ليموزين", + "عابرة محيط منتظمة", + "أحمر شفاه", + "غسول", + "سَمَاعَة‎", + "منشرة", + "شخشيخة", + "زايلفون", + "قِناع", + "سارية مايو", + "قصر التيه", + "كُوب قِيَاس‎", + "جندل", + "مِذْيَاع‎", + "فرن ميكروويف", + "ميكروباص", + "تنورة قصيرة", + "ميني فان", + "صارُوخ", + "مساكن مصنعة", + "فورد موديل تي", + "مودم", + "مستغرق", + "القبعة الجامعية المربعة", + "مسْجِد", + "ناموسية", + "سكوتر", + "دراجة جبلية", + "فأرة", + "مصيدة فئران", + "مسمار", + "طوق العنق", + "قلادة", + "كمبيوتر محمول", + "مسلة", + "أوبوا", + "أكرينة", + "فلتر الزيت", + "أورغان", + "راسم إشارة", + "قناع أكسجين", + "رَبْطَة‎", + "مغداف", + "عجلة تغديف", + "قفل حلقي", + "فُرْشَاة‎ الطِلَاء‎", + "بجامة", + "إِيوان", + "مصفار", + "منشفة ورقية", + "مِظَلّة هُبُوط‎", + "متوازي", + "عداد انتظار السيارات‎", + "عربة ركاب", + "مصطبة", + "حامِل‎", + "مقلمة", + "مِبْرَاة‎", + "عطر", + "طبق بتري", + "ناسخة", + "ريشة‎", + "بيكلهاوبه", + "نصف نقل", + "حَصَّالَة‎", + "وسادة", + "إِبْرِيق‎", + "مِنْجَرَة‎", + "كيس نايلون", + "محراث", + "مكبس غطاس", + "albaret", + "عمُود", + "بونشو", + "طاولة البلياردو", + "أَصِيص‎", + "عَجَلَة فَخَّار‎", + "سَجَّادَة‎", + "طابعة", + "سجن", + "قذيفة", + "جهاز إسقاط", + "قُرْص‎", + "ملكمة", + "جزدان", + "ريشة", + "لحاف", + "راحة كرة", + "رديتر", + "مِذْياع", + "مقراب راديوي", + "مرْكبة اِسْتِجْمام", + "ثلاجة", + "تحكم من بعد", + "مطعم", + "مسدس دوار", + "بُنْدُقِيّة", + "كرسي هزاز", + "مِسْطَرَة‎", + "حذاء رياضي", + "خَزْنَة‎", + "دبوس مشبك", + "رَشَّاشَةْ الْمِلْح‎", + "صَنْدَل‎", + "صَارُون‎", + "ساكسفون", + "غِلَاف‎", + "ميزان", + "حافلة مدرسية", + "سكونة", + "برغي", + "مف", + "حزام الأمان", + "آلة الخياطة", + "تُرْس", + "دكان لبيع الأحذية", + "عربة المشتريات", + "مِجْرَاف‎", + "لوحا التزحلق على الثلج", + "حَقِيبَةُ النَّوْم‎", + "مسطرة حاسبة", + "عربة الجليد الآلية", + "كاسحة ثلوج", + "موزع الصابون", + "جوارب", + "فرن شمسي", + "سومبريرو", + "مفتاح مسافة", + "مدفأة", + "مِغْزَل‎", + "سيارة رياضية", + "منصة", + "قاطرة بخارية", + "جسر قوسي نفقي", + "طبل نحاسي", + "سماعة طبية", + "جدار جاف", + "موقد", + "تُرام", + "النقالة", + "سْتُوبَا‎", + "غواصة", + "بذلة", + "مِزْولة", + "نظارات شمسية", + "واق شمسي", + "جسر معلق", + "مِمْسَحَة", + "أُرْجُوحَة‎", + "مفتاح كهربائي", + "محقنة", + "دبابة", + "ابريق الشاي", + "دبدوب", + "كرة (تنس)", + "كشتبان", + "دراسة (آلة)", + "عرش", + "مُحَمِصَّة‎", + "دخاخني", + "مقعد المرحاض", + "مشعل", + "عمود رسم طوطمي", + "جرّار", + "صِينِيّة", + "معطف الخندق", + "دراجة ثلاثية", + "حامل ثلاثي", + "قوس النصر", + "الترولي باص", + "مترددة (آلة موسيقية)", + "بوابة دوارة", + "مظلة", + "دراجة أحادية", + "مكنسة كهربائية", + "مزْهرِيّة", + "قبة", + "مخمل", + "صدرية (زي ديني)", + "قنطرة متعددة الركائز", + "كمان", + "كرة", + "مِحْفَظَة‎", + "خِزَانَة المَلابِس", + "طائرة عسكرية", + "حوض الوضوء", + "آلَة غَسِيل", + "مطرة (قارورة)", + "برج مياه", + "الصّافرة", + "شعر مستعار", + "ووك", + "صوف", + "منزل اليورت", + "موقع ويب", + "كتاب هزلي", + "كلمات متقاطعة", + "لَافِتَة مُرُور‎", + "إشارة ضوئية", + "غُوَّاكَامُولِي‎", + "الوعاء الساخن", + "آيْس كِرِيم‎", + "مصاصة ثلج", + "بايغل", + "عقدية (مخبوزات)", + "تْشِيز بَرْجَر‎", + "بطاطا مهروسة", + "قَرْنَبِيط‎", + "كوسة", + "خیار", + "تفاح أخضر", + "تِين‎", + "أناناس", + "موْز", + "رُمَّان‎", + "علف مُجفّف", + "كاربونارا", + "صلصة الشوكولا", + "عجينة خبز", + "بيتزا", + "بوريتو", + "نَبِيذ أَحْمَر‎", + "قهوة اسبرسو", + "فقاعة", + "جرف (جغرافيا)", + "شعاب مرجانية", + "فوارة حارة", + "أرض رأسية", + "شاطِئ", + "وَادِ", + "جبل النار", + "عريس", + "سلجم", + "أقحوان", + "خف السيدة الأصفر", + "البلوط", + "وردة المسك", + "عيش الغراب ذو الصفائح", + "سُنْبُلة", + "وَرَق اَلْحَمَّام‎" + ] + ], + "SA": [ + [ + 61, + 65, + 71, + 79, + 92, + 99, + 104, + 133, + 134, + 269, + 288, + 291, + 292, + 309, + 310, + 312, + 319, + 342, + 344, + 346, + 348, + 360, + 374, + 393, + 407, + 417, + 437, + 456, + 462, + 463, + 470, + 483, + 487, + 508, + 513, + 529, + 541, + 558, + 580, + 614, + 618, + 620, + 673, + 679, + 701, + 702, + 708, + 725, + 730, + 760, + 778, + 787, + 792, + 816, + 823, + 832, + 879, + 897, + 928, + 943, + 952, + 953, + 957, + 971, + 979, + 980 + ], + [ + "अजगरी", + "होत्राभिः", + "वृश्चिक", + "वृश्चिक", + "मधुकरासश्", + "हंस", + "वल्लब्य्", + "बित्तेर्न्", + "सारस", + "वृक", + "चित्रकः", + "सिंह", + "व्याघ्रः", + "मधुमक्षिका", + "पिपीलिका", + "फालका", + "प्राचिका", + "वराह", + "करियाद", + "महिषः", + "उरण", + "उद्र", + "कोलोबिने", + "जाति स्व झष", + "रुग्णवाहनं", + "ख-व्योम", + "दीपस्तंभ", + "धनु", + "सम्मार्जनी", + "द्रोणि", + "मधुजवर्ती", + "दुर्ग", + "जङ्गमदूरभाषयन्त्रम्", + "कुञ्जीफलकम्", + "गोविषाणिक", + "वरकं", + "दुन्दुभि", + "पिच्छोरा", + "हरितगृहम्", + "किमोनो", + "दर्वि", + "अङ्कसङ्गणक", + "मूषकम्", + "कण्ठभूषा", + "परिष्यूतम्", + "युग्मदण्डम्", + "पीठम्", + "कलश", + "हल", + "शीतकम्", + "भौतिकी तुला", + "ढाल", + "चन्चुका", + "तर्कु", + "स्पन्दमापिनी", + "स्तूप", + "छत्रम्", + "वस्त्रनिर्मलीकरणयन्त्रम्", + "पयोहिम", + "कर्कटि", + "अञ्जीर", + "अनानसफलम्", + "दन्तबीज", + "बुद्बुद", + "उपत्यका", + "अग्निपर्वतः" + ] + ], + "CA": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 25, + 29, + 30, + 33, + 34, + 36, + 39, + 42, + 45, + 46, + 48, + 49, + 50, + 51, + 61, + 63, + 65, + 69, + 70, + 71, + 75, + 76, + 77, + 78, + 79, + 80, + 82, + 84, + 85, + 86, + 87, + 88, + 89, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 157, + 158, + 160, + 162, + 163, + 165, + 173, + 178, + 180, + 184, + 187, + 191, + 193, + 197, + 198, + 199, + 200, + 201, + 211, + 212, + 213, + 215, + 217, + 218, + 219, + 220, + 221, + 224, + 227, + 229, + 230, + 233, + 235, + 237, + 238, + 239, + 242, + 244, + 245, + 246, + 247, + 249, + 250, + 251, + 254, + 256, + 257, + 258, + 259, + 269, + 270, + 271, + 272, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 364, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 375, + 376, + 379, + 380, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 394, + 395, + 398, + 399, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 421, + 422, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 443, + 444, + 445, + 447, + 448, + 449, + 450, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 538, + 539, + 541, + 542, + 543, + 546, + 547, + 549, + 550, + 551, + 552, + 553, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 578, + 579, + 580, + 581, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 597, + 599, + 600, + 601, + 602, + 604, + 606, + 608, + 610, + 611, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 631, + 632, + 633, + 634, + 636, + 637, + 639, + 641, + 642, + 643, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 660, + 662, + 663, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 677, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 738, + 739, + 740, + 742, + 743, + 744, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 800, + 802, + 803, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 816, + 817, + 818, + 819, + 820, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 847, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 862, + 864, + 865, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 902, + 903, + 904, + 907, + 908, + 911, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 925, + 926, + 927, + 928, + 929, + 932, + 933, + 935, + 936, + 937, + 938, + 939, + 943, + 944, + 947, + 949, + 950, + 951, + 952, + 953, + 954, + 956, + 957, + 958, + 960, + 961, + 962, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 988, + 989, + 992, + 996, + 998, + 999 + ], + [ + "tenca", + "Carpí daurat", + "tauró blanc", + "tauró tigre", + "Esfírnids", + "Torpediniforme", + "dasyatis", + "ocell mascle", + "ocell femella", + "estruç", + "pinsà mec", + "cadernera", + "Cardenal anyil de front lila", + "Griva americana", + "Picnonòtid", + "gaig", + "garsa", + "Cínclid", + "Milà (ocell)", + "pigarg americà", + "Voltor", + "gamarús de Lapònia", + "salamandra", + "axolot", + "Granota toro", + "tortuga babaua", + "tortuga llaüt", + "tortuga d'aigua dolça", + "iguana verda", + "Agama (gènere)", + "monstre de Gila", + "Lluert oriental", + "dragó de Komodo", + "cocodril del Nil", + "Al·ligàtor del Mississip", + "Ugrosaure", + "Boa constrictora", + "cobra d'ulleres", + "Hidrofins", + "trilobit", + "frare", + "escorpí", + "vídua negra", + "taràntula", + "licòsid", + "Paparra", + "Quilòpode", + "Gall cuaforcat", + "Perdiu de collar", + "paó", + "Guatlla", + "perdicí", + "lloro gris africà", + "guacamai", + "cacatua de cresta groga", + "Meròpid", + "Calaus", + "colibrí", + "Galbúlid", + "tucà", + "ànec", + "bec de serra mitjà", + "oca", + "cigne negre", + "equidna", + "ornitorrinc", + "ualabi", + "Coales", + "Uombats", + "medusa", + "Anemones de mar", + "platihelmints", + "Nemàtodes", + "Corn marí", + "cargol", + "llimac", + "Nudibranqui", + "Poliplacòfors", + "nàutil", + "Crancs violinistes", + "Litòdid", + "Llamàntol americà", + "Llagostes (crustacis)", + "Crancs de riu", + "Paguroïdeus", + "isòpode", + "cigonya blanca", + "Cigonya negra", + "bec planer", + "flamenc", + "botaurins", + "Gruid", + "carrau", + "fotja americana", + "avitarda", + "Remena-rocs comú", + "territ variant", + "Gamba roja comuna", + "tetolet", + "garsa de mar", + "pelicà", + "pingüí reial", + "albatros", + "balena grisa", + "Orques", + "Dugònguid", + "Lleó marí", + "chihuahua (gos)", + "Spaniel japonès", + "Bichon maltès", + "pequinès", + "Papillon spaniel", + "terrier", + "llebrer afganès", + "Beagle (raça de gos)", + "gos coniller", + "Coonhound negre i bronze", + "ca eivissenc", + "Brac de Weimar", + "pitbull terrier americà", + "Terrier irlandès", + "Terrier de Yorkshire", + "terrier d'Airedale", + "Terrier d'Austràlia", + "schnauzer gegant", + "schnauzer estàndard", + "Terrier escocès", + "terrier tibetà", + "Terrier australià", + "Brac hongarès", + "setter anglès", + "setter irlandès", + "Spaniel Bretó", + "Springer spaniel anglès", + "Springer spaniel gal·lè", + "cocker spaniel anglès", + "Spaniel de Sussex", + "spaniel irlandès", + "Pastor belga groenendael", + "Kelpie australià", + "antic pastor anglès", + "Pastor de Shetland", + "Bover de Flandes", + "pastor alemany", + "pinscher miniatura", + "Gran bover suís", + "Bover de Berna", + "Bòxer", + "mastí tibetà", + "Buldog francès", + "danés", + "Santbernat", + "malamut d'Alaska", + "husky siberià", + "dàlmata", + "carlí", + "Terranova", + "Gos de muntanya dels Pirineus", + "Samoiede (gos)", + "Pomerània (gos)", + "llop", + "llop blanc", + "llop vermell", + "coiot", + "gos salvatge asiàtic", + "Gos salvatge africà", + "Hienes", + "rabosa", + "guineu àrtica", + "guineu grisa", + "gat persa", + "gat siamès", + "gat egipci", + "pantera", + "linx", + "lleopard", + "lleopard de les neus", + "pantera", + "lleó", + "tigre", + "guepard", + "Os bru", + "Os negre americà", + "ós blanc", + "ós morrut", + "Mangostes", + "suricata", + "cicindelins", + "marieta", + "caràbid", + "Cerambícid", + "Crisomèlid", + "Escarabat piloter", + "Dinastins", + "Curculionoïdeu", + "Dípter", + "antòfil", + "Formigues", + "saltamartí", + "grill", + "insecte bastó", + "escarabat", + "Mantodeus", + "cigala", + "Cicadèl·li", + "libèl·lul", + "parotet", + "monarca (papallona)", + "Asteroïdeus", + "eriçó de mar", + "Cogombres de mar", + "llebre", + "Conill d'Angora", + "Cricetins", + "porc espí", + "Esquirol guineu", + "Marmotes", + "Vebre", + "conill porquí", + "Zebrota", + "porc", + "senglar", + "porc senglar", + "hipopòtam", + "bou", + "Búfal aquàtic", + "bisó", + "marrà", + "Mufló de les Muntanyes Rocalloses", + "cabra dels Alps", + "búbal", + "Aepycerotinae", + "gasela", + "dromedari", + "Llames", + "mostela", + "Visó", + "fura de bosc comuna", + "fura", + "Llúdria", + "mofeta", + "teixó", + "Peresós de coll pàl·li", + "orangutan de Borneo", + "goril·l", + "ximpanzé", + "gibó", + "Symphalangus", + "mona vermella", + "babuí", + "Macaco", + "colobins", + "còlob", + "nassut", + "Aluata", + "Cal·licebin", + "mona aranya de mans negres", + "Mona esquirol", + "lèmur de cua anellada", + "elefant asiàtic", + "elefant africà", + "panda petit", + "panda gegant", + "Scomber dentatus", + "anguila", + "salmó platejat", + "Acipensèrids", + "agulla", + "àbac", + "abaia", + "acordió", + "guitarra acústica", + "portaavions", + "avió de línia", + "aeronau", + "ambulància", + "vehicle amfibi", + "apiari", + "devantal", + "cubell de la brossa", + "Fusell d'assalt", + "sarró", + "Forn de pa", + "Barra d'equilibris", + "globus", + "boli", + "Passamà", + "halter", + "barberia", + "Pallissa", + "baròmetre", + "tonel", + "carretó", + "pilota de beisbol", + "pilota de bàsquet", + "bressol", + "fagotista", + "casquet de bany", + "tovallola de bany", + "bany", + "Familiar", + "balisa", + "vas de precipitats", + "colbac", + "ampolla de cervesa", + "gerra de cervesa", + "pitet", + "tàndem", + "biquini", + "Binocle", + "colomar", + "hangar de barques", + "Corredor de bob", + "casquet", + "llibreria", + "llibreria", + "tap", + "arc", + "corbatí", + "placa commemorativa", + "sostenidor", + "Espigó", + "Ègida", + "escombra", + "cubell", + "Sivella", + "armilla antibales", + "Radio-taxi", + "calderó", + "candela", + "canoa", + "Obridor", + "càrdigan", + "retrovisor", + "cavallets", + "joc d'eines", + "bric", + "roda de cotxe", + "caixer automàtic", + "casset", + "casset", + "castell", + "catamarà", + "Reproductor CD-Audio", + "violoncel", + "mòbil", + "cadena", + "tela metàl·lic", + "ausberg", + "motoserra", + "cofre", + "calaixera", + "carilló", + "església", + "sala de cinema", + "Tallant (de ganivet)", + "esclop", + "Coctelera", + "cafetera", + "espiral", + "pany de combinació", + "teclat", + "confiteria", + "portacontenidors", + "descapotable", + "llevataps", + "trompeta", + "camperes", + "barret de cowboy", + "bressol", + "grua", + "bressol", + "olla de cocció lenta", + "pilota de croquet", + "crossa", + "cuirassa", + "presa d'aigua", + "Escriptori (moble)", + "Ordinador de taula", + "bolquer", + "Rellotge digital", + "rellotge digital", + "taula de menjador", + "Baieta", + "rentaplats", + "fre de disc", + "Dàrsena", + "cúpula", + "estoreta", + "tambor", + "baqueta", + "manuella", + "guitarra elèctrica", + "tren elèctric", + "sobre", + "cafetera exprés", + "pólvores per a la cara", + "boà", + "fitxer", + "Vehicle de bombers", + "guardafoc", + "asta", + "flauta travessera", + "Cadira plegable", + "casc de futbol americà", + "toro", + "font", + "estilogràfica", + "llit de dosser", + "vagó de mercaderies", + "trompa", + "paella (estri)", + "abric de pell", + "Camió d'escombraries", + "careta antigàs", + "Dispensador de gasolina", + "calze", + "kart", + "pilota de golf", + "Carro de golf", + "góndola", + "vestit llarg", + "piano de cua", + "hivernacle", + "calandra", + "Botiga d'ultramarins", + "guillotina", + "Laca pels cabells", + "semieruga", + "martell", + "canastra", + "eixugador de cabells", + "Dispositiu mòbil", + "mocador", + "disc dur", + "harmònica", + "arpa", + "dalladora antiga", + "pistolera", + "enrajolat de l'espai", + "garra", + "crinolina", + "barra fixa", + "rellotge de sorra", + "planxa", + "texans", + "samarreta", + "puzle", + "quimono", + "genollera", + "nus (llaç)", + "bata", + "cullerot", + "pantalla", + "ordinador portàtil", + "dalladora mecànica", + "tapa d'objectiu", + "obrecartes", + "biblioteca", + "bot salvavides", + "flama", + "llemosina", + "transatlàntic", + "pintallavis", + "loció", + "altaveu", + "lupa", + "serradora", + "cartera", + "bústia", + "mallot", + "maraques", + "xilòfon", + "màscara", + "Maibaum", + "laberint", + "Tassa de mesurar", + "farmaciola", + "megàlit", + "micròfon", + "forn de microones", + "uniforme militar", + "lletera", + "minibús", + "minifaldilla", + "Monovolum", + "míssil", + "mitena", + "Habitatge mòbil", + "mòdem", + "convent", + "ciclomotor", + "morter", + "Birret", + "mesquita", + "mosquitera", + "escúter", + "bicicleta de muntanya", + "tenda de campanya", + "ratolí", + "ratera", + "camió de mudances", + "clau (falca)", + "collaret", + "tetina", + "ordinador portàtil", + "obelisc", + "oboè", + "Ocarines", + "hodòmetre", + "Filtre d'oli", + "òrgan", + "oscil·loscop", + "faldellí", + "màscara d'oxigen", + "paquet", + "pagaia", + "roda de paletes", + "cadenat", + "pinzell", + "pijama", + "palau", + "flauta de Pan", + "paper de cuina", + "paracaigudes", + "barres paral·lele", + "parquímetre", + "vagó de passatgers", + "Terrassa (arquitectura)", + "Telèfon públic", + "Plint", + "plomer", + "maquineta de fer punta", + "perfum", + "Placa de Petri", + "fotocopiadora", + "pua", + "casc de punta", + "palissada", + "camioneta", + "pilar", + "guardiola", + "flascó de píndoles", + "coixí", + "pilota de ping-pong", + "vaixell pirata", + "gerra", + "ribot", + "planetari", + "Bossa de plàstic", + "escorreplats", + "arada", + "Desembossador", + "Càmera instantània", + "pal", + "furgó policial", + "ponxo", + "taula de billar", + "vas de flors", + "torn de terrissaire", + "barrina elèctrica", + "impressora", + "Presó", + "projectil", + "Puck (hoquei)", + "sac de boxa", + "moneder", + "Ploma d'ànec", + "manta", + "cotxe de competició", + "raqueta", + "Radiador", + "radiofonia", + "radiotelescopi", + "autocaravana", + "rodet", + "càmera rèflex", + "frigorífic", + "comandament a distància", + "organització pública d'alimentació", + "revòlver", + "fusell", + "balancí (moble)", + "a l'ast", + "goma d'esborrar", + "pilota de rugbi", + "regle", + "Sabatilla esportiva", + "Caixa de cabals", + "agulla imperdible", + "saler", + "sandàlia", + "sarong malai", + "saxòfon", + "beina", + "balança (instrument)", + "autobús escolar", + "goleta", + "marcador", + "cargol", + "tornavís", + "cinturó de seguretat", + "màquina de cosir", + "escut", + "sabateria", + "carret de supermercat", + "pala (eina)", + "gorra de dutxa", + "cortina de bany", + "Esquí (objecte)", + "passamuntanyes", + "sac de dormir", + "regle de càlcul", + "màquina escurabutxaques", + "moto de neu", + "llevaneu", + "pilota de futbol", + "mitjó", + "Forn solar d'alta temperatura", + "barret mexicà", + "escudella", + "barra d'espai", + "calefactor", + "transbordador espacial", + "espàtula", + "llanxa ràpida", + "fus", + "automòbil esportiu", + "focus", + "escenari,", + "tren de vapor", + "tambor metàl·li", + "estetoscopi", + "Estola", + "Paret seca", + "cronòmetre", + "estufa", + "colador", + "xarxa de tramvia", + "civera", + "submarí", + "vestit", + "rellotge de sol", + "ulleres de sol", + "Crema solar", + "pont penjant", + "pal de fregar", + "dessuadora", + "banyador", + "gronxador", + "interruptor", + "xeringa", + "Vehicle blindat de combat", + "tetera", + "Os de peluix", + "televisió", + "Pilota de tennis", + "sostre de palla", + "teló", + "didal", + "Ventadora", + "tron", + "teulada", + "torradora", + "estanc", + "torxa", + "Grua (vehicle)", + "botiga de joguines", + "Camió articulat", + "safata", + "Gavardina (indumentària)", + "tricicle", + "trimarà", + "trípode", + "arc de triomf", + "troleibús", + "trombó", + "tina", + "Torniquet d'accés", + "paraigua", + "monocicle", + "piano vertical", + "aspirador", + "gerro", + "volta", + "vellut", + "màquina expenedora", + "vestidura litúrgica", + "viaducte", + "violí", + "voleibol", + "gofrera", + "cartera", + "armari", + "avió militar", + "pica", + "rentadora", + "ampolla d'aigua", + "aiguamans", + "Torre d'aigua", + "xiulet", + "perruca", + "mosquitera", + "ampolla de vi", + "ala", + "llana", + "iol", + "iurta", + "pàgina web", + "còmic", + "mots encreuats", + "senyal de trànsit", + "Semàfor", + "Folre (coberta)", + "menú", + "plàtera", + "Consomé", + "fondue xinesa", + "fotesa", + "gelat", + "gelat de gel", + "prètzel", + "hamburguesa amb formatge", + "puré de patates", + "col cabdellada", + "bròquil", + "bròquil blanc", + "carbassó", + "cogombre", + "carxofa", + "bolet", + "maduixot", + "taronja", + "llimona", + "figa", + "pinya", + "plàtan", + "xirimoia", + "magrana", + "fenc", + "salsa de xocolata", + "massa", + "pastís de carn", + "vi negre", + "Cafè exprés", + "ponx d'ou", + "Alps", + "bombolla", + "penya-segat", + "Escull de corall", + "guèiser", + "promontori", + "costa", + "vall", + "volcà", + "jugador de beisbol", + "nuvi", + "escafandrera", + "Colza", + "margalida", + "Sabatetes de la mare de Déu", + "gla", + "gratacul", + "Agàric", + "Gírgola de castanyer", + "espiga (inflorescència)", + "paper higiènic" + ] + ], + "IS": [ + [ + 0, + 1, + 2, + 3, + 4, + 6, + 9, + 10, + 11, + 15, + 18, + 22, + 23, + 29, + 34, + 39, + 45, + 48, + 49, + 51, + 63, + 69, + 71, + 78, + 79, + 80, + 81, + 94, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 115, + 116, + 119, + 124, + 130, + 134, + 137, + 139, + 140, + 141, + 143, + 144, + 146, + 147, + 148, + 151, + 163, + 169, + 170, + 213, + 229, + 235, + 236, + 242, + 244, + 246, + 250, + 251, + 258, + 269, + 272, + 273, + 276, + 277, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 307, + 308, + 309, + 310, + 312, + 314, + 319, + 320, + 327, + 328, + 329, + 331, + 333, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 346, + 347, + 348, + 349, + 350, + 352, + 354, + 355, + 360, + 362, + 363, + 364, + 365, + 366, + 367, + 372, + 381, + 383, + 385, + 386, + 387, + 388, + 390, + 394, + 397, + 398, + 403, + 404, + 405, + 406, + 407, + 411, + 412, + 413, + 414, + 415, + 417, + 418, + 421, + 425, + 426, + 427, + 428, + 430, + 435, + 436, + 437, + 440, + 447, + 453, + 454, + 456, + 457, + 459, + 462, + 463, + 464, + 467, + 468, + 470, + 472, + 473, + 476, + 478, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 491, + 492, + 497, + 498, + 505, + 506, + 508, + 512, + 513, + 515, + 516, + 523, + 524, + 525, + 526, + 527, + 529, + 532, + 534, + 536, + 538, + 541, + 542, + 546, + 549, + 553, + 557, + 558, + 561, + 563, + 567, + 570, + 572, + 575, + 579, + 580, + 582, + 583, + 587, + 589, + 590, + 591, + 593, + 594, + 602, + 606, + 608, + 609, + 610, + 611, + 612, + 614, + 616, + 618, + 619, + 620, + 624, + 626, + 627, + 629, + 632, + 642, + 643, + 644, + 645, + 646, + 650, + 651, + 655, + 658, + 661, + 662, + 663, + 668, + 671, + 673, + 674, + 677, + 679, + 681, + 682, + 683, + 684, + 687, + 688, + 692, + 696, + 697, + 698, + 701, + 704, + 705, + 706, + 710, + 711, + 713, + 714, + 717, + 718, + 721, + 725, + 726, + 730, + 733, + 734, + 735, + 738, + 742, + 743, + 744, + 745, + 746, + 749, + 754, + 755, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 771, + 772, + 774, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 797, + 802, + 806, + 808, + 812, + 816, + 818, + 819, + 820, + 823, + 827, + 829, + 833, + 834, + 835, + 837, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 850, + 851, + 855, + 857, + 859, + 862, + 866, + 868, + 870, + 875, + 876, + 879, + 880, + 881, + 882, + 883, + 885, + 888, + 889, + 891, + 892, + 893, + 894, + 897, + 900, + 903, + 908, + 909, + 911, + 916, + 918, + 919, + 920, + 922, + 928, + 931, + 932, + 937, + 938, + 943, + 949, + 950, + 951, + 952, + 954, + 957, + 958, + 961, + 963, + 966, + 967, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 984, + 988, + 989, + 999 + ], + [ + "Grunnungur", + "Gullfiskur", + "hvítháfur", + "tígrisháfur", + "Hamarhákarl", + "stingskötur", + "strútur", + "fjallafinka", + "Þistilfinka", + "Farþröstur", + "skjór", + "Skallaörn", + "Hrægammur", + "Tálknamandra", + "Leðurskjaldbaka", + "Kembur", + "Gilaeðla", + "Kómódódreki", + "Nílarkrókódíll", + "Nashyrningseðla", + "Gleraugnaslanga", + "Þríbrotar", + "sporðdreki", + "Blóðmaurar", + "margfætla", + "Orri", + "rjúpa", + "kólibrífugl", + "túkan", + "Toppönd", + "gæs", + "Svartsvanur", + "mjónefur", + "breiðnefur", + "Vallabía", + "pokabjörn", + "Vambi", + "marglytta", + "Sæfíflar", + "Flatormar", + "Þráðormar", + "snigill", + "Bertálkni", + "Nökkvar", + "Grjótkrabbi", + "Vatnakrabbar", + "Flæmingjar", + "trana", + "Kolhæna", + "Tildra", + "Lóuþræll", + "Stelkur", + "tjaldur", + "pelíkani", + "Albatrossar", + "Sandlægja", + "Háhyrningur", + "Chihuahua (hundategund)", + "blóðhundur", + "Rússneskur úlfhundur", + "írskur úlfhundur", + "Írskur setter", + "gamli enski fjárhundur", + "þýskur fjárhundur", + "Dofri (hundur)", + "böggur", + "tíbetmeistari", + "Stóri dani", + "Síberískur husky", + "dalmatíuhundur", + "Samójed", + "úlfur", + "Sléttuúlfur", + "Dingó", + "Hýena", + "tófa", + "Heimskautarefur", + "Grárefur", + "Persneskur köttur", + "Síamsköttur", + "Fjallaljón", + "gaupa", + "hlébarði", + "snæhlébarði", + "Jagúar", + "ljón", + "Tígrisdýr", + "Blettatígur", + "Brúnbjörn", + "Svartbjörn", + "hvítabjörn", + "Mangar", + "Jarðköttur", + "maríuhæna", + "Járnsmiðir", + "Ranabjöllur", + "Fluga", + "bý", + "Maurar", + "krybba", + "kakkalakki", + "Drekaflugur", + "Meyjarflugur", + "krossfiskur", + "ígulker", + "Sæbjúgu", + "Hérar", + "hamstur", + "Múrmeldýr", + "bifur", + "Naggrísir", + "sebrahestur", + "svín", + "Villisvín", + "vörtusvín", + "Flóðhestur", + "Vatnabuffall", + "Vísundur", + "hrútur", + "Stórhyrningur", + "steingeit", + "Impalahjörtur", + "drómedari", + "Lamadýr", + "otur", + "greifingi", + "beltisdýr", + "Þrítæða letidýr", + "Órangútan", + "górilla", + "simpansi", + "Bavíanar", + "Kóngulóar-Apar", + "Kattalemúr", + "asíufíll", + "afríkufíll", + "Rauð panda", + "pandabirna", + "áll", + "Styrjur", + "ígulfiskur", + "Talnagrind", + "lugmóðurskip", + "Farþegaflugvél", + "loftskip", + "altari", + "sjúkrabíll", + "Svunta", + "Ruslatunna", + "Hríðskotariffill", + "Bakpoki", + "bakarí", + "Loftbelgur", + "kúlupenni", + "grindverk", + "hlaða", + "loftvog", + "Tunna", + "Hjólbörur", + "körfubolti", + "baðker", + "skutbíll", + "viti", + "bjórflaska", + "sjónauki", + "bókaskápur", + "bókaverslun", + "bogi", + "þverslaufa", + "Brjóstahaldari", + "sópur", + "fata", + "Döggskór", + "kjötmarkaður", + "leigubíll", + "Kerti", + "kanó", + "Dósaupptakari", + "Hringekja", + "ferna", + "hraðbanki", + "kassetta", + "borg", + "Tvíbytna", + "selló", + "gemsi", + "keðja", + "keðjusög", + "kista", + "kirkja", + "Kvikmyndahús", + "kaffikanna", + "spírall", + "leturborð", + "tappatogari", + "trompet", + "kúrekahattur", + "vagga", + "hækja", + "bolbrynja", + "stífla", + "skrifborð", + "borðtölva", + "bleyja", + "matarborð", + "uppþvottavél", + "Skipakví", + "hvolfþak", + "Tromma", + "trommukjuði", + "rafmagnsgítar", + "umslag", + "skjalaskápur", + "flaggstöng", + "flauta", + "gaffallyftari", + "blekpenni", + "Steikarpanna", + "Gasgríma", + "bikar", + "golfbíll", + "flygill", + "Gróðurhús", + "Matvöruverslun", + "Fallöxi", + "hamar", + "hárþurrka", + "Smátæki", + "vasaklútur", + "Munnharpa", + "Harpa (hljóðfæri)", + "svifrá", + "straujárn", + "gallabuxur", + "jeppi", + "stuttermabolur", + "Púsluspil", + "Rikksjó", + "Kimono (sloppur)", + "Hnútur (mælieining)", + "ausa", + "skermur", + "fartölva", + "bókhlaða", + "lampi", + "limmósína", + "varalitur", + "Hátalari", + "sílófónn", + "gríma", + "eldspýta", + "Maístöng", + "villustigur", + "hljóðnemi", + "örbylgjuofn", + "pínupils", + "lúffa", + "T-Ford", + "Mótald", + "munkaklaustur", + "moska", + "Fjallahjól", + "mús", + "tréköttur", + "Nagli", + "hálsfesti", + "ferðatölva", + "Broddsúla", + "óbó", + "Okkarína", + "orgel", + "Sveiflusjá", + "pakki", + "pensill", + "Náttföt", + "palata", + "Fallhlíf", + "stöðumælir", + "rúta", + "svalir", + "yddari", + "Ilmvatn", + "ljósritunarvél", + "nögl", + "pallbíll", + "brúarstöpull", + "Koddi", + "kanna", + "Hefill", + "plógur", + "slá", + "Svarta María", + "Ponsjó", + "blómapottur", + "prentari", + "Fangelsi", + "flugskeyti", + "skjávarpi", + "pökkur", + "fjaðurpenni", + "fjarskipti", + "útvarpssjónauki", + "kæliskápur", + "fjarstýring", + "matsölustaður", + "Sexhleypa", + "Riffill", + "ruggustóll", + "reglustika", + "peningaskápur", + "næla", + "sandali", + "Saxófónn", + "skálpur", + "reisla", + "skólavagn", + "Skonnorta", + "skrúfa", + "skrúfjárn", + "öryggisbelti", + "Saumavél", + "Buklari", + "spaði", + "Skíði", + "svefnpoki", + "Vélsleði", + "sokkur", + "mexíkanahattur", + "geimflaug", + "snælda", + "ljóskastari", + "Leiksvið", + "eimreið", + "hlustunarpípa", + "ofn", + "sporvagn", + "kafbátur", + "jakkaföt", + "Sólúr", + "Sólgleraugu", + "Hengibrú", + "Moppa", + "róla", + "stilli", + "sprauta", + "skriðdreki", + "Tekanna", + "Bangsi", + "sjónvarp", + "fingurbjörg", + "öndvegi", + "brauðrist", + "kyndill", + "Dráttarvél", + "dallur", + "Þríhjól", + "básúna", + "geymir", + "Regnhlíf", + "Einhjól", + "stofupíanó", + "ryksuga", + "vasi", + "flauel", + "Dalbrú", + "fiðla", + "Vöfflujárn", + "veggklukka", + "seðlaveski", + "skápur", + "þvottavél", + "vatnsturn", + "Hárkolla", + "vængur", + "wok-panna", + "ull", + "vefsetur", + "krossgáta", + "umferðarmerki", + "Umferðarljós", + "matseðill", + "Rjómaís", + "Beygla", + "kringla", + "brokkolí", + "blómkál", + "gúrka", + "jarðaber", + "appelsína", + "límóna", + "fíkja", + "banani", + "granatepli", + "hey", + "Deig", + "pítsa", + "rauðvín", + "Espressó", + "kúla", + "klettaveggur", + "Kóralrif", + "Goshver", + "strönd", + "Dalur", + "Eldstöð", + "Repja", + "akarn", + "rósaber", + "klósettpappír" + ] + ], + "IT": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10, + 11, + 15, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 31, + 32, + 33, + 34, + 37, + 39, + 40, + 42, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 54, + 55, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 71, + 74, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 84, + 85, + 86, + 87, + 89, + 90, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 113, + 114, + 115, + 116, + 117, + 120, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 157, + 160, + 161, + 162, + 163, + 169, + 170, + 171, + 172, + 176, + 177, + 178, + 196, + 197, + 198, + 208, + 211, + 213, + 217, + 219, + 224, + 225, + 226, + 227, + 229, + 230, + 231, + 233, + 235, + 242, + 244, + 246, + 247, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 265, + 269, + 270, + 271, + 272, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 321, + 323, + 324, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 391, + 393, + 394, + 395, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 477, + 478, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 497, + 498, + 499, + 500, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 532, + 533, + 534, + 535, + 536, + 538, + 539, + 541, + 542, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 576, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 623, + 624, + 625, + 626, + 628, + 629, + 631, + 632, + 634, + 637, + 639, + 640, + 642, + 643, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 655, + 656, + 657, + 658, + 661, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 675, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 716, + 717, + 719, + 721, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 755, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 793, + 794, + 795, + 797, + 798, + 800, + 802, + 803, + 806, + 809, + 810, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 851, + 852, + 854, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 905, + 907, + 908, + 910, + 911, + 913, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 925, + 926, + 927, + 928, + 929, + 932, + 933, + 935, + 937, + 938, + 939, + 943, + 944, + 946, + 948, + 950, + 951, + 952, + 955, + 957, + 958, + 959, + 961, + 962, + 963, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 992, + 995, + 997, + 998, + 999 + ], + [ + "Tinche", + "pesce rosso", + "pescecane", + "squalo tigre", + "pesce martello", + "torpedine", + "pastinaca", + "gallo", + "struzzo", + "peppola", + "cardellino", + "tordo migratore", + "ghiandaia", + "gazza", + "cinclidi", + "nibbio", + "aquila calva", + "avvoltoio", + "Gufo della Lapponia", + "Proteidae", + "rana toro", + "raganella", + "Ascaphidae", + "caretta", + "tartaruga liuto", + "Tartaruga scatola", + "Iguana squamosa", + "anolide", + "Agama (zoologia)", + "mostro di Gila", + "racano", + "Camaleonte africano", + "drago di Komodo", + "Coccodrillo del Nilo", + "Alligator Missisipiensis", + "triceratope", + "vipera del deserto", + "biscia d'erba", + "serpente giarrettiera", + "boa (serpente)", + "pitone di Seba", + "cobra dagli occhiali", + "Idrofidi", + "ceraste", + "crotalo ceraste", + "Trilobitomorpha", + "scorpione", + "epeira", + "vedova nera", + "ragno-lupo", + "zecca", + "centopiedi", + "Fagiano di monte eurasiatico", + "pernice bianca", + "pernice", + "pavone", + "quaglia", + "pernice", + "Psittacus cinereus", + "cacatua ciuffogiallo", + "tricoglosso", + "vespiere", + "Bucerotiformes", + "colibrì", + "galbula", + "tucano", + "anatra maschio", + "smergo minore", + "oca", + "cigno nero", + "cinghiale", + "formichiere", + "ornitorinco", + "Phascolarctos", + "vombato", + "medusa", + "Rose di mare", + "Mussidae", + "Vermi piatti", + "ascaride", + "chiocciola", + "limaccia", + "lumaca di mare", + "placofori", + "nautilo", + "Uca (zoologia)", + "astice americano", + "aragosta", + "gambero d'acqua dolce", + "bernardo l’eremita", + "isopode", + "cicogna bianca", + "cicogna nera", + "spatola", + "fenicottero", + "tarabuso", + "gru", + "Aramidae", + "pollo sultano", + "folaga americana", + "otarda", + "voltapietre", + "Piovanello pancianera", + "pettegola", + "ostrichiere", + "pellicano", + "Pinguino re", + "albatros", + "balena-grigia", + "urca", + "dugongo", + "otaria", + "chihuahua (razza canina)", + "Chin (razza canina)", + "maltese (razza canina)", + "Pechinese", + "Épagneul nano continentale", + "levriero afgano", + "bassethound", + "beagle (razza canina)", + "segugio", + "barzoi", + "levriero irlandese", + "levriero italiano", + "piccolo levriero inglese", + "levriero persiano", + "levriero inglese a pelo ruvido", + "Bracco di Weimar", + "schnauzer nano", + "schnauzer gigante", + "schnauzer medio", + "labrador", + "Bracco Ungherese", + "Setter irlandese", + "Springer spaniel inglese", + "cocker-spaniel", + "cane da pastore belga (Groenendael)", + "pastore belga di Malines", + "cane da pastore di Brie", + "cane da pastore australiano Kelpie", + "pastore-inglese-antico", + "Cane da pastore scozzese Shetland", + "pastore scozzese", + "bovaro delle Fiandre", + "cane lupo", + "boxer (cane)", + "mastino tibetano", + "danese", + "Cane di San Bernardo", + "malamute di Alaska", + "husky siberiano", + "dalmata", + "Affenpinsher", + "cane del Congo", + "carlino", + "cane di Terranova", + "cane da montagna dei Pirenei", + "Samoiedo", + "Pomerania", + "ciauciau", + "Keeshound", + "barboncino nano", + "lupo", + "Lupo della Groenlandia", + "crisocione", + "coiote", + "cane selvatico asiatico", + "licaone", + "iena", + "volpe", + "volpe pigmea americana", + "volpe bianca", + "urucione", + "gatto soriano", + "Persiano (gatto)", + "gatto siamese", + "egiziano", + "leone americano", + "lince", + "leopardo", + "leopardo delle nevi", + "giaguaro", + "leone", + "tigre", + "ghepardo", + "orso bruno", + "orso nero americano", + "orso bianco", + "orso giocoliere", + "mangosta", + "suricato", + "cicindela", + "coccinella", + "Carabi", + "cerambice", + "Chrysomelidi", + "scarabeo stercorario", + "tonchio", + "mosca", + "pecchia", + "formica", + "cavalletta", + "grillo", + "fasmide", + "blatta", + "mantide", + "cicala (insetto)", + "Cicadellidi", + "libellula", + "zigotteri", + "vanessa", + "farfalla monarca", + "cavolaia", + "stella di mare", + "riccio di mare", + "oloturia", + "Silvilago", + "Lepus (zoologia)", + "coniglio d'Angora", + "criceto", + "porcospino", + "scoiattolo volpe", + "marmotta", + "castoro", + "porcellino d'India", + "sauro", + "zebre", + "maiale", + "cinghiale", + "facocero", + "ippopotamo", + "bue", + "bufalo d'acqua", + "bisonte", + "montone", + "Pecora delle Montagne rocciose", + "stambecco", + "alcelafo", + "melampo", + "gazzelle", + "dromedario", + "lama", + "donnola", + "visone", + "puzzola europea", + "furetto", + "lontra", + "moffetta", + "tasso", + "bradipo", + "Pongo (zoologia)", + "Gorillini", + "scimpanzè", + "gibbone", + "siamango", + "cercopiteco", + "pata", + "babbuino", + "macaco", + "Colobidae", + "colobo", + "nasica", + "uistitì", + "scimmia cappuccina", + "scimmia urlatrice", + "Callicebus", + "scimmia ragno", + "scimmia uistitì", + "lemure catta", + "elefante asiatico", + "elefante africano", + "panda rosso", + "Panda pornografia", + "anguilla", + "Salmo hisutch", + "pesce pagliaccio", + "storione", + "Aguglia di Svetovidov", + "pesce palla", + "abaco", + "abaya (indumento)", + "abbigliamento accademico", + "fisarmoniche", + "chitarra acustica", + "portaerei", + "aereo di linea", + "dirigibile", + "altare", + "ambulanza", + "veicolo anfibio", + "orologio analogico", + "apiario", + "grembiule", + "contenitore per rifiuti", + "fucile d'assalto", + "zaino", + "forno", + "trave di equilibrio", + "palloncino", + "penna a sfera", + "bangio", + "balaustrata", + "Bilanciere", + "granaio", + "barometro", + "barile", + "carriola", + "Palla da baseball", + "pallone da pallacanestro", + "culla", + "fagottista", + "cuffia da nuoto", + "asciugamano da bagno", + "vasca da bagno", + "familiare", + "faro", + "becher", + "sciaccò", + "bottiglia di birra", + "pettina", + "Tandem (aeronautica)", + "duepezzi", + "raccoglitore", + "binocolo", + "gabbietta", + "rimessa per barche", + "guidoslitta", + "Cravatta di cuoio", + "cuffia", + "libreria", + "libreria", + "tappo", + "arco", + "farfallino", + "targa", + "reggiseno", + "bastione", + "corazza", + "scopa", + "secchio", + "fibbia", + "giubbotto antiproiettile", + "macelleria", + "tassì", + "calderone", + "candela", + "cannone", + "canoa", + "apriscatole", + "golf", + "giostra", + "kit di attrezzi", + "cartone", + "cassa automatica", + "cassetta", + "riproduttore a cassetta", + "castello", + "catamarano", + "lettore CD", + "basso di viola da braccio", + "cellulare", + "catena", + "reticolato rete metallica", + "maglia di ferro", + "motosega", + "baule", + "canterano", + "suoneria", + "chiesa", + "cinema (luogo)", + "Mannarino", + "Cliff-dwellers", + "zoccolo (calzatura)", + "shaker", + "caffettiera", + "elica", + "Serratura a combinazione", + "tastiera", + "pasticceria", + "portacontainer", + "decappottabile", + "cavatappi", + "cornetta", + "stivali da cow boy", + "cappello da cowboy", + "culla", + "gru", + "casco", + "cassa da imballaggio di legno", + "lettino", + "stampella", + "corazza", + "argine", + "scrittoio", + "computer fisso", + "manopola rotativa", + "pannolino", + "orologio digitale", + "tavolo da pranzo", + "strofinaccio", + "lavastoviglie", + "freno a disco", + "darsena", + "cupola a cipolla", + "zerbino", + "membranofoni", + "bacchetta", + "manubrio", + "chitarra elettrica", + "locomotiva elettrica", + "busta", + "cipria", + "boa (abbigliamento)", + "archivio", + "Motobarcapompa", + "camion dei pompieri", + "caminiera", + "asta della bandiera", + "flauto traverso", + "sedia pieghevole", + "casco da football", + "muletto", + "fontana", + "penna stilografica", + "letto a baldacchino", + "carro merci", + "corno", + "padella", + "pelletteria", + "autocompattatore", + "maschera antigas", + "distributore di carburante", + "coppa", + "kart", + "palla da golf", + "gondola veneziana", + "pianoforte a coda", + "serra", + "griglia", + "alimentari", + "ghigliottina", + "fermacapelli", + "Lacca per capelli", + "veicolo semicingolato", + "martello", + "cesta", + "asciugacapelli", + "dispositivo mobile", + "fazzoletto", + "disco rigido", + "armonica", + "arpa", + "raccoglitrice", + "accetta", + "Fondina", + "tassellazione dello spazio", + "trappola", + "crinolina", + "Sbarra", + "clessidra", + "ferro da stiro", + "zucca di Halloween", + "blue-jeans", + "fuoristrada", + "maglietta", + "gioco ad incastro", + "risciò", + "chimono", + "ginocchiera", + "nodo", + "camice", + "mestolo", + "paralume", + "computer portatile", + "falciatura", + "aprilettere", + "biblioteca", + "lancia di salvataggio", + "accendino", + "transatlantico", + "rossetto", + "lozione", + "altoparlante", + "segheria", + "casella postale", + "costume intero", + "chiusino", + "xilofono", + "maschera", + "albero di maggio", + "labirinto", + "misurino", + "armadietto dei medicinali", + "megalito", + "microfono", + "microonde", + "minigonna", + "monovolume", + "razzo", + "guanto a manopola", + "Flivver", + "monastero", + "monitore", + "motorino", + "mortaio", + "tocco (copricapo)", + "moschea", + "Zanzariera", + "motoretta", + "fuoristrada", + "ratto", + "trappola per topi", + "furgone per traslochi", + "chiodo", + "collarino cervicale", + "collana", + "tettarella", + "portatile", + "obelisco", + "oboi", + "ocarina di Budrio", + "contachilometri", + "filtro dell'olio", + "organo", + "oscilloscopio", + "sopraggonna", + "maschera per ossigeno", + "pacchetto", + "remo", + "ruota a pale", + "lucchetto", + "pennello", + "pigiama", + "palazzo reale", + "siringa", + "scottex", + "paracadute", + "Parallele simmetriche", + "panchina", + "parchimetro", + "carrozza", + "altana", + "telefono pubblico", + "piedistallo", + "astuccio", + "temperamatite", + "profumo", + "Piastra di Petri", + "stampa fotomeccanica", + "plettro", + "stecconata", + "pick-up", + "salvadanaio", + "cuscino", + "caraffa", + "pialla", + "planetario", + "sacchetto di plastica", + "piattaia", + "aratro", + "sturalavandino", + "fotografia istantanea", + "palo", + "Cellulare", + "poncio", + "tavolo da biliardo", + "vaso per fiori", + "ruota del vasaio", + "trapano elettrico", + "tappeto da preghiera", + "stampante", + "carcere", + "proiettile", + "proiettore", + "disco di gomma", + "sacco", + "borsellino", + "calamo", + "trapunta", + "macchina da corsa", + "racchetta", + "calorifero", + "radiotelescopio", + "autocaravan", + "bobina", + "reflex", + "frigo", + "controllo remoto", + "ristorante", + "rivoltella", + "fucile", + "sedia a dondolo", + "spiedo", + "gomma", + "pallone da rugby", + "riga (strumento)", + "scarpa da ginnastica", + "cassaforte", + "spilla di sicurezza", + "spargisale", + "sandalo", + "sassofono", + "guaina", + "bilancia", + "scuolabus", + "scuna", + "tabellone segnapunti", + "schermo", + "vite", + "cacciavite", + "cintura", + "macchina per cucire", + "scudo", + "negozio di scarpe", + "carrello", + "pala", + "cuffia da doccia", + "tenda da doccia", + "sci", + "sacco a pelo", + "regolo", + "slot-machine", + "gatto delle nevi", + "spazzaneve", + "calzino", + "scodella", + "barra spaziatrice", + "fuoribordo", + "ragna", + "fuso", + "vettura sport", + "riflettore", + "palco", + "locomotiva", + "stetoscopio", + "stola", + "muro di pietra", + "cronometro", + "stufa", + "colino", + "tranvia", + "barella", + "divano letto", + "sottomarino", + "vestito", + "orologio solare", + "occhiali da sole", + "filtro solare", + "ponte sospeso", + "lavapavimenti", + "felpa", + "calzoncini da bagno", + "altalena", + "interruttore", + "siringa (medicina)", + "lampada da tavolo", + "carro armato", + "teiera", + "orsacchiotto", + "radiotelevisione", + "pallina da tennis", + "Sipario", + "ditale", + "trebbiatrice", + "trono", + "tostapane", + "tabaccaia", + "asse del water", + "torcia", + "palo totemico", + "carro attrezzi", + "motrice", + "Autoarticolato", + "vaschetta", + "trench", + "triciclo", + "trimarano", + "Treppiede", + "arco di trionfo", + "filobus", + "trombone a pistoni", + "tino", + "tornello", + "tastiera della macchina da scrivere", + "ombrello", + "monociclo", + "pianoforte verticale", + "aspirapolvere", + "vaso", + "volta", + "velluto", + "distributore automatico", + "paramento liturgico", + "viadotto", + "violino folk", + "pallone da pallavolo", + "macchina per waffle", + "orologio a parete", + "borsellino", + "armadio", + "aeromobile militare", + "lavandino", + "lavatrice", + "borraccia", + "torre piezometrica", + "fischio", + "parrucca", + "avvolgibile", + "bottiglia di vino", + "ala", + "cucchiaio di legno", + "lana", + "relitto", + "iurta", + "sito web", + "fumetto", + "cruciverba", + "targa stradale", + "segnali di traffico", + "Sovraccoperta", + "menù", + "brodo chiarificato", + "pignatta mongola", + "zuppa inglese", + "gelato", + "ghiacciolo", + "Breze", + "hamburger al formaggio", + "purè", + "broccolo", + "cavolfiore", + "zucchino", + "cetriolo", + "verde foresta", + "cardo", + "Mela verde Granny Ramsey Smith", + "arancia", + "limone", + "fico", + "frutto dell'albero del pane", + "melagrana", + "fieno", + "Libro di cucina/Ricette/Spaghetti alla carbonara", + "pasta", + "polpettone", + "pasta per pizza", + "vino rosso", + "caffè", + "specie di zabaione", + "alpe", + "bollicina", + "falesia", + "barriera corallina", + "lungolago", + "capo", + "tombolo", + "costa", + "valle", + "vulcano", + "giocatore di baseball", + "sposo", + "colza", + "pratolina", + "Scarpetta di Venere", + "granaglie", + "ghianda", + "cinorrodo", + "castagna d'India", + "agarico", + "geastro", + "boleto", + "spiga", + "carta igienica" + ] + ], + "SV": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 13, + 14, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 28, + 29, + 30, + 34, + 37, + 39, + 40, + 42, + 45, + 46, + 47, + 48, + 49, + 50, + 52, + 56, + 57, + 60, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 71, + 74, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 85, + 87, + 88, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 157, + 162, + 163, + 169, + 170, + 175, + 177, + 191, + 199, + 201, + 211, + 213, + 215, + 217, + 219, + 222, + 224, + 226, + 227, + 230, + 233, + 235, + 236, + 237, + 242, + 244, + 246, + 247, + 248, + 250, + 251, + 256, + 257, + 258, + 259, + 266, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 358, + 359, + 360, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 393, + 394, + 395, + 397, + 398, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 423, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 444, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 496, + 497, + 498, + 502, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 541, + 542, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 554, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 564, + 567, + 568, + 569, + 570, + 571, + 572, + 574, + 575, + 576, + 577, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 595, + 596, + 600, + 601, + 602, + 604, + 606, + 607, + 610, + 611, + 612, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 623, + 624, + 626, + 627, + 628, + 629, + 630, + 632, + 633, + 634, + 640, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 661, + 662, + 663, + 665, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 680, + 681, + 683, + 684, + 685, + 686, + 687, + 688, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 721, + 725, + 726, + 728, + 730, + 731, + 732, + 733, + 734, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 793, + 794, + 795, + 797, + 798, + 802, + 803, + 804, + 805, + 806, + 808, + 810, + 811, + 812, + 816, + 817, + 818, + 819, + 820, + 821, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 851, + 852, + 854, + 855, + 856, + 857, + 859, + 860, + 862, + 863, + 864, + 866, + 867, + 868, + 870, + 872, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 907, + 908, + 909, + 910, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 926, + 928, + 929, + 932, + 933, + 935, + 938, + 939, + 943, + 944, + 949, + 950, + 951, + 952, + 954, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 985, + 986, + 988, + 989, + 990, + 992, + 994, + 996, + 997, + 998, + 999 + ], + [ + "Sutare", + "guldfisk", + "Vithaj", + "Tigerhaj", + "hammarhajar", + "darrockeartade rockor", + "stingrocka", + "struts", + "bergfink", + "steglits", + "Juncor", + "turkoskardinal", + "vandringstrast", + "bulbyler", + "skata", + "strömstarar", + "glador", + "vithövdad havsörn", + "gamar", + "lappuggla", + "Gulfläckig mullvadssalamander", + "Axolot", + "oxgroda", + "havslädersköldpadda", + "dossköldpaddor", + "Grön leguan", + "grön anolis", + "Egentliga agamer", + "gilaödla", + "smaragdödla", + "Chamaeleo aegyptius", + "Komodovaran", + "nilkrokodil", + "mississippialligator", + "Calamaria amoena", + "Kungssnokar", + "strumpebandssnokar", + "Leptodeira torquata", + "kungsboa", + "klippyton", + "Glasögonorm", + "Havsormar", + "hornhuggorm", + "sidvindare", + "trilobit", + "skorpion", + "korsspindel", + "svart änka", + "vargspindel", + "fästing", + "tusenfoting", + "orre", + "ripa", + "kragjärpe", + "Vaktlar", + "gråjako", + "arapapegoja", + "Större gultofskakadua", + "Sporrgökar", + "biätare (familj)", + "näshornsfåglar", + "kolibri", + "Jakamarer", + "tukan", + "andrake", + "småskrake", + "gås", + "Svart svan", + "Myrpiggsvin", + "näbbdjur", + "vallaby", + "Phascolarctidae", + "vombat", + "manet", + "anemon", + "plattmaskar", + "rundmaskar", + "snigel", + "sniglar", + "Nakensnäckor", + "ledsnäckor", + "Stenkrabba", + "Vinkarkrabbor", + "trollkrabbor", + "amerikansk hummer", + "langust", + "kräftor", + "Eremitkräftor", + "Vit stork", + "svart stork", + "skedstorkar", + "Flamingoer", + "rördrom", + "trana", + "ralltrana", + "amerikansk sothöna", + "trappar", + "roskarl", + "Kärrsnäppa", + "Rödbena", + "beckasinsnäppor", + "strandskata", + "pelikan", + "kungspingvin", + "Albatrosser", + "gråval", + "späckhuggare", + "dugonger", + "Sjölejon", + "chihuahua (hundras)", + "japanesechin", + "Malteser", + "pekinges", + "Shi-tzu", + "papillon (hundras)", + "beagle (hundras)", + "blodhund", + "Rysk vinthund", + "irländsk varghund", + "Utterhund", + "skotsk hjorthund", + "Airedaleterrier", + "skotsk terrier", + "silkyterrier", + "Ungersk vizsla", + "irländsk röd setter", + "Bretagne spaniel", + "engelsk springer spaniel", + "cockerspaniel", + "Kuvaszen", + "belgisk vallhund groenendael", + "Berger de Brie", + "Australisk kelpie", + "dvärgcollie", + "Bouiver des flandres", + "schäfer", + "Dobberman", + "dvärgpinscher", + "Boxerhund", + "tibetansk mastiff", + "Ulmerdogg", + "Sankt bernhardshund", + "Polarhund", + "sibirisk husky", + "dalmatin", + "newfoundlandshund", + "pyrenéerhund", + "samojedhund", + "Pomeran", + "mellanpudel", + "varg", + "Polarvarg", + "rödvarg", + "prärievarg", + "Canis lupus. dingo", + "Asiatisk vildhund", + "afrikansk vildhund", + "Hyenor", + "rödräv", + "ökenkatträv", + "fjällräv", + "Gråräv", + "Perser", + "siameskatt", + "Bergslejon", + "lo", + "leoparder", + "snöleopard", + "panter", + "lejon", + "Världens tigrar", + "gepard", + "brunbjörn", + "Svartbjörn", + "isbjörn", + "Manguster", + "Surikat", + "nyckelpiga", + "jordlöpare", + "långhorningar", + "Bladbaggar", + "Noshornsbaggar", + "Vivlar", + "fluga", + "bi", + "Myror", + "gräshoppor", + "syrsa", + "vandrande pinne", + "kackerlacka", + "bönsyrsor", + "Dvärgstritar", + "egentliga trollsländor", + "jungfruslända", + "luktgräsfjäril", + "Monark (fjäril)", + "sjöstjärna", + "sjöborre", + "Sjögurkor", + "Bomullssvanskaniner", + "harar (släkte)", + "angorakanin", + "hamstrar", + "Piggsvin", + "östlig rävekorre", + "murmeldjur", + "bäver", + "marsvin", + "zebror", + "gris", + "vildsvin", + "vårtsvin", + "flodhäst", + "stut (oxe)", + "vattenbuffel", + "bison (släkte)", + "gumse", + "tjockhornsfår", + "stenbock", + "koantilop", + "Aepycerotinae", + "Gaseller", + "dromedar", + "lama", + "iller", + "tamiller", + "utter", + "grävling", + "bältdjur", + "tretåiga sengångare", + "orangutanger", + "gorillor", + "schimpans", + "lar (gibbon)", + "Symphalangus", + "markatta", + "husarapa", + "babian", + "makak", + "langurer", + "Colobusapa", + "Näsapa", + "vrålapor", + "springapor", + "Spindelapor", + "Dödskalleapor", + "ringsvanslemur", + "Babakut", + "asiatisk elefant", + "savannelefant", + "mindre panda", + "jättepanda", + "Scomber dentatus", + "ål", + "Silverlax", + "Clownfiskar", + "stör", + "Långnosad bengädda", + "blåsfisk", + "kulram", + "dragspel", + "akustisk gitarr", + "Hangarskepp", + "trafikflygplan", + "luftskepp", + "altare", + "ambulans", + "amfibiefordon", + "förkläde", + "soptunna", + "automatkarbin", + "ryggsäck", + "bageri", + "Bom", + "ballong", + "kulpenna", + "tenorbanjo", + "räcke", + "skivstång", + "frisörstol", + "lada", + "aneroidbarometer", + "tunna", + "skottkärra", + "baseboll (boll)", + "basketboll", + "vagga", + "badmössa", + "badhandduk", + "kar", + "herrgårdsvagn", + "Båk", + "bägare", + "björnskinnsmössa", + "ölflaska", + "tandemcykel", + "kikare", + "fågelholk", + "båthus", + "bob (sport)", + "bolo (halssmycke)", + "hätta", + "Bokhylla", + "bokhandel", + "flaskkapsyl", + "pilbåge", + "fluga", + "minnestavla", + "behå", + "Hövd", + "bröstharnesk", + "kvast", + "hink", + "bältesspänne", + "Skyddsväst", + "droskbil", + "kittel", + "levande ljus", + "kanon", + "kanot", + "konservöppnare", + "kofta", + "karusell", + "kartong", + "uttagsautomat", + "kassett", + "fästning", + "katamaran", + "CD-spelare", + "violoncell", + "mobiltelefon", + "kedja", + "Gunnebostängsel", + "ringbrynja", + "motorsåg", + "kista (möbel)", + "kommod", + "julstrumpa", + "kyrka", + "biograf", + "geta (sko)", + "kaffekanna", + "rulle", + "Kombinationslås", + "tangentbord", + "konfekt", + "containerfartyg", + "plåtcab", + "korkskruv", + "mungiga", + "cowboyhatt", + "vagga", + "kran", + "motorcykelhjälm", + "spjällåda", + "spjälsäng", + "långsamkokare", + "krycka", + "harnesk", + "damm", + "skrivbord", + "skrivbordsdator", + "blöja", + "digitalur", + "matbord", + "disktrasa", + "diskmaskin", + "Skivbroms", + "docka", + "kälke", + "kupol", + "membranofon", + "trumstock", + "hantel", + "elgitarr", + "ellok", + "konvolut", + "Puder", + "boa (klädesplagg)", + "arkiv", + "brandbåt", + "brandfordon", + "flaggstång", + "tvärflöjt", + "Fällstol", + "gaffeltruck", + "fontän", + "reservoarpenna", + "stolpsäng", + "stekplåt", + "pälsrock", + "sopbil", + "skyddsmask", + "bensinpump", + "bägare", + "golfboll", + "golfbil", + "gondol", + "gonggong", + "flygel", + "växthus", + "livsmedelsbutik", + "giljotin", + "hårsprej", + "Halvbandvagn", + "hammare", + "korg", + "hårtork", + "mobil enhet", + "näsduk", + "munspel", + "harpa", + "lieman", + "yxa", + "fälla", + "styvkjol", + "räck", + "timglas", + "strykjärn", + "Pumpalykta", + "t-tröja", + "pussel", + "Rikscha", + "knäskydd", + "knut", + "laboratorierock", + "slev", + "lampskärm", + "bärbar dator", + "slåtter", + "brevkniv", + "bibliotek", + "tändare", + "Limousin", + "oceanångare", + "läppstift", + "loafers", + "högtalare", + "lupp", + "sågverk", + "manhålslucka", + "xylofon", + "ansiktsmask", + "tändsticka", + "midsommarstång", + "labyrint", + "matmått", + "badrumsskåp", + "megalit", + "mikrofon", + "mikrovågsugn", + "minibuss", + "minikjol", + "minibuss", + "robot (vapen)", + "vante", + "T-Ford", + "modempool", + "kloster", + "moppe", + "Oxfordmössa", + "moské", + "myggnät", + "vespa", + "terrängcykel", + "mus", + "råttfälla", + "spik", + "halsband", + "napp", + "bärbar dator", + "hautboist", + "lergök", + "vägmätare", + "Oljefilter", + "orgel", + "oscilloskop", + "syrgasmask", + "paket", + "paddel", + "skovelhjul", + "hänglås", + "målarpensel", + "pjamas", + "palats", + "panflöjt", + "hushållspapper", + "fallskärm", + "barr", + "parkeringsautomat", + "personvagn", + "altan", + "Mynttelefon", + "piedestal", + "pennskrin", + "pennvässare", + "parfym", + "petriskål", + "fotokopia", + "plektrum", + "pickelhuva", + "staket", + "pickup (fordon)", + "pir", + "spargris", + "kudde", + "kanna", + "hyvel", + "plastkasse", + "Plog", + "vaskrensare", + "direktbildskamera", + "stång", + "piketbuss", + "biljardbord", + "blomkruka", + "drejning", + "bönematta", + "skrivare", + "anstalt (kriminalvård)", + "projektil", + "projektor", + "hockeypuck", + "boxningssäck", + "portmonnä", + "Bläckpenna", + "kviltat täcke", + "klubbor, racketar och slagträn", + "Värmeelement", + "radioteleskop", + "husbil", + "kylskåp", + "fjärrkontroll", + "storhushåll", + "revolvrar", + "gevär", + "gungstol", + "spett (matlagning)", + "rugbyboll", + "linjal", + "sportskor", + "kassaskåp", + "säkerhetsnål", + "saltkar", + "sandaler", + "saxofon", + "slida", + "balansvåg", + "skolbuss", + "skonare", + "skruv", + "skruvmejsel", + "säkerhetsbälte", + "symaskin", + "sköld", + "kundvagn", + "skyffel", + "duschmössa", + "duschdraperi", + "skidor", + "sovsäck", + "räknesticka", + "snöskoter", + "snöplog", + "tvålpump", + "fotboll", + "socka", + "Sombrerohatt", + "mellanslagstangent", + "byggnadsuppvärmning", + "rymdfärja", + "slända", + "sportbil", + "strålkastare", + "platform", + "ånglok", + "bågbro", + "stetoskop", + "Stola", + "stenmur", + "tidtagarur", + "drivhus", + "spårväg", + "bår", + "ubåt", + "kostym", + "solur", + "solglasögon", + "solskyddsmedel", + "hängbro", + "mopp", + "gunga", + "strömbrytare", + "spruta", + "bordslampa", + "stridsvagn", + "tekanna", + "nallebjörn", + "TV", + "tennisboll", + "ridå", + "fingerborg", + "Tröskverk", + "tron", + "brödrost", + "tobakshandlare", + "fackla", + "Totempåle", + "bärgare", + "traktor", + "trailerdragare", + "bricka (köksredskap)", + "trehjuling", + "Stativ", + "triumfbåge", + "trådbuss", + "trombon", + "kar", + "Vändkors", + "paraply", + "enhjuling", + "dammsugare", + "vas", + "valv", + "sammet", + "viadukt", + "fiol", + "volleyboll (boll)", + "våffeljärn", + "väggklocka", + "plånbok", + "skrubbar", + "stridsflygplan", + "tvättställ", + "tvättmaskin", + "vattenflaska", + "vattentorn", + "visselpipa", + "peruk", + "Flaskstorlek", + "vinge", + "wokpanna", + "träsked", + "ull", + "jurta", + "webbsajt", + "seriealbum", + "korsord", + "gatuskylt", + "trafiksignal", + "skyddsomslag", + "matsedel", + "fondue", + "glass", + "isglass", + "kringla", + "ostburgare", + "potatismos", + "blomkål", + "squash (växt)", + "gurka", + "Jadegrön", + "jordgubbsfärg", + "apelsin", + "citron", + "fikon", + "banan", + "granatäpple", + "hö", + "Pasta à la carbonara", + "chokladsås", + "deg", + "köttgrotta", + "pizzaugn", + "taco de harina", + "rödvin", + "Latte inferno", + "ägglikör", + "bubbla", + "klint (landform)", + "korallrev", + "gejser", + "udde", + "havskust", + "dal", + "vulkan", + "brudgum", + "raps", + "tusensköna", + "guckusko", + "ekollon", + "nypon", + "hästkastanj", + "skivlingar", + "stinksvamp", + "Korallticka", + "sopp", + "ax", + "toalettpapper" + ] + ], + "GA": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 13, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 34, + 36, + 37, + 39, + 45, + 48, + 51, + 61, + 62, + 65, + 68, + 69, + 71, + 74, + 78, + 79, + 80, + 81, + 82, + 85, + 86, + 87, + 92, + 94, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 116, + 119, + 120, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 133, + 134, + 137, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 159, + 160, + 162, + 163, + 169, + 170, + 172, + 175, + 177, + 180, + 184, + 187, + 191, + 194, + 199, + 201, + 206, + 211, + 213, + 215, + 217, + 219, + 222, + 226, + 228, + 229, + 233, + 234, + 235, + 236, + 237, + 242, + 243, + 244, + 246, + 247, + 248, + 249, + 251, + 252, + 253, + 254, + 255, + 256, + 258, + 259, + 260, + 261, + 268, + 269, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 307, + 308, + 309, + 310, + 312, + 313, + 314, + 315, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 331, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 362, + 363, + 365, + 366, + 367, + 368, + 371, + 372, + 373, + 375, + 376, + 377, + 379, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 394, + 397, + 398, + 401, + 402, + 403, + 404, + 405, + 407, + 411, + 414, + 415, + 417, + 418, + 420, + 425, + 426, + 428, + 430, + 431, + 432, + 433, + 434, + 435, + 437, + 438, + 447, + 448, + 454, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 467, + 468, + 469, + 470, + 472, + 474, + 476, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 491, + 492, + 497, + 498, + 508, + 510, + 512, + 513, + 516, + 517, + 525, + 526, + 527, + 529, + 532, + 534, + 536, + 538, + 541, + 542, + 543, + 546, + 549, + 551, + 554, + 557, + 558, + 561, + 562, + 563, + 567, + 569, + 570, + 571, + 572, + 577, + 579, + 583, + 587, + 588, + 589, + 591, + 593, + 594, + 597, + 607, + 608, + 609, + 610, + 611, + 615, + 619, + 620, + 621, + 623, + 626, + 628, + 632, + 640, + 642, + 643, + 644, + 649, + 650, + 651, + 657, + 658, + 662, + 665, + 668, + 671, + 673, + 677, + 679, + 681, + 683, + 684, + 687, + 688, + 693, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 704, + 705, + 706, + 708, + 710, + 711, + 713, + 714, + 719, + 721, + 725, + 726, + 728, + 730, + 731, + 738, + 739, + 742, + 743, + 744, + 745, + 748, + 749, + 752, + 755, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 774, + 776, + 777, + 778, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 795, + 797, + 806, + 808, + 810, + 816, + 822, + 823, + 827, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 846, + 847, + 849, + 856, + 857, + 859, + 860, + 861, + 862, + 866, + 867, + 870, + 873, + 874, + 875, + 882, + 883, + 884, + 885, + 887, + 889, + 890, + 893, + 894, + 896, + 897, + 900, + 911, + 916, + 917, + 918, + 919, + 920, + 927, + 928, + 935, + 938, + 939, + 943, + 953, + 957, + 958, + 961, + 963, + 966, + 971, + 972, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 988, + 989, + 994, + 999 + ], + [ + "Cúramán", + "Iasc órga", + "Siorc bán mór", + "siorc tíograch", + "Siorc ceann casúir", + "Roc nimhe", + "roc ga nimhe", + "ostrais", + "Breacán", + "coinnleoir Muire", + "Luachairín", + "Gealóg phlúiríneach", + "smólach imirce", + "Bulbal", + "Scréachóg coille", + "meaig", + "Gabha dubh", + "Cúr", + "iolar maol", + "bultúr", + "Ulchabhán mór", + "Acsalatal", + "Turtar droimleathair", + "tiripín", + "Turtar boscach", + "Ioguána", + "Ollphéist Gila", + "Dragan Chomódó", + "Trícheireatóp", + "Buachrapaire", + "píotón Afracach", + "Nathair mhara", + "nathair shligreach adharcach", + "Tríliopaít", + "Scairp", + "damhán garraí", + "Sceartán", + "céadchosach", + "Liathchearc", + "tarmachan", + "Cearc rufach", + "gearg", + "patraisc", + "Pearóid Afracach", + "beachadóir", + "Dordéan", + "túcán", + "bárdal", + "Síolta rua", + "gé", + "Eala dhubh", + "eicidneach", + "platapas", + "Valbaí", + "cóála", + "vombat", + "smugairle róin", + "bundún leice", + "Leithphéisteanna", + "Néimeatóid", + "Trumpa sliogáin", + "Seilmide", + "Drúchtín", + "ciotón", + "portán carraige Atlantach", + "luaineachán", + "gliomach Meiriceánach", + "Gliomach spíonach", + "Gliomach fionnuisce", + "portán sligreach", + "iseapód", + "Storc bán", + "Storc dubh", + "Leitheadach", + "Lasairéan", + "bonnán", + "Grús", + "Cearc cheannann Mheiriceánach", + "Piardálai trá", + "Breacóg", + "cosdeargán", + "Guilbnín", + "Roilleach", + "Peileacán", + "Rí-phiongain", + "Albatras", + "Míol mór glas", + "Cráin dhubh", + "Dugang", + "Rón mór", + "sí-abhabha", + "Sin Seapánach", + "Measán Máltach", + "Peicinís", + "dronnach Róidéiseach", + "cú Afganastánach", + "Pocadán beag", + "Madra fola", + "Cú faoil Rúiseach", + "cú faoil", + "Fuipéad", + "Madra dobharchú", + "Fiachú", + "tarbh-bhrocaire", + "madra gearr", + "brocaire Yorkshire", + "Brocaire Airedale", + "Brocaire Dandie Dinmont", + "Brocaire Albanach", + "Brocaire slim Astrálach", + "aimseadóir fionnachas", + "Viosla Ungárach", + "Sotar rua", + "Spáinnéar Briotánach", + "Spáinnéar preabach Sasanach", + "spáinnéar feá", + "Cuvascach Ungárach", + "Brióir", + "Comandóir Ungárach", + "Sípéir gallda", + "Gadhar stoic Flóndrach", + "rótvaidhléir", + "madra Alsáiseach", + "pinséir Dobermann", + "pinséir bídeach", + "bocsaeir", + "Tarbhmhaistín", + "Maistín Tibéadach", + "Danar mór", + "ailpíneach", + "huscaí", + "malamútach", + "Dalmátach", + "pinséir ápúil", + "Baiséinseach", + "smutmhadra", + "leoinbeirgeach", + "Madra Thalamh an Éisc", + "Samóideach", + "Madra Pomaránach", + "Seabha-seabha", + "Caesmhadra", + "Madra Meicsiceach Gan Fionnadh", + "madra alla", + "Faolchú mongach", + "Cadhóit", + "diongó", + "Madra fiáin Áiseach", + "Gadhar seilge Afracach", + "Hiéana", + "sionnach", + "sionnach Artach", + "Cat riabhach", + "Cat Peirseach", + "Cat Siamach", + "Cúgar", + "lincse", + "Liopard", + "Liopard sneachta", + "iaguar", + "leon", + "tíogar", + "liopard fiaigh", + "Béar donn", + "béar dubh Meiriceánach", + "Béar bán", + "Mongús", + "Míorchat", + "ciaróg thíograch", + "bó shamraidh", + "Daol", + "ciaróg fhadadharcach", + "Ciaróg duilleog", + "Priompallán", + "gobachán", + "cuileog", + "beach", + "seangán", + "cruicéad", + "cipíneach", + "ciaróg", + "Maintis", + "Preabaire duilleog", + "Snáthaid mhór", + "Béchuil", + "Fáinneog", + "Bleachtfhéileacán", + "crosóg mhara", + "Cuán mara", + "súmaire cladaigh", + "Giorria", + "hamstar", + "Torcán craobhach", + "Iora sionnaigh oirthearach", + "Marmat", + "béabhar", + "Muc ghuine", + "séabra", + "muc", + "torc allta", + "Muc fhaithneach", + "dobhareach", + "Damh", + "buabhall uisce", + "Buabhall Eorpach", + "reithe", + "Caora mhóradharcach", + "hartaibéist", + "iompála", + "gasail", + "dromodaire", + "láma", + "Bláthnaid ghallda", + "Minc", + "cat coille", + "Firéad dúchosach", + "madra uisce", + "broc", + "armadailín", + "Órang-útan", + "goraille", + "simpeansaí", + "Giobún", + "Moncaí patach", + "Babún", + "meacaic", + "Moncaí colabach", + "Moncaí probaisc", + "moncaí marmaisíneach", + "Moncaí uallach", + "moncaí géagach", + "moncaí iorach", + "léamar bandearrach", + "indrídigh", + "Eilifint Indiach", + "Eilifint na hAfraice", + "Panda rua", + "ollphanda", + "Snúc", + "Eascann", + "bradán fearna", + "iasc balún", + "fráma comhairimh", + "cairdín", + "giotár acústach", + "iompróir aerárthaí", + "aerlínéar", + "Aerlong", + "Otharcharr", + "Naprún (éadach)", + "mála lóin", + "Báicéireacht", + "balún", + "peann gránbhiorach", + "bainseo", + "scioból", + "baraiméadar", + "bara", + "cispheil", + "Cliabhán", + "basún", + "bonaid-snàimh", + "tuáille folctha", + "Folcadán", + "teach solais", + "eascra", + "gloiní", + "teachín éan", + "siopa leabhar", + "bogha", + "Carbhat cuachóige", + "cíochbheart", + "tonnchosc", + "uchtphláta", + "scuab", + "buicéad", + "búcla", + "margadh feola", + "Tacsaí", + "coire", + "Coinneal", + "curach", + "cairdeagan", + "timpeallán spraoi", + "meaisín bainc", + "caiséad", + "caisleán", + "Catamarán", + "seinnteoir CDanna", + "dordveidhil", + "fón póca", + "slabhra", + "Sábh slabhrach", + "cófra", + "eaglais", + "pictiúrlann", + "méarchlár", + "Long choimeádáin", + "corcscriú", + "coirnéad", + "cliabhán", + "craein", + "Damba", + "Deasc", + "ríomhaire deisce", + "Clúidín", + "bord seomra bia", + "miasniteoir", + "Duga", + "Cruinneachán", + "Scannánafón", + "bata druma", + "Tromán lúith", + "giotár leictreach", + "clúdach", + "snuaphúdar", + "bád dóiteáin", + "crann brataí", + "fliúit", + "forcardaitheoir", + "scairdeán", + "peann tobair", + "scilléad", + "leoraí bruscair", + "Análaitheoir", + "pumpa peitril", + "cuach", + "Gang", + "mórphianó", + "Gilitín", + "casúr", + "ciseán", + "triomadóir gruaige", + "naipcín póca", + "armónach", + "cruit", + "curra", + "Seán na gealaí", + "brístí géine", + "jíp", + "geansaí", + "míreanna mearaí", + "pillín glún", + "clúdach lampa", + "ríomhaire glúine", + "buainteoir", + "scian pháipéir", + "adhainteoir", + "línéar", + "Callaire", + "clúdach dúnphoill", + "Mairimbe", + "Masc", + "cipín solais", + "Meigilit", + "micreafón", + "oigheann micreathonnach", + "Diúracán treoraithe", + "mitín", + "Móideim", + "Móipéid", + "mosc", + "rothar sléibhe", + "luchóg", + "tairne", + "bráisléad brád", + "ríomhaire glúine", + "óbó", + "ócairín", + "orgán (ceol)", + "ascalascóp", + "céasla", + "glas fraincín", + "scuab phéinte", + "pitseámaí", + "pálás", + "Coinlín ceoil", + "píosa páipéar cistine", + "paraisiút", + "méadar páirceála", + "cóiste paisinéirí", + "paitió", + "seastán", + "Bioróir", + "Cumhrán", + "fótachóipeálaí", + "Figín", + "muicín taisce", + "Piliúr", + "crúsca", + "plána", + "mála plaisteach", + "céachta", + "Suncaire", + "pota bláthanna", + "roth potaire", + "printéir", + "príosún", + "diúracán", + "teilgeoir", + "sparáin", + "Peann cleite", + "raicéad", + "Radaiteileascóp", + "cuisneoir", + "cianrialú", + "bialann", + "gunnán", + "raidhfil", + "cathaoir luasctha", + "Rialóir", + "cuarán", + "sacsafón", + "truaill", + "meá-inneall", + "Scúnar", + "scórchlár", + "scriú", + "scriúire", + "crios sábhála", + "inneall fuála", + "Sciath", + "tralaí siopadóireachta", + "Sluasaid", + "scí", + "mála codlata", + "Stocaí", + "soimbréaró", + "barra spásála", + "fearsaid", + "Banna cruach", + "steiteascóp", + "sorn", + "sínteán", + "Fomhuireán", + "culaith", + "clog gréine", + "Spéaclaí gréine", + "Grianscagaire", + "droichead crochta", + "mapa", + "luascán", + "lasc", + "Steallaire", + "lampa boird", + "Tanc", + "taephota", + "buailteoir", + "Ríchathaoir", + "tóstaer", + "tobacadóir", + "Clár leithris", + "tóirse", + "Tarracóir", + "leoraí altach", + "trírothach", + "áirse an bhua", + "Bus tralaí", + "trombón", + "folúsghlantóir", + "vása", + "Boghta", + "veilbhit", + "éide sagairt", + "fidil", + "liathróid eitpheile", + "sparán", + "prios", + "báisín níocháin", + "meaisín níocháin", + "túr uisce", + "olann", + "suíomh gréasáin", + "Greannán", + "crosfhocal", + "comhartha tráchta", + "solas tráchta", + "traidhfil", + "Uachtar reoite", + "Brúitín", + "cóilis", + "Cúirséad", + "cúcamar", + "anann", + "gránúll", + "féar tirim", + "Taos", + "píotsa", + "fíon dearg", + "boilgeog", + "aill", + "géasar", + "rinn", + "cósta", + "gleann", + "bolcán", + "grúm", + "Ráib", + "dearcán", + "mogóir róis", + "adharc an phúca", + "páipéar leithris" + ] + ], + "BG": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 9, + 10, + 11, + 14, + 15, + 16, + 18, + 20, + 22, + 23, + 24, + 28, + 29, + 30, + 32, + 34, + 37, + 39, + 40, + 42, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 56, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 71, + 75, + 77, + 78, + 79, + 80, + 81, + 87, + 88, + 89, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 117, + 121, + 122, + 123, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 157, + 160, + 162, + 163, + 165, + 169, + 180, + 199, + 201, + 211, + 213, + 215, + 222, + 223, + 224, + 226, + 227, + 228, + 229, + 230, + 231, + 233, + 234, + 235, + 236, + 242, + 243, + 244, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 269, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 319, + 320, + 323, + 327, + 328, + 329, + 330, + 331, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 379, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 393, + 394, + 395, + 397, + 398, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 430, + 432, + 433, + 435, + 436, + 437, + 438, + 439, + 445, + 447, + 450, + 452, + 453, + 454, + 455, + 456, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 494, + 497, + 498, + 499, + 500, + 502, + 506, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 520, + 523, + 524, + 525, + 526, + 527, + 529, + 534, + 536, + 537, + 538, + 541, + 542, + 543, + 546, + 547, + 549, + 551, + 553, + 555, + 557, + 558, + 561, + 562, + 563, + 564, + 567, + 568, + 570, + 572, + 576, + 577, + 578, + 580, + 582, + 583, + 586, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 595, + 597, + 601, + 602, + 604, + 606, + 607, + 608, + 610, + 611, + 612, + 614, + 616, + 618, + 619, + 620, + 621, + 626, + 627, + 628, + 629, + 632, + 633, + 634, + 638, + 639, + 641, + 642, + 643, + 645, + 646, + 647, + 649, + 650, + 651, + 655, + 656, + 657, + 662, + 665, + 668, + 671, + 673, + 674, + 677, + 679, + 680, + 681, + 682, + 683, + 684, + 687, + 688, + 692, + 693, + 695, + 696, + 697, + 698, + 699, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 710, + 711, + 712, + 713, + 714, + 717, + 719, + 721, + 725, + 726, + 730, + 738, + 739, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 753, + 755, + 756, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 770, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 795, + 797, + 798, + 800, + 802, + 803, + 806, + 808, + 810, + 811, + 812, + 816, + 817, + 818, + 819, + 820, + 822, + 823, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 839, + 840, + 841, + 843, + 844, + 845, + 847, + 849, + 850, + 855, + 856, + 857, + 859, + 862, + 866, + 867, + 870, + 872, + 873, + 874, + 875, + 879, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 893, + 894, + 895, + 896, + 897, + 900, + 902, + 903, + 909, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 924, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 948, + 952, + 953, + 957, + 958, + 959, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 984, + 986, + 988, + 989, + 996, + 998, + 999 + ], + [ + "лин", + "златна рибка", + "голяма бяла акула", + "тигрова акула", + "Акули чук", + "електрически скатове", + "щраус", + "планинска чинка", + "кадънка", + "индигова пасерина", + "Ръждивогуш дрозд", + "бюлбюлови", + "сврака", + "водни косове", + "белоглав орел", + "лешояд", + "брадата улулица", + "жълтопетниста амбистома", + "аксолотъл", + "Жаба бик", + "опашати жаби", + "кожестата костенурка", + "кутиести костенурки", + "зелена игуана", + "Анолисови", + "агами", + "зелен гущер", + "Chamaeleo aegyptius", + "комодски варан", + "нилски крокодил", + "американски алигатор", + "трицератопси", + "Calamaria amoena", + "Кралски змии", + "панделковидни змии", + "Боа удушвач", + "скален питон", + "индийска кобра", + "морски змии", + "двурога пепелянка", + "рогата гърмяща змия", + "трилобити", + "скорпиони", + "черна вдовица", + "тарантула", + "кърлежи", + "стоножки", + "тетрев", + "бяла яребица", + "жако", + "ара", + "голямо жълтокачулато какаду", + "Пчелоядови", + "носорогови птици", + "колибри", + "галбулови", + "тукан", + "паток", + "среден нирец", + "гъска", + "черен лебед", + "ехидни", + "птицечовка", + "валаби", + "коала", + "вомбати", + "медуза", + "актиния", + "плоски червеи", + "кръгли червеи", + "Градински охлюв", + "гол охлюв", + "голохрили охлюви", + "Панцерни мекотели", + "Бисерен наутилус", + "кралски раци", + "американски омар", + "Гърбати омари", + "раци отшелници", + "бял щъркел", + "черен щъркел", + "лопатарки", + "фламинго", + "голям воден бик", + "жерав", + "Арама", + "Американска лиска", + "дропла", + "камъкообръщач", + "тъмногръд брегобегач", + "червенокрак водобегач", + "стридояди", + "пеликан", + "кралски пингвин", + "албатросови", + "сив кит", + "косатка", + "дюгон", + "морски лъвове", + "Чихуахуа", + "Японски хин", + "Малтийска болонка", + "пекинез", + "Папийон", + "афганска хрътка", + "Бигъл", + "Блъдхаунд", + "черно-кафяв кунхаунд", + "Борзой", + "Питбул", + "Шотландски териер", + "австралийски копринен териер", + "унгарска визла", + "Ирландски сетер", + "Бретански шпаньол", + "Кувас", + "шиперке", + "Белгийска овчарка Грьонендал", + "Бриар", + "Австралийско келпи", + "Комондор", + "Староанглийска овчарка", + "Шетландска овчарка", + "коли", + "фландърско бувие", + "Ротвайлер", + "немска овчарка", + "Доберман", + "боксер", + "Булмастиф", + "тибетски мастиф", + "немски дог", + "Санбернар", + "хъски", + "аляски маламут", + "сибирско хъски", + "далматин", + "афенпинчер", + "мопс", + "нюфаундленд (куче)", + "Пиренейско планинско куче", + "Самоед", + "померан", + "Чау-чау", + "вълчи шпиц", + "вълк", + "Червен вълк", + "койот", + "динго", + "азиатско диво куче", + "хиеново куче", + "хиени", + "лисица", + "полярна лисица", + "сива лисица", + "Таби", + "персийска котка", + "сиа́мска ко́тка", + "пума", + "рис", + "леопард", + "сне́жен леопа́рд", + "ягуар", + "лъв", + "тигър", + "гепард", + "кафява мечка", + "американска черна мечка", + "бяла мечка", + "мангустови", + "сурикат", + "калинка", + "бегачи", + "Сечковци", + "листояди", + "хоботни бръмбари", + "муха", + "пчели", + "мравки", + "скакалец", + "щурец", + "хлебарка", + "богомолки", + "жътвар", + "разнокрили", + "равнокрили водни кончета", + "пеперуда монарх", + "морски звезди", + "морски таралежи", + "Морски краставици", + "американски зайци", + "зайци", + "хомяковидни", + "бодливо прасе", + "лисича катерица", + "мармот", + "бобър", + "Морско свинче", + "зебра", + "свиня", + "ди́ва свиня́", + "брадавичеста свиня", + "хипопотам", + "Вол", + "Домашен бивол", + "бизони", + "ове́н", + "Дебелорог овен", + "алпийски козирог", + "обикновен бубал", + "импала", + "газела", + "едногъ́рба ками́ла", + "лама (животно)", + "порове", + "норка", + "черен пор", + "пор", + "видрови", + "язовец", + "бронено́сец", + "трипръст ленивец", + "борнейски орангутан", + "горила", + "шимпанзе", + "гибон", + "Сиаманг", + "гвенон", + "патас", + "павиани", + "макаци", + "тънкотели маймуни", + "колобуси", + "Дългоноса маймуна", + "Ревачи", + "коата на Жофроа", + "обикновена саймири", + "котешки лемур", + "индри", + "Индийски слон", + "Африкански слонове", + "червена панда", + "Голяма панда", + "баракуда", + "змиорка", + "Сребриста сьомга", + "Риби Клоун", + "Есетрови", + "леписостиди", + "риба-таралеж", + "сметало", + "хармоника", + "акустична китара", + "Самолетоносач", + "пътнически самолет", + "Дирижабъл", + "Линейка", + "Кола-амфибия", + "пчели́н", + "прести́лка", + "кофа за боклук", + "автома́т", + "раница", + "пека́рна", + "греда (гимнастика)", + "балон", + "химикалка", + "Банджо", + "пери́ло", + "щтанга", + "Земеделски постройки", + "барометър", + "бъчва", + "ръчна количка", + "баскетбо́л", + "фагот", + "Плувна шапка", + "Вана", + "Комби", + "фар", + "бехерова чаша", + "ки́вер", + "бики́ни", + "бинокъл", + "бобслей", + "боне", + "библиотека (мебел)", + "книжарница", + "запушалка", + "лък", + "табелка", + "сутиен", + "Вълнолом", + "нагръ́дник", + "метла́", + "ко́фа", + "катарама", + "бронежилетка", + "такси", + "коте́л", + "свещ", + "кану", + "Жилетка", + "въртележка", + "кашон", + "банкома́т", + "касе́та", + "замъкIкрепост", + "катамаран", + "виолончело", + "мобѝлен телефо̀н", + "вери́га", + "Ризница", + "верижен трион", + "кути́я", + "скрин", + "камбанки", + "черква", + "киносалон", + "сатър", + "Скално жилище", + "налъм", + "намо́тка", + "клавиатура", + "Сладкарница", + "контейнеровоз", + "кабриолет", + "тирбушон", + "тромпет", + "каубойски ботуши", + "Каубойска шапка", + "лю́лка", + "кран", + "де́тско крева́тче", + "Патерици", + "кираса", + "бент", + "бюро", + "Настолен компютър", + "Пелена", + "съдомиялня", + "Корабен док", + "Кучешки впряг", + "купол", + "Мембранофон", + "палка", + "Дъмбел", + "електрическа китара", + "електрически локомотив", + "плик", + "Пудра", + "папка", + "Пожарна кола", + "флагщо́к", + "флейта", + "Мотокар", + "фонтан", + "писалка", + "легло с балдахин", + "тиган", + "кожухарство", + "противогаз", + "чаша със столче", + "гондола", + "гонг", + "Рокля", + "парник", + "бакали́я", + "гилотина", + "Полуверижна машина", + "чук", + "кошница с капак", + "сешоар", + "мобилно устройство", + "къ́рпичка", + "устна хармоника", + "арфа", + "Жътварка", + "Кобур", + "кринолин", + "висилка", + "Пясъчен часовник", + "ютия", + "Тиквен фенер", + "джи́нси", + "тениска", + "пъзел", + "Рикша", + "Кимоно", + "Възел", + "черпа́к", + "абажур", + "лаптоп", + "косене", + "Запалка", + "лимузина", + "Лайнер", + "Червило", + "Високоговорител", + "лупа", + "Дъскорезница", + "трико", + "бански костюм", + "Маракаси", + "ксилофон", + "маска", + "Майско дърво", + "лабиринт", + "мерителна чаша", + "мегалит", + "микрофон", + "микровълнова фурна", + "минижуп", + "многофункционален автомобил", + "ракетно оръжие", + "Модем", + "мотопедIскутер", + "джамия", + "Планински велосипед", + "мишка", + "капан за мишки", + "пирон", + "колие́", + "биберон", + "лаптоп", + "обелиск", + "Обой", + "Окарина", + "орган", + "осцилоскоп", + "паке́тче", + "лопа́та", + "катина́р", + "че́тка", + "пижама", + "Дворец", + "панфлейта", + "парашу́т", + "мъжка успоредка", + "паркометър", + "вагон", + "тераса", + "телефонен автомат", + "пиедестал", + "Острилка", + "Парфюм", + "Блюдо на Петри", + "ксероко́пия", + "Перце", + "пикап", + "Касичка за монети", + "възглавница", + "Стомна", + "Ренде", + "Плуг", + "сакси́я", + "грънчарско колело", + "принтер", + "Затвор", + "проектил", + "прое́ктор", + "ша́йба", + "боксов чувал", + "кеси́я", + "перо (инструмент)", + "кувертюра", + "Радиатор", + "радиотелескоп", + "бъчва за дъждовна вода", + "кемпер", + "хладилник", + "дистанцио́нно управле́ние", + "рестора́нт", + "револвер", + "пу́шка", + "люлка", + "лини́йка", + "маратонки", + "сейф", + "Безопасна игла", + "со́лница", + "Сандал", + "саксофон", + "ножница", + "везни (уред)", + "Шхуна", + "табло", + "винт", + "отвертка", + "предпазен колан", + "ше́вна маши́на", + "щит", + "количка", + "Лопата", + "Ски (екипировка)", + "спален чувал", + "Сметачна линия", + "монетен автомат", + "Снегоход", + "Снегорин", + "чорап", + "Сомбреро", + "интервал", + "Отопление", + "совалка", + "врете́но", + "спортен автомобил", + "проже́ктор", + "сцена", + "парен локомотив", + "Стоманен барабан", + "стетоскоп", + "печка", + "трамвай", + "носи́лка", + "подводница", + "костюм", + "слъ́нчев часо́вник", + "слънчеви очила", + "висящ мост", + "подочиста́чка", + "суитър", + "люлка", + "ключ (електротехника)", + "шприц", + "танк", + "чайник", + "Плюшено мече", + "Напръстник", + "върша́чка", + "трон", + "тостер", + "фа́кел", + "влека́ч", + "Полуремарке", + "триколка", + "статив (техника)", + "Триумфална арка", + "тролейбус", + "тромбон", + "Чадър", + "Едноколесен велосипед", + "прахосмукачка", + "ваза", + "свод", + "кадифе", + "виадукт", + "цигулка", + "портмоне́", + "килер", + "Военен самолет", + "мивка", + "перална машина", + "водонапорна кула", + "свирка", + "перука", + "уок", + "вълна", + "Юрта", + "уебсайт", + "Комиксово списание", + "Кръстословица", + "пъ́тен знак", + "светофар", + "Гуакамоле", + "Сладолед", + "Ледена близалка", + "Бейгъл", + "брецел", + "чийзбургер", + "картофено пюре", + "карнаби́т", + "тиквичка", + "краставица", + "Грени Смит", + "смокиня", + "ананас", + "нар", + "сено́", + "Паста Карбонара", + "Тесто", + "Месно руло", + "пица", + "бурито", + "червено вино", + "еспресо", + "Ег-ног", + "мехур", + "клиф", + "коралов риф", + "гейзер", + "синур", + "крайбрежие", + "долина", + "вулкан", + "рапица", + "дребноцветна пантофка", + "жълъд", + "ши́пка", + "Възседурка", + "клас", + "Тоалетна хартия" + ] + ], + "VI": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 15, + 16, + 20, + 22, + 23, + 24, + 28, + 29, + 30, + 34, + 36, + 37, + 39, + 40, + 42, + 45, + 48, + 49, + 50, + 51, + 61, + 62, + 63, + 65, + 69, + 71, + 72, + 77, + 78, + 79, + 80, + 82, + 85, + 87, + 88, + 89, + 91, + 92, + 93, + 94, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 113, + 114, + 115, + 116, + 117, + 120, + 122, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 157, + 162, + 163, + 164, + 165, + 172, + 175, + 177, + 180, + 191, + 194, + 199, + 201, + 211, + 213, + 215, + 217, + 222, + 224, + 227, + 228, + 229, + 230, + 233, + 235, + 236, + 242, + 243, + 244, + 247, + 248, + 249, + 250, + 251, + 252, + 254, + 256, + 257, + 259, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 305, + 306, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 335, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 362, + 363, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 375, + 376, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 391, + 393, + 394, + 395, + 397, + 398, + 401, + 403, + 404, + 405, + 407, + 408, + 411, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 425, + 426, + 427, + 428, + 429, + 430, + 432, + 435, + 437, + 438, + 445, + 447, + 450, + 453, + 454, + 456, + 457, + 459, + 460, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 485, + 486, + 487, + 488, + 489, + 491, + 492, + 497, + 498, + 499, + 502, + 505, + 508, + 509, + 510, + 512, + 513, + 516, + 517, + 520, + 521, + 525, + 527, + 529, + 530, + 534, + 535, + 538, + 541, + 542, + 546, + 549, + 551, + 553, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 567, + 570, + 576, + 577, + 580, + 582, + 583, + 585, + 587, + 589, + 590, + 591, + 593, + 594, + 602, + 604, + 606, + 607, + 608, + 610, + 611, + 612, + 614, + 616, + 618, + 619, + 620, + 621, + 626, + 628, + 629, + 631, + 632, + 642, + 643, + 644, + 646, + 649, + 650, + 651, + 657, + 662, + 665, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 681, + 683, + 687, + 688, + 691, + 692, + 693, + 696, + 697, + 698, + 701, + 702, + 706, + 707, + 708, + 710, + 711, + 712, + 713, + 717, + 719, + 721, + 726, + 728, + 730, + 736, + 742, + 743, + 745, + 748, + 752, + 753, + 755, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 795, + 797, + 798, + 806, + 810, + 816, + 817, + 819, + 820, + 823, + 824, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 844, + 845, + 847, + 849, + 850, + 852, + 857, + 859, + 860, + 862, + 865, + 866, + 867, + 870, + 873, + 874, + 879, + 880, + 882, + 883, + 885, + 889, + 893, + 894, + 895, + 896, + 897, + 900, + 903, + 909, + 911, + 916, + 917, + 918, + 919, + 920, + 926, + 928, + 929, + 931, + 933, + 935, + 938, + 939, + 943, + 957, + 958, + 962, + 963, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 984, + 986, + 989, + 999 + ], + [ + "Cá chép nhớt", + "Cá vàng", + "Cá mập trắng lớn", + "Cá mập báo", + "Họ Cá nhám búa", + "Bộ Cá đuối điện", + "Cá đuối ó", + "đà điểu", + "Sẻ núi", + "Sẻ thông vàng châu Âu", + "Chim cổ đỏ", + "Họ Chào mào", + "Họ Lội suối", + "đại bàng đầu trắng", + "Kền kền", + "Hù xám lớn", + "Kỳ giông đốm vàng", + "Kỳ giông Mexico", + "Ếch ương beo", + "Rùa da", + "Rùa đầm", + "Rùa hộp Bắc Mỹ", + "kỳ nhông", + "Thằn lằn Carolina", + "Thằn lằn Agama", + "Quái vật Gila", + "Rồng Komodo", + "Cá sấu sông Nin", + "Cá sấu mõm ngắn Mỹ", + "Diceratus", + "Trăn xiết mồi", + "Trăn đá châu Phi", + "Rắn hổ mang Ấn Độ", + "Rắn biển", + "Bọ ba thùy", + "Bọ cạp", + "Zwartgele argiope", + "nhện sói", + "Ve (ký sinh)", + "Rết", + "Gà gô đen", + "Bonasa umbellus yukonensis", + "chim cút", + "Vẹt xám châu Phi", + "Vẹt Macaw", + "Cacatua galerita galerita", + "Chi Bìm bịp", + "Họ Trảu", + "Họ Hồng hoàng", + "Họ Chim ruồi", + "Vịt cát ngực đỏ", + "ngỗng", + "Thiên nga đen", + "thú lông nhím", + "Thú mỏ vịt", + "Chuột túi Wallaby", + "gấu túi", + "gấu túi mũi trần", + "sứa", + "Bộ Hải quỳ", + "San hô não", + "Giun dẹp", + "giun tròn", + "ốc", + "Sên lãi", + "Sên biển", + "Ốc song kinh", + "Ốc anh vũ", + "Còng", + "Tôm hùm Mỹ", + "Họ Tôm hùm không càng", + "Tôm hùm đất", + "cua ẩn sĩ", + "Hạc trắng", + "Hạc đen", + "Chi Cò thìa", + "hồng hạc", + "con hạc", + "Aramus", + "Fulica americana americana", + "Họ Ô tác", + "Dẽ khoang", + "Dẽ trán trắng", + "Choắt nâu", + "bồ nông", + "cánh cụt vua", + "Họ Hải âu mày đen", + "cá voi xám", + "cá voi sát thủ", + "Cá cúi", + "Sư tử biển", + "Chihuahua (chó)", + "Chó Nhật", + "Chó Malta", + "Chó Bắc Kinh", + "Chó bướm", + "Chó săn thỏ", + "Chó đánh hơi", + "Chó săn gấu mèo lam", + "Chó săn gấu mèo nâu đen", + "Chó Whippet", + "Chó Săn rái cá", + "Chó săn hươu Scotland", + "Chó Pit Bull", + "Chó sục Airedale", + "Chó sục Dandie Dinmont", + "Chó sục Scotland", + "Chó sục lông mượt Úc", + "Chó Vizsla", + "Setter Ái Nhĩ Lan", + "Chó Anh", + "Chó Springer Spaniel Anh Quốc", + "Chó Kuvasz", + "Chó Groenendael", + "Chó chăn cừu Kelpie Úc", + "Chó Komondor", + "Chó chăn cừu Anh Quốc", + "Chó chăn cừu Shetland", + "Chó chăn gia súc Flanders", + "Chó chăn cừu Đức", + "Chó Dobermann", + "Chó võ sĩ", + "Chó ngao Bun", + "chó ngao Tây Tạng", + "St. Bernard (chó)", + "Chó Husky", + "Alaska Malamute", + "husky Siberi", + "Chó đốm", + "Chó Affenpinscher", + "Chó Pug", + "Chó Newfoundland", + "Chó núi Pyrenees", + "Chó Phốc sóc", + "chó sói", + "Sói đài nguyên Alaska", + "Sói bờm", + "Sói đồng cỏ", + "Chó Dingo", + "Sói lửa", + "chó hoang châu Phi", + "linh cẩu", + "cáo", + "Cáo Bắc Cực", + "Cáo xám", + "Mèo vằn", + "Mèo Ba Tư", + "Mèo Xiêm", + "báo sư tử", + "linh miêu", + "báo hoa mai", + "báo tuyết", + "báo", + "sư tử", + "kễnh", + "báo săn", + "Gấu nâu", + "Gấu đen Bắc Mỹ", + "gấu Bắc Cực", + "Họ Cầy lỏn", + "cầy vằn bụng đỏ", + "nhu-nhược", + "Họ Bọ chân chạy", + "Họ Xén tóc", + "Họ Ánh kim", + "Bọ hung", + "Kiến dương", + "Ruồi", + "ong", + "Kiến", + "châu chấu", + "con dế", + "bọ que", + "Gián", + "bọ ngựa", + "con ve sầu", + "Họ Rầy xanh", + "Chuồn chuồn ngô", + "Chuồn chuồn kim", + "Bướm vua", + "sao biển", + "Cầu gai", + "Hải sâm", + "Thỏ đồng", + "Thỏ Angora", + "Chuột hamster", + "nhím", + "Sóc cáo miền Đông", + "hải ly", + "chuột lang nhà", + "Ngựa vằn", + "lợn", + "lợn rừng", + "Lợn nanh sừng châu Phi", + "lợn nước", + "bò đực thiến", + "trâu", + "Bò rừng bizon", + "cừu đực", + "Cừu sừng lớn", + "Dê núi Alps", + "linh dương sừng cao", + "Linh dương Gazelle", + "lạc đà một bướu", + "lạc đà không bướu", + "Chi Chồn", + "Chồn nhỏ", + "Chồn hôi châu Âu", + "Chồn chân đen", + "rái cá", + "Lửng", + "tatu", + "đười ươi", + "khỉ đột", + "tinh tinh", + "Vượn tay trắng", + "Vượn mực", + "Erythrocebus", + "Khỉ đầu chó", + "khỉ", + "Phân họ Khỉ ngón cái ngắn", + "Khỉ Colobus đen trắng", + "Khỉ vòi", + "Khỉ rú", + "Callicebus", + "Ateles geoffroyi azuerensis", + "Khỉ sóc thông thường", + "Vượn cáo đuôi vòng", + "Indri indri variegatus", + "Voi châu Á", + "Voi châu Phi", + "gấu trúc đỏ", + "gấu trúc lớn", + "cá chình", + "Cá hồi Coho", + "Cá hề", + "Họ Cá tầm", + "Bộ Cá láng", + "cá bóng", + "Bàn tính", + "đàn xếp", + "hàng không mẫu hạm", + "máy bay dân dụng", + "điều khiển được", + "xe cứu thương", + "Xe lội nước", + "tạp dề", + "Súng trường tấn công", + "ba lô", + "tiệm bánh", + "Cầu thăng bằng", + "Khí cầu", + "bút bi", + "đàn banjô", + "thanh vịn", + "lẫm", + "áp kế", + "Thùng tô nô", + "Xe rùa", + "quả bóng chày", + "Quả bóng rổ", + "kèn dăm kép", + "bồn tắm", + "Hải đăng", + "Cốc becher", + "áo tắm hai mảnh", + "Ống nhòm", + "xe trượt lòng máng", + "tủ sách", + "hiệu sách", + "cung", + "Nơ bướm", + "cái xú chiên", + "đê chắn sóng", + "Chổi", + "Xô", + "khóa", + "Áo chống đạn", + "tắc xi", + "Vạc (vật dụng)", + "nến", + "xuồng", + "đồ khui hộp", + "Cardigan (áo)", + "trò kéo quân", + "hộp", + "máy rút tiền tự động", + "cát-xét", + "lâu đài", + "Máy nghe đĩa CD", + "vi-ô-lông-xen", + "điện thoại cầm tay", + "xích", + "Lưới B40", + "Máy cưa xích", + "hòm", + "nhà thờ", + "rạp chiếu phim", + "Dao phay", + "Geta (guốc)", + "cà phê nồi", + "bàn phím", + "Cửa hàng bánh kẹo", + "Tàu container", + "tóc xoắn", + "kèn coonê", + "nôi", + "Cần trục", + "nôi", + "Nồi hầm", + "Đập", + "máy tính để bàn", + "Tã", + "Đồng hồ kỹ thuật số", + "máy rửa bát", + "đĩa thắng", + "kiến trúc vòm", + "trống", + "dùi trống", + "guitar điện", + "phong bì", + "Phấn phủ", + "tập tin", + "Xe cứu hỏa", + "cột cờ", + "sáo ngang", + "Ghế gấp", + "Xe nâng hạ", + "đài phun nước", + "bút máy", + "Chảo rán", + "mặt nạ khí", + "gonđon", + "cồng", + "Nhà kính", + "cửa hàng tạp hóa", + "Máy chém", + "Gôm xịt tóc", + "búa", + "Máy sấy tóc", + "máy tính di động", + "khăn tay", + "khẩu cầm", + "đàn harp", + "Xà đơn", + "Đồng hồ cát", + "bàn ủi", + "Jack-o'-latern", + "quần jeans", + "Áo thun", + "Trò chơi ghép hình", + "xe kéo", + "Hòa phục", + "Nút dây", + "cái giá", + "chụp đèn", + "máy tính xách tay", + "Máy cắt cỏ", + "lửa", + "Tàu hàng hải", + "Son môi", + "Sữa dưỡng thể", + "máy phát thanh", + "mộc cầm", + "mặt nạ", + "que diêm", + "Mê cung", + "cự thạch", + "micrô", + "Lò vi ba", + "Đạn tự hành", + "bộ điều giải", + "xe đạp điện", + "nhà thờ Hồi giáo", + "mùng", + "Xe tay ga", + "xe đạp leo núi", + "chuột", + "bẫy chuột", + "đinh", + "chuỗi hạt", + "máy tính xách tay", + "kèn ôboa", + "đàn ống", + "máy hiện sóng", + "mặt nạ oxy", + "gói", + "chèo", + "Cọ vẽ", + "pijama", + "cung điện", + "Dù nhảy", + "Xà kép", + "Sân thượng", + "điện thoại công cộng", + "bệ", + "Gọt bút chì", + "nước hoa", + "Đĩa Petri", + "máy sao chụp tự động", + "xe bán tải", + "lợn bỏ ống", + "Gối", + "Bào (dụng cụ)", + "Túi nylon", + "cày", + "Bàn bida", + "máy in", + "Nhà tù", + "Máy chiếu", + "ví", + "Vợt (thiết bị thể thao)", + "Bộ tản nhiệt", + "kính viễn vọng vô tuyến", + "Tủ lạnh", + "điều khiển", + "nhà hàng", + "Súng ngắn ổ xoay", + "súng trường", + "ghế rocking", + "Thước", + "Giày thể thao", + "két sắt", + "Kim băng", + "lọ rắc muối", + "dép quai hậu", + "xà rông", + "xắc xô", + "vỏ", + "cân", + "ốc vít", + "chìa vít", + "dây an toàn", + "máy khâu", + "khiên", + "cửa hàng giày", + "giỏ hàng", + "Xẻng", + "ván trượt tuyết", + "túi ngủ", + "Thước loga", + "tất", + "phím dài", + "cọc", + "Xe thể thao", + "sân khấu", + "đầu máy xe lửa hơi nước", + "Ống nghe", + "Dây Stola", + "lò", + "tàu điện", + "băng ca", + "tháp", + "Tàu ngầm", + "Com lê", + "Đồng hồ Mặt Trời", + "kính râm", + "kem chống nắng", + "cầu treo dây võng", + "cán lau nhà", + "đóng ngắt", + "ống tiêm", + "xe tăng", + "Ấm trà", + "Gấu bông", + "quả bóng quần vợt", + "Ngai vàng", + "máy nướng bánh mì", + "Người bán thuốc lá", + "ngọn đuốc", + "cửa hàng đồ chơi", + "máy kéo", + "xe moóc kéo", + "xe ba bánh", + "khải hoàn môn", + "Xe điện bánh hơi", + "Ô (vật dụng)", + "xe đạp một bánh", + "Máy hút bụi", + "lọ", + "nhung", + "vĩ cầm", + "ví", + "Phòng thay đồ trong nhà", + "máy bay quân sự", + "la-va-bô", + "máy giặt", + "Tháp nước", + "Tóc giả", + "chảo", + "len", + "trang web", + "sách tranh", + "Trò chơi ô chữ", + "biển báo giao thông", + "Đèn giao thông", + "Lẩu", + "kem", + "Kem que", + "Bánh mì vòng", + "Hamburger pho mát", + "Khoai tây nghiền", + "hoa lơ", + "bí ngòi", + "dưa chuột", + "lựu", + "Cỏ khô", + "Giò", + "bánh pizza", + "rượu vang đỏ", + "cà phê espresso", + "Cocktail trứng sữa", + "bong bóng", + "Bờ biển dốc", + "Rạn san hô", + "Mạch nước phun", + "bờ biển", + "thung lũng", + "Núi lửa", + "Cải dầu", + "Cypripedium parviflorum makasin", + "Quả tầm xuân", + "giấy đi cầu" + ] + ], + "SD": [ + [ + 23, + 39, + 71, + 78, + 85, + 86, + 103, + 115, + 130, + 270, + 276, + 291, + 292, + 293, + 294, + 298, + 308, + 309, + 310, + 319, + 340, + 341, + 346, + 347, + 372, + 373, + 388, + 398, + 401, + 412, + 435, + 462, + 463, + 469, + 487, + 497, + 525, + 554, + 558, + 563, + 606, + 612, + 620, + 710, + 721, + 725, + 728, + 730, + 760, + 765, + 779, + 786, + 806, + 819, + 833, + 866, + 916, + 917, + 962, + 971, + 980 + ], + [ + "ڳجھ", + "ڳوهه", + "وڇون", + "چچڙ", + "ٻٽيرو", + "تتر (پکي)", + "پليٽيپس", + "سامونڊي گھوگھيتو", + "لاکيڄاڃي‎", + "گرگ", + "چراخ", + "ببر شينهن", + "واگھُ‎", + "چيتو", + "ڀورو رڇ", + "نور", + "مک", + "مک‎", + "ڪول", + "بنڀوري", + "زيبرا", + "سوئر", + "مينهن", + "جھنگلي مينھن", + "ببون", + "مڪاڪ ڀولڙو", + "پانڊا", + "ڪمپيوٽر تعارف", + "اڪارڊين", + "ڪچريدان", + "وھنجڻ وارو ٽب", + "ٻھارو", + "بالٽي", + "ديڳ", + "موبائل فون", + "گرجا گهر", + "بند", + "آگبوٽ", + "بانسري", + "فائونٽين پين", + "استري", + "رڪشو", + "ليپٽاپ", + "پينسل سانچو", + "وهاڻو", + "بدنو", + "پلاسٽڪ ڳوٿري", + "هر", + "فرج", + "آرام ڪرسي", + "اسڪول بس", + "سلائي مشين", + "جوراب", + "منچ", + "آبدوز", + "ٽرئڪٽر", + "ويب سائيٽ", + "مزاحي ڪتاب", + "گوشت واري ڊبل روٽي", + "بدبدو‎", + "آتش فشان" + ] + ], + "UR": [ + [ + 2, + 3, + 4, + 5, + 9, + 16, + 23, + 48, + 54, + 71, + 79, + 85, + 88, + 99, + 103, + 105, + 106, + 107, + 108, + 113, + 122, + 128, + 134, + 138, + 146, + 148, + 234, + 235, + 252, + 269, + 276, + 277, + 279, + 284, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 296, + 298, + 309, + 310, + 312, + 314, + 319, + 320, + 323, + 327, + 332, + 333, + 334, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 352, + 353, + 354, + 360, + 362, + 381, + 384, + 385, + 386, + 388, + 398, + 399, + 403, + 404, + 405, + 407, + 408, + 412, + 415, + 418, + 426, + 427, + 430, + 437, + 445, + 447, + 456, + 459, + 462, + 463, + 468, + 470, + 472, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 492, + 497, + 498, + 508, + 511, + 513, + 517, + 525, + 527, + 529, + 530, + 538, + 541, + 547, + 549, + 551, + 558, + 567, + 580, + 587, + 590, + 591, + 594, + 604, + 606, + 608, + 610, + 612, + 614, + 620, + 629, + 632, + 643, + 650, + 651, + 657, + 662, + 665, + 668, + 670, + 673, + 677, + 679, + 685, + 687, + 688, + 695, + 697, + 698, + 701, + 706, + 708, + 710, + 711, + 713, + 721, + 725, + 730, + 739, + 741, + 742, + 743, + 744, + 748, + 753, + 755, + 760, + 762, + 764, + 768, + 771, + 774, + 776, + 778, + 779, + 783, + 784, + 786, + 787, + 792, + 795, + 797, + 806, + 816, + 820, + 829, + 830, + 833, + 834, + 844, + 845, + 847, + 862, + 866, + 879, + 882, + 883, + 885, + 889, + 893, + 895, + 897, + 911, + 915, + 916, + 928, + 932, + 938, + 943, + 953, + 957, + 963, + 967, + 971, + 973, + 978, + 979, + 980, + 988 + ], + [ + "عظیم سفید شارک", + "ٹائیگر شارک", + "ہیمرہیڈ شارک", + "برق مچھلی", + "شترمرغ‎", + "بلبل‎", + "گدھ", + "کوموڈو ڈریگن", + "تھوتھنی سانپ", + "بچھو", + "کَنْکَھجُورا‎", + "بٹیر", + "مکاؤ (پرندہ)", + "ہنس", + "ڈک بل", + "کوآلا", + "ومباٹ", + "جیلیفش", + "سمندری شقائق", + "گھونگھا", + "امریکی لابسٹر", + "سیاہ سارس", + "کونج", + "تلور", + "البٹراس", + "قاتل حوت", + "روٹویلر", + "جرمن شیفرڈ", + "ایفنپنسر", + "بھیڑیا", + "لگڑبھگا", + "لومڑی", + "قطبی لومڑ", + "سیامی بلی", + "تیندوا", + "برفانی چیتا‎", + "جیگوار", + "شیر‎", + "شیر", + "چیتا", + "بھورا ریچھ", + "قطبی ریچھ", + "نیولا", + "مکھی", + "چیونٹی", + "جھینگر‎", + "لال بیگ", + "بھنبھیری", + "کابلی مکھی", + "مونارک تتلیاں", + "تارا مچھلی", + "انگورہ خرگوش", + "ہیمسٹر", + "سیہہ", + "زیبرا", + "سور", + "جنگلی سور", + "دریائی گھوڑا", + "بیل", + "بھینس", + "بائسن", + "امپالا", + "غزال", + "سانڈنی‎", + "اودبلاؤ‎", + "بجو", + "اسپایئڈر بندر", + "اندری", + "ایشیائی ہاتھی", + "افریقی ہاتھی", + "دیوقامت پانڈا", + "گنتارا", + "عبایہ", + "طیارہ بردار بحری جہاز", + "مسافر بردار طیارہ", + "ہواکشتی", + "مطوف", + "برآبی ناقل", + "کوڑے کا سمانا", + "بیکری‎", + "بال پوائنٹ پین", + "بھارپیما", + "بیرل", + "باسکیٹ بال‎", + "منارہ‎", + "بکنی‎", + "دوربین‎", + "دھنش", + "سینہ بند", + "جھاڑو‎", + "بالٹی", + "ٹیکسی‎", + "موم بتی‎", + "کشتی", + "خودکار نقدشماری آلہ", + "کیسِٹ‎", + "قلعہ", + "چوبی کشتی", + "وائلن نما ساز‎", + "محمول", + "زنجیر‎", + "صندوق‎", + "کنیسہ", + "فلم تھیٹر", + "تختۂ کلید", + "متحول سیار", + "ترم", + "کرین", + "بَنْد‎", + "برمیزی شمارندہ", + "ڈائپر", + "رقمی گھنٹا", + "گنبد", + "ڈرم‎", + "برقی ناقلہ", + "لفافہ‎", + "غازہ", + "بانسری‎", + "کڑاہی‎", + "نبات خانہ", + "ہتوڑا", + "محمول اختراعات", + "رومال", + "بربط‎", + "ریت گھڑی", + "استری‎", + "جینس‎", + "ٹی شرٹ", + "رکشہ‎", + "کیمونو", + "لیپ ٹاپ", + "لپ اسٹک", + "بلندگو", + "ماسک", + "مائیکروفون", + "خردموجی چولھا", + "میزائل", + "تضمیلاصہ", + "موپڈ", + "مسجد‎", + "اسکوٹر (موٹرسیکل)", + "فارہ", + "کیل‎", + "ہار", + "مسافت پیما", + "نے دار ارغوان", + "آسلو سکوپ", + "تالا‎", + "پاجاما‎", + "محل", + "پیراشوٹ‎", + "مہتابی", + "پایہ ستون", + "پینسل تراش", + "خوشبو", + "فوٹو کاپی مشین", + "تکیہ", + "ابریق", + "ہل", + "چاک", + "جا نماز، سجدہ گاہ‎", + "پرنٹر", + "قید خانہ", + "پروجیکٹائل", + "پرس‎", + "مشعاع", + "ریڈیو دوربین", + "فریج", + "ریستوران", + "تفنگ", + "رگبی بال", + "سیف‎", + "چپل‎", + "سکسوفون", + "تلا", + "اسکول بس", + "پیچ", + "اسکرو ڈرائیور", + "سلائی مشین", + "ڈهال‎", + "بیلچہ", + "سکی‎", + "سلیپنگ بیگ‎", + "جراب", + "تکلا‎", + "بھاپ ریلوے انجن", + "ٹرام", + "اسٹریچر‎", + "آبدوز", + "سوٹ (لباس)", + "بدیل", + "مِحقِنَہ", + "بکتر بند لڑاکا ناقل", + "ٹارچ‎", + "ٹریکٹر", + "چھتری", + "خلائی مطہر", + "گلدان‎", + "مخمل‎", + "بیلا", + "بٹوا‎", + "عسکری طیارہ", + "آلۂ دھلائی", + "اون‎", + "خیمه‎", + "ویب سائٹ", + "آئس کریم", + "پریٹزل", + "گوبھی‎", + "ککڑی‎", + "انناس", + "انار‎", + "پیزا‎", + "اسپرسو", + "بلا‎", + "مرجانی جل پتھر", + "ساحل", + "وادی‎", + "آتش فشاں", + "شاہ بلوط کا پھل" + ] + ], + "KM": [ + [ + 3, + 39, + 48, + 71, + 79, + 99, + 102, + 107, + 144, + 149, + 269, + 277, + 284, + 291, + 292, + 293, + 296, + 301, + 306, + 308, + 309, + 310, + 312, + 314, + 319, + 327, + 334, + 338, + 340, + 341, + 344, + 346, + 354, + 360, + 367, + 390, + 398, + 407, + 415, + 418, + 421, + 425, + 426, + 428, + 430, + 435, + 437, + 447, + 453, + 454, + 456, + 459, + 460, + 462, + 463, + 464, + 468, + 469, + 470, + 473, + 478, + 480, + 481, + 483, + 487, + 488, + 491, + 492, + 497, + 508, + 516, + 525, + 534, + 541, + 549, + 557, + 558, + 563, + 577, + 587, + 591, + 594, + 604, + 606, + 608, + 609, + 612, + 614, + 618, + 619, + 620, + 632, + 643, + 650, + 651, + 662, + 668, + 669, + 670, + 673, + 677, + 679, + 684, + 688, + 692, + 693, + 697, + 701, + 710, + 717, + 728, + 730, + 736, + 748, + 760, + 761, + 762, + 764, + 769, + 771, + 774, + 777, + 784, + 786, + 787, + 792, + 795, + 797, + 806, + 810, + 816, + 830, + 832, + 834, + 835, + 837, + 843, + 844, + 845, + 849, + 862, + 864, + 870, + 872, + 882, + 883, + 885, + 889, + 893, + 896, + 909, + 911, + 916, + 920, + 926, + 928, + 943, + 952, + 957, + 958, + 963, + 966, + 971, + 976, + 979, + 998, + 999 + ], + [ + "ឆ្លាមខ្លា", + "បង្កួយ", + "បង្កួយយក្ស", + "ខ្ទួយ", + "ក្អែប", + "ក្ងាន", + "អ៊ីឈីដាណា", + "ខ្ញែសមុទ្រ", + "ទុង", + "ជ្រូកទឹក", + "ឆ្កែចចក", + "កញ្ជ្រោង", + "ឆ្មាសៀម", + "តោ", + "ខ្លាធំ", + "ឆីតា", + "ខ្លាឃ្មុំទឹកកក", + "អណ្ដើកមាស", + "កញ្ចែ", + "រុយ", + "ឃ្មុំ", + "ស្រមោច", + "ចង្រិត", + "កន្លាត", + "កន្ទុំរុយ", + "ផ្កាយសមុទ្រ", + "កាំប្រមា", + "កណ្ដុរសំពៅ", + "សេះបង្កង់", + "ជ្រូក", + "ដំរីទឹក", + "ក្របី", + "អូដ្ឋបូកមួយ", + "ភេ", + "ស្វាឳ", + "អន្ទង់", + "ក្បាច់គិតលេខ", + "អំប៊ូឡង់ស៍", + "ឡដុតនំប៉័ង", + "ប៊ិច", + "បង្កាន់ដៃ", + "តឹក", + "បារ៉ូម៉ែត", + "រទេះរុញ", + "កីឡាបាល់បោះ", + "អាងងូតទឹក", + "ហ្វារ", + "កែវយឹត", + "ទូសៀវភៅ", + "ហាងសៀវភៅ", + "ធ្នូ", + "ឤវទនាប់", + "ជញ្ជាំងការពារឆ្នេរសមុទ្រ", + "អំបោស", + "ថាំង", + "គន្លឹះ", + "តាក់ស៊ី", + "ខ្វាន់", + "ទៀន", + "ប្រដាប់គាស់កំប៉ុង", + "ប្រអប់", + "ម៉ាស៊ីនប្រាប់លុយស្វ័យប្រវត្តិ", + "កាសិត", + "ប្រាសាទ", + "ទូរសព្ទចល័ត", + "ច្រវាក់", + "រណាច្រវាក់", + "ហិប", + "វិហារ", + "ក្ដារចុចកុំព្យូទ័រ", + "អង្រឹង", + "ទំនប់", + "ម៉ាស៊ីនលាងចាន", + "ស្គរ", + "ស្រោមសំបុត្រ", + "ដងទង់", + "ខ្លុយ", + "ស្លាបប៉ាកកា", + "គង", + "ញញួរ", + "កន្សែងដៃ", + "ពិណ", + "នាឡិកាខ្សាច់", + "ឆ្នាំងអ៊ុត", + "ខោខូវ", + "ហ្ស៊ីប", + "ឆែកែវ", + "គីម៉ូណូ", + "វែក", + "គំរបចង្កៀង", + "កុំព្យូទ័រយួរដៃ", + "បំពង់ឧគ្ឃោសនស័ព្ទ", + "ក្បាំងមុខ", + "មីក្រូ", + "មីក្រូវ៉េវ", + "ម៉ូដឹម", + "វិហារអ៊ីស្លាម", + "មុងផ្លិត", + "ម៉ូតូស្កូតឺ", + "កណ្តុរ", + "ដែកគោល", + "ខ្សែក", + "អូការីណា", + "អូស៊ីឡូស្កុប", + "សំណុំ", + "ចែវ", + "ឈុតគេង", + "ឆ័ត្រយោង", + "ប្រដាប់ឃួងខ្មៅដៃ", + "ភីកអាប់", + "ថង់ប្លាស្ទិក", + "នង្គ័ល", + "តុប៊ីយ៉ា", + "កាបូប", + "ទូទឹកកក", + "ទូរបញ្ជា", + "ភោជនីយដ្ឋាន", + "កាំភ្លើងវែង", + "បន្ទាត់", + "ហិបប្រាក់", + "ស្បែកជើងសង្រែក", + "ស្រោមដាវ", + "ទួរណឺវិស", + "ម៉ាស៊ីនដេរ", + "ខែល", + "ចប", + "ស្គី", + "ថង់ដេក", + "ស្រោមជើង", + "គ្រាប់ចុច ចន្លោះមិនឃើញ", + "កដិពន្ធ", + "គ្រែស្នែង", + "ចេតិយ", + "ខោអាវបារាំង", + "នាឡិកាព្រះអាទិត្យ", + "វ៉ែនតាសំរាប់ថ្ងៃ", + "ទោង", + "កុងតាក់", + "សឺរ៉ាំង", + "ប៉ាន់តែ", + "ចន្លុះ", + "ឡានស្ទូច", + "ត្រីចក្រយាន", + "ជើងកាមេរ៉ា", + "ម៉ាស៊ីនបោសសំអាត", + "ថូ", + "កម្ញី", + "វីយោឡុង", + "កាបូប", + "អាងលាងសំអាត", + "ខ្ទះ", + "រោមចៀម", + "វិបសាយ", + "ភ្លើងចរាចរ", + "នាំងភ្លើង", + "ការ៉េម", + "ត្រសក់", + "ផ្លែល្វា", + "ឌាឌិម", + "ស្មៅស្ងួត", + "ភីហ្សា", + "ស្រក្រហម", + "ពងទឹក", + "ដើមភ្នំ", + "ជ្រលងភ្នំ", + "កួរ", + "ក្រដាសបង្គន់" + ] + ], + "PL": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 8, + 9, + 10, + 11, + 12, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 28, + 29, + 30, + 32, + 34, + 37, + 39, + 40, + 43, + 45, + 46, + 47, + 48, + 49, + 50, + 54, + 57, + 61, + 62, + 63, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 84, + 85, + 86, + 87, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 117, + 120, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 157, + 160, + 162, + 163, + 167, + 169, + 170, + 171, + 172, + 174, + 176, + 177, + 178, + 179, + 180, + 181, + 184, + 187, + 188, + 193, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 208, + 210, + 211, + 212, + 213, + 214, + 215, + 217, + 218, + 219, + 222, + 224, + 226, + 227, + 229, + 230, + 231, + 235, + 237, + 238, + 239, + 242, + 243, + 244, + 245, + 246, + 247, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 261, + 265, + 266, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 336, + 337, + 338, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 423, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 446, + 447, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 494, + 496, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 508, + 510, + 511, + 512, + 513, + 514, + 516, + 517, + 520, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 546, + 547, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 577, + 578, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 597, + 601, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 615, + 616, + 617, + 618, + 619, + 621, + 622, + 623, + 625, + 626, + 627, + 628, + 629, + 630, + 632, + 633, + 634, + 635, + 636, + 637, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 663, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 676, + 677, + 678, + 679, + 680, + 683, + 685, + 686, + 687, + 688, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 717, + 719, + 721, + 724, + 725, + 726, + 728, + 730, + 731, + 733, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 755, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 794, + 795, + 797, + 798, + 799, + 800, + 802, + 803, + 804, + 805, + 806, + 807, + 809, + 810, + 811, + 812, + 813, + 814, + 816, + 817, + 818, + 819, + 820, + 822, + 823, + 824, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 902, + 903, + 907, + 908, + 910, + 911, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 925, + 928, + 931, + 932, + 935, + 938, + 939, + 943, + 944, + 946, + 947, + 949, + 950, + 951, + 952, + 954, + 955, + 957, + 958, + 961, + 962, + 965, + 966, + 969, + 971, + 972, + 973, + 974, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 988, + 992, + 993, + 996, + 998, + 999 + ], + [ + "lin (ryba)", + "Karaś złocisty", + "żarłacz biały", + "żarłacz tygrysi", + "Młotowate", + "drętwokształtne", + "Orleniowate", + "kura", + "struś", + "jer (ptak)", + "Szczygieł", + "dziwuszka ogrodowa", + "Łuszczyk indygowy", + "drozd wędrowny", + "bilbile", + "sójka zwyczajna", + "sroka", + "Pluszcze", + "kania", + "bielik amerykański", + "sęp", + "puszczyk mszarny", + "salamandra plamista", + "traszka zwyczajna", + "ambystoma plamista", + "Ambystoma meksykańska", + "żaba rycząca", + "ogończakowate", + "żółw skórzasty", + "terapena", + "legwan zielony", + "Anolis zielony", + "agama kołnierzasta", + "heloderma arizońska", + "Jaszczurka zielona", + "kameleon afrykański", + "waran z Komodo", + "krokodyl nilowy", + "aligator amerykański", + "heterodon płaskonosy", + "zaskroniec zwyczajny", + "boa dusiciel", + "pyton hieroglifowy", + "Kobra indyjska", + "węże morskie", + "żmija rogata", + "grzechotnik diamentowy", + "Grzechotnik rogaty", + "trylobity", + "kosarz", + "skorpion", + "krzyżak ogrodowy", + "czarna wdowa", + "ptasznik", + "Pogońcowate", + "kleszcz", + "Pareczniki", + "cietrzew zwyczajny", + "pardwa", + "cieciornik", + "paw", + "przepiórka polna", + "kuropatwa", + "żako", + "kakadu żółtoczuba", + "Kukale", + "żołny", + "dzioborożec", + "koliber", + "złotopióry", + "tukan", + "kaczor", + "Szlachar", + "gęś", + "łabędź czarny", + "dzik", + "kolczatkowate", + "dziobak", + "kangur rdzawoszyi", + "Koala australijski", + "Wombatowate", + "meduza", + "ukwiały", + "płazińce", + "nicienie", + "ślimak", + "ślimak", + "nagoskrzelne", + "chitony", + "łodzik", + "krab skrzypek", + "Homar amerykański", + "langusta", + "Astacoidea", + "Pustelniki", + "równonóg", + "Bocian biały", + "bocian czarny", + "genus Platalea", + "flaming", + "czapla śniada", + "czapla amerykańska", + "bąk", + "żurawiowate", + "Bekaśnica", + "łyska amerykańska", + "dropie", + "kamusznik zwyczajny", + "Biegus zmienny", + "krwawodziób", + "ostrygojady", + "pelikan", + "pingwin królewski", + "albatrosy", + "Pływacz szary", + "orka oceaniczna", + "diugoń przybrzeżny", + "Lew morski", + "chihuahua (rasa psa)", + "chin japoński", + "maltańczyk", + "Pekińczyk", + "papillon (rasa psa)", + "chart afgański", + "Beagle (rasa psów)", + "ogar", + "foxhound angielski", + "borzoj", + "wilczarz irlandzki", + "charcik włoski", + "Chart angielski whippet", + "elkhund szary", + "chart perski", + "Chart szkocki", + "Wyżeł weimarski krótkowłosy", + "staffik", + "pitbullterier", + "bedlington terier", + "terier irlandzki", + "york", + "foksterier szorstkowłosy", + "terier australijski", + "boston terier", + "sznaucer miniaturowy", + "sznaucer olbrzym", + "sznaucer średni", + "terier szkocki", + "terier tybetański", + "Australijski silky terier", + "labrador", + "wyżeł niemiecki krótkowłosy", + "Wyżeł węgierski krótkowłosy", + "seter angielski", + "seter irlandzki", + "gordon", + "Spaniel bretoński", + "Springer spaniel angielski", + "springer spaniel walijski", + "cocker-spaniel", + "kuvasz węgierski", + "Owczarek belgijski Groenendael", + "Owczarek francuski briard", + "kelpie australiano", + "owczarek staroangielski", + "Owczarek szetlandzki", + "owczarek szkocki krótkowłosy", + "owczarek niemiecki", + "ratler", + "duży szwajcarski pies pasterski", + "berneński pies pasterski", + "Bokser (rasa psa)", + "bulmastif", + "mastyf tybetański", + "buldożek francuski", + "Dog niemiecki", + "bernardyn (rasa psa)", + "malamut", + "husky syberyjski", + "dalmatyńczyk", + "Pinczer małpi", + "basendżi", + "mops (rasa psa)", + "wodołaz", + "Pirenejski pies górski", + "Samojed", + "szpic miniaturowy", + "Szpic wilczy", + "pudel toy", + "pudel miniaturowy", + "wilk", + "wilk polarny", + "Wilk rudy", + "kojot", + "dingo australijski", + "cyjon", + "Likaon pstry", + "Hienowate", + "lis", + "lis wielkouchy", + "Lis polarny", + "Urocjon wirginijski", + "Kot pręgowany", + "tygrysek", + "Kot perski", + "kot syjamski", + "Puma płowa", + "ryś", + "lampart plamisty", + "Irbis śnieżny", + "jaguar amerykański", + "lew", + "tygrys azjatycki", + "gepard", + "niedźwiedź brunatny", + "niedźwiedź czarny", + "niedźwiedź polarny", + "aswal", + "mangustowate", + "surykatka szara", + "Trzyszczowate", + "biedronka", + "biegaczowate", + "kózkowate", + "stonkowate", + "Rohatyńcowate", + "ryjkowce", + "muchówki", + "pszczoły", + "mrówkowate", + "świerszcz", + "świerszcz", + "patyczak", + "karaczan", + "modliszki", + "cykada", + "Skoczkowate (owady)", + "ważka", + "łątka", + "Przestrojnik trawnik", + "danaid wędrowny", + "rozgwiazda", + "jeżowce", + "strzykwa", + "Królak", + "zając", + "Angora (rasa królika)", + "chomiki", + "jeżozwierz", + "Świstak", + "bóbr", + "kawia domowa", + "świnia", + "dzik", + "guziec", + "hipopotam nilowy", + "wół", + "bawół domowy", + "bizon", + "baran", + "owca kanadyjska", + "koziorożec alpejski", + "bawolec krowi", + "impala zwyczajna", + "Gazela", + "dromader", + "lama", + "łasica", + "Norka", + "tchórz zwyczajny", + "fretka", + "wydra", + "skunks", + "jaźwiec", + "pancernik", + "leniwcowate", + "orangutan borneański", + "goryl", + "szympans", + "gibon białoręki", + "Siamang wielki", + "koczkodan", + "Patas rudy", + "pawian", + "makak", + "Gerezy", + "gereza", + "nosacz sundajski", + "marmozety", + "kapucynka właściwa", + "wyjce", + "Callicebus", + "czepiak czarnoręki", + "Sajmiri", + "lemur katta", + "Indris krótkoogonowy", + "słoń indyjski", + "słoń afrykański", + "Pandka", + "panda wielka", + "Atun", + "węgorz", + "kiżucz", + "Amphiprion", + "jesiotrowate", + "niszczuka długonosa", + "ognica", + "ryba rozdymkowata", + "abakus (liczydło)", + "abaja", + "harmonia ręczna", + "gitara akustyczna", + "lotniskowiec", + "samolot pasażerski", + "sterowiec", + "ołtarz", + "ambulans", + "Amfibia (pojazd)", + "zegar analogowy", + "pasieka", + "fartuch", + "kubeł na śmieci", + "karabin automatyczny", + "Chlebak", + "piekarnia", + "Równoważnia", + "balonik", + "pióro kulkowe", + "bandżo", + "poręcz", + "sztanga", + "fotel fryzjerski", + "stodoła", + "barometr", + "beczka", + "taczka", + "Piłka baseballowa", + "piłka do koszykówki", + "Kołyska (kolebka)", + "czepek pływacki", + "ręcznik kąpielowy", + "wanna", + "kombi", + "latarnia morska", + "zlewka", + "bermyca", + "butelka od piwa", + "segregator", + "lornetka", + "bobsleje", + "krawat bolo", + "Bonet (nakrycie głowy)", + "regał", + "księgarnia", + "kapsel", + "łuk", + "muszka", + "tablica pamiątkowa", + "biustonosz", + "Falochron", + "napierśnik (zbroja)", + "miotła", + "wiadro", + "klamra", + "kamizelka kuloodporna", + "pociąg szybki", + "sklep mięsny", + "Taksówka", + "kocioł (naczynie)", + "świeca", + "armata", + "canoe (łódź)", + "otwieracz do konserw", + "Kardigan", + "lusterko samochodowe", + "karuzela", + "karton", + "koło samochodowe", + "samoobsługowy terminal do wpłaty gotówki", + "kaseta", + "odtwarzacz kasetowy", + "zamek", + "katamaran", + "odtwarzacz CD", + "wiolonczela", + "telefon komórkowy", + "łańcuch", + "kolczuga", + "piła łańcuchowa", + "kufer", + "komoda", + "dzwony rurowe", + "Skarpeta świąteczna", + "kościół", + "kino", + "tasak", + "geta (obuwie)", + "shaker", + "dzbanek do kawy", + "zwój", + "klawiatura", + "kontenerowiec", + "kabriolet", + "korkociąg", + "kornet", + "kowbojka", + "kolebka", + "dźwig", + "kojec", + "Wolnowar", + "kula", + "kirys", + "zapora wodna", + "biurko", + "komputer stacjonarny", + "pieluszka", + "zegar elektroniczny", + "stół", + "pomywak", + "zmywarka", + "Hamulec tarczowy", + "dok", + "psi zaprzęg", + "kopuła", + "wycieraczka", + "platforma wiertnicza", + "bęben", + "pałeczka", + "hantle", + "gitara elektryczna", + "lokomotywa elektryczna", + "koperta", + "ekspres ciśnieniowy", + "Puder", + "boa (szal)", + "plik", + "Statek pożarniczy", + "samochód pożarniczy", + "Ekran (mebel)", + "maszt flagowy", + "flet", + "krzesło składane", + "Kask futbolowy", + "wózek widłowy", + "fontanna", + "wieczne pióro", + "łóżko z baldachimem", + "wagon towarowy", + "róg", + "patelnia", + "kuśnierstwo", + "śmieciarka", + "maska przeciwgazowa", + "dystrybutor paliwa", + "kielich", + "kart", + "piłka golfowa", + "wózek golfowy", + "tam-tam (gong)", + "Suknia", + "fortepian", + "szklarnia (ogrodnictwo)", + "spożywczak", + "gilotyna", + "lakier do włosów", + "pojazd półgąsienicowy", + "młotek", + "koszałka", + "suszarka do włosów", + "urządzenie mobilne", + "chusteczka", + "HDD", + "harmonijka ustna", + "arfa", + "Żniwiarka", + "Kabura", + "krynolina", + "drążek", + "klepsydra", + "żelazko", + "latarnia z dyni", + "teksasy", + "dżip", + "koszulka z długim rękawem", + "układanka", + "riksza", + "dżojstik", + "Nakolannik", + "węzeł", + "kitel (odzież ochronna)", + "chochla", + "abażur", + "koszenie", + "dekielek", + "nóż do otwierania listów", + "Łódź ratownicza (ratownictwo brzegowe)", + "ogień", + "limuzyna", + "Transatlantyk", + "szminka", + "buty wzuwane", + "głośnik", + "lupa", + "tartak", + "kompas magnetyczny", + "listonoszka", + "skrzynka na listy", + "Marakasy", + "ksylofon", + "maska", + "zapałka", + "Słup Majowy", + "labirynt", + "miarka", + "megalit", + "mikrofon", + "kuchenka mikrofalowa", + "mikrobus", + "miniówka", + "miniwan", + "pocisk odrzutowy", + "mitenka", + "miska", + "dom mobilny", + "konwent", + "motorower", + "moździerz", + "biret", + "meczet", + "moskitiera", + "skuter", + "rower górski", + "mysz", + "Pułapka na myszy", + "kaganiec", + "Gwóźdź", + "Kołnierz ortopedyczny", + "naszyjnik", + "smoczek", + "obój", + "drogomierz", + "Filtr oleju", + "organy", + "oscyloskop", + "Maska tlenowa", + "paczka", + "wiosło", + "Koło łopatkowe", + "kłódka", + "pędzel", + "piżama", + "pałac", + "fletnia Pana", + "ręcznik papierowy", + "spadochron", + "Poręcze gimnastyczne", + "parkometr", + "wagon osobowy", + "taras (architektura)", + "automat", + "piedestał", + "Piórnik", + "temperówka", + "perfumy", + "szalka Petriego", + "ksero", + "kostka", + "Pikielhauba", + "pick-up", + "skarbonka", + "poduszka", + "statek piracki", + "dzban", + "hebel", + "Torba foliowa", + "pług", + "Przepychacz sanitarny", + "kół", + "Ponczo", + "bilard", + "doniczka", + "koło garncarskie", + "Modlitewnik", + "drukarka", + "zakład karny", + "pocisk", + "Projektor", + "krążek", + "worek bokserski", + "portmonetka", + "gęsie pióro", + "kołdra", + "wyścigówka", + "rakieta", + "grzejnik", + "radioteleskop", + "Kamper", + "kołowrotek", + "lustrzanka", + "chłodziarka", + "pilot", + "restauracja", + "rewolwer", + "karabin", + "fatersztul", + "gumka", + "piłka do rugby", + "linijka", + "tenisówki", + "Sejf", + "agrafka", + "solniczka", + "sandał", + "saksofon", + "pochwa", + "waga", + "autobus szkolny", + "szkuner", + "tablica wyników", + "ekran", + "śruba", + "wkrętak", + "pasy bezpieczeństwa", + "maszyna do szycia", + "puklerz", + "Wózek sklepowy", + "łopata (narzędzie)", + "zasłona prysznicowa", + "narty", + "śpiwór", + "suwak logarytmiczny", + "Drzwi przesuwane", + "automat", + "skuter śnieżny", + "Pług śnieżny", + "dozownik mydła", + "futbolówka", + "skarpeta", + "piec solarny", + "miska do zupy", + "spacja", + "nagrzewnica", + "prom kosmiczny", + "szpatułka", + "ślizgowiec", + "wrzeciono", + "samochód sportowy", + "reflektor", + "scena", + "lokomotywa parowa", + "Steeldrums", + "stetoskop", + "Stuła", + "sekundomierz", + "piec", + "system tramwajowy", + "Nosze", + "okręt podwodny", + "garnitur", + "zegar słoneczny", + "okulary przeciwsłoneczne", + "krem do opalania", + "most wiszący", + "bluza", + "kąpielówki", + "huśtawka", + "łącznik elektryczny", + "strzykawka", + "lampa stołowa", + "czołg", + "imbryk", + "Miś", + "telewizja", + "piłka tenisowa", + "strzecha", + "kurtyna (teatr)", + "Naparstek", + "młocarnia", + "tron", + "toster", + "właściciel sklepu tytoniowego", + "deska sedesowa", + "łuczywo", + "totem", + "laweta", + "sklep z zabawkami", + "ciągnik rolniczy", + "Ciągnik siodłowy", + "taca", + "Trencz", + "tricykl", + "trzykadłubowiec", + "Statyw fotograficzny", + "łuk triumfalny", + "trolejbus", + "puzon", + "kadź", + "bramka obrotowa", + "parasol", + "monocykl", + "pianino", + "odkurzacz", + "wazon", + "kopuła", + "aksamit", + "szata liturgiczna", + "wiadukt", + "skrzypce", + "piłka do siatkówki", + "gofrownica", + "zegar ścienny", + "portfel", + "szafa", + "samolot wojskowy", + "umywalka", + "pralka", + "bidon", + "dzbanek na wodę", + "Wieża wodociągowa", + "gwizdek", + "peruka", + "butelka do wina", + "skrzydło", + "kopyść", + "wełna", + "wrak", + "jol", + "jurta", + "strona WWW", + "komiks", + "krzyżówka", + "tablica ulicowa", + "sygnalizacja świetlna", + "obwoluta", + "rosół", + "lody", + "bajgiel", + "precel", + "purée ziemniaczane", + "kalafior", + "kabaczek", + "ogórek", + "feldgrau", + "kard", + "grzybek", + "truskawkowy", + "pomarańcza", + "cytryna", + "figa", + "banan", + "dżakfrut", + "granat", + "siano", + "ciasto", + "pieczeń rzymska", + "burito", + "czerwone wino", + "kogel-mogel", + "pęcherzyk", + "klif", + "rafa koralowa", + "gejzer", + "przylądek", + "piaszczysko", + "wybrzeże", + "dolina", + "wulkan", + "bejsbolista", + "pan młody", + "płetwonurek", + "rzepak", + "stokroć trwała", + "obuwik pospolity", + "żołądź", + "blaszkowce", + "piestrzenica", + "żagwica listkowata", + "kłos", + "papier toaletowy" + ] + ], + "HU": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 14, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 34, + 39, + 40, + 45, + 46, + 47, + 48, + 49, + 50, + 61, + 63, + 65, + 66, + 68, + 69, + 71, + 77, + 78, + 79, + 80, + 81, + 82, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 114, + 115, + 116, + 117, + 119, + 123, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 151, + 152, + 153, + 154, + 155, + 160, + 163, + 165, + 169, + 172, + 173, + 176, + 177, + 178, + 180, + 194, + 199, + 201, + 206, + 211, + 213, + 215, + 217, + 226, + 227, + 229, + 230, + 233, + 235, + 242, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 252, + 254, + 256, + 257, + 258, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 354, + 355, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 397, + 398, + 401, + 402, + 403, + 404, + 405, + 407, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 433, + 435, + 436, + 437, + 438, + 439, + 440, + 444, + 447, + 450, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 469, + 470, + 472, + 473, + 474, + 476, + 480, + 481, + 483, + 485, + 486, + 487, + 488, + 490, + 491, + 492, + 494, + 497, + 498, + 500, + 502, + 505, + 508, + 510, + 511, + 513, + 515, + 516, + 517, + 520, + 525, + 526, + 527, + 529, + 532, + 534, + 535, + 536, + 537, + 538, + 541, + 542, + 543, + 546, + 547, + 549, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 567, + 568, + 569, + 570, + 571, + 572, + 574, + 576, + 577, + 580, + 582, + 583, + 587, + 589, + 591, + 593, + 594, + 596, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 626, + 627, + 628, + 629, + 632, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 650, + 651, + 655, + 657, + 658, + 661, + 665, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 681, + 682, + 683, + 684, + 685, + 687, + 688, + 692, + 693, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 717, + 719, + 721, + 724, + 725, + 726, + 728, + 730, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 745, + 746, + 747, + 748, + 750, + 752, + 753, + 755, + 757, + 760, + 761, + 762, + 764, + 765, + 769, + 770, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 790, + 791, + 792, + 794, + 795, + 797, + 798, + 806, + 808, + 810, + 811, + 812, + 816, + 817, + 818, + 819, + 820, + 822, + 823, + 824, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 852, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 866, + 867, + 869, + 870, + 873, + 874, + 875, + 879, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 904, + 907, + 909, + 910, + 911, + 915, + 916, + 918, + 919, + 920, + 925, + 926, + 927, + 928, + 932, + 933, + 938, + 943, + 952, + 953, + 957, + 958, + 959, + 961, + 962, + 963, + 966, + 969, + 971, + 972, + 973, + 974, + 975, + 976, + 978, + 979, + 980, + 981, + 982, + 984, + 986, + 988, + 989, + 990, + 996, + 998, + 999 + ], + [ + "compó", + "Aranyhal", + "fehér cápa", + "tigriscápa", + "pörölycápafélék", + "elektromosrája-alakúak", + "tüskésrájafélék", + "strucc", + "fenyőpinty", + "tengelic (madár)", + "indigópinty", + "vándorrigó", + "bülbülfélék", + "szarka", + "vízirigófélék", + "kányaformák", + "fehérfejű rétisas", + "keselyűk", + "szakállas bagoly", + "mexikói axolotl", + "ökörbéka", + "kérgesteknős", + "zöld leguán", + "zöld anolisz", + "Gila", + "zöld gyík", + "afrikai kaméleon", + "komodói varánusz", + "nílusi krokodil", + "mississippi aligátor", + "közönséges óriáskígyó", + "pápaszemes kobra", + "Tengerikígyó-félék", + "szarvasvipera", + "Szarvas csörgőkígyó", + "trilobiták", + "skorpió", + "farkaspókfélék", + "kullancs", + "százlábú", + "nyírfajd", + "hófajd", + "galléros császármadár", + "fogolyformák", + "jákópapagáj", + "arapapagáj", + "sárgabóbitás kakadu", + "lóri", + "bozótkakukkformák", + "gyurgyalagfélék", + "szarvascsőrűmadár-félék", + "kolibri", + "jakamárfélék", + "tukán", + "gácsér", + "örvös bukó", + "lúd", + "fekete hattyú", + "hangyászsünfélék", + "kacsacsőrű emlős", + "Phascolarctos", + "vombatfélék", + "medúza", + "tengerirózsa", + "agykorallok", + "laposféreg", + "fonálférgek", + "Meztelencsigák", + "Csupaszkopoltyús csigák", + "cserepeshéjúak", + "csigáspolip", + "atlanti sziklarák", + "Európai languszta", + "remeterákok", + "fehér gólya", + "fekete gólya", + "kanalasgémformák", + "Flamingófélék", + "bölömbika", + "daru", + "Óriásguvat", + "Gyűrűscsőrű szárcsa", + "túzok", + "kőforgató", + "havasi partfutó", + "piroslábú cankó", + "Csigaforgatófélék", + "gödény", + "királypingvin", + "albatroszfélék", + "szürke bálna", + "kardszárnyú delfin", + "csivava", + "japán csin", + "máltai selyemkutya", + "pekingi palotakutya", + "Si-cu", + "afgán agár", + "angol véreb", + "fekete-cser mosómedvekopó", + "orosz agár", + "kis angol agár", + "ibizai kopó", + "perzsa agár", + "Skót szarvasagár", + "weimari vizsla", + "amerikai pitbull terrier", + "Dandie Dinmont-terrier", + "skót terrier", + "Ausztrál selyemszőrű terrier", + "göndörszőrű retriever", + "rövidszőrű magyar vizsla", + "ír szetter", + "Breton spániel", + "angol springer spániel", + "Brie-i juhászkutya", + "Ausztrál kelpie", + "óangol juhászkutya", + "shetlandi juhászkutya", + "Flandriai pásztorkutya", + "német juhászkutya", + "bokszer (kutyafajta)", + "bullmasztiff", + "tibeti masztiff", + "dán dog", + "Bernáthegyi", + "alaszkai malamut", + "szibériai husky", + "dalmata", + "majompincs", + "mopsz", + "újfundlandi", + "pireneusi hegyikutya", + "szamojéd (kutyafajta)", + "törpespicc", + "csaucsau", + "farkas", + "sarki farkas", + "sörényes farkas", + "prérifarkas", + "dingó", + "ázsiai vadkutya", + "afrikai vadkutya", + "hiénafélék", + "róka", + "sarki róka", + "szürkeróka", + "perzsa macska", + "sziámi macska", + "puma (állatfaj)", + "hiúz", + "leopárd", + "hópárduc", + "párduc", + "oroszlán", + "tigris", + "gepárd", + "barna medve", + "fekete medve", + "jegesmedve", + "Mongúzfélék", + "szurikáta", + "homokfutrinka-formák", + "katicabogár", + "futóbogárfélék", + "cincérfélék", + "levélbogár", + "óriásbogárformák", + "zsizsik", + "kétszárnyúak", + "méhek", + "hangyák", + "szöcske", + "tücsök", + "botsáska", + "csótány", + "fogólábúak", + "kabóca", + "mezeikabóca-félék", + "szitakötő", + "egyenlő szárnyú szitakötők", + "Satyrini", + "pompás királylepke", + "tengeri csillag", + "tengeri sün", + "tengeriuborkák", + "Lepus (állatnem)", + "Angóranyúl", + "hörcsögformák", + "sül", + "amerikai rókamókus", + "mormota", + "hód", + "tengerimalac", + "sertés", + "vaddisznó", + "szavannai varacskosdisznó", + "nílusi víziló", + "ökör", + "vízibivaly", + "bölény", + "kos", + "kanadai vadjuh", + "kőszáli kecske", + "vörös tehénantilop", + "impalaformák", + "dromedár", + "láma", + "közönséges görény", + "vadászgörény", + "vidraformák", + "csíkos bűzösborz", + "Borzformák", + "tatu", + "Háromujjú lajhár", + "borneói orangután", + "csimpánz", + "gibbonfélék", + "sziamang", + "huszármajom", + "pávián", + "makákó", + "Karcsúmajomformák", + "borneói nagyorrúmajom", + "selyemmajom", + "csuklyásmajomformák", + "Bőgőmajomformák", + "kabócamajom-formák", + "Geoffroy-pókmajom", + "mókusmajomformák", + "Gyűrűsfarkú maki", + "ázsiai elefánt", + "afrikai elefánt", + "vörös macskamedve", + "óriáspanda", + "angolna", + "valódi tokfélék", + "Kajmánhalfélék", + "gömbhal", + "abakusz", + "harmonika", + "akusztikus gitár", + "repülőgép-hordozó", + "utasszállító repülőgép", + "léghajó", + "mentőautó", + "Kötény", + "kuka (tartály)", + "gépkarabély", + "hátizsák", + "kenyérbolt", + "gerenda", + "lufi", + "golyóstoll", + "bendzsó", + "balusztrád", + "súlyzórúd", + "csűr", + "barométer", + "hordó (tartály)", + "talicska", + "Baseball-labda", + "kosárlabda", + "mózeskosár", + "úszósapka", + "fürdő", + "kombi", + "világítótorony", + "főzőpohár", + "csákó", + "sörösüveg", + "tandem kerékpár", + "távcső", + "bob (sport)", + "könyvszekrény", + "könyvesbolt", + "palack kupak", + "íj", + "Csokornyakkendő", + "emléktábla", + "melltartó", + "hullámtörő", + "Aigisz", + "seprű", + "veder", + "csat", + "Golyóálló mellény", + "bogrács", + "gyertya", + "Kenu", + "konzervnyitó", + "kardigán", + "ringlispíl", + "bankautomata", + "kazetta", + "vár", + "CD-lejátszó", + "gordonka", + "mobiltelefon", + "lánc", + "páncél", + "láncfűrész", + "láda", + "harangjáték", + "templom", + "filmszínház", + "barlanglakás", + "geta (lábbeli)", + "kávéskanna", + "billentyűzet", + "konténerszállító hajó", + "kabrió", + "trombita", + "cowboykalap", + "bölcső", + "daru", + "gyerekágy", + "gát (vízépítés)", + "íróasztal", + "asztali számítógép", + "Pelenka", + "étkezőasztal", + "mosogatógép", + "Tárcsafék", + "dokk", + "kutyaszán", + "kupola", + "membranofon hangszerek", + "dobverő", + "kézisúlyzó", + "elektromos gitár", + "villamosmozdony", + "boríték", + "tűzoltóautó", + "zászlórúd", + "ajaksípos hangszerek", + "összecsukható szék", + "targonca", + "szökőkút", + "töltőtoll", + "Serpenyő", + "szőrmeipar", + "szemetesautó", + "gázálarc", + "kútoszlop", + "serleg", + "Golflabda", + "gondola (vízi jármű)", + "gong (hangszer)", + "üvegház", + "élelmiszerüzlet", + "nyaktiló", + "kalapács", + "hajszárító", + "zsebkendő", + "szájharmonika", + "hárfa", + "fejsze", + "homokóra", + "vasaló", + "töklámpás", + "farmernadrág", + "dzsip", + "póló", + "kirakós", + "riksa", + "Kimonó", + "csomó (kötélen)", + "fehér köpeny", + "merőkanál", + "lámpabura", + "laptop számítógép", + "fűnyíró", + "objektívsapka", + "papírvágó kés", + "öngyújtó", + "limuzin", + "óceánjáró", + "ajakrúzs", + "hangszóró", + "csatornafedél", + "rumbatök", + "xilofon", + "álarc", + "gyufaszál", + "Májusfa", + "labirintus", + "mikrofon", + "mikrohullámú sütő", + "miniszoknya", + "Irányított rakéta", + "egyujjas kesztyű", + "T Modell", + "segédmotoros kerékpár", + "mecset", + "szúnyogháló", + "robogó", + "hegyikerékpár", + "egér", + "egérfogó", + "szög", + "nyaklánc", + "laptop számítógép", + "obeliszk", + "oboa", + "okarina", + "kilométeróra", + "orgona", + "oszcilloszkóp", + "tasak", + "evező", + "lakat", + "ecset", + "pizsama", + "palota", + "pánsíp", + "konyhai papírtörlő", + "ejtőernyő", + "parkolóóra", + "kocsi", + "tetőterasz", + "Nyilvános telefon", + "talapzat", + "tolltartó", + "hegyező", + "parfüm", + "Petri-csésze", + "fénymásoló", + "pengető", + "Pick-up", + "persely", + "párna", + "kalózhajó", + "kancsó", + "gyalu (szerszám)", + "műanyag zacskó", + "Eke", + "poncsó", + "biliárdasztal", + "virágcserép", + "fazekaskorong", + "imaszőnyeg", + "nyomtató", + "fegyház", + "vetítő", + "korong", + "boxzsák", + "kistáska", + "ágytakaró", + "ütő", + "radiátor", + "rádiótávcső", + "lakóautó", + "Hűtőgép", + "távirányító", + "vendéglő", + "puska", + "hintaszék", + "vonalzó", + "edzőcipő", + "páncélszekrény", + "Biztosítótű", + "sótartó", + "szandál", + "szaxofon", + "hüvely", + "mérleg", + "iskolabusz", + "Szkúner", + "csavar", + "csavarhúzó", + "biztonsági öv", + "varrógép", + "pajzs", + "bevásárlókosár", + "bevásárlókocsi", + "lapát", + "zuhanyfüggöny", + "sí", + "hálózsák", + "Logarléc", + "zokni", + "szombréró", + "szóköz", + "fűtőkészülék", + "űrrepülőgép", + "orsó", + "sportautó", + "reflektorfény", + "színpad", + "mozdony", + "stíldob", + "fonendoszkóp", + "Stóla", + "stopper", + "kályha", + "villamoshálózat", + "hordágy", + "sztúpa", + "tengeralattjáró", + "öltöny", + "napóra", + "napszemüveg", + "napozókrém", + "függőhíd", + "felmosórongy", + "hinta", + "kapcsoló", + "fecskendő", + "asztali lámpa", + "harckocsi", + "teáskanna", + "plüssmackó", + "teniszlabda", + "gyűszű", + "cséplőgép", + "trón", + "kenyérpirító", + "trafikos", + "vécéülőke", + "fáklya", + "totemoszlop", + "autómentő", + "vontató", + "kamion", + "viharkabát", + "tricikli", + "diadalív", + "trolibusz", + "harsona", + "ernyő", + "egykerekű", + "porszívó", + "váza", + "boltozat", + "bársony", + "viadukt", + "hegedű", + "pénztárca", + "szekrény", + "katonai repülőgép", + "mosdókagyló", + "Mosógép", + "vizesüveg", + "víztorony", + "síp", + "paróka", + "szúnyogháló", + "borosüveg", + "Vok", + "fakanál", + "gyapjú", + "jurta", + "internetes webhely", + "keresztrejtvény", + "közlekedési jelzőtábla", + "Közlekedési lámpa", + "consomé", + "forró fazék", + "angol krémdesszert", + "fagylalt", + "perec", + "sajtburger", + "karfiol", + "uborka", + "füge", + "ananász", + "gránátalma", + "széna", + "carbonara spagetti", + "tészta", + "fasírt", + "pizzéria", + "vörösbor", + "tojáslikőr", + "buborék", + "szikla", + "korallzátony", + "gejzír", + "tópart", + "hegyfok", + "tengerpart", + "völgy", + "vulkán", + "baseballjátékos", + "vőlegény", + "repce", + "boldogasszony papucsa", + "makk", + "csipkebogyó", + "vadgesztenye", + "Ágas tapló", + "kalász", + "WC-papír" + ] + ], + "SR": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 9, + 11, + 18, + 22, + 23, + 24, + 29, + 34, + 39, + 45, + 46, + 48, + 49, + 50, + 51, + 61, + 65, + 69, + 71, + 78, + 80, + 86, + 88, + 92, + 93, + 94, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 116, + 123, + 127, + 128, + 129, + 130, + 134, + 138, + 139, + 140, + 141, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 162, + 169, + 178, + 211, + 215, + 217, + 222, + 224, + 226, + 227, + 228, + 229, + 230, + 234, + 235, + 236, + 242, + 243, + 246, + 247, + 249, + 251, + 253, + 254, + 256, + 258, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 305, + 307, + 308, + 309, + 310, + 315, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 364, + 365, + 366, + 368, + 369, + 371, + 372, + 373, + 376, + 379, + 381, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 398, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 435, + 436, + 437, + 438, + 447, + 450, + 455, + 456, + 459, + 460, + 461, + 462, + 463, + 465, + 468, + 469, + 470, + 472, + 473, + 476, + 478, + 480, + 483, + 484, + 486, + 487, + 490, + 491, + 492, + 493, + 496, + 497, + 498, + 499, + 502, + 505, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 517, + 523, + 524, + 525, + 526, + 527, + 529, + 533, + 534, + 536, + 538, + 541, + 543, + 546, + 547, + 551, + 558, + 562, + 563, + 567, + 568, + 570, + 574, + 576, + 577, + 578, + 580, + 582, + 583, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 604, + 606, + 607, + 610, + 611, + 614, + 616, + 618, + 620, + 621, + 625, + 626, + 629, + 631, + 632, + 634, + 642, + 643, + 649, + 650, + 651, + 654, + 655, + 657, + 661, + 662, + 665, + 668, + 669, + 671, + 673, + 674, + 677, + 679, + 682, + 683, + 684, + 685, + 687, + 688, + 691, + 695, + 696, + 697, + 698, + 699, + 701, + 702, + 705, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 738, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 752, + 753, + 755, + 760, + 762, + 763, + 764, + 765, + 768, + 769, + 771, + 772, + 774, + 776, + 778, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 795, + 797, + 798, + 806, + 808, + 819, + 820, + 823, + 826, + 827, + 829, + 833, + 835, + 839, + 840, + 844, + 845, + 847, + 855, + 856, + 857, + 859, + 862, + 863, + 866, + 870, + 872, + 873, + 874, + 875, + 879, + 880, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 893, + 895, + 897, + 900, + 902, + 903, + 909, + 911, + 915, + 916, + 917, + 918, + 920, + 924, + 928, + 931, + 933, + 935, + 939, + 943, + 958, + 959, + 961, + 963, + 965, + 966, + 967, + 969, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 986, + 988, + 996, + 998, + 999 + ], + [ + "Linjak", + "златни караш", + "Велика бела ајкула", + "Тигар ајкула", + "Ajkulе čekićarkе", + "Električna raža", + "noj", + "Чешљугар", + "сврака", + "белоглави орао", + "Суп", + "Лапонска сова", + "аксолотл", + "Џиновска кожаста корњача", + "Зелена игуана", + "Гила монструм", + "Зелембаћ", + "комодски змај", + "нилски крокодил", + "Амерички алигатор", + "Трицератопс", + "Удав", + "Морске змије", + "трилобити", + "Скорпије", + "Крпељ", + "Ружевац", + "Јаребица", + "Ара", + "Pčelarice", + "Kljunorošci", + "Колибри", + "патак", + "Средњи ронац", + "гуска", + "Црни лабуд", + "Ješci", + "kljunar", + "Valabi", + "Коала", + "Вомбат", + "медуза", + "Морска саса", + "пљоснати црви", + "Ваљкасти црви", + "Пужеви", + "Голаћи", + "Хитони", + "Лангуст", + "Бела рода", + "црна рода", + "Kašikare", + "Фламинго", + "Ждралови (породица)", + "Droplja", + "Шљука камењарка", + "Црнотрба спрутка", + "Црвеноноги спрудник", + "Пеликан", + "Краљевски пингвин", + "Албатрос", + "Сиви кит", + "Кит убица", + "дугонг", + "Морски лав", + "čivav", + "Јапански чин", + "Malteški pas", + "Пекинезер", + "Ši cu", + "Бигл (пас)", + "Руски хрт — Барзој", + "Vajmarski ptičar", + "Мађарска вижла", + "Епањел бретон", + "Енглески спрингер шпанијел", + "Кувас", + "Гренендал", + "Бријешки овчар", + "Аустралијски келпи", + "Комондор", + "стари енглески овчар", + "Šetlandski ovčar", + "Ротвајлер", + "Немачки овчар", + "Доберман", + "боксер", + "Булмастиф", + "немачка дога", + "Бернардинац", + "Аљаски маламут", + "далматинац", + "Басенџи", + "мопс", + "Њуфаундлендски пас", + "Samojed (pas)", + "Померанац", + "Čau čau", + "вук", + "Arktički vuk", + "Гривасти вук", + "Којот", + "динго", + "Азијски дивљи пас", + "Афрички дивљи пас", + "хијена", + "риђа лисица", + "поларна лисица", + "Персијска мачка", + "Сијамска мачка", + "пума", + "рис", + "Леопард", + "снежни леопард", + "јагуар", + "lav", + "тигар", + "гепард", + "мрки медвед", + "Амерички црни медвед", + "beli medvev", + "Мунгоси", + "Меркат", + "бубамара", + "Trčci", + "стрижибубе", + "Cricoceris", + "Balegar", + "Жижак", + "Двокрилци", + "пчела", + "мрав", + "богомољке", + "Patuljasti cvrčci", + "Pravi vilini konjici", + "Vodene device", + "Лептир монарх", + "morska zvezda", + "morski jež", + "Морски краставац", + "зец", + "Ангорски зец", + "хрчак", + "Бодљикави прасићи", + "Мрмот", + "dabar", + "Морско прасе", + "зебра", + "свиња", + "divlja svinja", + "Брадавичаста свиња", + "нилски коњ", + "во", + "Водени биво", + "Бизон", + "баран", + "Амерички муфлон", + "алпски козорог", + "импала", + "Газела", + "дромедар", + "Лама (животиња)", + "Ласице", + "Нерц", + "Твор", + "Црноноги твор", + "Vidra/Видра", + "tvor", + "Тропрсти лењивац", + "орангутан", + "Гориле", + "Белоруки гибон", + "Сијаманг", + "патас", + "павијан", + "Макакији", + "Носати мајмун", + "Дрекавац", + "Мајмуни паукови", + "прстенорепи лемур", + "Индри", + "азијски слон", + "Афрички слон", + "црвена панда", + "џиновска панда", + "јегуља", + "Јесетра", + "Гар (риба)", + "абакус", + "хармоника", + "акустична гитара", + "носач авиона", + "путнички авион", + "дирижабл", + "Амбулантна кола", + "Амфибијско возило", + "kecelja", + "посуда за смеће", + "јуришна пушка", + "ранац", + "пекара", + "Греда", + "Балон (ваздухоплов)", + "Хемијска оловка", + "Бенџо", + "Pojata", + "барометар", + "Бачва", + "Тачке", + "Лопта за бејзбол", + "Кошаркашка лопта", + "Колевка", + "фагот", + "када", + "Караван", + "светионик", + "Лабораторијска чаша", + "Двоглед", + "Боб", + "Затварач", + "лук", + "грудњак", + "Лукобран", + "Егида", + "метла", + "кофа", + "Панцир", + "такси", + "Котлић", + "свећа", + "Кану", + "Отварач за конзерве", + "Vrteška", + "Karton", + "Банкомат", + "замак", + "Катамаран", + "Виолончело", + "mobilni telefon", + "Верижњача", + "Моторна тестера", + "Шкриња", + "Komoda", + "Божићна чарапа", + "црква", + "Биоскоп", + "месарски нож", + "кломпа", + "ибрик за кафу", + "tastatura", + "бомбонџија", + "Kontejnerski brod", + "Кабриолет", + "вадичеп", + "труба", + "каубојска чизма", + "Каубојски шешир", + "Дизалице", + "Штака", + "кирас", + "брана", + "радни сто", + "стони рачунар", + "Пелене", + "Крпа за судове", + "Машина за прање судова", + "пристаниште", + "купола", + "мембранофон", + "Тегови", + "електрична гитара", + "електрична локомотива", + "Пудер за лице", + "флаута", + "Фонтана", + "Пенкало", + "Тигањ", + "Бунда", + "Гас маска", + "Голф лоптица", + "гондола", + "Гонг", + "хаљина", + "Стаклена башта", + "бакалница", + "гиљотина", + "Полугусеничар", + "čekić", + "сушилица", + "мобилни уређај", + "Марамица", + "Усна хармоника", + "Харфа", + "peščanik", + "pegla", + "Џек-о'-Лантерн", + "мајица", + "Слагалица", + "Кимоно", + "чвор", + "kutlača", + "лаптоп", + "косилица за траву", + "чамац за спасавање", + "упаљач", + "Karmin", + "Лосион", + "рачунарски звучник", + "Пилана", + "ксилофон", + "Маска", + "мегалит", + "Микрофон", + "Микроталасна пећ", + "минибус", + "Мини сукња", + "пројектил", + "Форд Модел Т", + "Модем", + "мопед", + "džamija", + "Mreža za komarce", + "Брдски бициклизам", + "миш", + "Мишоловка", + "Ексер", + "Огрлица", + "Обелиск", + "обоа", + "Окарина", + "одометар", + "оргуље", + "осцилоскоп", + "Кисеоничка маска", + "Катанац", + "четкица за сликање", + "пиџама", + "Палата", + "Панова фрула", + "Падобран", + "Разбој (гимнастика)", + "путничка кола", + "Плинта", + "Перница", + "Резач за оловке", + "парфем", + "Петријева шоља", + "Фотокопирање", + "Trzalica", + "Пикап", + "kasica-prasica", + "јастук", + "врч", + "Ренде", + "Пластична кеса", + "Плуг", + "Саксија", + "Серџада", + "штампач", + "затвор", + "Пројектил", + "пројектор", + "Пак", + "Боксерска врећа", + "Reket", + "радијатор", + "Радио-телескоп", + "хладњак", + "Ресторан", + "Револвер", + "Пушка", + "љуљача", + "Лопта за рагби", + "Лењир", + "Сеф", + "Зихернадла", + "Сандале", + "saksofon", + "terazije", + "вијак", + "одвијач", + "Сигурносни појас", + "шиваћа машина", + "штит", + "Колица за куповину", + "Лопата", + "скије", + "Врећа за спавање", + "Логаритмар", + "чарапа", + "Сомбреро", + "Сцена", + "парна локомотива", + "Стетоскоп", + "Штоперица", + "Штедњак", + "трамвајски систем", + "Подморница", + "Сунчани часовник", + "Viseći most", + "Зогер", + "Прекидач", + "Бризгалица", + "Оклопна возила", + "напрстак", + "Vršalica", + "Престо", + "toster", + "Бакља", + "Индијански тотем", + "Трактор", + "Трицикл", + "Tronožac", + "Славолук", + "trolejbus", + "тромбон", + "кишобран", + "моноцикл", + "усисивач", + "Ваза", + "Свод", + "баршун", + "Одежда", + "Вијадукт", + "скрипка", + "Одбојкашка лопта", + "Новчаник", + "војни ваздухоплов", + "веш-машина", + "Водоторањ", + "Звиждаљка", + "Перика", + "Вок", + "вуна", + "Јурта", + "веб-сајт", + "стрип", + "укрштене речи", + "Семафор", + "гвакамоле", + "sladoled", + "Бејгл", + "чизбургер", + "Кромпир пире", + "тиквица", + "krastavac", + "Сено", + "карбонара", + "тесто", + "Пица", + "бурито", + "Црно вино", + "Espreso", + "Егног", + "Клиф", + "Корални гребен", + "Гејзер", + "рт", + "обала", + "Долина", + "Вулкан", + "ženik", + "Уљана репица", + "Госпина папучица", + "Жир", + "Zečarka", + "клас", + "Тоалетни папир" + ] + ], + "FR": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10, + 11, + 12, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 28, + 29, + 30, + 32, + 34, + 36, + 37, + 39, + 40, + 42, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 56, + 60, + 61, + 62, + 63, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 97, + 98, + 99, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 157, + 159, + 160, + 163, + 165, + 169, + 170, + 171, + 172, + 175, + 176, + 177, + 178, + 183, + 191, + 193, + 195, + 196, + 197, + 199, + 200, + 201, + 204, + 206, + 211, + 212, + 213, + 214, + 217, + 219, + 224, + 225, + 226, + 227, + 229, + 230, + 231, + 234, + 235, + 236, + 237, + 239, + 242, + 244, + 245, + 246, + 247, + 249, + 250, + 251, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 282, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 321, + 322, + 323, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 374, + 375, + 376, + 377, + 379, + 380, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 391, + 393, + 394, + 395, + 396, + 397, + 398, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 416, + 417, + 418, + 421, + 422, + 423, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 445, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 501, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 541, + 542, + 543, + 545, + 546, + 547, + 549, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 599, + 600, + 602, + 604, + 606, + 607, + 610, + 611, + 612, + 615, + 616, + 617, + 618, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 628, + 629, + 632, + 634, + 636, + 640, + 641, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 719, + 721, + 724, + 725, + 726, + 727, + 728, + 730, + 731, + 732, + 733, + 734, + 736, + 738, + 739, + 741, + 742, + 743, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 755, + 756, + 757, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 790, + 791, + 792, + 793, + 794, + 795, + 797, + 798, + 800, + 802, + 803, + 806, + 807, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 875, + 876, + 877, + 879, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 897, + 898, + 900, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 911, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 924, + 925, + 926, + 927, + 928, + 929, + 931, + 933, + 934, + 935, + 937, + 938, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 951, + 952, + 954, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 966, + 967, + 968, + 969, + 971, + 972, + 973, + 976, + 978, + 979, + 980, + 981, + 982, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 996, + 997, + 998, + 999 + ], + [ + "tanche", + "poisson rouge", + "grand requin blanc", + "requin-tigre", + "requin-marteau", + "raie électrique", + "dasyatidé", + "coq", + "autruche", + "pinson du nord", + "chardonneret élégant", + "roselin familier", + "passerin indigo", + "merle d'amérique", + "pycnonotidés", + "geai", + "pie", + "mésange", + "Cincle", + "milan", + "pygargue à tête blanche", + "Vautour", + "chouette lapone", + "salamandre tachetée", + "salamandre maculée", + "Siren pisciformis", + "ouaouaron", + "Ascaphidae", + "tortue luth", + "tortue aquatique", + "Cistuda", + "iguane", + "Macroleptura", + "agama (reptile)", + "Monstre de Gila", + "Lézard vert oriental", + "Chamaeleo candidus", + "dragon de Komodo", + "crocodile du Nil", + "alligator d'amérique", + "tricératops", + "Celuta helenae", + "Diadophis pulchellus", + "Stilosoma", + "Hypsiglena ochrorhyncha tortugaensis", + "Boa constricteur", + "Python de Seba", + "cobra indien", + "hydrophiidés", + "vipère à cornes", + "Crotale diamantin", + "Crotalus cerastes laterorepens", + "Bilobites", + "faucheur", + "scorpionisme", + "épeire", + "veuve noire", + "tarentule", + "lycose", + "tique", + "centipède", + "tétras lyre", + "lagopède", + "gélinotte huppée", + "paon", + "caille", + "perdrix", + "perroquet jaco", + "ara (oiseau)", + "cacatoès à huppe jaune", + "loriquet", + "Centropodiné", + "guêpier", + "calao", + "oiseau-mouche", + "galbulidés", + "canard", + "harle huppé", + "oie", + "échidné", + "ornithorynque", + "Wallabi", + "koala cendré", + "Vombat", + "méduse", + "Anémone de mer", + "Cerveau de Neptune", + "vers plats", + "nématode", + "conque", + "escargot", + "limace", + "Limace de mer", + "Oscabrion", + "nautile", + "crabe appelant", + "crabes royaux", + "homard américain", + "langouste rouge", + "écrevisse", + "bernard-l’ermite", + "isopode", + "cigogne blanche", + "cigogne noire", + "spatule (oiseau)", + "flamant", + "aigrette bleue", + "butor", + "gruidé", + "courlan brun", + "poule sultane", + "foulque d'amérique", + "outarde", + "tournepierre à collier", + "bécasseau variable", + "gambette", + "bécassin", + "huîtrier", + "pélican", + "manchot royal", + "albatros", + "baleine grise", + "épaulard", + "Dugongue", + "lion de mer", + "chihuahua (chien)", + "Épagneul japonais", + "Malteser (animal)", + "pékinois", + "Chi-tsu", + "Épagneul nain continental papillon", + "chien de Rhodésie à crête dorsale", + "lévrier afghan", + "limier", + "chien noir et feu pour la chasse au raton laveur", + "barzoï", + "lévrier irlandais", + "petit lévrier italien", + "lévrier whippet", + "chien a loutre", + "Lévrier persan", + "lévrier écossais", + "braque de Weimar à poil court", + "terrier kerry blue", + "airedale (animal)", + "terrier australien", + "terrier de boston", + "schnauzer nain", + "schnauzer géant", + "terrier écossais", + "terrier tibétain", + "Terrier australien à poil soyeux", + "lhassa apso", + "retriever à poil bouclé", + "braque hongrois à poil court", + "setter anglais", + "setter irlandais", + "setter gordon", + "springer anglais", + "cocker spaniel anglais", + "Berger belge Groenendael", + "chien de berger belge malinois", + "berger de brie", + "Kelpie (animal)", + "berger anglais ancestral", + "berger des shetland", + "colley", + "Rottweiler (chien)", + "berger allemand", + "Dobermann (chien)", + "pinscher nain", + "bouvier bernois", + "boxer (chien)", + "mâtin du Tibet", + "bouledogue", + "Dogue allemand", + "Saint-Bernard", + "malamute de l'alaska", + "husky sibérien", + "dalmatien", + "Terrier du Congo", + "Pug (animal)", + "chien de Leonberg", + "Terre-Neuve", + "Pastou", + "Samoyède", + "Poméranien", + "chowchow", + "spitz loup", + "loup", + "loup arctique", + "loup rouge", + "Coyote (canidé)", + "dingo (chien sauvage)", + "chien rouge", + "lycaon", + "Hyènes", + "renard commun", + "renard isatis", + "renard gris", + "chat tigré", + "chat-tigre", + "chat persan", + "siamois", + "lion des montagnes", + "loup-cervier", + "léopard", + "panthère des neiges", + "panthère", + "roi des animaux", + "tigre", + "guépard", + "ours brun", + "ours noir", + "ours blanc", + "ours lippu", + "mangouste", + "Suricata", + "cicindèle", + "coccinelle", + "carabe", + "Cérambycidé", + "Chrysomèle", + "scarabée bousier", + "scarabée rhinocéros", + "charançon", + "mouche", + "abeille", + "fourmi", + "sauterelle", + "grillon", + "canne", + "Blattaria", + "mante", + "cicadidae", + "Cicadelloidea", + "libellule", + "demoiselle", + "amiral", + "Tristan (papillon)", + "monarque", + "lycénidé", + "étoile de mer", + "oursin", + "concombre de mer", + "lapin d'amérique", + "lièvre", + "lapin angora", + "le hamster", + "porc-épic", + "écureuil renard", + "marmotte", + "bièvre", + "cobaye", + "zèbre", + "porc", + "Sus scrofa scrofa", + "phacochère", + "hippopotame", + "bœuf", + "buffle domestique", + "Bisonne", + "bélier", + "mouflon canadien", + "bouquetin des alpes", + "Hartbee", + "impala à face noire", + "Gazelle (animal)", + "dromadaire", + "lama", + "belettes", + "vison", + "putois d'Europe", + "putois à pieds noirs", + "loutre", + "moufette", + "blaireau", + "tatou", + "paresseux à crinière", + "orang-outan de Bornéo", + "gorille", + "chimpanzé", + "gibbons", + "Symphalangus", + "cercopithèque", + "Singe pleureur", + "babouin", + "Presbytini", + "colobe", + "nasique", + "ouistiti", + "alouate", + "Callicebus", + "singe-araignée de Geoffroy", + "saïmiri", + "maki catta", + "éléphant d'Asie", + "éléphant d'afrique", + "panda roux", + "ours panda", + "anguille", + "saumon coho", + "poisson-clown", + "Esturgeon", + "orphie", + "poisson-lion", + "poisson globe", + "boulier", + "Robe universitaire en France", + "accordéon", + "guitare acoustique", + "porte-aéronefs", + "avion de ligne", + "dirigeable", + "autel", + "ASSU", + "véhicule amphibie", + "horloge analogique", + "rucher", + "tablier", + "poubelle", + "fusil d'assaut", + "sac à dos", + "poutre", + "ballon", + "stylo", + "balustre", + "haltère", + "chaise de barbier", + "grange", + "baromètre", + "barrique", + "brouette", + "balle de baseball", + "basket-ball", + "bercelonnette", + "basson", + "bonnet de bain", + "serviette de bain", + "baignoire", + "break", + "phare", + "bécher", + "bonnet à poil", + "bouteille de bière", + "deux-pièces", + "jumelle", + "nichoir", + "hangar à bateaux", + "Bobelet", + "Cravate bolo", + "bonnet (vêtement)", + "bibliothèque", + "librairie", + "bouchon", + "arc", + "nœud papillon", + "laiton", + "soutien-gorge", + "jetée", + "égide", + "balai", + "baquet", + "boucle (ceinture)", + "gilet pare-balles", + "shinkansen", + "boucherie", + "taxi-auto", + "Chaudron", + "bougie", + "canon", + "canot", + "Ouvre-boîtes", + "jaquette", + "manège", + "carton (emballage)", + "guichet automatique bancaire", + "cassette vidéo", + "château", + "KL (catamaran)", + "lecteur CD", + "violoncelle", + "GSM", + "chaîne", + "Grillage", + "cotte de mailles", + "tronçonneuse", + "coffre", + "commode (meuble)", + "sonnette", + "vaisselier", + "bas de Noël", + "église", + "salle de cinéma", + "couperet", + "voile", + "geta (chausses)", + "shaker", + "cafetière", + "hélice", + "serrure à combinaison", + "clavier", + "sucrerie", + "porte-conteneurs", + "décapotable", + "tire-bouchon", + "cornet à pistons", + "santiag", + "chapeau de cow-boy", + "berceau", + "grue", + "casque de moto", + "crete", + "lit de camp", + "mijoteuse", + "béquille", + "armure", + "barrage", + "bureau", + "ordinateur de bureau", + "cadran d'appel", + "couche-culotte", + "table à manger", + "lavette", + "lave-vaisselle", + "frein à disque", + "darse", + "traîneau à chien", + "dôme", + "paillasson", + "tambour", + "baguette", + "haltère", + "ventilateur", + "guitare électrique", + "Locomotive électrique", + "enveloppe", + "poudre", + "boa (vêtement)", + "classeur à tiroirs", + "bateau-pompe", + "fourgon d'incendie", + "écran de cheminée", + "mât", + "flûte traversière", + "chaise pliante", + "Casque de Fooball", + "chariot élévateur", + "fontaine", + "stylo plume", + "lit à baldaquin", + "cor d'harmonie", + "poêle", + "manteau de fourrure", + "camion poubelle", + "masque anti-gaz", + "distributeur d'essence", + "gobelet", + "Kart", + "balle de golf", + "voiturette de golf", + "gondole", + "gong (instrument)", + "robe", + "piano à queue", + "serre", + "calandre", + "épicerie", + "guillotinés", + "laque", + "semi-chenillé", + "marteau", + "panier à couvercle", + "sèche-cheveux", + "appareil mobile", + "mouchoir", + "disque dur", + "Harmonika", + "harpe", + "moissonneuse", + "hache", + "pavage de l'espace", + "crochet", + "barre fixe", + "sablier", + "fer à repasser", + "citrouille-lanterne", + "t-shirt à manches longues", + "casse-tête", + "pousse-pousse (transport de personnes)", + "genouillère", + "nœud", + "blouse", + "louche", + "ordinateur portable", + "tondeuse à gazon", + "capuchon de l'objectif", + "coupe-papier", + "bibliothèque", + "canot de sauvetage", + "allumeur", + "transatlantique", + "rouge à lèvres", + "haut-parleur", + "scierie", + "sac postal", + "plaque d'égout", + "Maracasse", + "masque", + "allumette", + "arbre de mai", + "labyrinthe", + "verre gradué", + "armoire à pharmacie", + "mégalithe", + "micro", + "micro-onde", + "Uniforme militaire", + "pot à lait", + "minijupe", + "monospace", + "Missile (autopropulsé)", + "moufle", + "saladier", + "maison mobile", + "Ford Modèle T", + "Modem acoustique", + "monastère", + "vélomoteur", + "mortier", + "mortier (couvre-chef)", + "mosquée", + "moustiquaire", + "scouteur", + "vélo de montagne", + "souris", + "piège à souris", + "muselière", + "clou", + "Collier cervical", + "collier", + "tétine", + "portable", + "obélisque", + "haut bois", + "patate douce", + "odomètre", + "filtre à huile", + "Orgue", + "oscillographe", + "charette à bœufs", + "masque à oxygène", + "paquet", + "pagaie", + "roue à aubes", + "cadenas", + "pinceau", + "palais", + "flûte de Pan", + "essuie-tout", + "Parachuté", + "barres parallèles", + "parcmètre", + "voiture de chemin de fer", + "terrasse", + "téléphone public", + "socle", + "trousse", + "taille-crayon", + "fragrance", + "Boîte de Petri", + "photocopieuse", + "onglet", + "casque à pointe", + "palissade", + "SUT", + "cochon tirelire", + "oreiller", + "bateau pirate", + "broc", + "rabot", + "planétarium", + "sac plastique", + "charrue", + "ventouse (déboucheur)", + "appareil photographique instantané", + "poteau", + "panier à salade", + "table de billard", + "pot de fleurs", + "tour de potier", + "tapis de prière", + "imprimante", + "tôle", + "projecteur", + "palet", + "punching-ball", + "porte-monnaie", + "plume", + "édredon", + "voiture de course", + "raquette (sport)", + "radiateur", + "radiotélescope", + "réservoir d'eau de pluie", + "camping-car", + "appareil reflex", + "frigidaire", + "télécommande", + "resto", + "révolver", + "fusil", + "berçante", + "rôtissoire", + "caoutchouc", + "Ballon de rugby à XIII", + "règle", + "chaussure de sport", + "coffre-fort", + "épingle de sûreté", + "salière", + "sandale", + "pagne", + "fourreau", + "balance (instrument)", + "autobus scolaire", + "goélette", + "tableau d'affichage", + "écran", + "vis", + "tournevis", + "ceinture de sécurité", + "machine à coudre", + "écu", + "magasin de chaussures", + "panier", + "Caddie", + "pelle", + "bonnet de douche", + "rideau de douche", + "ski (matériel)", + "sac de couchage", + "règle à calcul", + "bandit manchot", + "motoneige", + "charrue", + "chaussette", + "capteur solaire", + "barre d'espace", + "chaufferette", + "navette spatiale", + "spatule", + "vedette", + "toile d'araignée", + "fuseau", + "voiture de sport", + "projecteur", + "scène", + "locomotive à vapeur", + "pont en arc par-dessus", + "Steel-drum", + "stéthoscope", + "étole", + "mur de pierre", + "chronomètre", + "poêle", + "passoire", + "tramway", + "civière", + "sous-marin", + "costume", + "Cadran solaire", + "lunettes de soleil", + "crème solaire", + "pont suspendu", + "serpillière", + "sweat-shirt", + "balançoire", + "interrupteur", + "seringue", + "lampe de table", + "char de combat", + "Théière", + "ours en peluche", + "télévision", + "balle de tennis", + "chaume", + "rideau d'avant-scène", + "dé à coudre", + "batteuse", + "trône", + "grille-pain", + "bureau de tabac", + "lunette", + "lampe de poche", + "mât totémique", + "dépanneuse", + "magasin de jouets", + "tracteur", + "semi-remorque", + "plateau", + "trench", + "vélocipède", + "trépied", + "arc de triomphe", + "trombone à coulisse", + "baquet", + "tourniquet", + "ombrelle", + "piano droit", + "aspirateur", + "vase (récipient)", + "voûte", + "velours", + "distributeur automatique", + "vêtement liturgique", + "viaduc", + "Vijole", + "ballon de volley-ball", + "moule à gaufres", + "horloge murale", + "portefeuille", + "penderie", + "avion militaire", + "machine à laver le linge", + "bouteille d'eau", + "château d'eau", + "sifflet à roulette", + "perruque", + "moustiquaire de fenêtre", + "bouteille de vin", + "aile", + "Carrail", + "cuillère en bois", + "laine", + "épave", + "yole", + "yourte", + "site Internet", + "bédé", + "mots croisés", + "panneau", + "feu", + "jaquette", + "Purée d'avocats", + "Consommé (cuisine)", + "fondue chinoise", + "bagatelle", + "glace", + "glace", + "beguel", + "hamburger au fromage", + "hot-dog", + "Purée de pommes de terre", + "brocoli", + "chou-fleur", + "concombre", + "artichaut", + "poivron", + "cardon", + "champignon", + "Pomme Granny smith", + "fraise", + "citron", + "figue", + "banane", + "grenade", + "foin", + "pâtes à la carbonara", + "sirop de chocolat", + "pâte", + "rôti de viande hachée", + "pâte à pizza", + "gros rouge", + "expresso", + "tasse", + "liqueur aux œufs", + "bulle", + "falaise", + "récif corallien", + "cap", + "côte", + "vallée", + "volcan", + "joueur de baseball", + "jeune marié", + "colza", + "marguerite", + "Sabot de Vénus", + "maïs", + "gland", + "cynorrhodon", + "marron d'Inde", + "ramariaceae", + "Champignon à lames", + "Polypore en touffe", + "bolet", + "épi", + "papier-cul" + ] + ], + "HI": [ + [ + 1, + 9, + 16, + 17, + 21, + 23, + 48, + 51, + 61, + 63, + 65, + 66, + 69, + 71, + 78, + 79, + 85, + 86, + 88, + 92, + 93, + 94, + 99, + 102, + 103, + 104, + 105, + 106, + 107, + 111, + 113, + 122, + 127, + 129, + 130, + 133, + 134, + 138, + 144, + 148, + 149, + 151, + 160, + 180, + 191, + 208, + 234, + 235, + 242, + 244, + 246, + 249, + 252, + 256, + 259, + 269, + 270, + 272, + 273, + 274, + 276, + 277, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 301, + 305, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 319, + 323, + 327, + 328, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 348, + 352, + 353, + 354, + 355, + 356, + 360, + 362, + 363, + 365, + 366, + 367, + 368, + 369, + 372, + 373, + 374, + 375, + 376, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 398, + 399, + 401, + 403, + 407, + 408, + 411, + 412, + 413, + 415, + 417, + 418, + 420, + 421, + 425, + 426, + 428, + 430, + 435, + 437, + 445, + 447, + 453, + 454, + 456, + 459, + 460, + 462, + 463, + 464, + 466, + 468, + 470, + 472, + 480, + 481, + 483, + 485, + 486, + 487, + 488, + 492, + 497, + 498, + 499, + 505, + 508, + 513, + 516, + 517, + 521, + 525, + 527, + 529, + 534, + 536, + 538, + 541, + 547, + 549, + 557, + 558, + 560, + 562, + 567, + 570, + 571, + 576, + 577, + 580, + 582, + 583, + 587, + 589, + 591, + 593, + 594, + 606, + 608, + 609, + 610, + 612, + 616, + 618, + 619, + 620, + 626, + 627, + 629, + 631, + 632, + 634, + 643, + 649, + 650, + 651, + 655, + 657, + 662, + 665, + 668, + 669, + 670, + 673, + 677, + 679, + 681, + 682, + 685, + 688, + 691, + 692, + 695, + 697, + 698, + 701, + 708, + 710, + 711, + 719, + 721, + 726, + 728, + 730, + 738, + 741, + 742, + 743, + 744, + 745, + 748, + 750, + 753, + 755, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 769, + 771, + 774, + 775, + 776, + 777, + 778, + 783, + 784, + 786, + 787, + 792, + 795, + 797, + 798, + 806, + 808, + 816, + 817, + 823, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 844, + 845, + 847, + 849, + 857, + 861, + 862, + 866, + 870, + 873, + 875, + 879, + 882, + 883, + 885, + 889, + 893, + 897, + 911, + 915, + 916, + 918, + 919, + 920, + 928, + 933, + 938, + 943, + 952, + 953, + 957, + 958, + 963, + 966, + 971, + 973, + 974, + 978, + 979, + 980, + 982, + 984, + 988, + 999 + ], + [ + "सुनहरी मछली (गोल्डफिश)", + "शुतुरमुर्ग", + "बुलबुल", + "nil kanth", + "चील", + "गिद्ध", + "कोमोडो ड्रैगन", + "ट्राइसेराटोप्स", + "बोआ कंस्ट्रिकटर", + "नाग", + "ह्य्द्रोफीनाइ", + "सेरास्टीस सेरास्टीस", + "ट्राइलोबाइट", + "बिच्छी", + "किलनी", + "शतपाद", + "बटेर", + "तीतर", + "मैकौ", + "पतेना", + "धनेश", + "गुंजन पक्षी", + "हंसी", + "एकिडना", + "प्लैटिपस", + "वल्लाबी", + "कोअला", + "वॉम्बैट", + "जेलिफ़िश", + "सूत्रकृमि", + "स्थलीय घोंघा", + "अमेरिकी झींगा मछली", + "श्वेत राजबक", + "चम्मचचोंच", + "राजहंस", + "जुनबगला", + "सारस", + "तिलोर", + "पेलिकन", + "किलर व्हेल", + "डूगोंग", + "चिहुआहुआ (कुत्ता)", + "अफगान हाउन्ड", + "पिट बुल", + "एरडेल टेरियर", + "लैब्राडोर", + "रोटवीलर", + "जर्मन शेफर्ड", + "बॉक्सर (कुत्ता)", + "भोटिया कुत्ता", + "ग्रेट डेन", + "अलास्कन मलामुट", + "अफ्फनपिन्स्चर", + "न्यूफ़ाउंडलैंड", + "पोमेरेनियन", + "भेड़िया", + "आर्कटिक वृक", + "कायोटी", + "डिंगो", + "सोनकुत्ता", + "हाइना (वंश)", + "लोमड़ी", + "कूगर", + "बनबिलाव", + "तेन्दुआ", + "हिम तेन्दुआ", + "जैगुआर", + "शेर", + "बाघ", + "चीता", + "भूरा भालू", + "अमेरिकी काला भालू", + "ध्रुवीय भालू", + "नेवला", + "सोनपंखी", + "शमल भृंग", + "डिप्टेरा", + "मधुमक्खी", + "चींटी", + "झीँगुर", + "ब्लाट्टोडेया", + "मैंटिस", + "झींगुर", + "व्याध पतंग", + "मोनार्च", + "तारामीन", + "जलसाही", + "खरहा", + "हैम्स्टर", + "साही", + "मारमोट", + "ऊदबिलाव", + "गिनी पिग", + "ज़ीब्रा", + "सूअर", + "जंगली सुअर", + "जलहस्ती", + "बैल", + "भैंस", + "बायसन", + "मेंढ़ा", + "इंपाला", + "गज़ेल", + "सांडनी", + "लामा", + "रासू", + "ऊदबिलाव", + "बिज्जू", + "आर्माडिलो", + "ओरंगउटान", + "गोरिल्ला", + "चिम्पांज़ी", + "गिबन", + "सियामंग", + "बैबून", + "मैकाक बंदर", + "कोलोबिने", + "काला-श्वेत कोलोबस", + "प्रोबोसिस बंदर", + "भारतीय हाथी", + "अफ़्रीकी हाथी", + "लाल पांडा", + "पाण्डा", + "सर्पमीन", + "क्लाउनफ़िश", + "असीपेंसेरडे", + "अबाकस", + "अबाया", + "अकॉर्डियन", + "वायुयान वाहक पोत", + "एम्बुलेंस", + "द्विधा गतिवाला वाहन", + "तहबन्द", + "कचरा पात्र", + "असाल्ट राइफल", + "बेकरी", + "गुब्बारा", + "बॉलपेन", + "बैंजो", + "डंडा", + "खलिहान", + "बैरोमीटर", + "व्हील बैरो", + "बास्केटबॉल", + "बाथटब", + "प्रकाशस्तम्भ", + "बिकिनी", + "द्विनेत्री दूरदर्शी", + "किताबों की अलमारी", + "किताबों की दुकान", + "कमान", + "ब्रेजिअर", + "जेटी", + "झाड़ू", + "बाल्टी", + "बकसुआ", + "बुलेट ट्रेन", + "टेक्सी", + "मोमबत्ती", + "कश्ती", + "स्वचालित गणक मशीन", + "कैसेट", + "दुर्ग", + "सीडी प्लेयर", + "सेलो", + "मोबाइल फ़ोन", + "श्रृंखला", + "संदूक़", + "चर्च", + "सिनेमा", + "क्लीवर", + "कॉफी पाट", + "कुञ्जीपटल", + "भोंपू", + "पालना", + "क्रेन", + "स्लो कुकर", + "बाँध", + "डेस्कटॉप", + "कलोट", + "पात्र प्रक्षालक", + "गोदी", + "गुम्बज", + "ढोल", + "विद्युत कर्षण", + "लिफ़ाफ़ा", + "झंडा फहराने का स्तम्भ", + "बांसुरी", + "फुटबॉल हैलमेट", + "फव्वारा", + "कड़ाहा", + "गैसत्राण", + "वितरण इकाई", + "गोंडोला", + "घंटा", + "ग्रीनहाउस", + "पंसारी की दुकान", + "गिलोटिन", + "हथौड़ा", + "हेअर-ड्रायर", + "रूमाल", + "माउथ ऑर्गन", + "वीणा", + "वस्त्र निपीडक", + "जीन्स", + "जीप", + "टी-शर्ट", + "रिक्शा", + "गांठ", + "कलछी", + "दीपछत्र", + "लैपटॉप", + "लाइटर", + "लिमोसिन", + "रंजनशलाका", + "लोशन", + "लाउडस्पीकर", + "आरा मिल", + "मुखौटा", + "महापाषाण", + "माइक्रोफ़ोन", + "माइक्रोवेव अवन", + "मिनीस्कर्ट", + "प्रक्षेपास्त्र", + "मॉडेम", + "मोपेड", + "मसजिद", + "मच्छरदानी", + "स्कूटर", + "माउस", + "कील", + "हार", + "लैपटॉप", + "ओबिलिस्क", + "पथमापी", + "दोलनदर्शी", + "ऑक्सीजन मास्क", + "पुलिंदा", + "ताला", + "पजामा", + "महल", + "पैराशूट", + "नींव आधार", + "पेंसिल चोखा", + "इत्र", + "गुल्लक", + "तकिया", + "रंदा", + "बैग", + "हल", + "Aksitha", + "जा-ए-नमाज़", + "प्रिण्टर", + "कारागार", + "प्रक्षेप्य", + "प्रक्षेपित्र", + "बटुआ", + "रज़ाई", + "विकिरक", + "रेडियो दूरदर्शी", + "प्रशीतित्र", + "रिमोट कन्ट्रोल", + "रेस्टोरेन्ट", + "रिवॉल्वर", + "राइफ़ल", + "झूलकुर्सी", + "रोटिसेरी", + "पैमाना", + "सेफ़", + "चप्पल", + "सारोंग", + "सैक्सोफ़ोन", + "मियान", + "तराज़ू", + "पेच", + "पेंचकस", + "सिलाई मशीन", + "ढाल", + "बेलचा", + "स्की", + "स्लीपिंग बैग", + "विसर्पी गणक", + "मोज़ा", + "सोमब्रेरो", + "तकली", + "स्पोर्ट्स कार", + "परिश्रावक", + "विराम घड़ी", + "चूल्हा", + "ट्राम", + "स्ट्रेचर", + "स्तूप", + "पनडुब्बी", + "सूट", + "सौर घड़ी", + "धूप का चश्मा", + "सनस्क्रीन", + "झूला पुल", + "स्विच", + "सुई", + "टैंक", + "चायदान", + "राजसिंहासन", + "टॉयलेट सीट", + "मशाल", + "ट्रैक्टर", + "तिपहिया साइकिल", + "विजय स्मारक", + "त्रोम्बोन", + "छाता", + "वैक्यूम क्लीनर", + "गुलदान", + "मखमल", + "सारंगी", + "बटुआ", + "कपड़ा धोने की मशीन", + "ऊन", + "युर्त", + "जालस्थल", + "वर्ग पहेली", + "यातायात संकेत", + "ट्रैफ़िक लाइट", + "मलाईबर्फ़", + "चीज़बर्गर", + "कोबी", + "खीरा", + "अंजीर", + "अन्नानास", + "अनार", + "सूखी घास", + "पिज़ा", + "लाल शराब", + "बुलबुला", + "प्रवाल शैल-श्रेणी", + "गीजर", + "सागरतट", + "वादी", + "ज्वालामुखी", + "दूल्हा", + "कैनोला", + "बंजुफल", + "शौच पत्र" + ] + ], + "FY": [ + [ + 0, + 2, + 9, + 10, + 11, + 18, + 20, + 23, + 71, + 92, + 94, + 99, + 100, + 107, + 111, + 127, + 128, + 130, + 134, + 138, + 140, + 141, + 143, + 146, + 235, + 256, + 272, + 277, + 287, + 291, + 296, + 298, + 301, + 309, + 310, + 322, + 323, + 330, + 331, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 345, + 347, + 350, + 352, + 354, + 356, + 358, + 359, + 360, + 361, + 362, + 386, + 388, + 390, + 403, + 404, + 405, + 411, + 414, + 417, + 426, + 428, + 437, + 447, + 456, + 459, + 462, + 463, + 472, + 483, + 486, + 487, + 497, + 498, + 508, + 512, + 513, + 525, + 529, + 538, + 541, + 558, + 570, + 583, + 591, + 594, + 611, + 612, + 627, + 642, + 643, + 645, + 649, + 650, + 651, + 662, + 668, + 677, + 679, + 683, + 684, + 687, + 698, + 699, + 701, + 717, + 742, + 743, + 749, + 760, + 764, + 772, + 774, + 776, + 779, + 786, + 787, + 795, + 802, + 820, + 823, + 833, + 839, + 847, + 856, + 864, + 866, + 875, + 888, + 889, + 893, + 900, + 910, + 915, + 916, + 918, + 928, + 943, + 958, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 985, + 988 + ], + [ + "mûdhûn", + "Wite haai", + "strúsfûgel", + "kwêkfink", + "Putter", + "ekster", + "Wetterlysters", + "gier", + "skorpioen", + "Bijefretters", + "Kolibrys", + "goes", + "Swarte Swan", + "kwab", + "Rûnwjirms", + "Earrebarre", + "Swarte Earrebarre", + "Flamingofûgels", + "Kraanfûgels", + "Trapfûgels", + "Bûnte Gril", + "tjirk", + "Strânljippen", + "Albatrossen", + "Dútske hardershûn", + "Nijfûnlanner", + "Prêrjewolf", + "foks", + "lynks", + "liuw", + "iisbear", + "Mangoesten", + "krupelhintsjes", + "bij", + "miammel", + "Donker Sâneachje", + "Monarchflinter", + "Katoensturtkninen", + "Echte hazzen", + "Kjifstikelbargen", + "Swart iikhoarntsje", + "Marmotten", + "bever", + "bargemot", + "sebra", + "baarch", + "Everswyn", + "Okse", + "Bizons", + "stienbok", + "Impala (antilope)", + "drommedaris", + "Lytse marters", + "Murd", + "Swartpoatmurd", + "fiskotter", + "Murden (ûnderskaai)", + "das", + "Afrikaanske Oaljefanten", + "Reuzepanda", + "iel", + "Fleandekskip", + "Passazjiersfleanmasine", + "Loftskip", + "skelk", + "rêchpûde", + "Hiteluchtballon", + "waarglês", + "kroade", + "fjoertoer", + "Fierrekiker", + "bûging", + "boarststipe", + "biezem", + "amer", + "Kano (fartúch)", + "Kastiel", + "Sello", + "mobile tillefoan", + "tsjerke", + "Bioskoop", + "Kaaiboerd", + "koarkelûker", + "Trompet", + "daam", + "Ruft", + "Koepel", + "Membranofoanen", + "Fluit", + "gasmasker", + "falbile", + "bûsdoek", + "Harpe", + "Lispuzel", + "Riksja", + "Limûsine", + "ksylofoan", + "Masker", + "Maaiebeam", + "Megalyt", + "mikrofoan", + "Magnetron", + "oerset", + "Moskee", + "spiker", + "Halskeatling", + "Hobo", + "Okarina", + "oargel", + "Paleis", + "Panfluit", + "Parasjute", + "Pick-up (autotype)", + "Inketprinter", + "Finzenis", + "Guozzefear", + "Kuolkast", + "Gewear", + "Feilichheidsspjelde", + "sandaal", + "Saksofoan", + "skoalbus", + "naaimasine", + "skyld", + "Sky", + "Sniescooter", + "Stoomlokomotyf", + "stetoskoop", + "Underseeboat", + "Hingbrêge", + "Tank (wapen)", + "Terskmasine", + "Sleepauto", + "Trekker", + "Tromboane", + "Fiadukt", + "fioele", + "boekje", + "Wettertoer", + "spoen", + "Joert", + "webstee", + "Krúswurdpuzel", + "rjemme-iis", + "komkommer", + "hea", + "Klif", + "Koraalrif", + "Geiser (boarne)", + "Oerd (lânfoarm)", + "Kust", + "Delling", + "Fulkaan", + "koweblomke", + "ikel" + ] + ], + "ET": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 14, + 15, + 16, + 18, + 22, + 23, + 24, + 29, + 30, + 34, + 39, + 48, + 49, + 50, + 56, + 57, + 62, + 63, + 65, + 66, + 69, + 71, + 75, + 77, + 78, + 79, + 80, + 82, + 86, + 87, + 89, + 94, + 96, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 113, + 114, + 122, + 127, + 128, + 130, + 134, + 135, + 137, + 139, + 140, + 141, + 142, + 144, + 145, + 146, + 147, + 148, + 152, + 153, + 157, + 162, + 163, + 169, + 175, + 176, + 177, + 178, + 180, + 191, + 194, + 199, + 201, + 211, + 213, + 215, + 226, + 227, + 229, + 230, + 233, + 234, + 235, + 236, + 242, + 243, + 244, + 245, + 246, + 247, + 249, + 251, + 252, + 256, + 257, + 258, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 283, + 284, + 286, + 287, + 289, + 290, + 291, + 292, + 293, + 294, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 307, + 308, + 309, + 310, + 311, + 314, + 315, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 347, + 348, + 349, + 350, + 353, + 354, + 355, + 358, + 359, + 360, + 361, + 362, + 363, + 366, + 367, + 368, + 372, + 373, + 376, + 379, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 395, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 410, + 411, + 412, + 413, + 414, + 415, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 430, + 431, + 435, + 437, + 440, + 445, + 447, + 448, + 449, + 450, + 453, + 454, + 455, + 456, + 459, + 460, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 491, + 492, + 493, + 497, + 498, + 506, + 508, + 510, + 511, + 512, + 513, + 516, + 517, + 523, + 525, + 526, + 527, + 529, + 532, + 534, + 536, + 537, + 538, + 541, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 555, + 557, + 558, + 561, + 562, + 563, + 567, + 568, + 570, + 573, + 576, + 580, + 583, + 585, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 604, + 606, + 607, + 608, + 610, + 611, + 616, + 618, + 619, + 620, + 621, + 626, + 628, + 629, + 632, + 634, + 640, + 641, + 642, + 646, + 647, + 649, + 650, + 651, + 655, + 658, + 665, + 668, + 669, + 670, + 673, + 674, + 677, + 679, + 681, + 683, + 684, + 685, + 687, + 688, + 691, + 692, + 693, + 696, + 697, + 698, + 699, + 701, + 705, + 706, + 707, + 708, + 709, + 711, + 712, + 714, + 719, + 721, + 726, + 728, + 730, + 735, + 738, + 739, + 742, + 743, + 744, + 745, + 746, + 748, + 749, + 752, + 753, + 755, + 760, + 761, + 762, + 764, + 765, + 768, + 769, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 797, + 798, + 802, + 803, + 806, + 810, + 811, + 816, + 819, + 820, + 823, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 839, + 843, + 844, + 845, + 847, + 849, + 850, + 854, + 855, + 857, + 862, + 864, + 866, + 868, + 870, + 873, + 874, + 875, + 879, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 891, + 892, + 893, + 895, + 897, + 900, + 902, + 903, + 907, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 928, + 932, + 933, + 935, + 938, + 939, + 943, + 949, + 952, + 953, + 957, + 958, + 960, + 961, + 962, + 963, + 966, + 969, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 984, + 986, + 988, + 989, + 996, + 998, + 999 + ], + [ + "linask", + "kuldkala", + "mõrtsukhai", + "tiigerhai", + "Vasarhailased", + "elektrirailised", + "astelrai", + "jaanalind", + "põhjavint", + "ohakalind", + "indigolind", + "punarind-rästas", + "bülbüllased", + "harakas", + "valgepea-merikotkas", + "kaeluskotkas", + "habekakk", + "Mehhiko tömpsuu", + "Härgkonn", + "Nahkkilpkonn", + "Iguaan", + "komodo varaan", + "niiluse krokodill", + "ameerika alligaator", + "Kuningmadu", + "Tripimadu", + "Hieroglüüfpüüton", + "India kobra", + "merimadulased", + "Harilik sarvikrästik", + "Trilobiidid", + "Skorpionilised", + "Must lesk", + "Huntämbliklased", + "Puugid", + "sadajalgne", + "teder", + "kraepüü", + "Perdicinae", + "hallpapagoi", + "kollatutt-kakaduu", + "koolibrilased", + "tuukan", + "rohukoskel", + "hani", + "mustluik", + "sipelgasiillased", + "nokkloom", + "koaala", + "Vombatlased", + "Meduus", + "Meriroosilised", + "ajukorall", + "lameussid", + "Ümarussid", + "Tigu", + "nälkjas", + "Ameerika homaar", + "valge-toonekurg", + "Must-toonekurg", + "flamingo (perekond)", + "kurg", + "ruikkurg", + "ameerika lauk", + "kivirullija", + "soorüdi", + "Punajalg-tilder", + "neppvigle", + "pelikan", + "kuningpingviin", + "Albatroslased", + "Hallvaal", + "mõõkvaal", + "jaapani spanjel", + "Malta koer", + "Phalene", + "inglise madalajalgne hagijas", + "Verekoer", + "vene hurt", + "saarmakoer", + "Pärsia hurt", + "Hirvekoer", + "Weimari linnukoer", + "pitbullterjer", + "äärdeilterjer", + "Dandie Dinmonti terjer", + "šoti terjer", + "Austraalia siiditerjer", + "Ungari lühikarvaline linnukoer", + "Iiri punane setter", + "Bretooni spanjel", + "Berger de Brie", + "austraalia kelpie", + "Vana-inglise lambakoer", + "Shetlandi lambakoer", + "Flaami karjakoer", + "rotveiler", + "saksa lambakoer", + "Dobermanni pinšer", + "bokser", + "Bullmastif", + "tiibeti mastif", + "prantsuse buldog", + "Saksa dogi", + "Bernhardiin", + "Alaska malamuut", + "Dalmaatsia koer", + "ahvpinšer", + "Newfoundlandi koer", + "Pürenee mäestikukoer", + "samojeedi koer", + "Kääbusspits", + "tšau-tšau", + "susi", + "Polaarhunt", + "lakkhunt", + "koiott", + "Canis antarcticus", + "Punahunt", + "hüäänkoer", + "hüäänlased", + "rebane", + "polaarrebane", + "Pärsia kass", + "Siiami kass", + "puuma", + "ilves", + "lumeleopard", + "jaaguar", + "lõvi", + "tiiger", + "gepard", + "pruunkaru", + "jääkaru", + "mangustlased", + "Surikaat", + "lepatriinu", + "jooksiklane", + "Siklased", + "Poilased", + "Kärsaklased", + "kahetiivalised", + "mesilane", + "Sipelglased", + "rohutirts", + "prussakas", + "Röövritsikalised", + "kiil", + "Taolistiivalised", + "rohusilmik", + "Monarhliblikas", + "meritähed", + "merisiilikud", + "meripurad", + "sooküülik", + "jänes", + "okassealised", + "ümiseja", + "kobras", + "merisiga", + "sebrad", + "siga", + "metssiga", + "tüügassiga", + "jõehobu", + "härg", + "piison", + "oinas", + "Lumelammas", + "kaljukits", + "gasell", + "dromedar", + "laama", + "tuhkur", + "tuhkur", + "saarmas", + "vinuk", + "mäger", + "armadill", + "gorillad", + "šimpans", + "Laar", + "Paavian", + "makaak", + "ninaahv", + "Möiraahv", + "tavasaimiri", + "katta", + "india elevant", + "Aafrika elevant", + "Punane panda", + "Hiidpanda", + "angerjas", + "Harilik tuulehaug", + "arvelaud", + "‘Abā'ah", + "Talaar", + "akordion", + "akustiline kitarr", + "lennukikandja", + "Reisilennuk", + "Dirižaabel", + "kiirabi", + "mesila", + "põll", + "Prügikast", + "Automaat", + "seljakott", + "pagaritööstus", + "õhupall", + "pastapliiats", + "bandžo", + "balustraad", + "Kang (tõstmine)", + "põllumajandushoone", + "baromeeter", + "Vaat", + "Käru", + "koss", + "häll", + "vann", + "tuletorn", + "õllepudel", + "bikiinid", + "binokkel", + "linnumaja", + "paadikuur", + "bobisõit", + "raamaturiiul", + "raamatupood", + "pudelikork", + "vibu", + "rinnahoidja", + "buun", + "luud", + "Ämber", + "pannal", + "kuulivest", + "takso", + "Pada", + "küünal", + "Kanuu", + "konserviavaja", + "kampsun", + "karussell", + "pangaautomaat", + "kassett", + "kindlus", + "Katamaraan", + "tšello", + "mobiiltelefon", + "kett", + "mootorsaag", + "Kirst", + "kummut", + "kirik", + "kino", + "spiraal", + "sõrmistik", + "konteinerilaev", + "kabriolett", + "Korgitser", + "trompet", + "häll", + "kraana", + "Kark", + "pais", + "Kirjutuslaud", + "lauaarvuti", + "Mähkmed", + "söögilaud", + "nõudepesumasin", + "Dokk", + "Koerakelk", + "kuppel", + "trumm", + "Hantel", + "elektrikitarr", + "elektrivedur", + "ümbrik", + "Puuder", + "Boa (riietus)", + "toimik", + "Päästeauto", + "lipuvarras", + "flööt", + "Kahveltõstuk", + "purskkaev", + "sulepea", + "Pann", + "köösneritöökoda", + "Gaasitorbik", + "kart", + "gondel", + "kasvuhoone", + "giljotiin", + "juukselakk", + "poolroomiksõiduk", + "haamer", + "juuksekuivati", + "Mobiilseade", + "taskurätt", + "harmoonika", + "harf", + "liivakell", + "triikraud", + "kõrvitslatern", + "teksapüksid", + "T-särk", + "pusle", + "sõlm", + "Kulp", + "Lambivari", + "sülearvuti", + "muruniiduk", + "Välgumihkel", + "ookeaniliinilaev", + "huulepulk", + "valjuhääldi", + "saeveski", + "kanalisatsioonikaevu kaas", + "Marakas", + "ksülofon", + "labürint", + "mõõtekann", + "megaliit", + "mikrofon", + "mikrolaineahi", + "miniseelik", + "käpik", + "mopeed", + "mošee", + "Putukavõrk", + "motoroller", + "hiir", + "Hiirelõks", + "Nael", + "kaelakee", + "rüperaal", + "oboemängija", + "okariin", + "läbisõidumõõdik", + "orel", + "ostsilloskoop", + "hapnikumask", + "pakett", + "mõla", + "pintsel", + "pidžaama", + "palee", + "paaniflööt", + "langevari", + "reisivagun", + "terrass", + "taksofon", + "plint", + "Pinal", + "lõhnaõli", + "Petri tass", + "plektron", + "hoiupõrsas", + "padi", + "höövel", + "Kilekott", + "Ader", + "pontšo", + "lillepott", + "Potikeder", + "Maatriksprinter", + "vangla", + "Lendkeha", + "Projektor", + "hokiketas", + "kukkur", + "Kirjutussulg", + "reket", + "radiaator", + "Raadioteleskoop", + "külmik", + "kaugjuhtimispult", + "restoran", + "Vintpüss", + "kiiktool", + "ragbi pall", + "Joonlaud", + "seif", + "Haaknõel", + "soolatoos", + "sandaal", + "saksofon", + "mõõgatupp", + "kaal (kaalumisseade)", + "koolibuss", + "kuunar", + "kruvi", + "kruvikeeraja", + "turvavöö", + "õmblusmasin", + "Kilp", + "kühvel", + "suusad", + "magamiskott", + "Arvutuslükati", + "mootorsaan", + "Lumesahk", + "Sokk (riietusese)", + "tühikuklahv", + "küttekeha", + "kedervars", + "lava", + "auruvedur", + "stetoskoop", + "stopper", + "pliit", + "tramm", + "kanderaam", + "stuupa", + "allveelaev", + "Ülikond", + "päikesekell", + "päikeseprillid", + "rippsild", + "kiik", + "Lüliti", + "prits", + "Soomuk", + "teekann", + "kaisukaru", + "Eesriie", + "sõrmkübar", + "troon", + "tõrvik", + "Puksiirauto", + "traktor", + "Kandik", + "kolmerattaline", + "Triumfikaar", + "trollibuss", + "Tromboon", + "vihmavari", + "üksratas", + "tolmuimeja", + "vaas", + "võlv", + "samet", + "viadukt", + "viiul", + "vahvliraud", + "seinakell", + "rahakott", + "sõjalennuk", + "pesumasin", + "veetorn", + "kohtuniku vile", + "parukas", + "veinipudel", + "vill", + "jurta", + "veebisait", + "koomiks", + "Ristsõnad", + "Tänavasilt", + "valgusfoor", + "jäätis", + "Vesikringel", + "juustuburks", + "kartulipuder", + "lillkapsas", + "puhmik-õlikõrvits", + "kurk", + "maasikpunane", + "viigimari", + "ananass", + "granaatõun", + "hein", + "šokolaadisiirup", + "taigen", + "Pikkpoiss", + "pitsa", + "punane vein", + "munaliköör", + "mull", + "pank", + "korallrahu", + "geiser", + "neem", + "rannik", + "org", + "vulkaan", + "raps", + "kaunis kuldking", + "tammetõru", + "kibuvitsamari", + "leht-kobartorik", + "viljapea", + "tualettpaber" + ] + ], + "BS": [ + [ + 1, + 2, + 18, + 22, + 23, + 46, + 48, + 69, + 71, + 78, + 94, + 97, + 100, + 103, + 106, + 110, + 111, + 116, + 148, + 150, + 153, + 169, + 213, + 234, + 235, + 240, + 242, + 251, + 258, + 259, + 260, + 274, + 276, + 289, + 291, + 292, + 293, + 294, + 296, + 298, + 301, + 304, + 308, + 309, + 310, + 312, + 327, + 328, + 329, + 337, + 338, + 341, + 342, + 353, + 360, + 361, + 365, + 366, + 368, + 372, + 374, + 376, + 383, + 386, + 390, + 398, + 401, + 403, + 404, + 410, + 416, + 426, + 430, + 436, + 437, + 450, + 470, + 483, + 484, + 486, + 487, + 497, + 503, + 508, + 511, + 513, + 525, + 538, + 541, + 546, + 558, + 583, + 587, + 606, + 610, + 618, + 620, + 626, + 634, + 643, + 649, + 650, + 651, + 668, + 673, + 677, + 683, + 687, + 688, + 697, + 701, + 705, + 708, + 711, + 712, + 725, + 730, + 742, + 743, + 744, + 746, + 762, + 764, + 774, + 776, + 780, + 783, + 784, + 823, + 829, + 833, + 835, + 847, + 866, + 873, + 874, + 875, + 879, + 884, + 893, + 916, + 918, + 920, + 928, + 943, + 958, + 963, + 967, + 972, + 973, + 974, + 978, + 979, + 980, + 984, + 989 + ], + [ + "Zlatna ribica", + "Velika bijela ajkula", + "svraka", + "Bjeloglavi orao", + "lešinar", + "Zelembać", + "Komodski varan", + "Trilobiti", + "škorpija", + "Krpelj", + "Kolibri", + "patak", + "Crni labud", + "Čudnovati kljunar", + "Vombat", + "Pljosnati crvi", + "Valjkasti crvi", + "Mnogoljušturaši", + "Orka", + "Morski lav", + "Maltezer", + "Ruski hrt", + "Irski seter", + "Rotvajler", + "Njemački ovčar", + "Apencelska kokoš", + "Njemački bokser", + "Dalmatinac", + "Samojed (pas)", + "Pomeranac", + "Čau čau", + "Azijski divlji pas", + "Hijena", + "Snježni leopard", + "Lav", + "tigar", + "Gepard", + "Mrki medvjed", + "Polarni medvjed", + "Mungos", + "bubamara", + "Zlatice", + "Dvokrilci", + "Pčela", + "Mravi", + "cvrčak", + "Morske zvijezde", + "morski jež", + "Morski krastavci", + "dabar", + "Zamorac", + "svinja", + "Divlja svinja", + "gazela", + "Vidra", + "tvor", + "Orangutani", + "Gorile", + "Giboni", + "Babun", + "Vitkostasi i sakati majmuni", + "Majmun nosonja", + "Prstenorepi lemur", + "Afrički slon", + "jegulja", + "Abakus (računaljka)", + "Harmonika", + "Nosač aviona", + "Putnički avion", + "Pčelinjak", + "Greda (gimnastika)", + "Barometar", + "Košarkaška lopta", + "Karavan (automobil)", + "svjetionik", + "Bob (sport)", + "Svijeća", + "Dvorac", + "Katamaran", + "violončelo", + "Mobilni telefon", + "crkva", + "Šejker", + "tastatura", + "Kabriolet", + "Truba", + "Brana", + "kupola", + "Bubanj", + "električna gitara", + "Flauta", + "Giljotina", + "čekić", + "pegla", + "majica", + "kutlača", + "Prijenosnik", + "Upaljač", + "Pilana", + "Maska", + "Megalitska kultura", + "Mikrofon", + "Mikrovalna peć", + "džamija", + "miš", + "Ekser", + "Oboa", + "Orgulje", + "Osciloskop", + "pidžama", + "Padobran", + "Putnički vagon", + "Plinta", + "Parfem", + "Petrijeva zdjelica", + "ibrik", + "Plug", + "pisač", + "Zatvor", + "Projektil", + "Pak (hokej)", + "Restoran", + "Puška", + "Sandala", + "Saksofon", + "Škuna", + "Vijak", + "Odvijač", + "Stetoskop", + "tramvaj", + "Podmornica", + "Sunčani sat", + "Oklopno vozilo", + "Traktor", + "Slavoluk", + "Trolejbus", + "Trombon", + "Kišobran", + "Svod", + "Novčanik", + "Veb-sajt", + "Križaljka", + "Semafor", + "Sladoled", + "krastavac", + "Sijeno", + "pica", + "Espresso kafa", + "Klif", + "Koralni greben", + "Gejzir", + "Obala", + "Dolina", + "vulkan", + "Uljana repica", + "Šipurak" + ] + ], + "SW": [ + [ + 4, + 9, + 16, + 18, + 20, + 21, + 23, + 45, + 48, + 65, + 71, + 79, + 85, + 86, + 91, + 92, + 93, + 94, + 99, + 102, + 103, + 104, + 105, + 106, + 107, + 110, + 111, + 113, + 129, + 130, + 133, + 134, + 138, + 143, + 144, + 146, + 269, + 275, + 276, + 277, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 296, + 298, + 299, + 305, + 307, + 308, + 309, + 310, + 314, + 315, + 316, + 329, + 334, + 337, + 340, + 341, + 342, + 343, + 344, + 346, + 347, + 352, + 353, + 355, + 359, + 360, + 362, + 363, + 365, + 366, + 367, + 368, + 372, + 373, + 374, + 388, + 390, + 398, + 401, + 402, + 405, + 407, + 411, + 414, + 417, + 418, + 420, + 428, + 430, + 432, + 435, + 437, + 454, + 456, + 459, + 460, + 461, + 462, + 463, + 468, + 470, + 472, + 481, + 483, + 486, + 487, + 488, + 491, + 497, + 498, + 505, + 508, + 513, + 514, + 517, + 525, + 526, + 538, + 541, + 549, + 558, + 578, + 587, + 591, + 593, + 594, + 604, + 610, + 612, + 616, + 620, + 626, + 632, + 642, + 643, + 650, + 651, + 657, + 662, + 668, + 669, + 673, + 677, + 679, + 683, + 687, + 692, + 695, + 711, + 725, + 726, + 730, + 742, + 743, + 748, + 752, + 760, + 762, + 769, + 771, + 774, + 776, + 778, + 783, + 784, + 786, + 787, + 795, + 798, + 806, + 810, + 823, + 824, + 833, + 834, + 835, + 837, + 840, + 844, + 845, + 847, + 862, + 866, + 875, + 879, + 882, + 885, + 889, + 893, + 895, + 902, + 909, + 911, + 916, + 928, + 932, + 938, + 943, + 949, + 952, + 953, + 957, + 958, + 961, + 973, + 974, + 978, + 979, + 980, + 982, + 998, + 999 + ], + [ + "Papa Mbingusi", + "mbuni", + "Shore", + "Kinubi", + "Mkesha-maji", + "Mwewe", + "tumbusi", + "Dubwana-Gila", + "Joka wa Komodo", + "Swila-bahari", + "nge", + "Tandu", + "Tombo", + "Sikipi", + "Dudumizi", + "Keremkerem", + "Hondohondo", + "Kolibri", + "bata bukini", + "mhanganungu", + "kinyamadege", + "Walabi", + "Phascolarctos", + "wombati", + "Konyeza", + "Mnyoo-bapa", + "mnyoo", + "konokono", + "Domomwiko", + "Heroe", + "Vumatiti", + "korongo", + "Tandawala", + "Kizamiachaza", + "Mwari", + "Albatrosi", + "mbwa mwitu", + "mbwa mwitu", + "Fisi", + "mbweha mwekundu", + "Simba-milima", + "Linksi", + "chui", + "Chui-theluji", + "jagwa", + "simba", + "chui milia", + "Duma", + "Dubu barafu", + "Nguchiro", + "nguchiro wa porini", + "Bungo-mavi", + "Fukusi", + "inzi", + "Nyuki", + "sisimizi", + "kombamwiko", + "Kivunjajungu", + "Nyenje-miti", + "Jongoobahari", + "nungunungu", + "biva", + "punda milia", + "nguruwe", + "jivi", + "ngiri", + "Kiboko", + "nyati", + "Baisani", + "Swala pala", + "swara", + "Lama (mnyama)", + "fereti", + "ota", + "melesi", + "kakakuona", + "Orangutanu", + "nyani", + "sokwe mtu", + "Masokwe wadogo", + "nyani", + "Kaku", + "Mbega", + "Panda Mkubwa", + "mkunga", + "Abakasi", + "kodiani", + "Gitaa kavu", + "Ndegeputo", + "ambyulensi", + "aproni", + "Mfuko wa backpack", + "Puto", + "kalamu", + "zeze la kizungu", + "ngolofimo", + "mpira wa kikapu", + "basuni", + "bafu", + "Mnara wa taa", + "duka la vitabu", + "upinde", + "sindiria", + "fuko", + "egisi", + "Ufagio", + "Ndoo", + "teksi", + "Mshumaa", + "Mtumbwi", + "kaseti", + "Ngome", + "chelo", + "rununu", + "mnyororo", + "Msumenonyororo", + "kanisa", + "Jumba la Sinema", + "dele", + "baobonye", + "tarumbeta", + "Mabuti ya wachunga ng'ombe", + "jeki", + "Lambo", + "jarari", + "Kuba (jengo)", + "Ngoma (ala ya muziki)", + "bahasha", + "Filimbi", + "Gauni", + "nyundo", + "Leso", + "kinanda cha mdomo", + "kinubi", + "Saa ya mchanga", + "sweta", + "Riksho", + "Fundo", + "Tarakilishi mpakato", + "mwanga", + "Kipaza sauti", + "marimba ya kizungu", + "barakoa", + "mikrofoni", + "oveni ya mikrowevu", + "Kombora", + "Kiwiano", + "msikiti", + "kiandarua cha mbu", + "puku", + "msumari", + "kidani", + "nzumari ndogo", + "Kinanda cha filimbi", + "pakiti", + "kufuli", + "Marashi", + "nzio", + "Randa", + "plau", + "Kichapishi", + "Gereza", + "mfuko", + "Raketi", + "Jokofu", + "mkahawa", + "Rula", + "uganda", + "Makubadhi", + "saksofoni", + "Mizani", + "parafujo", + "Bisibisi", + "Cherehani", + "Ngao", + "skii", + "Kikokoteo", + "soksi", + "Kibonyezo cha nafasi", + "Stethoskopu", + "Stola", + "Nyambizi", + "suti", + "bonyeza", + "miwani ya jua", + "deki", + "swichi", + "sirinji", + "Kifaru (jeshi)", + "mwenge", + "Trekta", + "tromboni", + "Mwavuli", + "Kisafishi ombwe", + "mahameli", + "fidla", + "kipochi", + "Ndege ya kijeshi", + "Filimbi", + "Karai", + "manyonya", + "Tovuti", + "aiskrimu", + "pretseli", + "koliflawa", + "tango", + "rangi ya strouberi", + "tini", + "nanasi", + "komamanga", + "ukoko mkwavu", + "Kinyunga", + "Matumbawe", + "gaiza", + "Pwani", + "bonde", + "Volkeno", + "bwanaarusi", + "sikio", + "karatasi ya choo" + ] + ], + "AZ": [ + [ + 0, + 1, + 2, + 3, + 5, + 9, + 10, + 11, + 13, + 15, + 16, + 21, + 22, + 24, + 34, + 39, + 40, + 46, + 48, + 49, + 50, + 51, + 66, + 69, + 71, + 78, + 79, + 86, + 92, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 116, + 123, + 127, + 128, + 129, + 130, + 134, + 135, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 154, + 162, + 235, + 242, + 243, + 244, + 247, + 251, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 308, + 309, + 310, + 312, + 314, + 315, + 323, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 348, + 350, + 352, + 353, + 354, + 355, + 356, + 360, + 362, + 364, + 365, + 366, + 367, + 372, + 376, + 382, + 384, + 385, + 386, + 387, + 388, + 390, + 391, + 394, + 395, + 398, + 399, + 402, + 403, + 404, + 407, + 408, + 411, + 413, + 414, + 415, + 418, + 421, + 425, + 426, + 427, + 428, + 430, + 432, + 435, + 436, + 437, + 447, + 450, + 454, + 456, + 459, + 460, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 480, + 481, + 483, + 486, + 487, + 488, + 492, + 497, + 498, + 502, + 508, + 511, + 512, + 513, + 516, + 517, + 525, + 526, + 534, + 538, + 541, + 546, + 549, + 554, + 557, + 558, + 562, + 563, + 567, + 576, + 580, + 582, + 583, + 587, + 589, + 591, + 594, + 602, + 604, + 606, + 607, + 608, + 611, + 612, + 616, + 617, + 618, + 619, + 620, + 626, + 627, + 629, + 631, + 642, + 643, + 650, + 651, + 654, + 656, + 657, + 668, + 673, + 674, + 677, + 679, + 683, + 684, + 685, + 687, + 688, + 692, + 695, + 696, + 697, + 699, + 701, + 706, + 708, + 709, + 710, + 711, + 714, + 717, + 719, + 721, + 725, + 726, + 730, + 738, + 739, + 741, + 743, + 746, + 748, + 750, + 760, + 762, + 763, + 764, + 769, + 771, + 772, + 773, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 798, + 806, + 810, + 816, + 817, + 820, + 823, + 827, + 830, + 833, + 834, + 835, + 837, + 839, + 843, + 844, + 845, + 847, + 849, + 855, + 856, + 857, + 862, + 866, + 868, + 869, + 873, + 875, + 879, + 882, + 883, + 884, + 885, + 888, + 889, + 890, + 893, + 895, + 897, + 900, + 902, + 903, + 915, + 916, + 918, + 919, + 920, + 924, + 927, + 928, + 929, + 935, + 943, + 952, + 957, + 958, + 961, + 963, + 969, + 971, + 973, + 974, + 979, + 980, + 984, + 986, + 989, + 998, + 999 + ], + [ + "Lilbalıq", + "Qızılı balıqcıq", + "Böyük ağ köpəkbalığı", + "Pələng köpəkbalığı", + "Elektrik skatları", + "dəvəquşu", + "birəbitdən", + "payızbülbülü", + "Yunko", + "Gəzərgi qaratoyuq", + "Bülbüllər", + "Çalağanlar", + "Ağbaş qartal", + "Saqqallı yapalaqca", + "Dərili tısbağa", + "Adi iquana", + "Anolislər", + "Yaşıl kərtənkələ", + "Komodo varanı", + "Nil timsahı", + "Missisipi alliqatoru", + "Triseratops", + "Buynuzlu gürzə", + "Trilobitlər", + "Əqrəblər", + "gənə", + "qırxayaq", + "kəklik", + "Qızlarquşular", + "Kolibrilər", + "Yakamarlar", + "tukan", + "Uzunburun pazdimdik", + "qaz", + "Qara ququşu", + "Yexidnalar", + "Ördəkburun", + "Phascolarctos", + "vombat", + "Medusozoa", + "Aktinilər", + "Yastı qurdlar", + "Yumru qurdlar", + "İlbiz", + "Zirehli molyusklar", + "Lanqustlar", + "Ağ leylək", + "Qara leylək", + "Ərsindimdiklər", + "Qızılqaz", + "Durnalar", + "Arama", + "Doydaqlar", + "Sahil daşçevirəni", + "Qaradöş qumluqca", + "Otluq ilbizcüllütü", + "Sağsağanı alacüllütlər", + "Qutan", + "Kral pinqvini", + "Albatroslar", + "Boz balinalar", + "Orka", + "Dyoqon", + "Dəniz şirləri", + "Pekines", + "Biql", + "Alman çoban iti", + "Boksyor", + "Bulmastif", + "Tibet mastifi", + "Senbernar", + "Dalmatin", + "Kürən canavar", + "Koyyot", + "Dinqo", + "Qırmızı canavar", + "Afrika çöl iti", + "Zolaqlı kaftar", + "Adi tülkü", + "Qütb tülküsü", + "vaşaq", + "Bəbir", + "qar bəbiri", + "Yaquar", + "aslan", + "Pələng", + "gepard", + "qonur ayı", + "Amerika qara ayısı", + "Ağ ayı", + "Suricatinae", + "Surikat", + "Qaçağanlar", + "xallı bəzək", + "Karabidlər", + "Uzunbığlar", + "Yarpaqyeyənlər", + "İkiqanadlılar", + "arı", + "Qarışqa", + "sisəy", + "Tarakanlar", + "dəvədəlləyi", + "Monarx kəpənək", + "Dəniz ulduzları", + "Dəniz kirpiləri", + "Dəniz xiyarları", + "Dovşan", + "Ankara dovşanı", + "Dağsiçanı", + "oxlu kirpi", + "Suğur", + "qunduz", + "Dəniz donuzcuğu", + "zebr", + "Ev donuzu", + "Çöldonuzu", + "su atı", + "öküz", + "Asiya camışı", + "Bizon", + "qoç", + "Alp dağ keçisi", + "İmpalalar", + "ceyran", + "Birhürgüclü dəvə", + "Lama (heyvan)", + "Gəlincik", + "Samurkimilər", + "porsuq", + "Üçbarmaq ərincək", + "Nəsnas", + "qorilla", + "şimpanze", + "Pavianlar", + "Uzunburun meymun", + "Sincabaoxşar", + "İndri", + "Asiya fili", + "Afrika savanna fili", + "Kiçik panda", + "Böyük panda", + "Angvilkimilər", + "Kijuç", + "nərə", + "Zirehli durnabalıqları", + "abak", + "عبا", + "akustik gitara", + "aviadaşıyıcı", + "Sərnişin təyyarəsi", + "təcili tibbi yardım", + "Amfibiya maşın", + "önlük", + "Avtomat", + "Arxa çantası", + "çörəkxana", + "Diyircəkli qələm", + "sürahi", + "anbar", + "barometr", + "Barel", + "əl arabası", + "basketbol topu", + "Faqot", + "küvet", + "SW", + "mayak", + "binokl", + "Bobsley", + "kitab mağazası", + "yay", + "Büstqalter", + "Dalğaqıran", + "süpürgə", + "Vedrə", + "toqqa", + "zirehli jilet", + "Taksi", + "qazan (məişət əşyası)", + "Şam", + "ATM (Bank)", + "kaset", + "qəsr", + "Violonçel", + "mobil telefon", + "cari", + "sandıq", + "kilsə", + "kinoteatr", + "Sabo", + "Klaviatura", + "Kabriolet", + "probkaaçan", + "Truba (musiqi aləti)", + "beşik", + "Kran (qurğu)", + "sədd", + "Masa", + "qabyuyan maşın", + "Günbəz", + "Baraban", + "Elektrogitara", + "zərf", + "Yanğınsöndürmə gəmisi", + "bayraq dirəyi", + "fleyta", + "Fəvvarə", + "Doldurma qələm", + "tava", + "Qondola", + "Parnik (istixana)", + "baqqal", + "gilyotin", + "Çəkic", + "Saçqurudan", + "məndil", + "Arfa", + "Turnik", + "Qum saatı", + "ütü", + "Cek fənəri", + "cins", + "Pazl", + "rikşa", + "Düyün", + "Ağ həkim xalatı", + "çömçə", + "Abajur", + "noutbuk", + "Alışqan", + "Limuzin", + "dodaq boyası", + "Losyon", + "ksilofon", + "maska", + "mikrofon", + "mikrodalğalı soba", + "mikroavtobus", + "Miniven", + "Raket silahı", + "məscid", + "Siçan (kompüter)", + "siçan tələsi", + "mismar", + "Boyunbağı", + "qoboy", + "Okarina", + "Odometr", + "orqan", + "Osiloskop", + "paket", + "asma qıfıl", + "boya fırçası", + "pijama", + "Musiqar", + "Paraşüt", + "Terras", + "Pyedestal", + "Qələmqabı", + "karandaşyonan", + "Ətir", + "mizrab", + "Pikap yük maşını", + "pul daxılı", + "Yastıq", + "dolça", + "Rəndə", + "Kotan", + "dibçək", + "dulus dəzgahı", + "Namazlıq xalçaları", + "Həbsxana", + "şayba", + "portmonat", + "Yorğan", + "soyuducu", + "restoran", + "Altıaçılan", + "tüfəng", + "Xətkeş", + "kassa", + "sancaq", + "duzqabı", + "saksafon", + "kılıf", + "Tərəzi", + "məktəb avtobusu", + "Yelkən idmanı", + "Bolt birləşməsi", + "burğac", + "Təhlükəsizlik kəməri", + "tikiş maşını", + "Qalxan", + "Bel (alət)", + "xizəksürmə", + "Loqarifmik xətkeş", + "corab", + "boşluq düyməsi", + "iy", + "İdman avtomobili", + "Parovoz", + "stetoskop", + "Ocaq", + "Xərək (nəqliyyat)", + "Sualtı qayıq", + "kostyum", + "Günəş saatı", + "gün eynəyi", + "Asma körpü", + "yelləncək", + "dəyişdirici", + "şpris", + "zirehli döyuş maşını", + "Dəm çaydanı", + "Üskük", + "taxıldöyən", + "Taxt", + "məşəl", + "Traktor", + "Məcməyi", + "Trençkot", + "Zəfər tağı", + "trombon", + "Çətir", + "Tozsoran", + "Vaza", + "tağ", + "məxmər", + "Viaduk", + "skripka", + "Voleybol topu", + "Cüzdan", + "Hərbi təyyarə", + "paltaryuyan maşın", + "Su qülləsi", + "Hakim fiti", + "Parik", + "alaçıq", + "veb-sayt", + "Krossvord", + "yol nişan", + "yol işığı", + "Quakamole", + "Trayfl şirniyyatı", + "dondurma", + "Meyvəli buz", + "Kartof püresi", + "xiyar", + "əncir", + "nar", + "saman", + "Xəmir", + "pitsa", + "Eqq-noq içkisi", + "köpük", + "Mərcan rifi", + "Qeyzer", + "Dərə", + "Vulkan", + "Raps", + "Əsl zöhrəçiçəyi", + "itburnu", + "Sünbül (çiçək)", + "tualet kağızı" + ] + ], + "MK": [ + [ + 0, + 1, + 2, + 3, + 4, + 9, + 10, + 11, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 39, + 45, + 46, + 48, + 49, + 50, + 61, + 71, + 79, + 80, + 86, + 88, + 89, + 92, + 93, + 94, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 110, + 111, + 114, + 116, + 123, + 127, + 128, + 134, + 139, + 140, + 141, + 143, + 144, + 146, + 147, + 148, + 150, + 151, + 154, + 162, + 178, + 180, + 191, + 208, + 213, + 222, + 228, + 229, + 234, + 235, + 236, + 242, + 246, + 247, + 248, + 249, + 250, + 251, + 254, + 256, + 258, + 259, + 269, + 271, + 272, + 274, + 275, + 276, + 277, + 279, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 303, + 307, + 308, + 309, + 310, + 312, + 314, + 315, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 333, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 346, + 347, + 348, + 350, + 353, + 354, + 355, + 356, + 358, + 359, + 360, + 361, + 362, + 363, + 365, + 366, + 368, + 369, + 371, + 372, + 373, + 374, + 376, + 379, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 398, + 401, + 402, + 403, + 404, + 405, + 407, + 409, + 410, + 411, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 425, + 426, + 427, + 428, + 430, + 432, + 435, + 436, + 437, + 439, + 445, + 447, + 450, + 453, + 454, + 456, + 457, + 459, + 460, + 462, + 463, + 464, + 468, + 469, + 470, + 472, + 473, + 476, + 480, + 481, + 483, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 497, + 498, + 499, + 502, + 508, + 510, + 512, + 513, + 516, + 517, + 524, + 525, + 526, + 529, + 532, + 534, + 535, + 536, + 538, + 541, + 546, + 549, + 553, + 555, + 557, + 558, + 561, + 562, + 563, + 567, + 575, + 576, + 577, + 580, + 582, + 583, + 587, + 589, + 590, + 591, + 593, + 594, + 599, + 602, + 606, + 608, + 610, + 611, + 614, + 616, + 618, + 619, + 620, + 621, + 623, + 626, + 629, + 632, + 634, + 641, + 642, + 643, + 645, + 646, + 649, + 650, + 651, + 662, + 665, + 668, + 670, + 671, + 673, + 674, + 677, + 679, + 681, + 682, + 683, + 684, + 685, + 687, + 692, + 693, + 695, + 696, + 697, + 698, + 701, + 702, + 704, + 705, + 708, + 710, + 711, + 712, + 713, + 714, + 715, + 717, + 719, + 721, + 725, + 726, + 730, + 736, + 738, + 739, + 742, + 743, + 744, + 745, + 746, + 748, + 755, + 760, + 761, + 762, + 763, + 764, + 769, + 771, + 773, + 774, + 776, + 777, + 778, + 780, + 783, + 784, + 785, + 786, + 787, + 790, + 791, + 792, + 795, + 797, + 798, + 802, + 805, + 806, + 808, + 816, + 817, + 819, + 820, + 821, + 822, + 823, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 852, + 855, + 856, + 859, + 860, + 862, + 863, + 866, + 873, + 874, + 875, + 877, + 879, + 882, + 883, + 884, + 885, + 888, + 889, + 890, + 891, + 892, + 893, + 895, + 896, + 897, + 900, + 903, + 911, + 915, + 916, + 918, + 919, + 920, + 924, + 928, + 932, + 938, + 939, + 943, + 948, + 952, + 957, + 958, + 961, + 962, + 963, + 965, + 966, + 967, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 982, + 984, + 988, + 989, + 990, + 996, + 998, + 999 + ], + [ + "лињак", + "златна рипка", + "голема бела ајкула", + "Ајкула-тигар", + "ајкули-чекани", + "ноj", + "Планинска ѕвингалка", + "билбилче", + "преселнички дрозд", + "арапски билбили", + "страчка", + "водни косови", + "Луњи", + "белоглав орел", + "мршоjадец", + "брадест був", + "Аксолотл", + "Зелена игуана", + "Отровен брадавичар", + "зелен гуштер", + "комодски варан", + "Нилски крокодил", + "Американски алигатор", + "Удав стегач", + "акреп", + "стоногалка", + "мал тетреб", + "еребица", + "а́ра", + "големо жолтоцуцулесто какаду", + "пчеларки", + "клунорози", + "колибри", + "тукан", + "патор", + "Среден северен нуркач", + "гуска", + "Црн лебед", + "ехи́дна", + "клунар", + "валаби", + "Коала", + "Вомбат", + "медуза", + "Сплескани црви", + "Цевчести црви", + "голич", + "Хитони", + "лангусти", + "Бел штрк", + "црн штрк", + "жерав", + "Камењарче", + "обичен свиркач", + "Uрвенонога тринга", + "остригари", + "пелика́н", + "Албатрос", + "Сив кит", + "Кит убиец", + "моски лав", + "чивава", + "Пекинезер", + "Бигл", + "вајмарски птичар", + "Pit bill e hemisko kuce dobijeno od ukrstuvanje od mogu rasi kako sto se ; bull dog , mastif ,terier i mnogu drugi so cel e sozdadeno vo 2 svecka vojna za unistuvanje i pustane na neprijatelite, No den denes mozeeme da go sredteneme vo ulicni borbi", + "Ерделски териер", + "лабрадор ретривер", + "ирски сетер", + "Кувас", + "Комондор", + "стар англиски овчар", + "Ротвајлер", + "волчјак", + "Доберман", + "Германски боксер", + "германска дога", + "Бернардинец", + "Хаски", + "Алјаски маламут", + "сибирски хаски", + "далматинец (куче)", + "Мопс", + "Њуфаундлендер", + "Самојед", + "Померанец (куче)", + "волк", + "гривест волк", + "Којот", + "азиско диво куче", + "африканско диво куче", + "хиена", + "лисица", + "поларна лисица", + "Персиска мачка", + "Сијамска мачка", + "Пума", + "рис", + "леопард", + "снежен леопард", + "јагуар", + "лав", + "Тигар", + "гепард", + "кафеава мечка", + "Американска црна мечка", + "Бела мечка", + "Мунгоси", + "Меркат", + "песочници", + "бубамара", + "стрижибуби", + "чурилкаровидни", + "мува", + "Пчели", + "мравка", + "штурец", + "лебарка", + "Богомолки", + "вилино коњче", + "водни девици", + "Темна окатка", + "монарх", + "Морска ѕвезда", + "морски еж", + "морски краставици", + "’рчковци", + "мрмот", + "дабар", + "заморец", + "Зебра", + "свиња", + "дива свиња", + "брадавичеста свиња", + "нилски коњ", + "Бивол", + "Бизон", + "овен", + "алпски козорог", + "газела", + "дромедар", + "Лама", + "ласици", + "Твор", + "ласица", + "видра", + "твор", + "ја́зовец", + "оклопник", + "орангутан", + "Горила", + "Гибони", + "Сијаманг", + "патас", + "павијан", + "макаки", + "сакати мајмуни", + "носест мајмун", + "дрекавец", + "Прстеноопашест лемур", + "Индиски слон", + "Африкански слон", + "Црвена панда", + "Џиновска панда", + "јагула", + "Риба-кловн", + "есетра", + "сметалка", + "хармоника", + "акустична гитара", + "носач на авио́ни", + "патнички авион", + "воздушен брод", + "амбу́лантна ко́ла", + "аналоген часовник", + "пчеларник", + "скутина", + "Автоматска пушка", + "ранец", + "перкарница", + "греда", + "Балон (воздухоплов)", + "хемиско пенкало", + "Бенџо", + "гелендер", + "плевна", + "Барометар", + "Бочва", + "ра́чна ко́личка", + "кошарка́рска топка", + "фагот", + "када", + "карава́н", + "Светилник", + "шако", + "бики́ни", + "двоглед", + "Боб", + "библиотека", + "книжарница", + "лак", + "Пеперушка (вратоврска)", + "прслук", + "насип", + "метла", + "Кофа", + "тока", + "такси", + "казан", + "све́ќа", + "кану", + "отворач за конзерви", + "рингишпил", + "банкомат", + "касе́та", + "замок", + "виолончело", + "мобилен телефон", + "верига", + "верижница", + "моторна пила", + "Ковчег", + "комода", + "црква", + "кино", + "сатар", + "Гета", + "тастатура", + "контејнерски брод", + "отворач за тапи", + "труба", + "лулка", + "дигалка", + "кираса", + "брана", + "работна маса", + "пелена", + "трпезариска маса", + "садомијачка", + "диск-кочница", + "док", + "Купола", + "тапан", + "електрична гитара", + "плик", + "картотека", + "противпожарно возило", + "јарбол", + "флејта", + "вилушкар", + "фонтана", + "на́ливперо", + "тиган", + "количка за голф", + "гондола", + "гонг", + "Стаклена градина", + "бакалница", + "гилотина", + "чекан", + "фен", + "преносен уред", + "марамче", + "усна хармоника", + "Харфа", + "сот", + "вратило", + "пегла", + "фармерки", + "Маица", + "Сложувалка", + "Кимоно", + "јазол", + "кутлача", + "абажур", + "преносен компјутер", + "косилка", + "ноже за писма", + "Запалка", + "Кармин", + "звучник", + "пилана", + "Маракас", + "Ксилофон", + "маска", + "мајско дрво", + "Лавиринт", + "Мегалит", + "Микрофон", + "микробранова печка", + "Модем", + "мопед", + "џамија", + "скутер", + "планински велосипед", + "глувче", + "глувчарник", + "заковка", + "ѓе́рдан", + "лаптоп", + "Обелиск", + "обоа", + "Окарина", + "Километражник", + "Оргули", + "пакет", + "весло", + "ка́тинар", + "четка", + "пижама", + "дворец", + "падобран", + "Разбој (гимнастика)", + "паркиралишен часовник", + "патнички вагон", + "пиедестал", + "Острилка", + "парфем", + "Петриева шолја", + "фотоко́пир", + "Перце", + "шилст шлем", + "камионет", + "прасенце", + "перница", + "Стомна", + "струг", + "Плуг", + "билија́рдска маса", + "саксија", + "гр́нчарско тр́кало", + "печатач", + "Затвор", + "дометно оружје", + "прое́ктор", + "плочка", + "портмоне", + "радиотелеско́п", + "фрижиде́р", + "далечински управувач", + "рестора́н", + "Револвер", + "пушка", + "линијар", + "сеф", + "соларник", + "сандала", + "Саксофон", + "ножница", + "Вага", + "шхуна", + "шраф", + "шрафцигер", + "сигурносен појас", + "Шивачка машина", + "штит", + "корпа", + "количка", + "лопата", + "скија", + "Вреќа за спиење", + "логаритмар", + "моторна санка", + "фудбал", + "чорап", + "Сомбреро", + "вретено", + "спортски автомобил", + "Сцена (театар)", + "парна локомотива", + "лачен мост со провлека", + "челичен тапан", + "Стетоскоп", + "стоперка", + "печка", + "трамвај", + "носилка", + "подморница", + "одело", + "Сончев часовник", + "темни очила", + "висечки мост", + "брис", + "лу́лашка", + "прекинувач", + "шприц", + "оклопно возило", + "чајник", + "Тениско топче", + "напрсток", + "вршилка", + "тостер", + "Тутунџија", + "факел", + "тотем", + "Трактор", + "славолак", + "тролејбус", + "Тромбон", + "турникет", + "Чадор", + "правосмукалка", + "вазна", + "Свод", + "Плиш", + "вијадукт", + "виоли́на", + "Одбојкарска топка", + "Вафларник", + "ѕиден часовник", + "па́ричник", + "воено летало", + "лавабо́", + "перална машина", + "водокула", + "Перика", + "волна", + "Јурта", + "мре́жно ме́сто", + "крстозбор", + "сообраќаен знак", + "семафор", + "Гвакамоле", + "сладолед", + "перек", + "карфио́л", + "Тиквичка", + "краставица", + "Грени Смит", + "смоква", + "калинка", + "Сено", + "Тесто", + "Ролат од месо", + "пица", + "Бурито", + "црвено вино", + "Еспресо", + "меур", + "спила", + "Корален гребен", + "Гејзер", + "крајбрежје", + "долина", + "Вулкан", + "младоженец", + "маслодајна репка", + "желад", + "шипинка", + "див костен", + "Зајачарка", + "клас", + "тоалетна хартија" + ] + ], + "ES": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 28, + 29, + 30, + 32, + 33, + 34, + 35, + 36, + 39, + 40, + 42, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 55, + 56, + 57, + 60, + 61, + 62, + 63, + 65, + 68, + 69, + 70, + 71, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 84, + 85, + 86, + 87, + 88, + 89, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 120, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 165, + 166, + 169, + 170, + 172, + 173, + 175, + 176, + 177, + 178, + 180, + 198, + 199, + 201, + 206, + 211, + 212, + 213, + 215, + 217, + 221, + 224, + 225, + 226, + 227, + 229, + 230, + 231, + 233, + 235, + 236, + 237, + 242, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 267, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 393, + 394, + 395, + 396, + 397, + 398, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 443, + 444, + 445, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 496, + 497, + 498, + 499, + 500, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 541, + 542, + 543, + 545, + 546, + 547, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 631, + 632, + 634, + 636, + 637, + 638, + 640, + 642, + 643, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 660, + 661, + 662, + 663, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 677, + 678, + 679, + 681, + 682, + 683, + 684, + 685, + 687, + 688, + 689, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 911, + 913, + 914, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 943, + 944, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 984, + 985, + 986, + 988, + 989, + 990, + 992, + 997, + 998, + 999 + ], + [ + "tenca", + "pez de colores", + "gran tiburón blanco", + "tiburón tigre", + "cornudilla", + "Raya electrica", + "raya látigo", + "gallo", + "pájaro hembra", + "avestruz", + "pinzón real", + "jilguero", + "pardillo", + "junco (aves)", + "azulejo", + "Zorzal petirrojo", + "arrendajo", + "urraca", + "carbonero", + "mirlo acuático", + "milano", + "águila calva", + "buitre", + "Carabo lapón", + "salamandra", + "salamandra moteada", + "perro de agua", + "rana mugidora", + "Ascaphidae", + "tortuga boba", + "tortuga canal", + "tortuga del fango", + "tortuga de agua dulce", + "iguana (género)", + "camaleón americano", + "Agama (animal)", + "monstruo de Gila", + "salamanquesa", + "camaleón africano", + "dragón de Komodo", + "cocodrilo del Nilo", + "Aligátor americano", + "tricerátopo", + "serpiente verde", + "Serpiente real", + "serpiente de jarretera", + "culebra nocturna", + "boa constrictora", + "Pitón de Seba", + "cobra de anteojos", + "hidra", + "Crotalo cornudo", + "Bilobites", + "falangio", + "escorpión", + "epeira", + "viuda negra", + "tarántula", + "licósido", + "garrapata", + "ciempiés", + "gallo lira", + "perdiz nival", + "grévol engolado", + "pavo real", + "codorniz", + "perdiz", + "Loro gris", + "guacamayo", + "Cacatua galeria", + "abejaruco", + "cálao", + "colibrí", + "Yacamara", + "tucán", + "pato", + "Serreta mediana", + "oca", + "cisne negro", + "jabalí", + "equidna", + "ornitorrinco", + "walabí", + "vombátido", + "aguamala", + "anémona de mar", + "platelminto", + "nemátodo", + "caracola", + "caracol", + "limaco", + "nudibranquio", + "poliplacóforo", + "nautilo", + "buey del Pacífico", + "nécora", + "bogavante americano", + "langosta", + "cangrejo de río", + "cangrejo ermitaño", + "isópodo", + "Cigüena blanca", + "Cigüeña negra", + "espátula", + "flamenco", + "avetoro", + "grulla", + "carrao", + "gallereta", + "avutarda", + "vuelvepiedras común", + "playero", + "archibebe", + "Agujeta (ave)", + "ostrero", + "pelícano", + "pingüino rey", + "pájaro carnero", + "ballena gris", + "Orsinus orca", + "dugongo", + "león marino", + "chihuahua (perro)", + "Spaniel japonés", + "Bichón maltés", + "Pekinés", + "Epagneul papillón", + "terrier", + "perro crestado rodesiano", + "lebrel afgano", + "perro basset", + "perro perdiguero", + "perro de San Huberto", + "Coonhound Negro y Bronce", + "perro raposero", + "lebrel ruso para la caza", + "lobero irlandés", + "lebrel", + "podenco ibicenco", + "perro de nutria", + "perro real de Egipto", + "Lebrel escocés", + "Weimariano", + "Pit Bull Terrier Americano", + "Schnauzer estándar", + "terrier escocés", + "Silky terrier australiano", + "Retriever de pelo rizado", + "Braco hungaro", + "setter inglés", + "setter irlandés", + "spaniel inglés", + "Springer spaniel inglés", + "spaniel irlandés", + "Pastor belga groenendael", + "perro de pastor belga malinois", + "pastor de Brie", + "Kelpie Australiano", + "antiguo pastor inglés", + "Perro pastor de las islas Shetland", + "pastor escocés", + "Boyero de Flandes", + "pastor alemán", + "dóberman", + "pinscher miniatura", + "Bóxer", + "mastín tibetano", + "bulldog francés", + "alano alemán", + "San Bernardo (perro)", + "perro esquimal", + "Malamute de Alaska", + "husky siberiano", + "dálmata", + "Terrier de caza del Congo", + "carlino", + "Terranova", + "Perro de montaña de los Pirineos", + "Samoyedo", + "pomerania (perro)", + "chow chow (raza de perro)", + "Wolf Spitz", + "Poodle estándar", + "lobo", + "lobo blanco", + "aguará", + "C latrans", + "Perro salvaje", + "cuón", + "licaón", + "Hienas", + "zorro rojo", + "Zorro polar", + "zorra gris", + "gato atigrado", + "gato persa", + "Gato siamés", + "mau egipcio", + "pantera", + "lince", + "leopardo", + "leopardo de las nieves", + "pantera", + "león", + "tigre", + "guepardo", + "oso pardo", + "oso negro", + "oso blanco", + "oso bezudo", + "mangosta", + "suricato", + "Cicindelidos", + "mariquita", + "carábido", + "Cerambicidos", + "Escarabajo de las hojas", + "escarabajo pelotero", + "escarabajo rinoceronte", + "gorgojo", + "mosca", + "abeja", + "hormiga", + "saltamontes", + "grillo", + "fásmido", + "Blattodea", + "mantodeo", + "cigarra", + "cicadélidos", + "aguacil", + "caballito del diablo", + "monarca", + "estrellas de mar", + "erizo de mar", + "carajo de mar", + "Conejo de cola de algodón", + "liebre", + "conejo de Angora", + "Cricetinae ó Cunsters", + "puercoespín", + "marmotas", + "Castor sp.", + "conejillo de Indias", + "cebra", + "marrano", + "jabalí", + "facoquero", + "hipopótamo", + "bovino", + "búfalo indio", + "bisonte", + "carnero", + "Muflon de las Rocosas", + "íbice", + "alcelafo", + "gacela", + "dromedario", + "llama (animal)", + "comadreja", + "visón", + "turón europeo", + "hurón", + "lutria", + "mofeta", + "tejón", + "mulita", + "perezoso de tres dedos", + "orangután", + "Gorilas", + "chimpancé", + "hilobátido", + "Symphalangus", + "mono del viejo mundo", + "Mono husar", + "babuino", + "macaco", + "Colobino", + "násico", + "tití", + "capuchino", + "araguato", + "Callicebus", + "mono araña", + "mono ardilla", + "Lémur anillado", + "Indri niger", + "elefante asiático", + "elefante africano de sabana", + "panda menor", + "oso panda", + "sierra", + "anguila", + "Salmon coho", + "Amphiprion", + "esturión", + "Lepisosteiformes", + "pez león", + "pez globo", + "ábaco", + "Indumentaria académica", + "acordeón", + "guitarra acústica", + "portaaviones", + "avión de línea", + "zepelín", + "ambulancia", + "vehículo anfibio", + "reloj analógico", + "colmenar", + "mandil", + "cubo de basura", + "rifle de asalto", + "zurrón (recipiente)", + "horno de pan", + "viga de equilibrio", + "balón", + "bolígrafo", + "banyo", + "balaustrada", + "haltera", + "peluquería", + "granero", + "barómetro", + "barril", + "carretilla", + "pelota de béisbol", + "balón de baloncesto", + "cuna", + "bajón", + "gorro de baño", + "toalla de baño", + "bañera", + "familiar", + "faro", + "Vaso de precipitados", + "colbac", + "botella de cerveza", + "jarra de cerveza", + "babero", + "tándem", + "biquini", + "binoculares", + "palomar", + "varadero", + "Bobsledero", + "corbata de cordón", + "gorro", + "librería", + "librería", + "tapón de botella", + "arco", + "pajarita", + "placa conmemorativa", + "sostén", + "baluarte", + "coraza de pecho", + "escoba", + "balde", + "hebilla", + "chaleco antibalas", + "bala", + "carnicería", + "taxímetro", + "caldero", + "cirio", + "cañón", + "canoa", + "abrelatas", + "rebeca", + "retrovisor", + "carrusel", + "juego de herramientas", + "caja", + "rueda de coche", + "cajero automático", + "casete", + "reproductor de casete", + "castillo", + "catamarán", + "reproductor de CD", + "violonchelo", + "móvil", + "cadena", + "tela metálica", + "cota de malla", + "sierra de cadena", + "arcón", + "cómoda", + "carillón", + "Bota navideña", + "iglesia", + "sala de cine", + "tajador", + "vivienda Anasazi", + "zueco", + "coctelera", + "cafetera", + "hélice", + "cerradura de combinación", + "teclado", + "dulce", + "portacontenedores", + "descapotable", + "sacacorchos", + "trompeta", + "botas camperas", + "Sombrero vaquero", + "cuna", + "grúa", + "guacal", + "cuna", + "Olla de cocción lenta", + "pelota de croquet", + "muleta", + "coraza", + "represa", + "pupitre", + "ordenador de escritorio", + "disco de marcar", + "pañal", + "reloj digital", + "reloj digital", + "mesa de comedor", + "trapo de cocina", + "lavavajillas", + "freno de disco", + "dársena", + "trineo de perros", + "domo", + "tapete de entrada", + "tambor", + "palillo", + "mancuerna", + "ventilador", + "guitarra eléctrica", + "locomotora eléctrica", + "sobre", + "cafetera exprés", + "polvo para la cara", + "boa (prenda)", + "archivo", + "barco contraincendios", + "vehículo de bomberos", + "guardafuego", + "astabandera", + "flauta", + "Silla plegable", + "casco de fútbol americano", + "montacargas", + "fuente", + "pluma fuente", + "vagón de carga", + "trompa", + "sartén", + "chaqueta de piel", + "camión de recogida de desechos", + "máscara antigás", + "surtidor de combustible", + "copa", + "kart", + "pelota de golf", + "carro de golf", + "góndola", + "batintín", + "vestido", + "piano de cola", + "invernadero", + "parrilla", + "ultramarinos", + "guillotina", + "pasador", + "laca", + "semioruga", + "martillo", + "cesta", + "secador de pelo", + "dispositivo móvil", + "pañuelo", + "disco duro", + "armónica", + "arpa", + "segadora", + "hacha de mano", + "Pistolera", + "panal", + "trampa", + "crinolina", + "Barra fija", + "reloj de arena", + "plancha", + "calabaza", + "bluyín", + "todoterreno", + "camiseta", + "rompecabezas", + "rickshaw con tracción humana", + "palanca de mando", + "quimono", + "Rodillera", + "nudo", + "bata (prenda)", + "cucharón", + "pantalla", + "ordenador portátil", + "siega", + "tapa de objetivo", + "abrecartas", + "biblioteca", + "buque de salvamento y rescate", + "mechero", + "limusina", + "transatlántico", + "lápiz labial", + "loción", + "altavoz", + "aserradero", + "saco de correos", + "buzón", + "mallas", + "tapa de registro", + "xilófono", + "máscara", + "mayo", + "laberinto", + "vaso graduado", + "botiquín", + "megalito", + "micrófono", + "microondas", + "uniforme militar", + "lechera", + "minibús", + "minifalda", + "monovolumen", + "misil", + "manopla", + "Caravanas estáticas", + "Modelo T", + "módem", + "cenobio", + "ciclomotor", + "mortero", + "birrete", + "mezquita aljama", + "toldillo", + "motoneta", + "BTT", + "tienda de campaña", + "ratón", + "ratonera", + "camión de mudanzas", + "clavo", + "Collarín cervical", + "cadena", + "ordenador portátil", + "obelisco", + "sistema thumbplate", + "Ocarina precolombina", + "odómetro", + "órgano", + "osciloscopio", + "sobrefalda", + "máscara de oxígeno", + "paquete", + "remo", + "rueda de paletas", + "candado", + "pincel", + "pijama", + "palacio", + "flauta de Pan", + "papel absorbente", + "paracaídas", + "Barras paralelas", + "parquímetro", + "vagón", + "terraza", + "teléfono público", + "peana", + "cartuchera", + "sacapuntas", + "esencia", + "placa de Petri", + "fotocopia", + "plectro", + "Casco prusiano", + "cerca de estacas", + "furgoneta", + "pilar", + "alcancía", + "frasco de píldoras", + "almohada", + "pelota de ping pong", + "barco pirata", + "cántaro", + "cepillo", + "planetario", + "bolsa plástica", + "portaplatos", + "arado", + "desatascador", + "Cámara instantánea", + "asta", + "lechera", + "Poncho-unku", + "mesa de billar", + "botella de refresco", + "maceta", + "torno de alfarero", + "taladro mecánico", + "alfombra de oración", + "impresora", + "prisión", + "proyectil", + "proyector", + "disco de goma", + "saco de boxeo", + "monedero", + "pluma", + "colcha", + "coche de competición", + "raqueta", + "radiador", + "radiofonía", + "radiotelescopio", + "casa rodante", + "carrete", + "réflex", + "frío", + "mando", + "restaurante", + "revólver", + "fusil", + "mecedora", + "rosticería", + "goma de borrar", + "balón de rugby", + "regla", + "calzado deportivo", + "caja fuerte", + "alfiler", + "salero", + "caite", + "pareo", + "saxofón", + "vaina", + "balanza", + "autobús escolar", + "goleta", + "marcador", + "pantalla", + "tornillo", + "destornillador", + "cinturón de seguridad", + "máquina de coser", + "escudo", + "zapatería", + "cesta de la compra", + "carrito de la compra", + "pala", + "gorro de ducha", + "cortina de ducha", + "tabla de esquí", + "balaclava", + "saco de dormir", + "regla de cálculo", + "puerta corredera", + "tragamonedas", + "tubo snorkel", + "motonieve", + "quitanieves", + "dispensador de jabón", + "balón de fútbol", + "calcetín", + "horno solar", + "sombrero mexicano", + "sopera", + "barra espaciadora", + "calefactor", + "transbordador espacial", + "espátula", + "lancha rápida", + "tela de araña", + "huso", + "automóvil deportivo", + "reflector", + "escenario", + "locomotora de vapor", + "puente en arco de tablero pasante suspendido", + "Tambores metálicos de Trinidad y Tobago", + "estetoscopio", + "Estola", + "muro de piedra", + "cronómetro", + "estufa", + "colador", + "red de tranvías", + "camilla", + "estupa", + "submarino", + "traje", + "reloj de sol", + "anteojos de sol", + "protector solar", + "puente colgante", + "coleto", + "sudadera", + "taparrabos", + "columpio", + "interruptor", + "jeringuilla", + "lámpara de mesa", + "tanque", + "reproductor de casetes", + "tetera", + "oso de peluche", + "televisión", + "pelota de tenis", + "paja", + "telón", + "dedal", + "aventadora", + "trono", + "tejado", + "tostadora", + "estanco", + "asiento de la taza", + "antorcha", + "poste totémico", + "grúa (vehículo)", + "juguetería", + "cabezal", + "camión articulado", + "bandeja", + "gabardina (prenda)", + "triciclo", + "trimarán", + "trípode", + "arco de triunfo", + "trolebús", + "trombón", + "cuba", + "molinete", + "paraguas", + "monociclo", + "piano vertical", + "aspiradora", + "florero", + "bóveda", + "terciopelo", + "máquina de vending", + "vestidura litúrgica", + "viaducto", + "violín tradicional", + "pelota de voleibol", + "gofrera", + "reloj de pared", + "billetero", + "ropero", + "aeronave militar", + "Lavabo (religión)", + "lavadora", + "botella de agua", + "aguamanil", + "arca de agua", + "silbato", + "peluca", + "alambrera", + "botella de vino", + "ala", + "sartén china", + "cuchara de madera", + "lana", + "buque naufragado", + "yola", + "sitio Web", + "historieta", + "crucigrama", + "placa de calle", + "semáforo", + "sobrecubierta", + "menú", + "fuente", + "salsa guacamole", + "consomé", + "Fondue", + "sopa inglesa", + "helado", + "sorbete", + "rosca de pan", + "Salzbrezel", + "hamburguesa con queso", + "perrito", + "puré de patatas", + "repollo", + "brécol", + "coliflor", + "cucurbita pepo", + "pepino", + "alcachofa", + "hongo", + "manzana verde de la Abuela Smith", + "frutilla", + "china", + "limón", + "higo", + "piña", + "plátano", + "chirimoya", + "granada", + "heno", + "Salsa Carbonara", + "sirope de chocolate", + "masa", + "pastel de carne", + "pizza congelada", + "pastel de carne", + "burrito (comida)", + "vino tinto", + "café expreso", + "licor de huevos", + "Alpes", + "burbuja", + "acantilado", + "arrecife de coral", + "géiser", + "ribera del lago", + "cabo", + "banco de arena", + "costa", + "valle", + "volcán activo", + "pelotero", + "novio", + "colza", + "pascueta", + "Zueco de Dama", + "bellota", + "escaramujo", + "castaño de Indias", + "agárico", + "boleto", + "espiga", + "papel higiénico" + ] + ], + "MN": [ + [ + 1, + 2, + 9, + 10, + 11, + 22, + 23, + 24, + 30, + 49, + 63, + 71, + 79, + 94, + 98, + 99, + 103, + 105, + 106, + 128, + 129, + 130, + 134, + 138, + 139, + 144, + 145, + 146, + 148, + 150, + 154, + 236, + 244, + 252, + 260, + 269, + 271, + 272, + 273, + 274, + 277, + 279, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 309, + 310, + 314, + 315, + 319, + 327, + 336, + 337, + 338, + 340, + 341, + 342, + 344, + 345, + 348, + 352, + 353, + 354, + 355, + 357, + 360, + 362, + 365, + 366, + 367, + 387, + 388, + 390, + 393, + 394, + 398, + 401, + 407, + 411, + 415, + 420, + 428, + 430, + 436, + 445, + 447, + 454, + 456, + 459, + 462, + 464, + 468, + 469, + 470, + 473, + 480, + 483, + 486, + 487, + 488, + 491, + 497, + 498, + 508, + 513, + 516, + 525, + 526, + 529, + 541, + 546, + 558, + 562, + 567, + 570, + 587, + 589, + 591, + 593, + 594, + 606, + 608, + 610, + 620, + 627, + 650, + 651, + 662, + 665, + 668, + 673, + 674, + 677, + 679, + 683, + 692, + 695, + 696, + 697, + 701, + 710, + 712, + 713, + 742, + 746, + 750, + 760, + 762, + 764, + 765, + 771, + 774, + 777, + 779, + 783, + 785, + 786, + 792, + 794, + 795, + 806, + 827, + 832, + 839, + 844, + 847, + 849, + 859, + 862, + 866, + 874, + 882, + 885, + 889, + 892, + 911, + 915, + 916, + 920, + 928, + 938, + 943, + 957, + 958, + 963, + 966, + 971, + 974, + 979, + 980, + 984, + 999 + ], + [ + "Алтан загас", + "Аврага цагаан загас", + "тэмээн хяруул", + "алаг бужирга", + "Алгар шувуу", + "Халзан бүргэд", + "Тас", + "Угалзан ууль", + "Бух мэлхий", + "Нилийн матар", + "Энэтхэг наж могой", + "хилэнцэт хорхой", + "жаран хөлт", + "Эрээн дальт бяцхан шувуу", + "Сэвгэр бохио", + "галуу", + "нугасан хошуут", + "Коала", + "Вомбат", + "Хар өрөвтас", + "Халбаган хошуут", + "Фламинго", + "тогоруу", + "Тоодгийнхон", + "Алаг хайргач", + "Хотон (шувуу)", + "Хаан оцон шувуу", + "Салхич шувуу", + "Алуурчин халим", + "Далайн арслан", + "хав", + "Добэрман пинчэр", + "Төвд мастиф", + "Аффэнпинчэр", + "Чау чау", + "чоно", + "Улаан чоно", + "талын чоно", + "Динго", + "Цөөвөр чоно", + "Улаан үнэг", + "Цагаан үнэг", + "сиамын муур", + "Пума", + "Шилүүс", + "Цоохор ирвэс", + "ирвэс", + "ягуар", + "арслан", + "Бар", + "үчимбэр", + "Хүрэн баавгай", + "Америкийн хар баавгай", + "цагаан баавгай", + "ᠵᠥᠭᠡᠢ", + "Шоргоолж", + "жом", + "цөгөрцөг", + "тэмээлзгэнэ", + "далайн од", + "тарвага", + "минж", + "усан гахай", + "Эрээн тахь", + "Гахай", + "Зэрлэг гахай", + "Армана", + "шар", + "эр хонь", + "Пала гөрөөс", + "зээр", + "ганц бөхт тэмээ", + "Лам гөрөөс", + "Усны булга", + "халиу", + "дорго", + "Орангутан", + "Горилла", + "шимпанзе", + "Улаан хулсны баавгай", + "Аварга хулсны баавгай", + "могой загас", + "Алиалагч загас", + "Хилэм", + "Сампин", + "Баян хуур", + "хээрийн эмнэлэг", + "хормогч", + "талх барих газар", + "банжо", + "түрдэг тэрэг", + "сагсан бөмбөг", + "Комби", + "бикини", + "дуран", + "номын дэлгүүр", + "нум", + "левчик", + "ᠱᠦᠭᠦᠷ", + "горхи", + "ᠲ᠋ᠠᠻᠰᠢ", + "тогоо", + "лаа", + "лааз онгойлгогч", + "Мөнгөний автомат", + "цайз", + "морин хийл", + "гар утас", + "гинж", + "Гинжит хөрөө", + "сүмд", + "Кинотеатр", + "компьютерийн гар", + "бүрээ", + "бүүвэйлэх", + "Боомт", + "ширээ", + "манцуй", + "бөмбөр", + "Цахилгаан гитар", + "Бишгүүр", + "Усан оргилуур", + "хайруулын таваг", + "Хорт утааны баг", + "Алх", + "хатаагч", + "ᠭᠠᠷ ᠠᠯᠴᠢᠭᠤᠷ", + "аман хуур", + "Босоо ятга", + "Индүү", + "жийнс", + "Футболк", + "зөөврийн компьютер", + "лимузин", + "микрофон", + "БДЗ", + "Модем", + "мопед", + "мечет", + "хулгана", + "хулганы хавх", + "хадаас", + "хүзүүний зүүлт", + "ᠵᠢᠮᠪᠦᠬᠦᠷ", + "баглаа", + "цоожоор", + "багс", + "унтлагын хувцас", + "шүхэр", + "Харандаа үзүүрлэгч", + "Петрийн аяга", + "Хувилуур", + "Принтер", + "шайб", + "орны нимгэн бүтээлэг", + "хөргүүр", + "гуанз", + "буу", + "дүүжин сандал", + "сейф", + "Сэрүүн шаахай", + "хуй", + "сургуулийн автобус", + "шураг", + "аюулгүйн бүс", + "Оёдлын машин", + "хүрз", + "шүршүүрийн хөшиг", + "цана", + "Оймс", + "зуух", + "ᠰᠤᠪᠤᠷᠭ ᠠ", + "дүүжин гүүр", + "залгуур", + "Танк", + "аягыг", + "талх шарагч", + "ᠪᠠᠮᠪᠠᠷ", + "Трактор", + "троллейбус", + "тоос сорогч", + "хилэн", + "Хийл", + "ханын цаг", + "ноос", + "Гэр", + "Вэб сайт", + "Гэрлэн дохио", + "цэцгийн мэхээлдэс", + "цэцэгт байцаа", + "огурцы", + "анар", + "өвс", + "пицца", + "ᠤᠯᠠᠭ᠋ᠠᠨ ᠳᠠᠷᠠᠰᠤ", + "хий", + "гейзэр", + "хөндий", + "Галт уул", + "Рапс", + "ариун цэврийн цаас" + ] + ], + "JA": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 28, + 29, + 30, + 34, + 36, + 37, + 39, + 40, + 45, + 48, + 49, + 50, + 51, + 56, + 61, + 62, + 63, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 85, + 86, + 87, + 88, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 118, + 120, + 121, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 153, + 154, + 155, + 157, + 160, + 162, + 163, + 164, + 165, + 169, + 172, + 173, + 175, + 176, + 177, + 178, + 180, + 187, + 191, + 194, + 199, + 201, + 206, + 208, + 211, + 213, + 215, + 217, + 222, + 223, + 224, + 226, + 227, + 228, + 229, + 230, + 231, + 233, + 234, + 235, + 236, + 242, + 243, + 244, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 379, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 423, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 435, + 436, + 437, + 438, + 439, + 440, + 444, + 445, + 447, + 448, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 496, + 497, + 498, + 500, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 519, + 520, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 534, + 535, + 536, + 537, + 538, + 541, + 542, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 554, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 567, + 569, + 570, + 571, + 573, + 575, + 576, + 577, + 578, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 596, + 597, + 599, + 600, + 601, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 660, + 661, + 662, + 665, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 678, + 679, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 719, + 721, + 724, + 725, + 726, + 728, + 730, + 731, + 732, + 734, + 735, + 736, + 738, + 739, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 756, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 793, + 795, + 797, + 798, + 802, + 803, + 806, + 807, + 808, + 810, + 811, + 812, + 816, + 817, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 852, + 854, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 904, + 907, + 909, + 910, + 911, + 912, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 924, + 925, + 926, + 927, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 948, + 949, + 952, + 953, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 975, + 976, + 978, + 979, + 980, + 981, + 982, + 984, + 985, + 988, + 989, + 996, + 998, + 999 + ], + [ + "テンチ", + "キンギョ", + "ホホジロザメ", + "イタチザメ", + "シュモクザメ", + "痺鱏", + "アカエイ", + "ダチョウ", + "アトリ", + "ゴシキヒワ", + "ルリノジコ", + "コマツグミ", + "ヒヨドリ科", + "カケス", + "鵲", + "カワガラス科", + "トビ類", + "ハクトウワシ", + "ハゲタカ", + "カラフトフクロウ", + "キボシサンショウウオ", + "ウーパールーパー", + "ウシガエル", + "オサガメ", + "テラピン", + "アメリカハコガメ属", + "グリーンイグアナ", + "グリーンアノール", + "アメリカドクトカゲ", + "コモドオオトカゲ", + "ナイルワニ", + "アメリカアリゲーター", + "トリケラトプス", + "キングヘビ属", + "ボアコンストリクター", + "アフリカニシキヘビ", + "インドコブラ", + "ウミヘビ科", + "サハラツノクサリヘビ", + "ダイヤガラガラヘビ", + "ヨコバイガラガラヘビ", + "三葉虫", + "ザトウムシ", + "蠍", + "クロゴケグモ", + "コモリグモ", + "だに", + "ムカデ", + "クロライチョウ", + "雷鳥", + "エリマキライチョウ", + "ウズラ類", + "ヤマウズラ属", + "ヨウム", + "コンゴウインコ", + "キバタン", + "バンケン科 (Sibley)", + "ハチクイ科", + "サイチョウ科", + "ハチドリ", + "キリハシ科", + "大嘴", + "ウミアイサ", + "ガチョウ", + "コクチョウ", + "エキドナ", + "カモノハシ", + "ワラビー", + "コアラ", + "ウォンバット", + "クラゲ", + "イソギンチャク", + "扁形動物", + "線形動物", + "巻貝", + "カタツムリ", + "ナメクジ", + "ウミウシ", + "多板綱", + "アメリカイチョウガニ", + "シオマネキ", + "タラバガニ科", + "イセエビ科", + "ザリガニ", + "ヤドカリ", + "シュバシコウ", + "ナベコウ", + "ヘラサギ属", + "フラミンゴ", + "にがり", + "鶴", + "ツルモドキ", + "アメリカオオバン", + "ノガン科", + "キョウジョシギ", + "ハマシギ", + "アカアシシギ", + "都鳥", + "ペリカン属", + "キングペンギン", + "アホウドリ科", + "コククジラ", + "鯱", + "ジュゴン", + "アシカ", + "チワワ", + "マルチーズ", + "ペキニーズ", + "シーズー", + "パピヨン", + "アフガン・ハウンド", + "ビーグル", + "セント・ヒューバート", + "ブルーティック・クーンハウンド", + "ブラック・アンド・タン・クーンハウンド", + "ボルゾイ", + "ウィペット", + "イビザン・ハウンド", + "オッターハウンド", + "サルーキ", + "スコティッシュ・ディアハウンド", + "ワイマラナー", + "ピットブル", + "ヨーキー", + "エアデール・テリア", + "ダンディ・ディンモント・テリア", + "スコティッシュ・テリア", + "オーストラリアン・シルキー・テリア", + "カーリーコーテッド・レトリーバー", + "ラブラドール・レトリーバー", + "ビーシュラ", + "アイリッシュ・セッター", + "フレンチ・ブリタニー・スパニエル", + "イングリッシュ・スプリンガー・スパニエル", + "ハンガリアン・クーヴァーズ", + "スキッパーキ", + "ベルジアン・シェパード・ドッグ・グローネンダール", + "ブリアード", + "オーストラリアン・ケルピー", + "コモンドール", + "オールド・イングリッシュ・シープドッグ", + "シェットランド・シープドッグ", + "コリー", + "ブービエ・デ・フランダース", + "ロットワイラー (犬種)", + "ジャーマン・シェパード・ドッグ", + "ドーベルマン", + "ボクサー", + "ブルマスティフ", + "チベタン・マスティフ", + "グレート・デーン", + "セント・バーナード", + "ハスキー犬", + "アラスカン・マラミュート", + "シベリアン・ハスキー", + "ダルメシアン", + "アーフェンピンシャー", + "バセンジー", + "パグ", + "ニューファンドランド (犬)", + "グレート・ピレニーズ", + "サモエド犬", + "ポメラニアン", + "チャウ・チャウ", + "キースホンド", + "ショロイッツクゥイントリ", + "狼", + "ホッキョクオオカミ", + "タテガミオオカミ", + "コヨーテ", + "ディンゴ", + "ドール", + "リカオン", + "ハイエナ", + "キツネ", + "ホッキョクギツネ", + "ハイイロギツネ", + "トラネコ", + "ペルシャ", + "シャム (ネコ)", + "ピューマ", + "山猫", + "ヒョウ", + "雪豹", + "豹", + "ライオン", + "トラ", + "チーター", + "ヒグマ", + "亜米利加熊", + "北極グマ", + "マングース科", + "ミーアキャット", + "斑猫", + "テントウムシ", + "オサムシ科", + "カミキリムシ科", + "ハムシ", + "糞虫", + "カブトムシ", + "ゾウムシ", + "ハエ", + "ハナバチ", + "アリ", + "蟋蟀", + "ナナフシ", + "ゴキブリ", + "カマキリ目", + "蝉", + "ヨコバイ", + "蜻蛉", + "イトトンボ", + "オオカバマダラ", + "ヒトデ", + "雲丹", + "海鼠", + "モリウサギ", + "ノウサギ属", + "アンゴラウサギ", + "ハムスター", + "ヤマアラシ", + "キツネリス", + "マーモット", + "ビーバー", + "天竺鼠", + "シマウマ", + "豚", + "猪", + "イボイノシシ", + "カバ", + "去勢牛", + "スイギュウ", + "バイソン属", + "牡羊", + "ビッグホーン", + "アイベックス", + "ハーテビースト", + "インパラ", + "ガゼル属", + "ヒトコブラクダ", + "ラマ", + "イタチ", + "ミンク", + "ヨーロッパケナガイタチ", + "フェレット", + "獺", + "スカンク", + "アナグマ", + "アルマジロ", + "タテガミナマケモノ", + "オランウータン", + "ゴリラ", + "チンパンジー", + "手長猿", + "フクロテナガザル", + "尾長猿", + "パタスモンキー", + "狒々", + "マカク属", + "コロブス亜科", + "コロブス属", + "テングザル", + "マーモセット", + "ホエザル", + "アカクモザル", + "コモンリスザル", + "ワオキツネザル", + "インドリ", + "アジアゾウ", + "アフリカゾウ", + "レッサーパンダ", + "パンダ", + "オキサワラ", + "ウナギ", + "ギンザケ", + "クマノミ", + "チョウザメ", + "ガー目", + "蓑笠子", + "河豚", + "算盤", + "アバヤ", + "アカデミックドレス", + "アコーデオン", + "アコースティック・ギター", + "航空母艦", + "旅客機", + "飛行船", + "救急車", + "水陸両用車", + "養蜂場", + "エプロン", + "ごみ箱", + "アサルトライフル", + "リュックサック", + "パン屋", + "平均台", + "風船", + "ボールペン", + "バンジョー", + "手摺", + "バーベル", + "バーバーチェア", + "納屋", + "気圧計", + "樽", + "手押し車", + "ボール (野球)", + "バスケットボール", + "バシネット", + "ファゴット", + "スイムキャップ", + "湯船", + "ステーションワゴン", + "灯台", + "ビーカー", + "バスビー", + "ビール瓶", + "タンデム自転車", + "ビキニ", + "双眼鏡", + "巣箱", + "ボブスレー", + "ボロ・タイ", + "ボンネット", + "本棚", + "書店", + "ボトルキャップ", + "弓", + "ボウ", + "ブラ", + "防波堤", + "胸当て", + "箒", + "バケツ", + "締め金", + "ボディアーマー", + "超特急", + "食肉市場", + "タクシー", + "釜", + "ろうそく", + "大砲", + "カヌー", + "缶切り", + "カーディガン", + "メリーゴーラウンド", + "紙パック", + "現金自動預け払い機", + "カセット", + "城", + "双胴船", + "CDプレーヤー", + "チェロ", + "携帯電話", + "鎖", + "金網", + "鎖帷子", + "鎖鋸", + "櫃", + "箪笥", + "鐘", + "クリスマスの靴下", + "教会", + "ピクチュア・パレス", + "岩棚居住", + "木靴", + "シェイカー (調理器具)", + "コーヒーポット", + "螺旋", + "ダイヤル錠", + "キーボード", + "菓子類", + "コンテナ船", + "オープンカー", + "コルクスクリュー", + "トランペット", + "カウボーイブーツ", + "テンガロンハット", + "揺り籠", + "起重機", + "クレート (箱)", + "ベビーベッド", + "スロークッカー", + "松葉杖", + "キュイラス", + "ダム", + "机", + "デスクトップパソコン", + "おむつ", + "デジタル時計", + "ダイニングテーブル", + "食器洗い機", + "ディスクブレーキ", + "ドック", + "犬ぞり", + "円蓋", + "太鼓", + "ドラムスティック", + "ダンベル", + "エレキギター", + "電気機関車", + "封筒", + "フェースパウダー", + "ボア", + "書類整理棚", + "消防艇", + "消防車", + "旗竿", + "笛", + "パイプ椅子", + "フォークリフト", + "噴水", + "万年筆", + "フライパン", + "ごみ収集車", + "ガスマスク", + "給油機", + "ゴーカート", + "ゴルフ・カート", + "ゴンドラ (船)", + "ゴング", + "ガウン", + "グランドピアノ", + "温室", + "食料品店", + "ギロチン", + "ヘアスプレー", + "半装軌車", + "金槌", + "ブロードライヤー", + "携帯機器", + "ハンカチ", + "ハーモニカ", + "ハープ", + "鉈", + "ホルスター", + "空間充填", + "罠", + "フープスカート", + "鉄棒", + "砂時計", + "アイロン", + "ジャック・オー・ランタン", + "ジーパン", + "ジープ", + "Tシャツ", + "ジグソーパズル", + "力車", + "和服", + "ニーパッド", + "結び目", + "白衣", + "お玉杓子", + "ランプシェード", + "ノートパソコン", + "芝刈り機", + "レンズキャップ", + "ペーパーナイフ", + "救難艇", + "明かり", + "リムジン", + "オーシャン・ライナー", + "口紅", + "ローファー", + "化粧水", + "スピーカー", + "ルーペ", + "製材所", + "マイヨ", + "マンホールの蓋", + "マラカス", + "シロフォン", + "仮面", + "マッチ", + "五月柱", + "迷宮", + "計量カップ", + "巨石記念物", + "マイクロフォン", + "電子レンジ", + "マイクロバス", + "ミニスカート", + "ミニバン", + "ミサイル", + "ミトン", + "トレーラーハウス", + "フォード・モデルT", + "変復調装置", + "原動機付自転車", + "角帽", + "モスク", + "蚊帳", + "スクーター", + "マウンテンバイク", + "マウス", + "ネズミ捕り", + "釘", + "ネックカラー", + "首飾り", + "ノートパソコン", + "オベリスク", + "オーボエ", + "オカリナ", + "オドメーター", + "オイルフィルター", + "オルガン", + "オシロスコープ", + "酸素マスク", + "パケット", + "パドル", + "パドルホイール", + "南京錠", + "筆", + "パジャマ", + "宮殿", + "パンパイプ", + "キッチンペーパー", + "落下傘", + "平行棒", + "パーキングメーター", + "客車", + "パティオ", + "公衆電話", + "台座", + "筆箱", + "鉛筆削り", + "香水", + "シャーレ", + "複写機", + "ピック", + "ピッケルハウベ", + "杭垣", + "ピックアップ", + "貯金箱", + "枕", + "海賊船", + "ピッチャー", + "鉋", + "ビニール袋", + "プラウ", + "ラバーカップ", + "インスタントカメラ", + "遊撃車", + "ポンチョ", + "ビリヤード・テーブル", + "植木鉢", + "轆轤", + "印刷機", + "刑務所", + "飛び道具", + "映写機", + "パック", + "サンドバッグ", + "財布", + "羽根ペン", + "ベッドカバー", + "ラケット", + "ラジエーター", + "電波望遠鏡", + "天水桶", + "レクリエーショナル・ビークル", + "冷蔵箱", + "リモートコントロール", + "レストラン", + "回転式拳銃", + "ライフル", + "ロッキングチェア", + "ロティサリー", + "ラグビー・ボール", + "物差し", + "金庫", + "安全ピン", + "塩入れ", + "草鞋", + "サロン (民族衣装)", + "サキソフォン", + "鞘", + "秤", + "スクールバス", + "スクーナー", + "スコアボード", + "ねじ", + "スクリュードライバー", + "シートベルト", + "裁縫機械", + "盾", + "靴屋", + "ショッピングカート", + "ショベル", + "シャワーキャップ", + "スキー板", + "寝袋", + "計算尺", + "スノーモービル", + "スノープラウ", + "靴下", + "太陽炉", + "ソンブレロ", + "スペースキー", + "暖房", + "スペースシャトル", + "紡錘", + "スポーツカー", + "演壇", + "蒸気機関車", + "通り抜けアーチ橋", + "スティールパン", + "聴診器", + "ストラ", + "石垣", + "ストップウォッチ", + "ストーブ", + "ライトレール", + "ストレッチャー", + "卒塔婆", + "潜水艦", + "洋服一揃い", + "日時計", + "サングラス", + "日焼け止め剤", + "吊橋", + "モップ", + "トレーナー", + "ブランコ", + "スイッチ", + "注射器", + "テーブルランプ", + "戦車", + "ティーポット", + "テディベア", + "テニスボール", + "緞帳", + "指貫 (裁縫道具)", + "脱穀機", + "玉座", + "トースター", + "煙草屋", + "便座", + "松明", + "トーテムポール", + "レッカー車", + "トラクター", + "トレーラートラック", + "トレイ", + "トレンチコート", + "三輪車", + "三脚", + "凱旋門", + "トロリーバス", + "トロンボーン", + "自動改札機", + "傘", + "一輪車", + "掃除機", + "花瓶", + "ヴォールト", + "ベルベット", + "祭服", + "高架橋", + "フィドル", + "ボール (バレーボール)", + "ワッフルメーカー", + "掛け時計", + "財布", + "クローゼット", + "軍用機", + "聖水盤", + "洗濯機", + "水筒", + "給水塔", + "ホイッスル", + "かつら (装身具)", + "網戸", + "ワインボトル", + "ちゅうかなべ", + "杓文字", + "毛糸", + "角材の柵", + "ゲル (家屋)", + "ウェブサイト", + "漫画雑誌", + "クロスワードパズル", + "道路標識", + "信号機", + "ブックカバー", + "ワカモレ", + "コンソメ", + "鍋", + "トライフル", + "アイスクリーム", + "アイスキャンディー", + "ベーゲル", + "プレッツェル", + "チーズバーガー", + "マッシュポテト", + "花キャベツ", + "ズッキーニ", + "きゅうり", + "グラニー・スミス", + "苺色", + "無花果", + "パイナップル", + "石榴", + "干草", + "カルボナーラ", + "チョコレート・シロップ", + "パン生地", + "ミートローフ", + "ピザ", + "ポットパイ", + "ブリトー", + "赤ワイン", + "エスプレッソ", + "アドヴォカート", + "泡立つ", + "崖", + "サンゴ礁", + "間欠泉", + "湖畔", + "ヘッドランド", + "海岸", + "谷", + "火山", + "野球選手", + "しんろう", + "セイヨウアブラナ", + "ヒナギク", + "どんぐり", + "ハマナス", + "マイタケ", + "穂", + "トイレットペーパー" + ] + ], + "TL": [ + [ + 1, + 2, + 4, + 6, + 9, + 11, + 17, + 18, + 23, + 29, + 48, + 49, + 61, + 71, + 78, + 79, + 85, + 92, + 93, + 94, + 99, + 102, + 105, + 107, + 108, + 110, + 111, + 113, + 114, + 125, + 127, + 128, + 130, + 134, + 144, + 146, + 148, + 149, + 150, + 151, + 272, + 273, + 276, + 277, + 279, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 296, + 298, + 301, + 302, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 319, + 323, + 327, + 328, + 329, + 331, + 334, + 337, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 353, + 354, + 355, + 356, + 357, + 360, + 362, + 363, + 365, + 366, + 368, + 373, + 385, + 386, + 387, + 388, + 390, + 396, + 397, + 398, + 401, + 405, + 407, + 411, + 412, + 414, + 415, + 418, + 420, + 421, + 425, + 426, + 428, + 430, + 432, + 435, + 437, + 438, + 447, + 450, + 454, + 456, + 457, + 459, + 460, + 462, + 463, + 464, + 468, + 469, + 470, + 472, + 473, + 476, + 483, + 486, + 487, + 488, + 497, + 498, + 499, + 508, + 512, + 513, + 517, + 523, + 525, + 527, + 532, + 538, + 541, + 543, + 546, + 549, + 557, + 558, + 567, + 580, + 582, + 587, + 591, + 593, + 594, + 604, + 606, + 609, + 619, + 626, + 627, + 631, + 632, + 642, + 643, + 646, + 650, + 657, + 668, + 669, + 673, + 677, + 679, + 683, + 687, + 688, + 696, + 697, + 698, + 701, + 710, + 711, + 712, + 713, + 714, + 719, + 721, + 725, + 726, + 728, + 738, + 744, + 748, + 755, + 760, + 762, + 764, + 765, + 769, + 771, + 772, + 774, + 775, + 776, + 777, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 806, + 816, + 823, + 827, + 833, + 834, + 835, + 840, + 844, + 845, + 847, + 849, + 855, + 859, + 870, + 875, + 879, + 885, + 889, + 893, + 894, + 902, + 909, + 911, + 915, + 916, + 917, + 928, + 931, + 938, + 943, + 952, + 953, + 957, + 958, + 961, + 963, + 966, + 967, + 969, + 971, + 972, + 973, + 978, + 979, + 980, + 988, + 999 + ], + [ + "Goldpis", + "Malaking puting pating", + "Pating ng martilyo", + "pagi", + "abestrus", + "kardelina", + "Ibong salta", + "Dominiko", + "Buwitre", + "aholote", + "Bayawak ng Komodo", + "Buwaya ng Nilo", + "banyas", + "alakdan", + "Garapata", + "alupihan", + "Pugo", + "manunubing", + "kalaw", + "ibong umuugong", + "gansa", + "ekidna", + "kowala", + "dikya", + "anemonang-dagat", + "lapyulod", + "uodugat", + "kuhol", + "lintang-kati", + "Ermitanyang alimango", + "Puting tagak", + "Itim na tagak", + "Plamengko", + "Kreyn", + "pelikano", + "Albatros", + "Orka", + "Dugonguidae", + "Leon-dagat", + "Tsiwawa", + "Koyote", + "Dinggo", + "Hayina", + "alamid", + "Artikong soro", + "Pusang Thai", + "Leong-bundok", + "linse", + "leopardo", + "Leopardong niyebe", + "haguwar", + "leon", + "Tigre", + "gepardo", + "Kayumanggi oso", + "U maritimus", + "Monggus", + "marikita", + "sumbang-tae", + "Langaw", + "pukyot", + "langgam", + "kuliglig-lupa", + "Ipis", + "Mandadangkal", + "kuliglig", + "tutubi", + "Paruparong Monarch", + "Isdambituin", + "salungo", + "tripang", + "Liyebre", + "Porkyupayn", + "Kastor", + "Konehilyo", + "sebra", + "baboy", + "baboy-ramo", + "ipopotamo", + "Kapong baka", + "kalabaw", + "Bayson", + "Gasel", + "Dromedaryo", + "liyama", + "Wisel", + "Visón", + "Lutrinae", + "Badyer", + "armadilyo", + "Orangutan ng Borneo", + "Gorilya", + "Mas maliit na bakulaw", + "Makak", + "Elepanteng Asyano", + "Aprikanong elepante", + "Pulang panda", + "Dambuhalang panda", + "Igat", + "lallong", + "pumutok isda", + "abako", + "akurdyon", + "Barkong panghimpapawid", + "ambulansiya", + "tapi", + "basurahan", + "Kabalyas", + "panaderya", + "bolpoint", + "Bandyo", + "palababahan", + "kamalig", + "Barometro", + "bitlag", + "basketbol", + "bahon", + "paligo", + "Parola", + "Basong panglaboratoryo", + "duhansipat", + "Bobsley", + "bilihang-aklat", + "pana", + "buklod-kurbata", + "Brasiyer", + "pamasag-alon", + "Walis", + "Timba", + "pamuko", + "taksi", + "kaldero", + "kandila", + "Lunday", + "Abrilata", + "tiyubibo", + "kastilyo", + "tselo", + "teleponong selular", + "tanikala", + "simbahan", + "Sinehan", + "panghapak", + "tipaan", + "tirabuson", + "Trumpeta", + "Kreyn", + "Saklay", + "tarundon", + "kumputador panghapag", + "dulang", + "Lungaw", + "Tambol", + "Dambel", + "Gitarang de-kuryente", + "sobre", + "tagdan ng bandila", + "bansi", + "kawali", + "Bahay-patubuan", + "abaseriya", + "Martilyo", + "panyolito", + "Silindro (gamit panugtog)", + "Kudyapi", + "Orasa", + "plantsa", + "dyip", + "pantalya ng lampaba", + "lampara", + "limusina", + "Losyon", + "daktinig", + "Saylopon", + "maskara", + "Laberinto", + "mayk", + "Misil", + "Moske", + "Kulambo", + "maws", + "pako", + "binaysok", + "obo", + "organo", + "tuguysipat", + "pinsel", + "pandiyama", + "Palasyo", + "payong-payong", + "pantasa", + "Pabango", + "Pinggang Petri", + "Aparatong pangopya", + "puwa", + "tanggunggong", + "Unan", + "Pitsel", + "Katam", + "Supot", + "paso", + "Panudla", + "lukbutan", + "daksipat-diglap", + "Repriherador", + "restawrant", + "riple", + "Tumba-tumba", + "galod", + "Kahang bakal", + "perdible", + "sandalyas", + "Sarng", + "saksopon", + "bayna", + "skuner", + "palapuntusan", + "Tornilyo", + "destornilyador", + "Sinturong pangkaligtasan", + "Makinang panahi", + "Kalasag", + "Pala", + "eski", + "medyas", + "sudlan", + "diblinig", + "katan", + "Submarino", + "Terno", + "kuwadrante", + "lampaso", + "kabtol", + "hiringgilya", + "Tangke", + "tsarera", + "Didal", + "tustahan ng tinapay", + "traysikel", + "Trombon", + "payong", + "pelus", + "Biyulin", + "Pitaka", + "Kloset", + "Silbato", + "Talyasi", + "lana", + "tolda", + "pahinarya", + "Komiks (magasin o aklat)", + "Sorbetes", + "Beygel", + "koliplor", + "pipino", + "igos", + "pinyá", + "granada", + "ginikan", + "Tapay", + "pitsa", + "pulang bino", + "ekspreso", + "Gatas ng inahin", + "bula", + "Bangin", + "Bahura ng mga bulaklak na bato", + "dalampasigan", + "lambak", + "Bulkan", + "Ensina", + "pang-iwang" + ] + ], + "TR": [ + [ + 0, + 1, + 2, + 3, + 6, + 9, + 10, + 11, + 13, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 29, + 32, + 34, + 39, + 42, + 46, + 48, + 49, + 50, + 53, + 62, + 63, + 65, + 69, + 71, + 75, + 77, + 78, + 79, + 80, + 85, + 86, + 87, + 88, + 89, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 116, + 124, + 126, + 127, + 128, + 129, + 130, + 134, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 151, + 152, + 153, + 154, + 155, + 160, + 162, + 169, + 170, + 176, + 191, + 211, + 213, + 215, + 226, + 231, + 233, + 234, + 235, + 242, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 254, + 256, + 257, + 258, + 259, + 260, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 305, + 306, + 308, + 309, + 310, + 312, + 314, + 315, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 336, + 337, + 338, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 352, + 353, + 354, + 355, + 356, + 357, + 359, + 360, + 361, + 362, + 364, + 365, + 366, + 367, + 368, + 372, + 373, + 374, + 376, + 379, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 391, + 394, + 395, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 425, + 426, + 427, + 428, + 430, + 431, + 432, + 433, + 435, + 436, + 437, + 440, + 447, + 448, + 450, + 453, + 454, + 456, + 457, + 459, + 460, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 508, + 509, + 510, + 511, + 512, + 513, + 516, + 517, + 523, + 525, + 527, + 529, + 532, + 534, + 535, + 536, + 537, + 538, + 541, + 543, + 546, + 547, + 549, + 551, + 553, + 554, + 555, + 557, + 558, + 561, + 562, + 563, + 567, + 569, + 570, + 571, + 572, + 574, + 575, + 576, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 601, + 602, + 604, + 606, + 608, + 609, + 610, + 611, + 612, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 626, + 627, + 628, + 629, + 631, + 632, + 633, + 636, + 641, + 642, + 643, + 646, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 662, + 665, + 667, + 668, + 669, + 671, + 673, + 677, + 679, + 681, + 682, + 683, + 684, + 686, + 687, + 688, + 689, + 691, + 692, + 693, + 694, + 695, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 710, + 711, + 712, + 713, + 714, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 732, + 735, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 793, + 795, + 797, + 799, + 802, + 803, + 805, + 806, + 810, + 816, + 817, + 818, + 819, + 820, + 823, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 850, + 852, + 854, + 855, + 856, + 857, + 859, + 861, + 862, + 863, + 864, + 866, + 867, + 868, + 869, + 870, + 873, + 874, + 875, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 891, + 892, + 893, + 894, + 895, + 897, + 900, + 902, + 903, + 907, + 909, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 924, + 928, + 929, + 933, + 935, + 938, + 939, + 943, + 944, + 952, + 957, + 958, + 961, + 962, + 965, + 966, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 981, + 982, + 984, + 988, + 989, + 990, + 996, + 998, + 999 + ], + [ + "Kadife balığı", + "Japon balığı", + "Carcharodon charcharias", + "kaplan köpek balığı", + "vatoz", + "devekuşu", + "Dağ ispinozu", + "Saka kuşu", + "Junko", + "Amerika nar bülbülü", + "Arap bülbülügiller", + "Alakarga", + "saksağan", + "su karatavuğugiller", + "Çaylak", + "Kel kartal", + "Akbaba", + "Aksolotl", + "Kuyruklu kurbağa", + "deri sırtlı deniz kaplumbağası", + "İguana", + "Kaya keleri", + "Yeşil kertenkele", + "Komodo ejderi", + "Nil timsahı", + "Amerika aligatoru", + "Boğmaklı yılan", + "Afrika kaya pitonu", + "Adi kobra", + "Deniz yılanı", + "Trilobitler", + "akrep", + "Karadul", + "Kurt örümceği", + "kene", + "çıyan", + "Kara orman tavuğu", + "bıldırcın", + "keklik", + "Jaco", + "Amerikan papağanı", + "Kükürt taçlı kakadu", + "Arı kuşugiller", + "Boynuzgaga", + "sinek kuşu", + "Jakamar", + "tukan", + "Tarakdiş", + "kaz", + "Kara kuğu", + "Dikenli karıncayiyengiller", + "gagalı memeli", + "Valabi", + "keseli ayı", + "vombat", + "denizanası", + "Denizşakayığı", + "Yassı solucanlar", + "Yuvarlak solucanlar", + "salyangoz", + "Sümüklüböcek", + "Kitonlar", + "kerevit", + "tespih böceği", + "Leylek", + "kara leylek", + "Kaşıkçı (kuş)", + "allı turna", + "turna", + "Toygiller", + "Bayağı taşçeviren", + "Kara karınlı kum kuşu", + "Kızılbacak", + "poyraz kuşu", + "pelikan", + "kral penguen", + "Albatros", + "gri balina", + "katil balina", + "Batı Hint Denizineği", + "Chihuahua (köpek)", + "Japon köpeği", + "Malta köpeği", + "Pekinez", + "Şitsu", + "Afgan tazısı", + "Beagle (köpek)", + "Borzoy", + "İrlanda kurt köpeği", + "Gazal tazısı", + "Airedale teriyeri", + "Macar Vizsla", + "İrlanda seteri", + "Bretagne epanyölü", + "Brie çoban köpeği", + "Colley", + "Flandre çoban köpeği", + "Rotvaydır", + "Alman çoban köpeği", + "Boksör (köpek)", + "Bulmastif", + "Tibet mastifi", + "Danua", + "Senbernar", + "Alaska kurdu", + "Sibirya haskisi", + "Dalmaçya köpeği", + "Pug köpekleri", + "Newfoundland (köpek)", + "Pyrenees çoban köpeği", + "Samoyed (köpek)", + "Pomeranian Boo", + "Çov-çov", + "kurt", + "Kutup kurdu", + "Kızıl kurt", + "kır kurdu", + "Avustralya yaban köpeği", + "Asya yaban köpeği", + "Afrika yaban köpeği", + "Asıl sırtlanlar", + "tilki", + "Kutup tilkisi", + "Boz tilki", + "Tekir", + "İran kedisi", + "Siyam kedisi", + "Dağ aslanı", + "vaşak", + "pars", + "Kar leoparı", + "panter", + "aslan", + "kaplan", + "çita", + "Boz ayı", + "Amerikan kara ayısı", + "kutup ayısı", + "Kuyruksürengiller", + "Mirket", + "uğur böceği", + "bok böceği", + "gergedan böceği", + "Çift kanatlılar", + "arı", + "karınca", + "cırcır böceği", + "hamam böceği", + "Peygamberdevesi", + "yusufçuk", + "Küçük kızböcekleri", + "Kral kelebeği", + "Denizyıldızı", + "denizkestanesi", + "Deniz hıyarı", + "Kır tavşanı", + "Angora tavşanı", + "hemstır", + "oklu kirpi", + "dağ sıçanı", + "kastor", + "Ginepig", + "domuz", + "Yaban domuzu", + "Düğmeli domuz", + "Su aygırı", + "Öküz", + "manda", + "Bizon", + "koç", + "Amerika yaban koyunu", + "Alp dağ keçisi", + "İmpala", + "Ceylan", + "hecin", + "lama", + "Gelincik", + "Vizon", + "feret", + "lutr", + "kokarca", + "porsuk", + "Üç parmaklı tembel hayvanlar", + "Borneo orangutanı", + "goril", + "şempaze", + "Gibongiller", + "şebek", + "Makak maymunu", + "Kolobine", + "Uzun burunlu maymun", + "Uluyan maymun", + "örümcek maymunu", + "Sincap maymunu", + "Halka kuyruklu maki", + "Hint fili", + "Afrika savan fili", + "Küçük panda", + "Dev panda", + "yılan balığı", + "Gümüş sombalığı", + "mersin balığı", + "Zargana", + "balon balığı", + "abaküs", + "Abaye", + "Akademik kıyafet", + "akordiyon", + "Akustik gitar", + "Uçak gemisi", + "Yolcu uçağı", + "Hava gemisi", + "cankurtaran", + "Amfibiyen araç", + "kovanlık", + "önlük", + "Çöp konteyneri", + "piyade tüfeği", + "Sırt çantası", + "Ekmek fırını", + "Denge aleti", + "balon", + "tükenmez kalem", + "banco", + "korkuluk", + "samanlık", + "barometre", + "fıçı", + "El arabası", + "basketbol topu", + "Beşik", + "Obua Ailesi", + "Bone", + "küvet", + "steyşın", + "deniz feneri", + "Bira şişesi", + "dürbün", + "kuş evi", + "Bobsledçi", + "kitaplık", + "kitabevi", + "yay", + "papyon", + "sütyen", + "küpeşte", + "süpürge", + "kova", + "toka", + "Kurşun geçirmez yelek", + "taksi", + "kazan", + "mum", + "top", + "kano", + "açacak", + "hırka", + "atlıkarınca", + "Karton", + "bankamatik", + "kaset", + "kale", + "katamaran", + "CD çalar", + "viyolonsel", + "cep", + "zincir", + "örme zincir", + "motorlu testere", + "kutu", + "Konsol (mobilya)", + "kilise", + "sinema salonu", + "Satır", + "Sabo", + "Shaker", + "cezve", + "makara", + "klavye", + "Şekerci", + "Konteyner gemisi", + "Cabriolét", + "tirbuşon", + "trompet", + "beşik", + "Vinç", + "Koltuk değneği", + "baraj", + "masaüstü bilgisayar", + "Bebek bezi", + "yemek masası", + "bulaşık makinesi", + "Disk fren", + "Dok", + "Köpek kızağı", + "kubbe", + "davul", + "Dambıl", + "elektro gitar", + "Elektrikli lokomotif", + "zarf", + "Yüz pudrası", + "dosya", + "Yangın söndürme gemisi", + "İtfaiye aracı", + "bayrak direği", + "flüt", + "kaldırmaç", + "çeşme", + "dolma kalem", + "tava", + "çöp arabası", + "Respiratör", + "Akaryakıt pompası", + "kadeh", + "Golf topu", + "Golf arabası", + "Gondol", + "kuyruklu piyano", + "sera", + "bakkal", + "giyotin", + "Saç spreyi", + "Yarı paletli", + "çekiç", + "saç kurutma makinasý", + "mobil cihaz", + "Mendil", + "mızıka", + "arp", + "Halka etek", + "Barfiks", + "Kum saati", + "ütü", + "kot pantolon", + "cip", + "Tişört", + "yapboz", + "çekçek", + "dizlik", + "Düğüm", + "Bluz", + "kepçe", + "abajur", + "dizüstü", + "Çim biçme makinesi", + "Çakmak", + "limuzin", + "Transatlantik", + "ruj", + "Losyon", + "Hoparlör", + "büyüteç", + "Postacı çantası", + "Marakas", + "ksilofon", + "Maske", + "Labirent", + "Megalit", + "mikrofon", + "mikrodalga fırın", + "minibüs", + "mini etek", + "Çok amaçlı araç", + "Füze", + "Modem denetleyicisi", + "mobilet", + "Akademik şapka", + "mescit", + "cibinlik", + "Dağ bisikleti", + "fare", + "Çivi", + "kolye", + "dizüstü bilgisayar", + "dikilitaş", + "Obua", + "Okarina", + "Yağ filtresi", + "org", + "Osiloskop", + "Üst etek", + "oksijen maskesi", + "paket", + "kürek", + "Kanatlı çark", + "kilit", + "pijama", + "Saray", + "Panflüt", + "kâğıt havlu", + "paraşüt", + "Paralel bar", + "parkmetre", + "Yolcu vagonu", + "teras", + "Ankesörlü telefon", + "Kaide", + "kalemtıraş", + "Parfüm", + "Petri kabı", + "fotokopi makinesi", + "pena", + "Kamyonet", + "kumbara", + "yastık", + "sürahi", + "planya", + "poşet", + "saban", + "Polaroid fotoğraf makinası", + "Panço", + "Saksı", + "Çömlekçi çarkı", + "seccade", + "yazıcı", + "Cezaevi", + "Atkı (fizik)", + "gösterici", + "boks torbası", + "cüzdan", + "tüy kalem", + "Yorgan", + "raket", + "Radyatör", + "radyo teleskop", + "Seyahat aracı", + "buzdolabı", + "uzaktan kumanda cihazi", + "lokanta", + "Altıpatlar", + "tüfek", + "sallanan sandalye", + "cetvel", + "kasa", + "çengelli iğne", + "tuzluk", + "sandalet", + "saksafon", + "kın", + "kantar", + "okul otobüsü", + "Uskuna", + "vida", + "tornavida", + "Emniyet kemeri", + "Dikiş makinesi", + "kalkan", + "Alışveriş arabası", + "Kürek (alet)", + "duş bonesi", + "kayak", + "Uyku tulumu", + "Sürgülü araba kapısı", + "karmobil", + "Kar temizleme aracı", + "futbol topu", + "çorap", + "Boşluk tuşu", + "iğ", + "Spor otomobil", + "spot lambası", + "Sahne", + "Buharlı lokomotif", + "stetoskop", + "Kronometre", + "Soba", + "tramvay ağı", + "Sedye", + "Denizaltı", + "takım elbise", + "Güneş saati", + "güneş gözlüğü", + "güneş kremi", + "asma köprü", + "paspas", + "salıncak", + "anahtar", + "Şırınga", + "Zırhlı savaş aracı", + "çaydanlık", + "Oyuncak ayı", + "Tenis topu", + "Perde (tiyatro)", + "yüksük", + "patoz", + "taht", + "ekmek kızartma makinesi", + "klozet kapağı", + "meşale", + "Totem direği", + "Çekici", + "Traktör", + "Yarı römork kamyon", + "tepsi", + "Trençkot", + "triportör", + "Zafer takı", + "Troleybüs", + "trombon", + "Turnike", + "Şemsiye", + "tekteker", + "aspiratör", + "vazo", + "Tonoz", + "kadife", + "viyadük", + "keman", + "Tost makinesi", + "duvar saati", + "cüzdan", + "dolap", + "Askerî uçak", + "çamaşır makinesi", + "Su kulesi", + "Düdük", + "Peruk", + "Salmanazar", + "çin tavası", + "yün", + "yurt (çadır)", + "internet sitesi", + "Karikatür öykü", + "çengel bulmaca", + "Sokak tabelası", + "Trafik ışığı", + "Guakamole", + "dondurma", + "Buzlu meyve", + "çizburger", + "patates püresi", + "karnabahar", + "sakız kabağı", + "hıyar", + "Orman yeşili", + "incir", + "saklı", + "saman", + "hamur", + "dalyan köfte", + "Taco de harina", + "kırmızı şarap", + "köpük", + "uçurum", + "Mercan resifi", + "gayzer", + "sahil", + "vadi", + "Yanardağ", + "beyzbolcu", + "güveyi", + "Kanola", + "meşe palamufu", + "Kuşburnu (meyve)", + "at kestanesi", + "Maitake Mantarı", + "Başak", + "tuvalet kağıdı" + ] + ], + "GD": [ + [ + 1, + 9, + 10, + 11, + 14, + 15, + 23, + 65, + 71, + 78, + 80, + 81, + 92, + 94, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 105, + 108, + 112, + 113, + 114, + 124, + 125, + 127, + 128, + 133, + 134, + 139, + 140, + 141, + 143, + 144, + 148, + 199, + 231, + 235, + 269, + 277, + 286, + 287, + 289, + 290, + 291, + 292, + 293, + 298, + 301, + 309, + 312, + 319, + 322, + 323, + 328, + 331, + 333, + 337, + 338, + 340, + 341, + 342, + 344, + 346, + 348, + 353, + 354, + 356, + 357, + 359, + 360, + 361, + 362, + 366, + 390, + 394, + 396, + 401, + 402, + 407, + 411, + 412, + 420, + 421, + 425, + 426, + 427, + 428, + 430, + 432, + 433, + 435, + 437, + 448, + 452, + 454, + 456, + 460, + 461, + 462, + 463, + 464, + 467, + 468, + 469, + 473, + 480, + 483, + 487, + 488, + 493, + 497, + 506, + 508, + 513, + 516, + 518, + 526, + 534, + 541, + 542, + 543, + 546, + 549, + 557, + 558, + 567, + 572, + 580, + 582, + 587, + 589, + 593, + 594, + 606, + 608, + 610, + 611, + 618, + 620, + 643, + 649, + 650, + 651, + 658, + 668, + 673, + 677, + 679, + 683, + 687, + 692, + 696, + 697, + 730, + 743, + 748, + 760, + 761, + 762, + 764, + 765, + 769, + 770, + 774, + 776, + 777, + 778, + 784, + 785, + 787, + 797, + 803, + 806, + 818, + 820, + 823, + 830, + 833, + 834, + 835, + 837, + 838, + 840, + 856, + 859, + 860, + 862, + 866, + 875, + 882, + 883, + 884, + 885, + 889, + 893, + 894, + 903, + 910, + 911, + 916, + 928, + 943, + 953, + 958, + 962, + 966, + 971, + 976, + 978, + 979, + 980, + 988, + 999 + ], + [ + "Òr-iasg", + "struth", + "breacan-caorainn", + "Deargan fraoich", + "Pompee phlooreenagh", + "Treshlen Americaanagh", + "Fang", + "Nathair-mhara (snàigean)", + "sgairp", + "Gartan", + "Coileach dubh", + "tarmachan", + "beachadair", + "drannd-eun", + "tùcan", + "ràc", + "Sìolta dhearg", + "gèadh", + "Eala dhubh", + "Itheadair-sheangan", + "Platapas gob-tunnaige", + "Mathan coala", + "cìochag-thràghad", + "Spàirneag", + "seilcheag", + "seilcheag", + "Giomach uisge", + "partan-tuathal", + "Corra bhàn", + "Corra dhubh", + "corra-ghrian", + "corra-mhonaidh", + "Trìlleachan beag", + "Pollaran", + "Cam-glas", + "gille-brìghde", + "Pelecanus onocrotalus", + "Madadh-cuain", + "Abhag Albannach", + "coilidh", + "buachaille Gearmailteach", + "madadh allaidh", + "sionnach", + "Pùma", + "Lioncs", + "Leopard-sneachda", + "Iaguar", + "leòmhann", + "Tìgear", + "Sìotà", + "Mongùs", + "daolag bhreac dhearg", + "Seillean", + "greollan", + "tarbh-nathrach", + "fàinneag-dhonn", + "dealan-dé rìoghail", + "cragan-tràghad", + "Maigheach", + "Hamstair", + "los-leathann", + "Gearra-mhuc", + "asal stiallach", + "muc", + "torc fiadhaich", + "Each-aibhne", + "buabhall uisge", + "rùda", + "gasail", + "dromadair", + "Neas", + "Mionc", + "fearaid", + "dòbhran", + "feocallan", + "broc", + "Goiriola", + "easgann", + "bradan-cearr", + "iasg-leòmhainn", + "bogsa piàna", + "giotàr acousticeach", + "Carbad-eiridinn", + "Aparan", + "Basgaid-sgudail", + "Bainsiò", + "stùc-shread", + "sabhal", + "glainne-shìde", + "Baraille", + "bara", + "ball-basgaid", + "Torm-fheadan", + "Bonaid-snàimh", + "amar", + "taigh-solais", + "taigh-eun", + "Bonaid", + "bùth-leabhraichean", + "bogha-saighde", + "doirlinn-fasgaidh", + "uchd-aodach", + "sguab", + "Peile", + "Bucall", + "margadh na feòla", + "tagsaidh", + "coire", + "fosglair chanastairean", + "inneal-airgid", + "caisteal", + "fòn-làimh", + "cuibhreach", + "Bòrd-sgeadachaidh", + "eaglais", + "lùb", + "meur-chlàr", + "Trombaid", + "creathall", + "clogaid-bhualaidh", + "deasg", + "nigheadair-shoithichean", + "druma", + "bioran-druma", + "Dòirneag-neirt", + "giotàr dealain", + "cèis-litreach", + "bratchrann", + "cuisle-chiùil", + "sgeileid", + "cuach", + "taigh-ghlainne", + "bùth grosaireachd", + "òrd", + "tiormadair gruaige", + "organ-beòil", + "troman-ciùil", + "Bòrd-iarnaigidh", + "dìnichean", + "geansaidh", + "mìrean-measgaichte", + "ladar", + "coimpiutair-uchd", + "brat-gnùise", + "tursa", + "microfòn", + "àmhainn meanbh-thonnach", + "miotag", + "mosg", + "luch", + "tarrag", + "seud-muineil", + "òboidh", + "Òrgan", + "pacaid", + "Bruis-pheant", + "deise-leapa", + "Crann-treabhaidh", + "Prìosan", + "sporan", + "fionnaradair", + "uidheam-smachd cèin", + "taigh-bìdh", + "Gunna", + "cathair shiùdanach", + "rùilear", + "Bròg-cleasachd", + "cuaran", + "Sacsafòn", + "faighean", + "Meidheadair", + "sgriubhaire", + "crios-sàbhailteachd", + "sgiath", + "poca-cadail", + "Crann-sneachda", + "stocainn", + "solas mòr", + "Carbad-smùide", + "steatasgop", + "Ragadair", + "bàta-tumaidh", + "deise", + "Uaireadair-grèine", + "speuclairean-grèine", + "Dubhadh-grèine", + "sguab", + "Inneal-bualaidh", + "tòstair", + "neach-bùtha tombaca", + "toirds", + "Tractar-àiteachais", + "Trombon", + "sguabadair", + "Bhàsa", + "bogha", + "meileabhaid", + "Fìdheall", + "màileid", + "preas", + "Biorabhaig", + "spàin-fhiodha", + "clòimh", + "ionad", + "Reòiteag", + "cularan", + "anann", + "feur", + "buileann feòla", + "fìon dearg", + "builgean", + "sròn", + "Còrsa", + "gleann", + "Beinn-theine", + "bachar", + "pàipear suathaidh" + ] + ], + "RO": [ + [ + 0, + 1, + 2, + 3, + 5, + 7, + 8, + 9, + 10, + 11, + 15, + 17, + 18, + 19, + 20, + 22, + 23, + 26, + 28, + 29, + 30, + 34, + 36, + 40, + 41, + 45, + 46, + 47, + 48, + 49, + 50, + 56, + 58, + 61, + 63, + 66, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 84, + 85, + 86, + 87, + 90, + 92, + 93, + 94, + 96, + 97, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 123, + 124, + 127, + 128, + 129, + 130, + 133, + 134, + 138, + 140, + 141, + 143, + 144, + 145, + 146, + 148, + 150, + 151, + 153, + 154, + 160, + 161, + 162, + 163, + 165, + 169, + 173, + 176, + 180, + 196, + 197, + 202, + 207, + 211, + 213, + 216, + 227, + 230, + 235, + 242, + 244, + 246, + 247, + 249, + 250, + 251, + 254, + 256, + 258, + 260, + 265, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 305, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 321, + 323, + 324, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 369, + 371, + 372, + 375, + 377, + 378, + 383, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 398, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 440, + 444, + 445, + 447, + 448, + 450, + 453, + 454, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 478, + 479, + 480, + 481, + 482, + 483, + 485, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 494, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 519, + 520, + 525, + 526, + 529, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 541, + 542, + 543, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 553, + 554, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 599, + 600, + 601, + 602, + 603, + 604, + 606, + 608, + 609, + 610, + 612, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 625, + 626, + 627, + 628, + 629, + 631, + 632, + 633, + 634, + 635, + 637, + 641, + 642, + 643, + 645, + 646, + 647, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 663, + 665, + 666, + 668, + 669, + 670, + 671, + 673, + 674, + 675, + 676, + 677, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 716, + 717, + 718, + 719, + 721, + 724, + 725, + 726, + 728, + 730, + 733, + 734, + 736, + 738, + 740, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 755, + 758, + 759, + 760, + 761, + 762, + 764, + 765, + 767, + 769, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 790, + 791, + 792, + 794, + 795, + 796, + 797, + 798, + 799, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 816, + 818, + 819, + 820, + 821, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 843, + 844, + 845, + 847, + 848, + 849, + 850, + 851, + 852, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 876, + 878, + 879, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 889, + 890, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 904, + 905, + 907, + 908, + 911, + 913, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 923, + 925, + 928, + 929, + 932, + 935, + 938, + 939, + 943, + 944, + 947, + 949, + 950, + 951, + 952, + 954, + 956, + 957, + 958, + 959, + 960, + 961, + 966, + 968, + 969, + 971, + 972, + 973, + 974, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 992, + 994, + 996, + 998, + 999 + ], + [ + "lin", + "peștișorauriu", + "marelealb", + "rechin-tigru", + "torpilă", + "bărbătuș", + "femelă", + "struţ", + "cinteză de iarnă", + "sticlete", + "Turdusmigratorius", + "gaiță", + "coţofană", + "pițigoiamerican", + "mierlădepârâu", + "vultur-pleșuv", + "vulturpleșuv", + "Triturusvulgaris", + "salamandra pătată", + "axolot", + "broască-bou", + "Dermochelyidae", + "broască-țestoasădeapădulce", + "Anolisul verde", + "cnemidophorus", + "Helodermasuspectum", + "Gușter", + "Chamaeleo aegyptius", + "dragondeKomodo", + "Crocodilul de Nil", + "Aligatorul american", + "șarperegal", + "șarpedeapă", + "Șarpe boa", + "cobră indiană", + "viperăcucorn", + "trilobit", + "Araneadiademata", + "văduva neagră", + "tarantulă", + "păianjen-lup", + "căpuşă", + "centiped", + "cocoș de mesteacăn", + "cocoș polar", + "păun", + "pitpalac", + "potârniche", + "Papagal gri african", + "papagallorikeet", + "albinărel", + "calao", + "colibri", + "tucan", + "răţoi", + "gâscă", + "lebădăneagră", + "Echidnă", + "ornitorinc", + "urskoala", + "vombatide", + "meduză", + "anemonă-de-mare", + "platelmint", + "limbric", + "Melc", + "Limax", + "melcdemare", + "Poliplacofore", + "langustă", + "racîmplătoșat", + "barză albă", + "barză neagră", + "lopătar", + "Phoenicopteriformes", + "buhai-de-baltă", + "grui", + "dropie", + "fugaci de țărm", + "Fluierarul cu picioare roșii", + "scoicar", + "babiță", + "pinguin regal", + "albatros", + "balenăucigașă", + "leudemare", + "Chihuahua (rasă canină)", + "dogmaltez", + "pechinez", + "ogar afgan", + "baset", + "copoi", + "ogar", + "black-and-tancoonhound", + "Barzoi", + "ogar de Ibiza", + "Ogar persan", + "pitbullterier", + "schnauzerpitic", + "schnautzeruriaș", + "soft-coatedwheatenterrier", + "retrieverauriu", + "vișlă", + "setter irlandez", + "clumberspaniel", + "kelpieaustralian", + "Ciobănesc de Shetland", + "ciobănesc german", + "boxer (câine)", + "mastiff tibetan", + "Dog german", + "Saint-Bernard", + "Malamut de Alaska", + "Husky Siberian", + "dalmațian", + "mopspitic", + "Terra Nova (rasă canină)", + "Samoed", + "ciau-ciau", + "pudelpitic", + "lup", + "Lup arctic", + "Lup roșu", + "coiot", + "Câine dingo", + "câinele sălbatic asiatic", + "Câine sălbatic african", + "Hienă", + "vulpe", + "Vulpe polară", + "Urocyoncinereoargenteus", + "pisicăbălțată", + "Pisică persană", + "Siameză", + "pumă", + "linx", + "Pantherapardus", + "Leopardul zăpezilor", + "Felis onca coxi", + "leu", + "tigru", + "ghepard", + "Urs brun", + "urs negru american", + "Thalarctosmaritimus", + "mangustă", + "suricată", + "buburuză", + "Gândac de sol", + "cerambicide", + "crisomelide", + "scarabeu", + "gărgăriță", + "muscă", + "albină", + "furnică", + "lăcustă", + "greier", + "fasmide", + "gândacdebucătărie", + "mantodee", + "cicoare", + "cosaș", + "libelulă", + "Zigoptere", + "flutureleamiral", + "Fluture Monarh", + "fluturealbastru", + "fluture", + "asterie", + "Echinoide", + "castravete de mare", + "iepuredepădure", + "iepure propriu-zis", + "iepuredeAngora", + "hârciog", + "porcspinos", + "marmotă", + "biber", + "porcușordeguinea", + "zebră", + "porc", + "Mistreț", + "porcalergător", + "Hipopotam", + "bou", + "bivolul de apă", + "Bizon", + "berbec", + "muflon candian", + "capra alpină", + "antilopăsud-africană", + "gazelă", + "dromader", + "lamă", + "nevăstuică", + "nurcă", + "Dihor", + "nevăstuică", + "vidră", + "sconcs", + "bursuc", + "tatu", + "leneș", + "urangutani", + "gorilă", + "cimpanzeu", + "Hylobatessyndactylus", + "maimuțăhusar", + "Babuin", + "maimuțăcolobus", + "saguin", + "maimuțăcapucin", + "lemur cu coadă inelată", + "elefant indian", + "Elefantul african", + "panda roșu", + "urspanda", + "ţipar", + "Sturion", + "lepisosteiforme", + "abac", + "robă", + "harmonika", + "chitarărece", + "portavion", + "avion de linie", + "dirijabil", + "salvare", + "vehiculamfibie", + "stupină", + "şorţ", + "coș de gunoi", + "armădeasalt", + "rucsac", + "brutărie", + "bârnă", + "balon", + "pix", + "balustradă", + "bară", + "scaundefrizer", + "frizerie", + "hambar", + "barometru", + "butoi", + "roabă", + "mingedebaseball", + "baschetbal", + "Fagot (instrument)", + "cască", + "prosopdebaie", + "cadă", + "Break", + "far", + "Pahar Berzelius", + "sticlădebere", + "bicicletă tandem", + "costumdebaie", + "binoclu", + "porumbărie", + "bobslei", + "dulappentrucărți", + "librărie", + "arc", + "papion", + "plăcuță", + "brasieră", + "Mol (construcție)", + "cuirasă", + "mătură", + "căldare", + "cataramă", + "vestă antiglonț", + "tren de mare viteză", + "măcelărie", + "Taximetru", + "Ceaun", + "lumânare", + "bombă", + "caiac", + "desfăcător pentru conserve", + "Cardigan (vestimentație)", + "oglindăauto", + "călușei", + "cutiedecarton", + "roatădecauciuc", + "tonomatbancar", + "casetă", + "casetofon", + "castel", + "CD-Player", + "violoncel", + "telefon mobil", + "lanț", + "armură", + "drujbă", + "cufăr", + "șifonier", + "clopot", + "biserică", + "cinematograf", + "satâr", + "saboți", + "cocktailshaker", + "ibric de cafea", + "colac", + "încuietoarecucifru", + "claviatură", + "cofetărie", + "Portcontainer", + "decapotabilă", + "tirbușon", + "trompetă", + "ciocată", + "Pălărie de cowboy", + "leagăn", + "macara", + "ladă", + "pătuc", + "baraj", + "birou", + "cârpă", + "ceasdigital", + "masă", + "cârpădevase", + "mașină de spălat vase", + "frânăpedisc", + "doc", + "saniedecâini", + "Dom", + "ștergător", + "tobă", + "bățdetobă", + "Ganteră", + "ventilatorelectric", + "chitară electrică", + "Locomotivă electrică", + "sistemaudio-video", + "plic", + "automatespresso", + "pudră", + "fișier", + "navă de stins incendii", + "Autospecială pentru intervenții la incendii", + "catarg de steag", + "flaut", + "scaunpliant", + "stivuitor", + "fântână", + "stilou", + "patcubaldachin", + "vagondemarfă", + "cornfrancez", + "tigaie", + "hainădeblană", + "mașinădeluatgunoiul", + "Mască contra gazelor", + "pompă", + "cupă", + "bilădegolf", + "mini-cart", + "gondolă", + "gong (instrument)", + "rochiedeseară", + "pian", + "seră", + "mască", + "piață", + "ghilotină", + "clamădepăr", + "fixativ", + "autoșenilă", + "ciocan", + "coș", + "uscător de păr", + "aparat mobil (informatică)", + "batistă", + "harddisc", + "muzicuță", + "harpă", + "secerătoare", + "baltag", + "toc", + "fagure (geometrie)", + "cârlig", + "malacof", + "Bară fixă", + "căruțădecai", + "clepsidră", + "fier de călcat", + "blugi", + "mașinădeteren", + "tricou", + "ricșă", + "chimonou", + "genunchieră", + "Nod", + "halat", + "polonic", + "abajur", + "computer portabil", + "mașinădetunsiarba", + "obturatorulobiectivului", + "tăietor de hârtie", + "barcădesalvare", + "brichetă", + "limuzină", + "Pachebot", + "ruj", + "loțiune", + "difuzor", + "monoclu", + "fabricădecherestea", + "busolă", + "cutiepoștală", + "Maracas (instrument)", + "Xilofon", + "mască", + "Armindeni", + "labirint", + "canăgradată", + "Megalit", + "microfon", + "Cuptor cu microunde", + "uniformămilitară", + "bidondelapte", + "microbuz", + "minijupă", + "Monovolum", + "proiectilrachetă", + "mănușăcuunsingurdeget", + "boldemixer", + "rulotă", + "modelulT", + "mănăstire", + "Ciclomotor", + "piuliță", + "moschee", + "plasădețânțari", + "scuter", + "bicicletădeteren", + "maus", + "cursă de șoareci", + "furgonetă", + "botniță", + "cui", + "salbă", + "tetină", + "calculator portabil", + "obelisc", + "oboi", + "ocarină", + "odometru", + "filtrudeulei", + "orgă", + "osciloscop", + "mască de oxigen", + "pachet", + "pagaie", + "zbat", + "lacăt", + "pensulă", + "pijama", + "palat", + "Nai", + "prosopdehârtie", + "parașută", + "Paralele", + "bancă", + "parcometru", + "vagondecălători", + "terasă", + "telefonpublic", + "soclu", + "penar", + "ascuțitoare", + "Parfumuri", + "Vas Petri", + "fotocopiator", + "pană", + "garddenuiele", + "camionetă", + "pilă", + "pușculiță", + "pernă", + "navăpirat", + "bărdacă", + "rindea", + "sac de plastic", + "Plug", + "prăjină", + "dubă", + "masădebiliard", + "ghiveci", + "bormașină", + "imprimantă", + "închisoare", + "proiectil", + "proiector", + "puc", + "sacdebox", + "portofel", + "Pană (instrument de scris)", + "mindir", + "mașinădecurse", + "rachetă", + "caloriferelectric", + "Radiotelescop", + "mulinetă", + "aparatreflex", + "frigider", + "comandă de la distanță", + "unitate de restaurație colectivă", + "puşcă", + "Balansoar", + "gumădeșters", + "riglă", + "seif", + "ac de siguranță", + "solniță", + "sanda", + "saxofon", + "teacă", + "cântar", + "autobuzpentruelevi", + "șunăr", + "tabelă de marcaj", + "ecran", + "şurub", + "şurubelniţă", + "centură de siguranță", + "mașină de cusut", + "Scut", + "magazindeîncălțăminte", + "coșdecumpărături", + "căruț", + "lopată", + "perdeadeduș", + "schi", + "mascădeschi", + "sacdedormit", + "Riglă de calcul", + "ușăglisantă", + "snowmobil", + "Plug de zăpadă", + "dozatordesăpun", + "mingedefotbal", + "șosetă", + "discsolar", + "Sombrero (pălărie)", + "boldesupă", + "spațiu", + "aerotermă", + "navetăspațială", + "spatulă", + "barcădeviteză", + "fus", + "proiector", + "Scenă", + "Locomotivă cu abur", + "poddeoțelînformădearc", + "stetoscop", + "patrafir", + "ziddepiatră", + "Cronometru", + "Sobă", + "rețea de tramvaie", + "Targă", + "chedi", + "submarin", + "costum", + "cadran solar", + "ochelari de soare", + "cremă de protecție solară", + "podsuspendat", + "leagăn", + "întrerupător", + "seringă", + "vehicul militar blindat", + "player", + "ceainic", + "ursuleț de pluș", + "sistemdeteleviziune", + "mingedetenis", + "cortină", + "degetar", + "batoză", + "tron", + "acoperișdețiglă", + "prăjitor de pâine", + "tutungiu", + "scaun de WC", + "torță", + "stâlpi totemici", + "mașinădedepanare", + "camion cu remorcă", + "tavă", + "trenci", + "tricicletă", + "trepied", + "arc de triumf", + "troleibuz", + "trombon", + "vană", + "claviatură", + "Umbrelă", + "pianină", + "aspirator", + "glastră", + "Boltă", + "catifea", + "automat", + "Veșminte", + "vioară", + "mingedevolei", + "ceasdeperete", + "portofel", + "șifonier", + "avion militar", + "chiuvetă", + "mașină de spălat rufe", + "sticlădeapă", + "castel de apă", + "Fluier de semnal", + "Perucă", + "plasădețânțari", + "oblon", + "sticlă de vin", + "aripaavionului", + "lână", + "epavă", + "iurtă", + "sit web", + "Carte de benzi desenate", + "cuvinte încrucişate", + "indicator rutier", + "semafor", + "supracopertă", + "farfurie", + "supăconsomme", + "înghețată", + "înghețatăpebăț", + "covrigel", + "piure", + "conopidă", + "dovlecelverde", + "castravete", + "anghinare", + "ciupercă", + "căpșună", + "portocală", + "lămâie", + "smochină", + "banană", + "mărcustard", + "rodie", + "fân", + "spaghete carbonara", + "sosdeciocolată", + "aluat", + "vin roșu", + "ceașcă", + "lichiordeouă", + "bășică", + "stâncă", + "recifdecorali", + "gheizer", + "promontoriu", + "bancdenisip", + "relief litoral", + "Vale (geografie)", + "vulcan", + "baseballistă", + "mire", + "Rapiță", + "mărgărită", + "papucul doamnei", + "porumb", + "ghindă", + "măceașă", + "castanăsălbatică", + "ciupercălamelară", + "bureteputuros", + "Foalele vacii", + "spic", + "hârtie igienică" + ] + ], + "MG": [ + [ + 2, + 23, + 49, + 71, + 78, + 85, + 86, + 99, + 113, + 134, + 144, + 148, + 275, + 277, + 288, + 291, + 292, + 293, + 299, + 308, + 309, + 310, + 312, + 314, + 319, + 327, + 328, + 329, + 341, + 342, + 344, + 353, + 354, + 366, + 428, + 462, + 468, + 470, + 487, + 497, + 513, + 525, + 558, + 587, + 594, + 632, + 642, + 668, + 679, + 744, + 764, + 787, + 823, + 893, + 916, + 928, + 943, + 952, + 957, + 958, + 973, + 978, + 979, + 980 + ], + [ + "Antsantsa fotsy", + "Voltora", + "Voain' i Neily", + "mambambohitra", + "Kongona", + "Kibobo", + "Tsipoy", + "Gisa", + "Sifotra", + "Vano", + "Pelikana", + "Trozona mpamono", + "Alika afrikanina", + "Amboahaolo mena", + "Leôparda", + "liona", + "Tigra", + "Geparda", + "Sorikata", + "Lalitra", + "Renitantely", + "Vitsika", + "valala", + "Kalalao (biby)", + "angidina", + "kintandranomasina", + "Soky", + "Zanga", + "Kisoa", + "Lambo dia", + "Hipopotama", + "Gazela", + "Rameva tokan-trafo", + "Rajako", + "laborety", + "famafa", + "Fiarakaretsaka", + "labozia", + "Finday", + "fiangonana", + "trompetra", + "Tohodrano", + "Sodina", + "Tantanana", + "dokanga", + "Famoaham-peo", + "atranatrana", + "mosikiriny", + "vadim-bozo", + "Bala", + "Basy", + "ampinga", + "fihainoana", + "kitapom-batsy", + "vohikala", + "ranomandry", + "kitsaotsao", + "amontana", + "ampongabendanitra", + "bozaka maina", + "Haran-dranomasina", + "Morontsiraka", + "Lohasaha", + "Volkano" + ] + ], + "MR": [ + [ + 1, + 16, + 22, + 23, + 51, + 65, + 71, + 78, + 89, + 93, + 99, + 113, + 127, + 128, + 130, + 134, + 141, + 144, + 151, + 230, + 274, + 276, + 277, + 286, + 288, + 289, + 290, + 291, + 292, + 293, + 296, + 298, + 305, + 309, + 310, + 327, + 334, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 352, + 353, + 355, + 360, + 367, + 373, + 387, + 388, + 390, + 403, + 404, + 407, + 417, + 430, + 437, + 438, + 445, + 447, + 459, + 462, + 468, + 470, + 480, + 483, + 486, + 487, + 497, + 498, + 515, + 525, + 538, + 541, + 546, + 549, + 562, + 567, + 580, + 587, + 589, + 591, + 593, + 608, + 609, + 610, + 612, + 620, + 642, + 643, + 649, + 650, + 657, + 668, + 670, + 673, + 677, + 679, + 701, + 726, + 730, + 742, + 743, + 755, + 760, + 761, + 762, + 774, + 776, + 784, + 785, + 786, + 787, + 823, + 833, + 847, + 863, + 866, + 873, + 875, + 879, + 889, + 893, + 897, + 916, + 917, + 928, + 933, + 953, + 963, + 971, + 973, + 976, + 978, + 979, + 980, + 982, + 988 + ], + [ + "गोल्डफिश", + "बुलबुल", + "टकला गरुड", + "गिधाड", + "ट्रायसेराटॉप्स", + "समुद्री साप", + "विंचू", + "गोचीड", + "काकाकुवा", + "धनेश", + "हंसी", + "गोगलगाय", + "श्वेतबलाक", + "काळा करकोचा", + "रोहित (पक्षी)", + "क्रौंच", + "सामान्य टिलवा", + "पेलिकन", + "चिवावा", + "शेल्टी", + "कोळसून", + "तरस", + "कोल्हा", + "प्युमा", + "बिबट्या", + "हिमबिबट्या", + "जॅग्वार (प्राणी)", + "सिंह", + "वाघ", + "चित्ता", + "ध्रुवीय अस्वल", + "मुंगूस", + "शेणकिडा", + "मधुकर", + "मुंगी", + "तारामासा", + "साळू", + "झेब्रा", + "वराह", + "रानडुक्कर", + "पाणघोडा", + "बैल", + "पाण म्हैस", + "बायसन", + "इम्पाला", + "मृग", + "लामा", + "पाणमांजर", + "चिम्पांज़ी", + "सिंहपुच्छ वानर", + "तांबडा पांडा", + "प्रचंड पांडा", + "ईल", + "विमानवाहू नौका", + "प्रवासी विमान", + "रुग्णवाहिका", + "फुगा", + "बास्केटबॉल", + "दीपस्तंभ", + "चंचुपात्र", + "बिकिनी", + "द्विनेत्री", + "काचोळी", + "केरसुणी", + "टॅक्सी", + "मेणबत्ती", + "एटीएम", + "किल्ला", + "चेलो", + "मोबाईल फोन", + "चर्च", + "चित्रपटगृह", + "काउबॉय टोपी", + "धरण", + "घुमट", + "ड्रम", + "विद्युत गिटार", + "लिफाफा", + "कारंजे", + "फ्राय पॅन", + "हरितगृह", + "हातोडा", + "हेअर-ड्रायर", + "रुमाल", + "हार्मोनिका", + "जीन्स", + "जीप", + "टी-शर्ट", + "रिक्शा", + "लॅपटॉप", + "जाय्लोफोन", + "मुखवटा", + "महापाषाण", + "माइक्रोफ़ोन", + "क्षेपणास्त्र", + "मशीद", + "स्कूटर", + "माउस", + "खिळा", + "हार", + "पैराशूट", + "रंधा", + "नांगर", + "प्रिंटर", + "तुरुंग", + "रेडिओ दुर्बीण", + "शीतपेटी", + "रिमोट कन्ट्रोल", + "उपहारगृह", + "चप्पल", + "सॅक्सोफोन", + "पेचकश", + "सुरक्षा पट्टा", + "शिलाई यंत्र", + "ढाल", + "स्टेथोस्कोप", + "पाणबुडी", + "चिलखती वाहने", + "देवक-स्तंभ", + "ट्रॅक्टर", + "विजय स्मारक (आर्च)", + "ट्रॉम्बोन", + "छत्री", + "व्हायोलिन", + "बटवा", + "धुलाईयंत्र", + "संकेतस्थळ", + "कॉमिक बुक", + "आईसक्रीम", + "चीजबर्गर", + "अननस", + "पिझ्झा", + "बुडबुडा", + "प्रवाळाची बेट", + "भूशिर", + "समुद्रकिनारा", + "दरी", + "ज्वालामुखी", + "नवरा", + "ओक वृक्षाचे फळ" + ] + ], + "SL": [ + [ + 0, + 2, + 9, + 10, + 11, + 16, + 18, + 23, + 24, + 30, + 39, + 45, + 46, + 48, + 49, + 61, + 65, + 69, + 70, + 71, + 78, + 79, + 80, + 89, + 92, + 93, + 94, + 95, + 96, + 99, + 102, + 103, + 106, + 107, + 108, + 110, + 111, + 114, + 116, + 123, + 127, + 128, + 130, + 134, + 138, + 144, + 145, + 146, + 148, + 150, + 151, + 153, + 154, + 160, + 162, + 165, + 169, + 176, + 191, + 222, + 235, + 242, + 243, + 246, + 247, + 249, + 250, + 251, + 256, + 258, + 259, + 260, + 269, + 270, + 272, + 274, + 275, + 276, + 277, + 279, + 283, + 284, + 287, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 299, + 301, + 302, + 303, + 304, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 317, + 319, + 320, + 322, + 327, + 328, + 329, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 353, + 354, + 355, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 367, + 368, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 395, + 398, + 401, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 430, + 432, + 435, + 437, + 439, + 447, + 453, + 454, + 455, + 456, + 459, + 460, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 476, + 481, + 483, + 484, + 486, + 487, + 488, + 491, + 497, + 498, + 502, + 508, + 509, + 510, + 512, + 513, + 516, + 517, + 525, + 529, + 534, + 535, + 538, + 541, + 543, + 546, + 549, + 552, + 553, + 554, + 555, + 557, + 558, + 562, + 563, + 567, + 568, + 570, + 583, + 587, + 591, + 593, + 594, + 597, + 602, + 604, + 606, + 608, + 612, + 615, + 616, + 618, + 619, + 620, + 621, + 626, + 628, + 629, + 632, + 634, + 641, + 642, + 643, + 645, + 647, + 649, + 650, + 651, + 657, + 658, + 665, + 668, + 671, + 673, + 677, + 679, + 683, + 684, + 688, + 692, + 695, + 696, + 697, + 698, + 699, + 701, + 702, + 705, + 708, + 709, + 710, + 711, + 712, + 714, + 717, + 719, + 726, + 728, + 730, + 734, + 738, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 760, + 761, + 762, + 764, + 769, + 770, + 771, + 776, + 777, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 797, + 798, + 802, + 803, + 806, + 807, + 816, + 819, + 820, + 823, + 824, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 844, + 845, + 847, + 849, + 856, + 857, + 862, + 866, + 873, + 874, + 875, + 879, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 893, + 895, + 896, + 897, + 900, + 907, + 909, + 910, + 911, + 915, + 916, + 918, + 919, + 920, + 928, + 932, + 938, + 943, + 952, + 957, + 958, + 961, + 963, + 966, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 984, + 986, + 988, + 989, + 999 + ], + [ + "linj", + "Beli morski volk", + "noj", + "pinoža", + "Lišček", + "dlakavci", + "sraka", + "jastreb", + "Bradata sova", + "Volovska žaba", + "zeleni legvan", + "Strupeni bradavičar", + "navadni zelenec", + "komodoški varan", + "nilski krokodil", + "udav", + "morske kače", + "trilobit", + "suha južina", + "škorpijon", + "klošč", + "Strige", + "Ruševec", + "Veliki rumenočopasti kakadu", + "Legati", + "Kljunorožci (družina)", + "Kolibriji", + "bleščavci", + "tukan", + "gos", + "kljunati ježek", + "kljunaš", + "vombat", + "meduza", + "morske vetrnice", + "ploski črvi", + "gliste", + "polž slinar", + "Bokoživčniki", + "rárog", + "Bela štorklja", + "črna štorklja", + "plamenci", + "žerjav", + "droplje", + "pelikani", + "Kraljevi pingvin", + "albatrosi", + "Orka", + "Morski levi", + "čivava", + "maltežan", + "Pekinžan", + "afganski hrt", + "Angleški brak", + "Črno čreslasti rakunar", + "borzoj", + "perzijski hrt", + "Airedalec", + "Kuvas", + "nemški ovčar", + "bokser", + "bulmastif", + "Nemška doga", + "bernardinec", + "aljaški malamut", + "sibirski haski", + "Dalmatinec", + "Novofundlandec", + "Samojed", + "Pomeranec", + "Čov čov", + "volk", + "Tundrski volk", + "Kojot", + "rdeči volk", + "afriški hijenski pes", + "Hijene", + "lisjak", + "Polarna lisica", + "perzijska mačka", + "Siamska mačka", + "Risi", + "snežni leopard", + "Panter", + "lev", + "P. tigris", + "gẹ̑pard", + "rjavi medved", + "Ameriški črni medved", + "polarni medved", + "surikata", + "pikapolonica", + "krešiči", + "Kozlički", + "Lepenci", + "Pravi rilčkarji", + "dvokrilci", + "čebele", + "mravlje", + "kobilica", + "čriček", + "ščurek", + "bogomoljka", + "škržat", + "mali škržatki", + "Raznokrili kačji pastirji", + "Enakokrili kačji pastirji", + "Okati rjavec", + "morske zvezde", + "morski ježki", + "brizgači", + "Pravi zajec", + "hrčki", + "ježevec", + "svizec", + "bober", + "morski prašiček", + "zebre", + "pujs", + "Divja svinja", + "svinja bradavičarka", + "povodni konj", + "vol", + "vodni bivol", + "Bizon", + "oven", + "Debeloroga ovca", + "Alpski kozorog", + "kama (antilopa)", + "Gazela (žival)", + "dromedar", + "lama", + "močvirske podlasice", + "Evropski dihur", + "dihur", + "vidra", + "dihur", + "jazbec", + "pasavec", + "šimpanz", + "giboni", + "Azijski slon", + "Afriški slon", + "Mačji panda", + "orjaški panda", + "jegulja", + "Klovnske ribice", + "jesệter", + "Iglica", + "abak", + "harmonika", + "letalonosilka", + "potniško letalo", + "zračna ladja", + "ambulanta", + "Amfibijsko vozilo", + "Čebelnjak", + "predpasnik", + "smetnjak", + "avtomatska puška", + "nahrbtnik", + "pekarna", + "Gred", + "kemični svinčnik", + "bendžo", + "ograja", + "Dvoročna palica", + "skedenj", + "živosrebrni barometer", + "sod (posoda)", + "samokolnica", + "košarkaška žoga", + "fagót", + "kopalna kad", + "svetilnik", + "čaka", + "daljnogled", + "knjižna polica", + "knjigarna", + "zamašek", + "lok", + "nedrček", + "Valobran", + "metla", + "vedro", + "zaponka", + "neprebojni jopič", + "Taksi", + "kotel", + "Sveča", + "kanu", + "konzervni odpirač", + "vrtiljak", + "kaseta", + "grad", + "katamaran", + "violončelo", + "mobilni telefon", + "veriga", + "motorka", + "cerkev", + "kino", + "cokle", + "tipkovnica", + "slaščica", + "kontejnerska ladja", + "izvijač", + "trobenta", + "zibelka", + "žerjav", + "jez", + "plenica", + "pomivalni stroj", + "Kolutna zavora", + "Kupola", + "boben", + "Ročka (šport)", + "električna kitara", + "ovojnica", + "boa (šal)", + "arhivska omarica", + "Gasilska ladja", + "gasilsko vozilo", + "jarbol za zastavu", + "flavta", + "vodnjak", + "nalivno pero", + "ponev", + "krznarstvo", + "Plinska maska", + "giljotina", + "kladivo", + "robec", + "ustna harmonika", + "ruska vodka", + "pištolnica", + "Drog", + "Peščena ura", + "likalnik", + "kavbojke", + "Rikša", + "Kolenčniki", + "vozel", + "zajemalko", + "senčnik", + "prenosnik", + "košnja", + "vžigalnik", + "oceanska linijska ladja", + "šminka", + "Zvočnik", + "Žaga", + "marake", + "ksilofon", + "maska", + "Mlaj (drevo)", + "merilna posoda", + "megalit", + "mikrofon", + "mikrovalovna pečica", + "Samopogonski izstrelek", + "palčnik", + "kolo z motorjem", + "mošeja", + "Gorsko kolo", + "miška", + "Žebelj", + "verižica", + "oboa", + "okarína", + "Osciloskop", + "zavitek", + "žabica", + "Slikarski čopič", + "pižama", + "palača", + "trstenke", + "padalo", + "Bradlja", + "vagon", + "podstávek", + "Peresnica", + "šilček", + "parfumi", + "petrijevka", + "trzalica", + "Poltovornjak", + "hranilnik", + "skǫ́bəlj", + "Plastična vrečka", + "Plug", + "policijski kombi", + "lonec", + "Tiskalnik", + "zapor", + "projektil", + "Projektor", + "plošček", + "boks vreča", + "denarnica", + "Hladilnik", + "daljinec", + "obrat javne prehrane", + "puška", + "ravnilo", + "športni copati", + "sef", + "saksofon", + "nožnica", + "vijak", + "izvijač", + "varnostni pas", + "Šivalni stroj", + "Ščit", + "lopata", + "smuča", + "spalna vreča", + "Logaritemsko računalo", + "motorne sani", + "snežni plug", + "Nogavice", + "Sončna peč", + "vreteno", + "oder", + "parna lokomotiva", + "stetoskóp", + "Štola", + "peč", + "tramvaj", + "nosila", + "Podmornica", + "obleka", + "Sončna ura", + "sončna očala", + "Sredstvo za zaščito pred soncem", + "viseči most", + "Stikalo", + "brizgalka", + "oklepno bojno vozilo", + "čajnik", + "Mlatilnica", + "prestol", + "bakla", + "Traktor", + "slavolok", + "trolejbus", + "pozavna", + "Dežnik", + "Monokolo", + "sesalnik", + "vaza", + "Obok", + "žamet", + "viadukt", + "gosli", + "denarnica", + "vojaško letalo", + "umivalnik", + "pralni stroj", + "vodni stolp", + "buteljka", + "Vok", + "varjača", + "volna", + "jurta", + "spletna stran", + "križanka", + "prometni znak", + "semafor", + "Sladoled", + "prẹ̑sta", + "cvetača", + "kumara", + "figa", + "granatno jabolko", + "seno", + "testo", + "pica", + "rdeče vino", + "mehurček", + "klif", + "koralni greben", + "gejzir", + "rt", + "obala", + "dolína", + "Ognjenik", + "oljna repica", + "Lepi čeveljc", + "Želod", + "šipek", + "toaletni papir" + ] + ], + "PT": [ + [ + 0, + 1, + 2, + 3, + 9, + 10, + 11, + 13, + 14, + 15, + 17, + 18, + 21, + 22, + 23, + 24, + 29, + 30, + 32, + 33, + 34, + 39, + 42, + 45, + 48, + 49, + 50, + 51, + 61, + 62, + 65, + 68, + 69, + 71, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 86, + 87, + 88, + 89, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 106, + 107, + 108, + 109, + 110, + 111, + 113, + 114, + 115, + 116, + 118, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 157, + 160, + 162, + 163, + 165, + 169, + 170, + 184, + 187, + 199, + 208, + 211, + 213, + 215, + 217, + 222, + 223, + 224, + 226, + 227, + 229, + 230, + 231, + 233, + 235, + 243, + 244, + 246, + 247, + 249, + 250, + 251, + 254, + 256, + 257, + 258, + 259, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 334, + 338, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 376, + 377, + 379, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 395, + 397, + 398, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 423, + 425, + 426, + 427, + 428, + 429, + 430, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 444, + 445, + 447, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 496, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 508, + 509, + 510, + 511, + 512, + 513, + 516, + 517, + 519, + 520, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 533, + 534, + 535, + 536, + 538, + 541, + 542, + 543, + 546, + 549, + 551, + 553, + 555, + 556, + 557, + 558, + 559, + 561, + 562, + 563, + 566, + 567, + 568, + 569, + 570, + 572, + 573, + 575, + 576, + 577, + 578, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 596, + 597, + 601, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 623, + 624, + 626, + 627, + 628, + 629, + 631, + 632, + 633, + 634, + 636, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 661, + 662, + 663, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 685, + 687, + 688, + 690, + 692, + 693, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 710, + 711, + 712, + 713, + 714, + 716, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 731, + 732, + 733, + 734, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 754, + 755, + 757, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 793, + 795, + 797, + 798, + 800, + 802, + 803, + 806, + 808, + 810, + 811, + 812, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 847, + 849, + 850, + 851, + 852, + 855, + 856, + 857, + 859, + 860, + 862, + 864, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 892, + 893, + 894, + 895, + 897, + 900, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 923, + 924, + 926, + 928, + 929, + 933, + 935, + 938, + 939, + 943, + 948, + 949, + 951, + 952, + 953, + 957, + 958, + 960, + 961, + 962, + 963, + 964, + 966, + 967, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 981, + 982, + 984, + 985, + 988, + 989, + 990, + 992, + 997, + 998, + 999 + ], + [ + "Tenca", + "Kinguio", + "grande-tubarão-branco", + "tubarão-tigre", + "avestruz", + "tentilhão-montês", + "pintassilgo", + "Junco (gênero)", + "mariposa-azul", + "tordo-americano", + "gralha", + "pega", + "milhafre", + "águia-de-cabeça-branca", + "abutre", + "Coruja-lapónica", + "axolote", + "rã-touro-americana", + "Ascaphidae", + "tartaruga-cabeçuda", + "tartaruga-gigante", + "iguana-verde", + "gala-gala", + "Monstro-de-gila", + "dragão-de-komodo", + "Crocodilo-do-nilo", + "aligátor americano", + "tricerátopo", + "Jiboia-constritora", + "píton-africana", + "Cobra do mar", + "cascavel-chifruda", + "trilobito", + "escorpião", + "Viúva-negra", + "Aranha-lobo", + "carrapato", + "centopeia", + "tetraz-lira", + "lagópode", + "tetraz-de-colar", + "perdiz", + "Papagaio-cinzento", + "arara", + "Cacatua-de-crista-amarela", + "abelharuco", + "Bucerotiformes", + "beija-flor", + "jacamarici", + "tucano", + "Merganso-de-poupa", + "ganso", + "cisne-negro", + "equidna", + "ornitorrinco", + "Wallabíe", + "vombate", + "aguá-viva", + "anêmona-do-mar", + "coral-cérebro", + "platelminto", + "nemátodo", + "caracol", + "lesma", + "lesma marinha", + "quíton", + "caranguejo de Dungeness", + "Chama-maré", + "Caranguejo-real", + "lagosta-americana", + "lagosta", + "lagostim", + "bernardo-eremita", + "isópode", + "Cegonha-branca", + "cegonha-preta", + "Colhereiro", + "Phoenicopterus spp.", + "abetouro", + "grou", + "carão", + "Galeirão-americano", + "abetarda", + "Rola-do-mar", + "pilrito-comum", + "Cacongo", + "Ostraceiro", + "pelicano", + "pinguim-rei", + "albatroz", + "baleia-cinzenta", + "baleia-assassina", + "Dugongo", + "Leão-marinho", + "chihuahua (cão)", + "Spaniel japonês", + "Maltês", + "pequinês", + "shi-tzu", + "Spaniel anão continental", + "galgo afegão", + "cão beagle", + "sabujo", + "Coonhound preto e castanho", + "borzói", + "wolfhound irlandês", + "irishterrie", + "yorkshire", + "Terrier escocês", + "labrador", + "Braco húngaro de pelo curto", + "setter irlandês", + "Brittany (cão)", + "Springer spaniel inglês", + "Pastor Húngaro", + "Spits", + "Pastor Belga Groenendael", + "Pastor-de-brie", + "Kelpie australiano", + "pastor inglês", + "Pastor-de-shetland", + "collie (tipo de cão)", + "Boiadeiro da Flandres", + "Pastor-alemão", + "Bulmastife", + "mastim tibetano", + "Dogue alemão", + "são-bernardo", + "malamute do Alasca", + "husky siberiano", + "dálmata", + "Mol", + "Terra-nova", + "Cão de montanha dos Pirenéus", + "Samoieda", + "Spitz alemão", + "lobo", + "Lobo-do-ártico", + "Lobo-vermelho", + "coiote", + "Dingo australiano", + "cão-selvagem-asiático", + "mabeco", + "Hienas", + "raposa", + "Raposa-do-ártico", + "raposa-cinzenta", + "Gato persa", + "siamês (gato)", + "pantera", + "lince", + "leopardo", + "leopardo-das-neves", + "pantera", + "leão", + "tigre", + "guepardo", + "urso-pardo", + "urso-negro", + "urso polar", + "mangusto", + "suricata", + "Cicindelas", + "joaninha", + "besouro-carabídeo", + "cerambicídeos", + "crisomelídeo", + "Besouro do Esterco", + "besouro-rinoceronte", + "caruncho", + "mosca", + "abelha", + "Formiga", + "gafanhotos", + "grillo", + "inseto-pau", + "Barata", + "Louva-a-deus", + "cigarra", + "Cicadidae", + "libélula", + "donzelinha", + "borboleta-monarca", + "estrela-do-mar", + "ouriço-do-mar", + "pepino-do-mar", + "lebre", + "porco-espinho", + "Porquinho-da-índia", + "porco", + "javali", + "facóquero", + "hipopótamo-comum", + "boi", + "búfalo-asiático", + "bisonte", + "carneiro", + "Carneiro-selvagem", + "Íbex", + "búbalu", + "Aepycerotinae", + "gazela", + "dromedário", + "lama", + "doninha", + "vison", + "Tourão", + "furão", + "lontra", + "cangambá", + "texugo", + "tatu", + "preguiça-de-coleira", + "orangotango", + "Gorilla (gênero)", + "chimpancé", + "gibão", + "Symphalangus", + "cercopiteco", + "Erythrocebus", + "babuíno", + "macaco", + "macaco-narigudo", + "sagui", + "bugio", + "macaco-aranha", + "Macaco-de-cheiro", + "Lémur-de-cauda-anelada", + "elefante-asiático", + "elefante-africano", + "panda-vermelho", + "panda-gigante", + "enguia", + "Peixe-palhaço", + "esturjão", + "gar-bicudo", + "baiacu", + "ábaco", + "traje académico", + "acordeão", + "guitarra acústica", + "porta-aviões", + "avião de linha", + "dirigível", + "ambulância", + "veículo anfíbio", + "relógio analógico", + "apiário", + "avental", + "lixeira", + "fuzil de assalto", + "mochila", + "padaria", + "trave olímpica", + "balão", + "caneta esferográfica", + "Banjo brasileiro", + "balaustrada", + "barra", + "cadeira de barbeiro", + "celeiro", + "barômetro", + "barril", + "carrinho de mão", + "bola de beisebol", + "basquete", + "fagote", + "touca de natação", + "lençol de banho", + "banheira", + "perua", + "farol", + "béquer", + "colbaque", + "garrafa de cerveja", + "bicicleta tandem", + "biquíni", + "binóculo", + "gorro", + "estante", + "livraria", + "tampa de garrafa", + "arco", + "laço", + "placa", + "sutiã", + "quebra-mar", + "égide", + "vassoura", + "balde", + "fivela", + "Colete balístico", + "comboio-bala", + "táxi", + "caldeirão", + "vela", + "cano", + "canoa", + "abridor de lata", + "cardigã", + "carrossel", + "caixa automático", + "cassete", + "castelo", + "catamarã", + "diskman", + "violoncelo", + "telemóvel", + "cadeia", + "cerca de arame", + "cota de malha", + "motosserra", + "baú", + "cômoda", + "meia de Natal", + "igrejas", + "sala de cinema", + "cutelo", + "tamanco", + "coqueteleira", + "cafeteira", + "espiral", + "teclado", + "confeitaria", + "navio porta-contentores", + "descapotável", + "saca-rolhas", + "corneta", + "berço", + "guindaste", + "engradado", + "berço", + "muleta", + "couraça", + "barragem", + "secretária", + "computador de mesa", + "fralda", + "relógio digital", + "mesa de jantar", + "flanela", + "máquina de lavar louça", + "travão de disco", + "doca", + "domo", + "tambor", + "baqueta", + "haltere", + "guitarra elétrica", + "sobre", + "pó compacto", + "arquivo", + "carro de bombeiros", + "guarda-fogo", + "mastro", + "flauta transversa", + "cadeira de praia", + "empilhador", + "fontes", + "caneta-tinteiro", + "trompa", + "frigideira", + "pelarias", + "caminhão de lixo", + "máscara respiratória", + "cálice", + "kart", + "carrinho de golfe", + "gôndola", + "gongo", + "traje", + "piano de cauda", + "estufa", + "venda", + "guilhotina", + "laca", + "semilagarta", + "martelo", + "balaio", + "secador de cabelo", + "dispositivo móvel", + "lenço", + "gaita", + "harpa", + "machadinha", + "coldre", + "Saiote", + "barra fixa", + "ampulheta", + "ferro", + "coca", + "calça-jeans", + "jipe", + "camiseta", + "quebra-cabeça", + "jinriquixá", + "Quimono", + "Joelheira", + "nó", + "jaleco", + "concha", + "abajur", + "computador portátil", + "ceifa", + "abridor de cartas", + "biblioteca", + "isqueiro", + "limusine", + "transatlântico", + "batom", + "loção", + "coluna", + "lupa", + "serraria", + "Malote postal", + "maiô", + "maiô", + "tampão de poço de visita", + "maracá", + "xilofone", + "máscara", + "palito de fósforo", + "Pau de fita", + "labirinto", + "megalíto", + "microfone", + "forno de microondas", + "micro-ônibus", + "mini-saia", + "monovolume", + "míssil", + "Ford-T", + "fax-modem", + "mosteiro", + "mota", + "argamassa", + "Capelo", + "mesquita", + "mosquiteiro", + "motoreta", + "bicicleta de montanha", + "rato", + "ratoeira", + "prego", + "colar cervical", + "colar", + "bico", + "computador portátil", + "obelisco", + "oboé", + "hodómetro", + "órgão", + "osciloscópio", + "carro de bois", + "pacote", + "pagaia", + "cadeado", + "pincel", + "pijama", + "palácio", + "flauta de pã", + "papel-toalha", + "paraquedas", + "barras paralelas", + "parquímetro", + "carruagem", + "terraço", + "telefone público", + "plinto", + "apontador", + "essência", + "placa de Petri", + "xerox", + "plectro", + "Cerca de estacas", + "camioneta", + "porquinho-mealheiro", + "travesseiro", + "jarro", + "plaina", + "saco de plástico", + "arado", + "desentupidor", + "Câmera instantânea", + "pau", + "camburão", + "vaso de flores", + "Roda de oleiro", + "tapete de oração", + "impressora", + "prisão", + "projétil", + "projetor", + "disco de hóquei", + "saco de boxe", + "porta-moedas", + "pena", + "manta", + "raquete", + "radiador", + "rádio", + "radiotelescópio", + "motocasa", + "câmera reflex", + "geladeira", + "controle remoto", + "restaurante", + "revólver", + "fuzil", + "cadeira de balanço", + "borracha", + "bola de rugby", + "régua", + "tênis (vestuário)", + "cofre", + "alfinete de fralda", + "saleiro", + "chinelo", + "sarongue", + "saxofones", + "bainha", + "balança", + "ônibus escolar", + "escuna", + "placar", + "parafuso", + "chave de fenda", + "cinto", + "máquina de costura", + "escudo", + "loja de sapatos", + "carrinho de supermercado", + "pá", + "touca de banho", + "esquí", + "saco de dormir", + "régua de cálculo", + "caça-níqueis", + "mota de neve", + "limpa-neves", + "meia", + "sombreiro", + "espaço", + "aquecedor", + "ônibus espacial", + "fuso", + "automóvel desportivo", + "lâmpada", + "palco", + "maria-fumaça", + "através da ponte em arco", + "tambor de aço", + "estetoscópio", + "estola", + "parede de pedra", + "cronômetro", + "fogões", + "rede de eléctricos", + "maca", + "estupa", + "submarino", + "terno", + "relógio de sol", + "óculos escuros", + "filtro solar", + "ponte pênsil", + "esfregão", + "moletom", + "balanço", + "interruptor", + "seringa", + "tanque", + "bule", + "urso de peluche", + "tevê", + "bola de tênis", + "dedal", + "debulhador", + "trono", + "torradeira", + "tabacaria", + "tocha", + "reboque", + "trator", + "carreta", + "bandeja", + "gabardina", + "triciclo", + "tripé", + "arco do triunfo", + "trólebus", + "trombonista", + "cuba", + "catraca", + "guarda-chuva", + "monociclo", + "aspirador", + "vaso", + "abóbada", + "veludo", + "veste litúrgica", + "viaduto", + "Curvo", + "bola de vôlei", + "relógio de parede", + "carteira", + "guarda-roupas", + "aeronave militar", + "máquina de lavar roupa", + "caixa d'água", + "apito", + "peruca", + "tela de janela", + "garrafa de vinho", + "ala", + "uoque", + "colher de pau", + "lã", + "iurta", + "saite", + "história em quadrinhos", + "palavras cruzadas", + "placa de trânsito", + "semáforo", + "fonte", + "puré", + "fondue", + "gelado", + "picolé", + "X burguer", + "puré de batata", + "couve-flor", + "curgete", + "pepino", + "Maçã-verde", + "morango", + "limão", + "figo", + "ananás", + "romã", + "feno", + "xarope de chocolate", + "massa (alimento)", + "rolo de carne", + "Píteça", + "empada", + "vinho tinto", + "café expresso", + "bolha", + "falésia", + "recifes de coral", + "géiser", + "promontório", + "beira-mar", + "entremontes", + "vulcão", + "beisebolista", + "noivo", + "colza", + "margarida", + "bolota", + "cinórrodo", + "castanha-da-índia", + "agárico", + "boleto", + "espiga", + "papel higiênico" + ] + ], + "LT": [ + [ + 0, + 1, + 2, + 4, + 5, + 6, + 9, + 10, + 11, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 34, + 39, + 45, + 48, + 49, + 50, + 51, + 56, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 71, + 77, + 78, + 79, + 80, + 82, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 110, + 111, + 113, + 114, + 116, + 122, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 160, + 162, + 163, + 170, + 172, + 173, + 176, + 180, + 206, + 208, + 213, + 222, + 224, + 225, + 226, + 228, + 229, + 230, + 231, + 234, + 235, + 236, + 237, + 242, + 243, + 244, + 245, + 246, + 247, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 258, + 260, + 269, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 302, + 303, + 304, + 306, + 307, + 308, + 309, + 310, + 312, + 314, + 315, + 317, + 319, + 320, + 322, + 327, + 328, + 329, + 330, + 331, + 332, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 358, + 359, + 360, + 362, + 363, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 379, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 395, + 398, + 401, + 403, + 404, + 405, + 407, + 410, + 411, + 412, + 413, + 414, + 415, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 430, + 432, + 433, + 435, + 436, + 437, + 439, + 441, + 444, + 445, + 447, + 449, + 450, + 453, + 454, + 456, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 474, + 476, + 479, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 491, + 492, + 497, + 498, + 499, + 502, + 505, + 508, + 511, + 512, + 513, + 516, + 517, + 523, + 524, + 525, + 526, + 529, + 531, + 533, + 534, + 535, + 536, + 538, + 541, + 543, + 545, + 546, + 547, + 549, + 554, + 555, + 557, + 558, + 562, + 563, + 567, + 568, + 569, + 570, + 579, + 580, + 582, + 583, + 587, + 589, + 591, + 593, + 594, + 595, + 597, + 604, + 606, + 608, + 610, + 611, + 616, + 618, + 619, + 620, + 621, + 626, + 627, + 628, + 629, + 631, + 632, + 634, + 642, + 643, + 646, + 649, + 650, + 651, + 654, + 655, + 656, + 661, + 662, + 663, + 664, + 665, + 668, + 670, + 671, + 673, + 674, + 677, + 679, + 681, + 682, + 683, + 684, + 685, + 687, + 688, + 692, + 695, + 696, + 697, + 698, + 699, + 701, + 705, + 708, + 710, + 711, + 712, + 713, + 714, + 715, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 735, + 742, + 743, + 745, + 748, + 749, + 753, + 755, + 760, + 761, + 762, + 763, + 764, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 786, + 787, + 788, + 792, + 795, + 797, + 798, + 802, + 806, + 808, + 810, + 813, + 816, + 817, + 819, + 820, + 823, + 824, + 828, + 829, + 830, + 831, + 833, + 834, + 835, + 837, + 839, + 844, + 845, + 847, + 849, + 850, + 855, + 856, + 859, + 862, + 863, + 866, + 867, + 870, + 873, + 874, + 875, + 876, + 879, + 880, + 882, + 883, + 885, + 886, + 888, + 889, + 892, + 893, + 895, + 897, + 900, + 903, + 908, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 924, + 925, + 928, + 931, + 935, + 938, + 939, + 943, + 949, + 951, + 952, + 953, + 954, + 957, + 958, + 961, + 962, + 963, + 966, + 967, + 970, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 981, + 984, + 986, + 988, + 989, + 992, + 996, + 997, + 998, + 999 + ], + [ + "lynas (žuvis)", + "auksinė žuvelė", + "Didysis baltasis ryklys", + "kūjarykliai", + "Elektrinės rajožuvės", + "Rajožuvė", + "strutis", + "Šiaurinis kikilis", + "Dagilis", + "indigo stērste", + "ceļotājstrazds", + "biulbiulis", + "Kėkštas", + "šarka", + "Vandeniniai strazdai", + "Pesliai", + "baltagalvis erelis", + "grifas", + "laplandinė pelėda", + "Aksolotlis", + "Varlė jautis", + "kietaodis vėžlys", + "Žalioji iguana", + "Šiurpusis nuodadantis", + "Komodo varanas", + "Nilo krokodilas", + "Misisipės aligatorius", + "Triceratopsas", + "Karališkosios gyvatės", + "Raištinės gyvatės", + "Paprastasis smauglys", + "Hieroglifinis pitonas", + "indiškoji kobra", + "jūrinės gyvatės", + "Raguotoji angis", + "Raguotoji barškuolė", + "Trilobitai", + "skorpionas", + "Plėšriavoriai", + "erkė", + "lūpakojai", + "Eurazinis tetervinas", + "apkakles mežirbe", + "didžioji geltonkuodė kakadu", + "Kukaliai", + "bitininkiniai", + "ragasnapiniai", + "Kolibriniai", + "Žakamariniai", + "tukanas", + "gaigalas", + "Vidutinis dančiasnapis", + "žąsis", + "Juodoji gulbė", + "Echidniniai", + "ančiasnapis", + "Koaliniai", + "vombatas", + "medūzos", + "Plokščiosios kirmėlės", + "Apvaliosios kirmėlės", + "Sraigė", + "šliužas", + "Chitonai", + "amerikinis omaras", + "Krabai atsiskyrėliai", + "Baltasis gandras", + "juodasis gandras", + "girnovės", + "flamingas", + "baublys", + "gervė", + "Arama", + "Amerikas laucis", + "eininiai", + "Akmenė (paukštis)", + "juodkrūtis bėgikas", + "Raudonkojis tulikas", + "Jūrinės šarkos", + "pelikanas", + "karališkasis pingvinas", + "Albatrosiniai", + "pilkieji banginiai", + "Orka", + "Diugonis", + "jūrų liūtai", + "čihuahua", + "Japonų činas", + "Maltos bišonas", + "Pekinai", + "Ši Cu", + "afganų kurtas", + "Biglis", + "Bladhaundas", + "airių volfhaundas", + "vipetas", + "Ibisos podengas", + "saliukis", + "pitbulterjeras", + "Garbanotasis retriveris", + "Labradoro retriveris", + "airių seteris", + "kuvasas", + "Griunendalis", + "malinua", + "Briaras", + "komondoras", + "Bobteilas", + "Šeltis", + "škotų aviganis", + "rotveileris", + "Vokiečių aviganis", + "Dobermanas", + "nykštukinis pinčeris", + "Vokiečių bokseris", + "bulmastifas", + "Tibeto mastifas", + "prancūzų buldogas", + "Vokiečių Dogas", + "Senbernaras", + "Aliaskos malamutas", + "Sibiro haskis", + "dalmatinas", + "afenpinčeris", + "basendžis", + "Mopsas", + "niufaundlendas (šuo)", + "Samojedų šuo", + "Čiau-čiau", + "vilkas", + "Rudasis vilkas", + "kojotas", + "dingas", + "Raudonasis vilkas", + "hieninis šuo", + "Hieniniai", + "lapinas", + "Poliarinė lapė", + "pilkoji lapė", + "Persų ilgaplaukė katė", + "Siamo katė", + "Pumos", + "lūšis", + "Leopardas", + "Irbis", + "jaguaras", + "liūtas", + "Tigras", + "gepardas", + "rudasis lokys", + "Juodasis lokys", + "baltasis lokys", + "Mangustiniai", + "surikata", + "šokliai", + "Žygiai", + "Ūsuočiai", + "Lapgraužiai", + "Ragvabaliai", + "Straubliukiniai", + "dvisparniai", + "bitė", + "skruzdėlės", + "svirplys", + "tarakonas", + "Maldininkai", + "Cikadėlės", + "strėlikė", + "Vienodasparniai žirgeliai", + "Tamsusis satyras", + "jūrų žvaigždė", + "juros ezys", + "Holoturijos", + "Amerikiniai triušiai", + "Kiškiai", + "Angoros triušis", + "ursonas", + "švilpikas", + "bẽbras", + "jūrų kiaulytė", + "zebrai", + "kiaulė", + "šernas", + "Afrikinis karpotis", + "Didysis hipopotamas", + "jautis", + "vandeninis buivolas", + "stumbrai ir bizonai", + "avinas", + "Snieginis avinas", + "kalnų ožys", + "Galvijinė antilopė", + "Aepycerotinae", + "Tikrosios gazelės", + "Vienkupris kupranugaris", + "Lama", + "šeškai", + "tamsusis šeškas", + "šeškas", + "ūdra", + "opšrus", + "šarvuotis", + "Borneo orangutanas", + "gorilos", + "šimpanzė", + "gibonai", + "Siamangas", + "Markata husaras", + "Pavianai", + "Makakos", + "Laibaliemenės beždžionės", + "Kolobai", + "Didnosė beždžionė", + "marmozetė", + "Staugūnai", + "Koatos (gentis)", + "Saimiriai", + "Katinis lemūras", + "Trumpauodegis indris", + "Azijinis dramblys", + "afrikinis savaninis dramblys", + "mažoji panda", + "didžioji panda", + "ungurys", + "Jūrų klounai", + "Eršketinės", + "Kaimanžuvės", + "Abakas", + "Akordeonas", + "Lėktuvnešis", + "oro laineris", + "dirižablis", + "greitosios pagalbos automobilis", + "bitynas", + "Prijuostė", + "šiukšliadėžė", + "automatas (ginklas)", + "kuprinė", + "kepykla", + "Oro balionas", + "tušinukas", + "bandža", + "turėklas", + "štanga", + "klėtis", + "barometras", + "statinė", + "karutis", + "krepšinis", + "Fagotas", + "plaukimo kepuraitė", + "vonia", + "universalas", + "Švyturys", + "Kiveris", + "stiklinė alui", + "Tandemas", + "bikinis", + "žiūronai", + "elingas", + "Ledrogių sportas", + "knygų spinta", + "knygynas", + "lankas", + "liemenėlė", + "molas", + "Antkrūtinis", + "Šluota", + "kibiras", + "geometrinė figūra", + "Šarvinė liemenė", + "Taksi", + "katilas", + "žvakė", + "Kanoja", + "Kardiganas", + "karuselė", + "automobilio ratas", + "bankomatas", + "kasetė", + "pilis", + "Katamaranas", + "violončelė", + "mobilusis telefonas", + "grandinė", + "Grandininis pjūklas", + "Skrynia", + "bažnyčia", + "Kino teatras", + "Kapoklė", + "medpadžiai", + "kavinukas", + "klaviatūra", + "Kabrioletas", + "kamščiatraukis", + "trimitas", + "lopšys", + "kranas", + "ramentas", + "kirasa", + "pylimas", + "stalas", + "sauskelnės", + "elektroninis laikrodis", + "mazgotė", + "indaplovė", + "diskiniai stabdžiai", + "dokas", + "kupolas", + "būgnas", + "Svarmuo (sporte)", + "elektrinis ventiliatorius", + "elektrinė gitara", + "elektrovežis", + "vokas", + "gaisrinis kateris", + "Gaisrinis automobilis", + "flagštokas", + "fleita", + "fontanas", + "automatinis plunksnakotis", + "keptuvė", + "kailiniai", + "Šiukšliavežis", + "Dujokaukė", + "rojalis", + "šiltnamis", + "bakalėjos krautuvė", + "giljotina", + "plaktukas", + "Plaukų džiovintuvas", + "nosinė", + "lūpinė armonikėlė", + "arfa", + "Javapjovė", + "pistoleto dėklas", + "smėlio laikrodis", + "laidynė", + "džinsai", + "marškinėliai", + "Dėlionė", + "Mazgas", + "kaušas", + "abažūras", + "laptopas", + "vejapjovė", + "žiebtuvėlis", + "Limuzinas", + "keleivinis laivas", + "lūpų dažai", + "Losjonas", + "garsiakalbis", + "Lentpjūvė", + "ksilofonas", + "Kaukė", + "Labirintas", + "Megalitas", + "mikrofonas", + "mikrobangų krosnelė", + "mikroautobusas", + "mini sijonas", + "Vienatūris", + "Ford Modell T", + "modemas", + "vienuolynas", + "monitorius", + "mopedas", + "mečètė", + "motoroleris", + "Kalnų dviratis", + "pelė", + "pelėkautai", + "Vinis", + "karoliai", + "portatyvinis kompiuteris", + "Obeliskas", + "Obojus", + "Okarina", + "odometras", + "Vargonai", + "Osciloskopas", + "pakelis", + "spynà", + "teptukas", + "pižama", + "Rūmai", + "Pano fleita", + "parašiutas", + "vagonas", + "Plintas", + "Drožtukas", + "kvepalai", + "petri lekstele", + "Kopijavimo aparatas", + "brauktukas", + "Smaiginis šalmas", + "Pikapas", + "kiaulė-taupyklė", + "pagalvė", + "ąsotis", + "Oblius", + "Plastikinis maišelis", + "plūgas", + "pončas", + "Spausdintuvas", + "kalėjimas", + "Projektorius", + "piniginė", + "Rašomoji plunksna", + "radiatorius", + "radioteleskopas", + "Šaldytuvas", + "nuotolinio valdymo pultelis", + "valgykla", + "revolveris", + "šautuvas", + "liniuotė", + "seifas", + "žiogelis", + "druskinė", + "sandalas", + "Sarongas", + "Saksofonas", + "makštis", + "Svarstyklės", + "mokyklinis autobusas", + "škuna", + "varžtas", + "atsuktuvas", + "siuvamoji mašina", + "Skydas", + "batų parduotuvė", + "gaubtas kastuvas", + "slidė", + "miegmaišis", + "logaritminė liniuotė", + "sniego motociklas", + "kojinė", + "sombreras", + "tarpo klavišas", + "mentelė", + "verpstukas", + "Sportinis automobilis", + "Scena", + "garvežys", + "Stetoskopas", + "stula", + "sietas", + "tramvajus", + "neštuvai", + "miegamoji sofa", + "Povandeninis laivas", + "Klasikinis vyriškas kostiumas", + "saulės laikrodis", + "akiniai nuo saulės", + "kabantis tiltas", + "jungiklis", + "Švirkštas", + "tankas", + "Arbatinukas", + "pliušinis meškiukas", + "antpirštis", + "Kuliamoji", + "Skrudintuvas", + "deglas", + "Totemo stulpas", + "Traktorius", + "Automobilvežis", + "triratis", + "triumfo arka", + "troleibusas", + "trombonas", + "statinė", + "skėtis", + "vienratis", + "dulkių siurblys", + "Vaza", + "aksomas", + "automatas", + "viadukas", + "smuikas", + "sieninis laikrodis", + "dėklas", + "Karinis orlaivis", + "Skalbimo mašina", + "vandens bokštas", + "perukas", + "sparnas", + "vilnonas", + "jurta", + "tinklalapis", + "Komiksų knyga", + "kryžiažodis", + "kelio ženklas", + "šviesoforas", + "knygos aplankas", + "Gvakamolė", + "Konsome", + "Ledai", + "Didriestainis", + "bulvių košė", + "žiedinis kopūstas", + "cukinija", + "agurkas", + "braškė", + "citrina", + "figa", + "ananasas", + "bananas", + "granatas", + "šienas", + "Tešla", + "zuikis", + "Pica", + "raudonasis vynas", + "espresas", + "aukšti kalnai", + "burbulas", + "Klifas", + "Koralinis rifas", + "geizeris", + "ragas", + "pakrantė", + "slėnis", + "Ugnikalnis", + "beisbolininkas", + "rapsas", + "Plačialapė klumpaitė", + "Gilė", + "Erškėtis", + "lakštabudinis grybas", + "kuokštinė grifolė", + "baravykas", + "varpa", + "tualetinis popierius" + ] + ], + "NO": [ + [ + 0, + 1, + 2, + 3, + 5, + 6, + 9, + 10, + 11, + 14, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 34, + 36, + 39, + 40, + 42, + 45, + 48, + 49, + 50, + 57, + 61, + 63, + 65, + 69, + 71, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 87, + 88, + 89, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 110, + 111, + 113, + 115, + 116, + 121, + 122, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 151, + 152, + 153, + 154, + 155, + 157, + 160, + 162, + 163, + 169, + 170, + 176, + 177, + 180, + 191, + 192, + 194, + 199, + 211, + 213, + 217, + 222, + 227, + 228, + 229, + 231, + 233, + 234, + 235, + 242, + 244, + 247, + 250, + 251, + 253, + 256, + 257, + 258, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 371, + 372, + 373, + 374, + 376, + 379, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 395, + 398, + 399, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 421, + 425, + 426, + 427, + 428, + 431, + 433, + 435, + 436, + 437, + 438, + 439, + 440, + 444, + 447, + 449, + 450, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 462, + 463, + 464, + 465, + 467, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 478, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 496, + 497, + 498, + 499, + 502, + 503, + 508, + 510, + 511, + 512, + 513, + 516, + 517, + 523, + 524, + 525, + 526, + 527, + 529, + 532, + 534, + 535, + 536, + 537, + 538, + 541, + 542, + 543, + 546, + 549, + 552, + 553, + 554, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 564, + 567, + 568, + 569, + 570, + 574, + 575, + 576, + 577, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 589, + 591, + 593, + 594, + 597, + 602, + 604, + 606, + 608, + 610, + 611, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 625, + 626, + 627, + 628, + 629, + 630, + 632, + 634, + 640, + 641, + 642, + 643, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 653, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 663, + 665, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 681, + 683, + 684, + 685, + 686, + 687, + 688, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 717, + 718, + 719, + 721, + 726, + 728, + 730, + 732, + 733, + 734, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 752, + 754, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 770, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 795, + 797, + 798, + 802, + 803, + 806, + 810, + 816, + 817, + 818, + 819, + 820, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 850, + 851, + 855, + 856, + 857, + 859, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 870, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 882, + 884, + 885, + 887, + 888, + 889, + 891, + 893, + 895, + 896, + 897, + 900, + 903, + 907, + 908, + 909, + 910, + 911, + 915, + 916, + 918, + 919, + 920, + 922, + 928, + 929, + 935, + 937, + 938, + 939, + 943, + 949, + 950, + 951, + 952, + 954, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 986, + 988, + 989, + 994, + 998, + 999 + ], + [ + "Suter", + "Gullfisk", + "hvithai", + "tigerhai", + "Elektriske skater", + "piggrokker", + "struts", + "Bjørkefink", + "Stillits", + "Indigospurv", + "Vandretrost", + "Bylbylfamilien", + "skjære", + "Fossekaller", + "Glenter", + "Hvithodehavørn", + "gribb (fugl)", + "Lappugle", + "Axolotlen", + "Amerikansk oksefrosk", + "havlærskilpadden", + "sumpskilpadde", + "Grønn iguan", + "Anoleøgler", + "Egentlige agamer", + "Gilaøgle", + "Komodovaran", + "Nilkrokodille", + "Amerikansk alligator", + "Strømpebåndsnoker", + "Kongeboa", + "Brilleslange", + "Havslanger", + "Trilobitter", + "skorpion", + "Sort enke", + "ulvedderkopp", + "Flåtter", + "tusenbein", + "orrfugl", + "rype", + "Kragejerpe", + "Jako (papegøye)", + "ara papegøye", + "Gultoppkakadu", + "Bietere", + "Hornfuglfamilien", + "Kolibrier", + "Jakamarfamilien", + "tukan", + "Siland", + "gås", + "Svartsvane", + "maurpiggsvin", + "nebbdyr", + "Koalabjørn", + "vombat", + "manet", + "Flatormer", + "rundorm", + "snegl", + "Nakensnegler", + "Leddsnegler", + "Trollkreps", + "Amerikahummer", + "langust", + "Astacoidea", + "eremittkreps", + "Stork", + "Svartstork", + "Skjestorker", + "Store flamingoer", + "Rørdrummer", + "trane", + "Riksetrane", + "Trappefamilien", + "Steinvender", + "myrsnipe", + "Rødstilk", + "Bekkasinsniper", + "Tjeldfamilien", + "Pelikaner", + "Kongepingvin", + "Albatrosser", + "Gråhval", + "spekkhogger", + "Chihuahua (hund)", + "Japansk tempelhund", + "Malteser", + "Pekingeser", + "Kinesisk løvehund", + "Kontinental toy spaniel", + "afghansk mynde", + "Beagle (hund)", + "Blodhund", + "Russkaya Psovaya Borzaya", + "irsk ulvehund", + "Saluqi", + "Skotsk hjortehund", + "Pitbuller", + "Airedaleterrier", + "cairnterrier", + "Dandie dinmont-terrier", + "Skotsk terrier", + "Ungarsk vizsla", + "irsk setter", + "Engelsk springer spaniel", + "Ungarsk kuvasz", + "Queensland heeler", + "Kiraly", + "The Dulux Dog", + "Collietype", + "Belgisk kveghund", + "Rottis", + "Langhåret schäferhund", + "bokser", + "tibetansk mastiff", + "Sanktbernhardshund", + "sibirsk husky", + "Dalmatiner", + "Zandehund", + "Newfoundlandshund", + "Pyreneerhund", + "Samojedhund", + "varg", + "Arktisk ulv", + "Rødulv", + "Prærieulv", + "Canis antarticus", + "Asiatisk villhund", + "Afrikansk villhund", + "Hyenefamilien", + "rev", + "Fjellrev", + "Grårev", + "Perser", + "Siameser", + "Fjelløve", + "gaupe", + "Leopard (dyr)", + "snøleopard", + "Jaguar (dyr)", + "løve", + "Tigere", + "gepard", + "brunbjørn", + "Svartbjørn", + "isbjørn", + "Mungofamilien", + "Surikat", + "Sandjegere", + "marifly", + "Løpebiller", + "Trebukker", + "Bladbiller", + "Hornbiller", + "Snute- og barkbiller", + "toving", + "bie", + "maur", + "gresshoppe", + "siriss", + "kakerlakk", + "Knelere", + "Dvergsikader", + "Libeller", + "vannymfe", + "Gullringvinge", + "monark", + "sjøstjerne", + "sjøpiggsvin", + "Sjøpølser", + "Bomullshalekaniner", + "Harer", + "Angorakanin", + "Hamstere", + "trepiggsvin", + "Reveekorn", + "murmeldyr", + "bever", + "marsvin", + "sebra", + "gris", + "villsvin", + "vortesvin", + "Vanlig flodhest", + "Okse", + "vannbøffel", + "sauebukk", + "Tykkhornsau", + "steinbukk", + "Kuantilope", + "Aepycerotinae", + "gasell", + "dromedar", + "lama", + "Amerikansk mink", + "Ilder", + "frett", + "oter", + "stinkdyr", + "grevling", + "beltedyr", + "Trefingerdovendyr", + "Orangutanger", + "Gorillaer", + "sjimpanse", + "Hvithåndgibbon", + "Husarape", + "Bavianer", + "Makaker", + "Bladaper", + "Neseape", + "Brølaper", + "Svarthåndklamreape", + "Ekornape", + "Ringhalelemur", + "Asiatisk elefant", + "Afrikanske elefanter", + "kattebjørn", + "Kjempepanda", + "ål", + "Klovnefisker", + "stør", + "Pansergjedder", + "kuleramme", + "Aba (plagg)", + "trekkspill", + "Akustisk gitar", + "hangarskip", + "Passasjerfly", + "luftskip", + "alter", + "ambulanse", + "Amfibisk kjøretøy", + "forkle", + "Søppelspann", + "Automatgevær", + "ryggsekk", + "bakeri", + "Bom (turn)", + "ballong", + "kulepenn", + "Rekkverk", + "låve", + "Barometre", + "tønne", + "Trillebår", + "Vugge", + "badehette", + "badekar", + "stasjonsvogn", + "fyr", + "begerglass", + "Bjørneskinnslue", + "ølflaske", + "Tandemsykkel", + "kikkert", + "naust", + "Bobslede", + "Kyse", + "bokhylle", + "bokhandel", + "flaskekapsel", + "boge", + "sløyfe (klesplagg)", + "plakett", + "bysteholder", + "molo", + "sopelime", + "Bøtte", + "spenne", + "Skuddsikker vest", + "slakteri", + "drosje", + "kjele", + "lys", + "kano", + "boksåpner", + "Kofte", + "karusell", + "kartong", + "kassett", + "borg", + "Katamaran", + "cd-speller", + "Cellist", + "mobiltelefon", + "kjede", + "gjerdenetting", + "ringbrynje", + "motorsag", + "kiste", + "Kommode", + "Julestrømpe", + "kirke", + "kino", + "kjøttøks", + "Tresko", + "Cocktailshaker", + "tastatur", + "containerskip", + "Kabriolet", + "korketrekker", + "trompet", + "vugge", + "kran", + "Krykke", + "kyrass", + "Demning", + "pult", + "Stasjonær PC", + "bleie", + "spisebord", + "oppvaskmaskin", + "Skivebrems", + "Dokk", + "Hundespann", + "kuppel", + "tromme", + "trommestikke", + "Håndvekt", + "Elektrisk gitar", + "konvolutt", + "Boa (klesplagg)", + "arkiv", + "Brannbåt", + "brannbil", + "flaggstang", + "tverrfløyta", + "Klappstol", + "gaffeltruck", + "fontene", + "fyllepenn", + "himmelseng", + "Stekepanne", + "pelshandel", + "renovasjonsbil", + "vernemaske", + "Golfballen", + "Golfbil", + "Gondol (båttype)", + "Gongong", + "flygel", + "drivhus", + "storsenter", + "giljotin", + "hårspray", + "Halvbeltekjøretøy", + "Hammer (redskap)", + "føner", + "Lommetørkle", + "munnspill", + "harpe", + "Hylster", + "Svingstang", + "Timeglass (tidsmåler)", + "strykejern", + "olabukse", + "T-skjorte", + "puslespill", + "Knebeskytter", + "Knop (knute)", + "labfrakk", + "Øse", + "lampeskjerm", + "Bærbar datamaskin", + "slått", + "Bergingsbåt", + "flamme", + "limousin", + "Atlanterhavsskip", + "leppestift", + "Aurlandssko", + "høgtaler", + "sagbruk", + "Kumlokk", + "Maracás", + "xylofon", + "maske", + "maistang", + "labyrint", + "Målebeger", + "Baderomskap", + "Megalittiske monument", + "mikrofon", + "mikrobølgeovn", + "melkespann", + "miniskjørt", + "Flerbruksbil", + "missil", + "vott", + "bakebolle", + "Modulhus", + "Ford Model T (24. september 1908)", + "kloster", + "Knallert", + "moské", + "Myggnett", + "Skuter", + "Terrengsykkel", + "mus", + "musefelle", + "spiker", + "halsbånd", + "bærbar", + "Obo", + "Okarina", + "Trippteller (bil)", + "Oljefilter", + "orgel", + "Oscilloskop", + "pakke", + "padleåre", + "Skovlhjul", + "hengelås", + "Pensel", + "pysjamas", + "palass", + "Panfløyte", + "kjøkkenrull", + "fallskjerm", + "Skranke", + "parkeringsautomat", + "vogn", + "terrasse", + "sokkel", + "Pennal", + "blyantspisser", + "parfyme", + "Petriskål", + "Kopimaskin", + "plekter", + "Pigghjelm", + "Pickup (bil)", + "bropilar", + "sparegris", + "pute", + "høvel", + "plastpose", + "plog", + "Instant kamera", + "påle", + "marja", + "biljardbord", + "blomsterpotte", + "Dreieskive (keramikk)", + "bønneteppe", + "skriver", + "fengsel", + "Prosjektil", + "Projeksjonsapparat", + "Pøkk", + "boksesekk", + "pung", + "Fjærpenn", + "Rekkert", + "radiokommunikasjon", + "radioteleskop", + "Bobil", + "kjøleskap", + "fjernkontroll", + "matsted", + "Revolver (våpen)", + "gevær", + "gyngestol", + "linjal", + "Joggesko", + "Pengeskap", + "sikkerhetsnål", + "saltbøsse", + "Sandaler", + "saksofon", + "slire", + "vekt", + "Skolebuss", + "skonnert", + "skrue", + "skrutrekker", + "setebelte", + "Symaskin", + "skjold", + "handlekurv", + "skuffe", + "ski (redskap)", + "sovepose", + "Regnestav", + "Snøskuter", + "Snøplog", + "sokk", + "mellomromstast", + "spindel", + "Sportsbil", + "søkelys", + "scene", + "damplokomotiv", + "stetoskop", + "Stola", + "steinmur", + "stoppeklokke", + "ovn", + "Sporvei", + "Båre", + "undervannsbåt", + "dress", + "solur", + "solbriller", + "solkrem", + "hengebru", + "Mopp", + "huske", + "Strømbryter", + "sprøyte", + "stridsvogn", + "tekanne", + "teddybjørn", + "fjernsyn", + "fingerbøl", + "Treskeverk", + "tronstol", + "brødrister", + "toalettsete", + "Fakkel", + "Totempåle", + "slepelastebil", + "leketøysbutikk", + "trekkvogn", + "Semitrailer", + "brett", + "trehjulssykkel", + "triumfbue", + "trolleybuss", + "Basstrombone", + "kar", + "Rotasjonsport", + "paraply", + "etthjulssykkel", + "støvsuger", + "hvelv", + "fløyel", + "Liturgiske klær", + "viadukt", + "fiolin", + "vaffeljern", + "lommebok", + "Militærfly", + "servant", + "Vaskemaskin", + "vanntårn", + "Parykk", + "vinflaske", + "vinge", + "vokk", + "tresleiv", + "ull", + "jurt", + "heimeside", + "kryssord", + "gateskilt", + "Trafikklys", + "meny", + "is", + "Vannis", + "Potetmos", + "brokkoli", + "blomkål", + "Squash (frukt)", + "agurk", + "jordbærfarge", + "appelsin", + "sitron", + "fiken", + "banan", + "granateple", + "høy", + "Pasta Carbonara", + "Sjokoladesaus", + "deig", + "kjøttpudding", + "pizzapai", + "rødvin", + "Ekspresso", + "Eggelikør", + "boble", + "Klippe", + "korallrev", + "geysir", + "nes", + "kyst", + "dal", + "vulkan", + "brudgom", + "raps", + "Marisko", + "eikenøtt", + "nype", + "stanksopp", + "Aks", + "dopapir" + ] + ], + "YI": [ + [ + 1, + 9, + 71, + 79, + 85, + 96, + 99, + 103, + 111, + 144, + 269, + 277, + 288, + 289, + 290, + 291, + 292, + 301, + 308, + 309, + 310, + 314, + 315, + 323, + 327, + 333, + 334, + 337, + 338, + 340, + 341, + 344, + 345, + 348, + 353, + 358, + 360, + 362, + 366, + 390, + 401, + 403, + 405, + 407, + 411, + 415, + 417, + 418, + 420, + 428, + 430, + 432, + 433, + 435, + 437, + 445, + 454, + 456, + 462, + 463, + 468, + 470, + 480, + 483, + 486, + 487, + 488, + 491, + 492, + 497, + 498, + 508, + 513, + 516, + 517, + 523, + 525, + 527, + 529, + 538, + 541, + 542, + 549, + 555, + 557, + 558, + 561, + 569, + 570, + 572, + 576, + 582, + 587, + 591, + 594, + 606, + 608, + 619, + 620, + 621, + 642, + 643, + 650, + 662, + 668, + 673, + 677, + 679, + 683, + 696, + 697, + 698, + 701, + 711, + 730, + 738, + 742, + 743, + 748, + 749, + 753, + 760, + 762, + 764, + 771, + 776, + 777, + 779, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 795, + 797, + 802, + 803, + 806, + 820, + 823, + 827, + 833, + 834, + 838, + 843, + 845, + 847, + 849, + 862, + 866, + 879, + 882, + 883, + 885, + 889, + 893, + 903, + 916, + 920, + 928, + 932, + 943, + 952, + 957, + 958, + 961, + 963, + 971, + 978, + 979, + 980, + 984, + 999 + ], + [ + "גאלדפיש", + "שטרויס‎", + "עקדיש", + "סענטיפּעדע‎", + "וואכטל", + "טוקאַן‎", + "גאַנדז‎", + "שנאָבל-חיה‎", + "רונדע ווערעם", + "פּעליקאַן‎", + "וואָלף", + "פֿוקס", + "לעמפערט", + "שניי לעמפערט", + "יאגואר", + "לייב", + "טיגער", + "משה רבנו׳ס בהמהלע‎", + "פליג", + "בין", + "מוראשקע", + "טאַראַקאַן", + "מאנטיס", + "מאנארך פלאטערל", + "ים־שטערן‎", + "האמסטער", + "שטעכל־חזיר‎", + "ביבער‎", + "ים־חזירל‎", + "זעברע", + "חזיר", + "היפּאָפּאָטאַם‎", + "אָקס‎", + "ווידער‎", + "הערש", + "אילטיס", + "ווידרע", + "דאַקס‎", + "גארילע", + "ווענגער‎", + "אַקאָרדעאָן‎", + "פליגער טרעגער", + "לופטשיף", + "אמבולאנס", + "פֿאַרטעך‎", + "בעקעריי", + "באלאן", + "באל-פאוינט פעדער", + "באַנדזשאָ‎", + "טאַטשקעס‎", + "באַסקעטבאָל‎", + "באַסון‎", + "באָדהיטל‎", + "וואנע", + "לײַכטטורעם‎", + "ביקיני‎", + "ביכערקראָם‎", + "בויגן", + "בעזים", + "עמער‎", + "טעקסי", + "ליכט‎", + "געלט אויטאמאט", + "שלאָס‎", + "טשעלא", + "מאָביל טעלעפֿאָן", + "קייט‎", + "קייטנזעג", + "קופֿערט", + "קירך", + "קינא", + "קלאוויאטור", + "טרומפּייט‎", + "וויג‎", + "הייבמאשין", + "קוליע", + "דאם", + "טיש קאמפיוטער", + "ווינדל", + "קופאל", + "פּויק‎", + "פּויקשטעקל‎", + "קאָנווערט‎", + "לעשאויטא", + "פֿאָנענמאַסט‎", + "פלייט", + "גאפל-הייבער", + "מיסטאויטאָ‎", + "גאַזמאַסקע‎", + "כּוס‎", + "גאָנדאָלע‎", + "שפּייזקראָם‎", + "האמער", + "נאָזטיכל‎", + "האַרפֿע‎", + "פּרעסאײַזן‎", + "דזשינס‎", + "אבאזשור", + "שויס קאמפיוטער", + "גראזשניידער", + "קסילאָפֿאָן‎", + "מאַסקע‎", + "מיקראפאן", + "מאדעם", + "מעטשעט‎", + "מויז", + "נאגל", + "האַלדזבאַנד‎", + "אָבאָע‎", + "פּענדזל‎", + "פּיזשאַמעס‎", + "פאלאץ", + "פּאַראַשוט‎", + "פארפום", + "אַקער", + "בלומענטאָפּ‎", + "דרוקער", + "טורמע", + "טײַסטער‎", + "קולמוס", + "ראדיאטאר", + "אײַזקאַסטן‎", + "רעסטאראן", + "ביקס‎", + "סייף", + "סאַקסאָפֿאָן‎", + "שייד‎", + "שולבוס", + "שרויף", + "שרויפן־ציער", + "שיצפאס", + "ניימאַשין‎", + "שילד‎", + "איינקויף וואגן", + "לאָפּעטע‎", + "נאַרטע‎", + "שלאָפֿזאַק‎", + "שניי-מאביל", + "שניי-סאכע", + "שטרימפ", + "דאמף-לאקאמאטיוו", + "מסכתא", + "אויוון‎", + "סובמארין", + "קאָסטיום‎", + "זונקרעם", + "הוידלקע‎", + "שפּריץ‎", + "טאנק", + "טשײַניק‎", + "שטורקאַץ‎", + "טראקטאר", + "שירעם", + "וואַקוּום‎", + "וואַזע‎", + "סאַמעט‎", + "פידל", + "בײַטל‎", + "שייטל", + "וועבזייטל", + "פֿאָרסיגנאַל‎", + "אייזקרעם", + "פרעצל", + "אוגערקע‎", + "פֿײַג‎", + "מילגרוים‎", + "היי‎", + "טייג", + "פּיצע‎", + "בלאָז‎", + "ברעג ים", + "טאל", + "וואולקאן", + "קאנאלא אויל", + "בית־הכסא־פּאַפּיר" + ] + ], + "UK": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 9, + 10, + 11, + 13, + 14, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 28, + 29, + 30, + 32, + 34, + 37, + 39, + 40, + 42, + 45, + 46, + 48, + 49, + 50, + 51, + 53, + 56, + 57, + 60, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 71, + 75, + 77, + 79, + 80, + 82, + 85, + 86, + 87, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 153, + 154, + 155, + 160, + 162, + 163, + 169, + 172, + 176, + 191, + 194, + 199, + 211, + 213, + 222, + 223, + 226, + 227, + 228, + 229, + 230, + 233, + 234, + 235, + 236, + 242, + 243, + 244, + 246, + 247, + 248, + 249, + 250, + 251, + 253, + 254, + 256, + 258, + 259, + 260, + 261, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 307, + 308, + 309, + 310, + 312, + 314, + 315, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 379, + 380, + 381, + 383, + 384, + 385, + 386, + 387, + 388, + 390, + 391, + 393, + 394, + 395, + 398, + 399, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 430, + 431, + 432, + 433, + 435, + 436, + 437, + 438, + 439, + 444, + 445, + 447, + 450, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 497, + 498, + 499, + 502, + 503, + 505, + 508, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 520, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 534, + 535, + 536, + 537, + 538, + 541, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 555, + 557, + 558, + 561, + 562, + 563, + 566, + 567, + 569, + 570, + 571, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 582, + 583, + 585, + 587, + 589, + 590, + 591, + 593, + 594, + 595, + 597, + 599, + 602, + 604, + 606, + 607, + 608, + 610, + 611, + 612, + 614, + 616, + 617, + 618, + 619, + 620, + 621, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 634, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 648, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 661, + 662, + 665, + 667, + 668, + 670, + 671, + 673, + 674, + 677, + 678, + 679, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 701, + 702, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 731, + 732, + 734, + 735, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 748, + 749, + 752, + 753, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 797, + 798, + 802, + 803, + 806, + 808, + 811, + 816, + 817, + 819, + 820, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 850, + 852, + 854, + 855, + 856, + 857, + 859, + 862, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 891, + 893, + 894, + 895, + 896, + 897, + 900, + 902, + 903, + 907, + 909, + 910, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 924, + 925, + 926, + 927, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 944, + 948, + 949, + 952, + 953, + 957, + 958, + 959, + 960, + 961, + 963, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 975, + 976, + 978, + 979, + 980, + 984, + 986, + 988, + 989, + 996, + 998, + 999 + ], + [ + "Лин звичайний", + "Карась китайський", + "Акула біла", + "Акула тигрова", + "Акули-молоти", + "Електричні скати", + "страус", + "В'юрок", + "Щиглик звичайний", + "юнко", + "Скригнатка індигова", + "Дрізд мандрівний", + "Бюльбюлеві", + "сорока", + "Пронурок", + "Шуличні", + "Орлан білоголовий", + "Падальники", + "Сова бородата", + "Американська плямиста саламандра", + "Аксолотль", + "Велика зелена жаба", + "Хвостата жаба", + "Шкіряста черепаха", + "Коробчаста черепаха", + "Ігуана звичайна", + "Аноліс каролінський", + "Агами", + "Аризонський отрутозуб", + "Ящірка зелена", + "Комодський варан", + "Нільський крокодил", + "Американський алігатор", + "Трицератопс", + "Нашийникова змія поцяткована", + "Королівська змія", + "Підв'язкові змії", + "Нічний вуж комірцевий", + "Удав справжній", + "Пітон ієрогліфий", + "Індійська кобра", + "Морські крайти", + "Рогата гадюка звичайна", + "Гримучник рогатий", + "Трилобіти", + "Скорпіони", + "Чорна вдова (вид)", + "Павуки-вовки", + "губоногі", + "Тетерук євразійський", + "Орябок американський", + "Перепілка", + "Куріпки", + "Папуга сірий", + "Какаду жовточубий", + "Коукал (рід)", + "Бджолоїдкові", + "Птахи-носороги", + "колібрі", + "Бурмотушки", + "тукан", + "Крех середній", + "гуска", + "Лебідь чорний", + "Єхиднові", + "качкодзьоб", + "Воллабі", + "Коала сірий", + "Вомбатові", + "медуза", + "Актинії", + "плоскі черви", + "немато́да", + "Равлик", + "слизня́к", + "Голозяброві", + "Панцирні", + "річкові раки", + "раки-самітники", + "Лелека білий", + "Лелека чорний", + "Колпиці", + "фламі́нґо", + "Бугайні", + "журавель", + "Арама (птах)", + "Лиска американська", + "Дрохвові", + "Крем'яшник", + "побережник чорногрудий", + "Коловодник звичайний", + "Кулик-сорока (рід)", + "пелікан", + "Пінгвін королівський", + "Альбатросові", + "Кит сірий", + "косатка", + "дюгонь", + "Морські леви", + "чихуахуа", + "Мальтез", + "Пекінес", + "ши-цу", + "афганський хорт", + "Бігль", + "Бладгаунд", + "російський псовий хорт", + "Випет", + "Салукі", + "Ердель-тер'єр", + "Денді-дінмонт-тер’єр", + "Шотландський тер'єр", + "Угорська вижла", + "ірландський сетер", + "Кувас", + "Шиперке", + "Бріард", + "Австралійський келпі", + "Комондор", + "Староанглійський вівчар, Бобтейл", + "Шетландський вівчар", + "Фландрський був'є", + "Ротвейлер", + "німе́цька вівча́рка", + "Доберман", + "Боксер", + "Бульмастиф", + "тибетський мастиф", + "Німецький дог", + "Сенбернар", + "Хаскі", + "Аляскинський маламут", + "сибірський хаскі", + "Далматин", + "Басенджі", + "Мопс", + "Ньюфаундленд", + "Самоїд", + "Померанський шпіц", + "Чау-чау", + "Вольфшпіц", + "ксолоітцкуінтлі", + "вовк", + "Вовк арктичний", + "Гривастий вовк", + "Койот", + "Динго", + "Куон гірський", + "Вовк строкатий", + "Гієнові", + "лис", + "Песець", + "Справжня сіра лисиця", + "Кішки таббі", + "Перська кішка", + "сіамська кішка", + "Пума", + "рис", + "Леопард", + "Сніговий барс", + "Ягуар", + "лев", + "тигр", + "ґепа́рд", + "бу́рий ведмі́дь", + "Ведмідь барибал", + "Ведмідь білий", + "Мангустові", + "Сурикат", + "Стрибуни", + "сонечко", + "Туруни", + "вусачі", + "Листоїди", + "Жуки-гнойовики", + "Довгоносикоподібні", + "двокрилі", + "Бджоли", + "мурахи", + "цвіркун", + "тарган", + "Богомоли", + "Цикадки", + "стрекоза́", + "Рівнокрилі бабки", + "Очняк квітковий", + "Монарх", + "морська́ зі́рка", + "Морські їжаки", + "Голотурії", + "Кролик", + "Заєць", + "Ангорський кріль", + "Хом'яки", + "дикобра́з", + "Вивірка східна", + "байба́к", + "бобер", + "Кавія свійська", + "зебра", + "свиня", + "Свиня дика", + "Бородавочник африканський", + "гіпопота́м", + "віл", + "Водяний буйвіл", + "Бізон", + "баран", + "Товсторіг", + "Козел альпійський", + "Конгоні", + "імпала", + "газель", + "дромадер", + "лама (тварина)", + "Мустела", + "Норка", + "Тхір лісовий", + "тхір", + "Видрові", + "Тхір", + "борсу́к", + "бронено́сець", + "Лінивець трипалий", + "Орангутан", + "горила", + "шимпанзе", + "гібонові", + "Сіаманг звичайний", + "мартишка", + "Erythrocebus", + "павіан", + "Макака", + "Колобусові", + "Колобус", + "Носач звичайний", + "Ревун", + "Callicebus", + "Коата", + "Лемур котячий", + "індрі", + "Слон індійський", + "Слон саванний", + "Панда (рід)", + "Велика панда", + "вугор", + "Кижуч", + "Риби-клоуни", + "Осетрові", + "Сарган звичайний", + "Абак", + "Абайя", + "гармонія", + "Акустична гітара", + "авіаносець", + "пасажи́рський літа́к", + "дирижабль", + "швидка́", + "Амфібія", + "Отари (Вурнарський район)", + "Фартух", + "Контейнер для сміття", + "автома́т", + "рюкзак", + "пека́рня", + "Колода (гімнастика)", + "Повітряна куля", + "кулькова ручка", + "Банджо", + "Перила", + "Штанга", + "клу́ня", + "барометр", + "бочка", + "Тачка", + "Баскетбольний м'яч", + "Колиска", + "фагот", + "Шапочка для плавання", + "Ванна", + "універсал", + "маяк", + "Лабораторний стакан", + "Ківер", + "Тандем", + "бікі́ні", + "Бінокль", + "Бобслей", + "книжко́ва ша́фа", + "книга́рня", + "Пляшковий корок", + "лук", + "Краватка-метелик", + "Бандо", + "Морська дамба", + "нагру́дник", + "мітла", + "Відро", + "за́стібка", + "Бронежилет", + "таксі", + "Казан (посуд)", + "сві́чка", + "Пушка (Архангельська область)", + "кано́е", + "відкрива́чка", + "Кофта", + "Карусель", + "банкома́т", + "касе́та", + "за́мок", + "Катамаран", + "CD-програвач", + "віолонче́ль", + "мобі́льний телефо́н", + "ланцюжо́к", + "Сітка Рабіца", + "Кольчуга", + "бензопила́", + "ку́фер", + "Тансу", + "церква", + "кінотеатр", + "Сікач", + "Деревняки", + "Шейкер", + "кавник", + "клавіатура комп'ютера", + "контейнеровоз", + "Кабріолет", + "штопор", + "труба", + "Ковбойські чоботи", + "стетсон", + "коли́ска", + "двигун", + "дитя́че лі́жечко", + "Повільноварка", + "Милиця", + "панцир", + "да́мба", + "Бюро", + "Настільний комп'ютер", + "Підгузок", + "посудомийна машина", + "Дискове гальмо", + "Корабельний док", + "Нарти", + "купол", + "Мембранофони", + "Гантелі", + "Електрогітара", + "Електровоз", + "конве́рт", + "пудра", + "Боа (шарф)", + "картоте́ка", + "Пожежний автомобіль", + "флагшто́к", + "флейта", + "Автонавантажувач", + "фонтан", + "ві́чне перо́", + "валторна", + "пате́льня", + "Сміттєвоз", + "Протигаз", + "бензоколо́нка", + "Карт", + "М'яч для гольфу", + "машина для гольфу", + "гондола", + "гонг", + "Сукня", + "роя́ль", + "Оранжерея", + "бакалі́я", + "ґільйотина", + "Лак для волосся", + "молот", + "фен", + "Мобільний комп'ютер", + "Носова хустка", + "губна гармоніка", + "арфа", + "Жниварка", + "Кобура", + "Стільник (геометрія)", + "Перекладина", + "Пісковий годинник", + "залізко", + "Ліхтар Джека", + "джи́нси", + "Футболка", + "Пазл", + "Рикша", + "Кімоно", + "Вузол", + "Халат лабораторний", + "Ополоник", + "абажу́р", + "Ноутбук", + "Газонокосарка", + "запальничка", + "лімузин", + "Лайнер", + "помада", + "Лофери", + "Лосьйон", + "Гучномовець", + "Тартак (деревообробка)", + "Кришка люка", + "маракаси", + "ксилофон", + "ма́ска", + "сірни́к", + "Травневе дерево", + "лабіринт", + "медичний пояс", + "Мегаліти", + "мікрофон", + "мікрохвильова піч", + "мікроавтобус", + "міні-спідни́ця", + "Мінівен", + "ракета", + "рукави́ця", + "Форд Т", + "моде́м", + "мопед", + "Академічна шапочка", + "мече́ть", + "скутер", + "гірський велосипед", + "комп'ютерна миша", + "Мишоловка (пристрій)", + "цвях", + "Шийний бандаж", + "кольє́", + "Обеліск", + "гобо́й", + "зозуля", + "Одометр", + "Масляний фільтр", + "орган", + "осцилограф", + "па́чка", + "весло́", + "Гребне колесо", + "Висячий замок", + "щі́точка", + "піжама", + "палац", + "Флейта Пана", + "парашу́т", + "Паралельні бруси", + "Пасажирський вагон", + "тераса", + "Таксофон", + "П'єдестал", + "Пенал", + "Точило для олівців", + "Парфум", + "Чашка Петрі", + "Копіювальний апарат", + "плектр", + "Пікельгаубе", + "Штахети", + "Пікап", + "скарбничка", + "подушка", + "Карафа", + "ге́мбель", + "Пластиковий пакет", + "плуг", + "Вантуз", + "Поляроїд", + "автоза́к", + "пончо", + "горщо́к", + "гонча́рний круг", + "Намазлик", + "Принтер", + "в'язниця", + "метальна зброя", + "проє́ктор", + "Шайба (хокей)", + "портмоне́", + "Гусяче перо", + "ракетка", + "радіатор", + "Радіотелескоп", + "Будинок на колесах", + "холоди́льник", + "дистанці́йне керува́ння", + "пере́кусна", + "револьвер", + "гвинті́вка", + "Крісло-гойдалка", + "рожен", + "ліні́йка", + "Кросівки", + "Сейф", + "Англійська шпилька", + "сільни́ця", + "Сандалі", + "Саронг", + "саксофон", + "пі́хви", + "Ваги", + "Шкільний автобус", + "Шхуна", + "гвинт", + "завертка", + "Ремінь безпеки", + "Швейна машина", + "Щит", + "лопата", + "Лижі", + "спа́льний мішо́к", + "логарифмічна лінійка", + "снігохід", + "Плужний снігоочисник", + "Шкарпетки", + "Сомбреро", + "калорифер", + "верете́но", + "Спортивний автомобіль", + "сцена", + "паровоз", + "стетоскоп", + "Стола", + "Мур", + "Секундомір", + "пі́чка", + "трамвайна система", + "Носилки", + "Підводний човен", + "Класичний костюм", + "Сонячний годинник", + "Окуляри сонцезахисні", + "Підвісний міст", + "швабра", + "го́йдалка", + "перемика́ч", + "шприц", + "танк", + "ча́йник", + "Плюшевий ведмедик", + "тенісний м'яч", + "Театральна завіса", + "наперсток", + "Молотарка", + "Престол", + "тостер", + "фа́кел", + "Трактор", + "Сідловий автопоїзд", + "Таця", + "Тренчкот", + "Трицикл", + "Штатив", + "тріумфальна арка", + "тролейбус", + "тромбон", + "турнікет", + "парасоля", + "Уніцикл", + "піані́но", + "пилосо́с", + "ваза", + "склепі́ння", + "Оксамит", + "Богослужбовий одяг", + "віадук", + "скри́пка", + "вафельниця", + "гаманець", + "шафа", + "Військовий літак", + "Рукомийник", + "пральна машина", + "Водонапірна вежа", + "свисток", + "Перука", + "Винна пляшка", + "Вок (сковорода)", + "копи́стка", + "вовна", + "Юрта", + "веб-са́йт", + "книга коміксів", + "кросворд", + "дороговка́зувач", + "Світлофор", + "Суперобкладинка", + "Гуакамоле", + "Консоме", + "Хвоґво", + "трайфл", + "морожене", + "Фруктовий лід", + "Байгель", + "брецель", + "чизбургер", + "Картопляне пюре", + "кучеря́ва капу́ста", + "кабачок", + "огірок", + "нефритовий зелений", + "Гренні Сміт", + "полуни́чний", + "інжи́р", + "ананас", + "грана́т", + "сі́но", + "Карбонара", + "Шоколадний сироп", + "тісто", + "піца", + "Буріто", + "черво́не вино́", + "Еспресо", + "Ег-ног", + "пузи́р", + "Кліф", + "Кораловий риф", + "гейзер", + "бе́рег о́зера", + "мис", + "узбережжя", + "долина", + "Вулкан", + "Ріпак", + "Зозулині черевички справжні", + "жолудь", + "шипши́на", + "Грифола кучерявенька", + "Колос", + "туале́тний папі́р" + ] + ], + "KY": [ + [ + 0, + 2, + 9, + 11, + 16, + 18, + 45, + 71, + 78, + 79, + 80, + 94, + 98, + 99, + 102, + 105, + 106, + 108, + 110, + 111, + 115, + 120, + 127, + 128, + 130, + 134, + 138, + 146, + 163, + 235, + 236, + 269, + 272, + 273, + 274, + 276, + 277, + 279, + 287, + 288, + 289, + 291, + 292, + 293, + 294, + 295, + 296, + 302, + 303, + 304, + 308, + 309, + 310, + 311, + 312, + 315, + 319, + 327, + 328, + 329, + 334, + 336, + 337, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 348, + 350, + 353, + 355, + 356, + 359, + 360, + 362, + 364, + 365, + 366, + 367, + 368, + 371, + 372, + 373, + 375, + 381, + 386, + 387, + 390, + 391, + 393, + 394, + 395, + 398, + 401, + 405, + 407, + 411, + 413, + 415, + 418, + 420, + 425, + 426, + 430, + 432, + 435, + 437, + 445, + 447, + 456, + 462, + 463, + 464, + 468, + 469, + 470, + 472, + 481, + 483, + 486, + 487, + 488, + 492, + 497, + 498, + 508, + 513, + 516, + 523, + 525, + 534, + 538, + 541, + 543, + 547, + 549, + 555, + 557, + 558, + 562, + 563, + 567, + 570, + 577, + 587, + 591, + 594, + 606, + 608, + 612, + 618, + 619, + 620, + 627, + 628, + 642, + 643, + 646, + 650, + 651, + 662, + 665, + 668, + 670, + 673, + 677, + 679, + 682, + 683, + 687, + 692, + 697, + 698, + 701, + 708, + 710, + 711, + 714, + 717, + 721, + 730, + 738, + 742, + 743, + 746, + 748, + 753, + 755, + 760, + 762, + 764, + 769, + 771, + 776, + 777, + 778, + 780, + 783, + 784, + 787, + 792, + 795, + 806, + 816, + 820, + 826, + 827, + 830, + 834, + 844, + 845, + 847, + 849, + 862, + 866, + 875, + 879, + 882, + 883, + 884, + 885, + 888, + 889, + 893, + 896, + 897, + 911, + 915, + 916, + 919, + 920, + 928, + 943, + 953, + 957, + 958, + 961, + 963, + 971, + 974, + 979, + 980, + 989, + 999 + ], + [ + "Линь", + "Кархародон", + "төө куш", + "Кадимки кендирчил", + "Мукур тырмак таркылдактар", + "сагызган", + "Жилатье", + "чаян", + "кене", + "Эринбуттар", + "Кара кур", + "колибри", + "Узунтумшуктуу кытай", + "каз", + "ехидна", + "коала", + "вомбат", + "Актиниялар", + "Жалпак курттар", + "Жумуру курт", + "Ачык бакалоордуулар", + "Жаңсагыч крабдар", + "Аккунас", + "Kaрa кунaс", + "фламинго", + "турна", + "Тоодактар", + "альбатрос", + "жойчу", + "Немис овчаркасы", + "Доберман", + "бөрү", + "Койот", + "Динго", + "Чөө", + "Көк жал сымалдуулар", + "түлкү", + "Калтар түлкү", + "сүлөөсүн", + "Кабылан", + "илбирс", + "арстан", + "Жолборс", + "гепард", + "Аюу", + "Барибал", + "ак аюу", + "Дуулдактар", + "Отун жаргычтар", + "Жалбырак кемиргичтер", + "кош канаттуулар", + "аары", + "Кумурскалар", + "чегиртке", + "кара чегиртке", + "Жаачы", + "ийнелик", + "Деңиз жылдыздары", + "Деңиз кирписи", + "Голотуриялар", + "жайра", + "суур", + "кемчет", + "Зебра", + "чочко", + "Доңуз", + "гиппопотам", + "Өгүз", + "Буйвол", + "Зубрлар", + "кочкор", + "Альпы тоотекеси", + "Жейрендер", + "Лама", + "Арысчычкандар", + "күзөн", + "кундуз", + "Кашкулак", + "Илендилер", + "орангутанг", + "горилла", + "шимпанзе", + "Гиббон сымалдуулар", + "Ак тумшук кызыл мартышка", + "Павиандар", + "Макакалар", + "Кооз маймылдар", + "Коата", + "Африка пилдери", + "Панда", + "Куртбалык түспөлдүүлөр", + "Кижуч", + "Амфиприондор", + "Осетр балыктары", + "Кайман сымалдуу балыктар", + "Абак (математика)", + "Аккордеон", + "Дирижабль", + "тез жардам", + "алжапкыч", + "Автомат (курал)", + "наабайкана", + "калемсап", + "Банджо", + "сарай", + "Барометр", + "баскетбол", + "Фагот", + "Ванна", + "маяк", + "бикини", + "дүрбү", + "жаа", + "шыпыргы", + "чака", + "таралга", + "такси", + "казан", + "шам", + "Каноэ", + "кассета", + "замок", + "виолончель", + "кол телефон", + "чынжыр", + "сандык", + "чиркөө", + "Кинотеатр", + "баскычтоп", + "корнет", + "бешик", + "Балдак", + "Плотина", + "идиш жуугуч", + "Күмбөз", + "барабан", + "Гантель", + "Электровоз", + "конверт", + "Өрт өчүргүч автомобиль", + "флагшток", + "най", + "фонтан", + "авторучка", + "Көмөч казан", + "Противогаз", + "Гонг", + "балка", + "Бет аарчы", + "арфа", + "үтүк", + "джинсы", + "Рикша", + "сузгу", + "Абажур", + "Ноутбук", + "Лимузин", + "Лайнер", + "Ксилофон", + "маска", + "лабиринт", + "микрофон", + "Кыска толкундуу меш", + "Модем", + "мопед", + "мечит", + "Мотороллер", + "чычкан", + "Мык", + "шуру", + "Обелиск", + "Гобой", + "Орган", + "пачка", + "пижама", + "Дворец", + "парашют", + "Пьедестал", + "точилка", + "атыр", + "Плектр", + "Пикап", + "Жаздык", + "Буурсун", + "карапа", + "Принтер", + "Түрмө", + "шайба", + "намыян", + "Радиатор", + "Радиотелескоп", + "муздаткыч", + "ресторан", + "Мылтык", + "сызгыч", + "Сейф", + "Саксофон", + "кын", + "тараза", + "шхуна", + "шуруп", + "бурагыч", + "калкан", + "күрөк", + "лыжа", + "байпак", + "ийик", + "паровоз", + "Секундомер", + "печка", + "носилка", + "костюм", + "ажыраткыч", + "шприц", + "Танк", + "чайнек", + "шамана", + "Трактор", + "тромбон", + "Кол чатыр", + "чаң соргуч", + "Ваза", + "свод", + "макмал", + "Виадек", + "Скрипка", + "Капчык", + "умувальник", + "Кир жуугуч машина", + "жүн", + "боз үй", + "Веб-сайт", + "жол белги", + "белгишам", + "бал муздак", + "бадыраң", + "ананас", + "анар", + "Чөп", + "камыр", + "пицца", + "көбүк", + "Гейзер", + "Өрөөн", + "Жанар тоо", + "Ит мурун", + "даарат кагазы" + ] + ], + "KA": [ + [ + 0, + 1, + 2, + 4, + 6, + 9, + 15, + 16, + 20, + 22, + 23, + 34, + 48, + 50, + 51, + 61, + 63, + 69, + 71, + 78, + 79, + 87, + 88, + 93, + 94, + 95, + 96, + 99, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 122, + 123, + 127, + 128, + 129, + 130, + 134, + 135, + 138, + 141, + 144, + 146, + 148, + 149, + 150, + 151, + 153, + 154, + 157, + 162, + 169, + 172, + 176, + 177, + 178, + 191, + 194, + 199, + 201, + 213, + 222, + 223, + 224, + 226, + 227, + 228, + 229, + 230, + 234, + 235, + 236, + 242, + 243, + 246, + 247, + 249, + 251, + 252, + 253, + 254, + 256, + 257, + 260, + 261, + 269, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 299, + 301, + 302, + 303, + 304, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 319, + 327, + 328, + 329, + 330, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 348, + 350, + 351, + 352, + 353, + 354, + 355, + 358, + 359, + 360, + 361, + 362, + 363, + 365, + 366, + 367, + 368, + 369, + 371, + 372, + 373, + 375, + 376, + 379, + 381, + 382, + 383, + 384, + 386, + 387, + 388, + 390, + 391, + 394, + 395, + 397, + 398, + 401, + 402, + 403, + 405, + 407, + 410, + 411, + 412, + 415, + 417, + 418, + 420, + 421, + 425, + 426, + 428, + 430, + 431, + 432, + 435, + 436, + 437, + 445, + 447, + 450, + 453, + 454, + 456, + 459, + 461, + 462, + 463, + 464, + 467, + 468, + 469, + 470, + 472, + 476, + 480, + 481, + 483, + 485, + 486, + 487, + 488, + 490, + 491, + 492, + 497, + 505, + 508, + 510, + 511, + 512, + 513, + 516, + 517, + 524, + 525, + 526, + 527, + 531, + 534, + 536, + 537, + 538, + 541, + 546, + 549, + 551, + 553, + 557, + 558, + 562, + 563, + 566, + 567, + 568, + 570, + 572, + 576, + 577, + 582, + 583, + 587, + 590, + 591, + 593, + 594, + 600, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 616, + 618, + 619, + 620, + 626, + 627, + 629, + 632, + 641, + 642, + 643, + 644, + 649, + 650, + 651, + 654, + 656, + 657, + 658, + 661, + 662, + 665, + 668, + 673, + 677, + 679, + 682, + 683, + 684, + 685, + 687, + 692, + 695, + 697, + 698, + 699, + 701, + 705, + 707, + 708, + 711, + 714, + 719, + 721, + 726, + 728, + 730, + 735, + 738, + 742, + 743, + 746, + 748, + 749, + 750, + 752, + 755, + 760, + 761, + 762, + 764, + 765, + 766, + 769, + 771, + 773, + 774, + 776, + 777, + 778, + 780, + 783, + 784, + 785, + 786, + 787, + 792, + 795, + 797, + 802, + 806, + 816, + 819, + 820, + 823, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 840, + 844, + 845, + 847, + 849, + 852, + 862, + 863, + 868, + 870, + 874, + 875, + 879, + 882, + 883, + 884, + 885, + 888, + 889, + 892, + 893, + 895, + 902, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 924, + 928, + 932, + 933, + 935, + 938, + 943, + 949, + 952, + 953, + 957, + 958, + 961, + 963, + 965, + 966, + 967, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 985, + 988, + 989, + 996, + 998, + 999 + ], + [ + "ლოქორია", + "ოქროს თევზი", + "თეთრი ზვიგენი", + "თავჩაქუჩა ზვიგენები", + "სკაროსი", + "სირაქლემა", + "მომთაბარე შაშვი", + "მჭრინავისებრნი", + "წყლის შაშვისებრნი", + "თეთრთავა არწივი", + "სვავი", + "ტყავიანი კუ", + "კომოდოს ვარანი", + "მისისიპის ალიგატორი", + "ტრიცერატოფსი", + "ჩვეულებრივი მახრჩობელა", + "ინდური კობრა", + "ტრილობიტები", + "მორიელი", + "ტკიპა", + "ტუჩფეხიანები", + "ჟაკო", + "არა (თუთიყუში)", + "რქაცხვირასებრნი", + "კოლიბრი", + "იაკამარასებრნი", + "ტუკან", + "ბატი", + "იქედნე", + "იხვნისკარტა", + "კოალა", + "ვომბატისებრნი", + "მედუზა", + "აქტინიები", + "ბრტყელი ჭიები", + "ნემატოდები", + "ლოკოკინა", + "ლოქორა", + "შიშველლაყუჩა მოლუსკები", + "ჯავშნიანები", + "ამერიკული ასთაკვი", + "ლანგუსტისებრნი", + "ლაკლაკი", + "იშხვარი", + "ჟეროები", + "ფლამინგო", + "წერო", + "არამა", + "სავათისებრნი", + "მსევანი", + "ვარხვისებრნი", + "ალბატროსისებრნი", + "ცელნამგალა ვეშაპი", + "დიუგონი", + "ზღვის ლომი", + "ჩიუაუა (ძაღლი)", + "მალტეზე", + "პეკინესი", + "პაპილიონი", + "ბიგლი", + "რუსული გრძელბანჯგვლიანი მწევარი", + "უიპეტი", + "სალუკი", + "დირჰაუნდი", + "ვეიმარანერი", + "ერდელტერიერი", + "დენდი დინმონტ ტერიერი", + "შოტლანდიური ტერიერი", + "ავსტრალიური აბრეშუმისებრი ტერიერი", + "ირლანდიური სეტერი", + "კუვასი", + "შიპერკე", + "გრიუნენდალი", + "ბრიარი", + "ავსტრალიური კელპი", + "კომონდორი", + "ძველინგლისური ნაგაზი", + "შეტლანდიური ნაგაზი", + "როტვეილერი", + "გერმანული ნაგაზი", + "დობერმანი", + "ბოქსიორი", + "ბულმასტიფი", + "გერმანული დოგი", + "სენბერნარი", + "ალასკური მალამუტი", + "დალმაციელი", + "აფენ პინჩერი", + "ბასენჯი", + "მოპსი", + "ნიუფაუნდლენდი (ძაღლი)", + "პირენეული მთის ძაღლი", + "ჩაუ-ჩაუ", + "კეესჰონდი", + "მგელი", + "წითური მგელი", + "კოიოტი", + "დინგო", + "წითელი მგელი", + "აფთრისებრი ძაღლი", + "აფთარი", + "მელია", + "ყარსაღი", + "რუხი მელა", + "სიამის კატა", + "პუმა", + "ფოცხვერი", + "ჯიქი", + "თოვლის ჯიქი", + "იაგუარი", + "ლომი", + "ვეფხვი", + "ავაზა", + "მურა დათვი", + "ბარიბალი", + "თეთრი დათვი", + "სურიკატი", + "ჭიამაია", + "ბზუალა ხოჭოები", + "ხარაბუზასებრნი", + "ფოთლიჭამიასებრნი", + "ბუზი", + "ფუტკარი", + "ჭიანჭველასებრნი", + "კალია", + "ჭრიჭინა", + "ტარაკანი", + "ჩოქელები", + "ნემსიყლაპია", + "ზღვის ვარსკვლავა", + "ზღვის ზღარბები", + "ჰოლოთურიები", + "ამერიკული ბოცვერი", + "კურდღელი", + "ზაზუნები", + "მაჩვზღარბა", + "ზაზუნა", + "თახვი", + "ზღვის გოჭი", + "ზებრები", + "ღორი", + "გარეული ღორი", + "მეჭეჭებიანი ღორი", + "ბეჰემოთი", + "ხარი", + "აზიური შინაური კამეჩი", + "ვერძი", + "ალპური თხა", + "ძროხისებრი ანტილოპა", + "იმპალა", + "ქურციკი", + "ერთკუზიანი აქლემი", + "ლამა", + "ქრცვინი", + "ქრცვინი", + "წავი", + "სკუნსი", + "მაჩვი", + "არმადილი", + "ორანგუტანგი", + "გორილა", + "შიმპანზე", + "თეთრხელა გიბონი", + "სიამანგი", + "ჰუსარი", + "ბაბუინი", + "მაკაკი", + "კოლობუსი", + "ცხვირა მაიმუნი", + "ღრიალა მაიმუნები", + "კოატა", + "საიმირი", + "კატისებრი ლემური", + "ინდრი", + "აფრიკული სპილო", + "პანდა", + "ბამბუკის დათვი", + "გველთევზა", + "კიჟუჩი", + "ზუთხისებრნი", + "კაიმანისებრი თევზები", + "ბურთით თევზი", + "საანგარიშე", + "აკორდეონი", + "აკუსტიკური გიტარა", + "ავიამზიდი გემი", + "დირიჟაბლი", + "სანიტარული ავტომანქანა", + "საფუტკრე", + "წინსაფარი", + "სანაგვე ყუთი", + "ფურნე", + "აეროსტატი", + "ბურთულიანი კალამი", + "ბანჯო", + "ბალუსტრადა", + "ბეღელი", + "ბარომეტრი", + "მაზიდა", + "კალათბურთი", + "აკვანი", + "ფაგოტი", + "აბაზანა", + "უნივერსალი", + "შუქური", + "ბიკინი", + "დურბინდი", + "ბობსლეი", + "წიგნის თარო", + "წიგნის მაღაზია", + "მშვილდი", + "ბიუსტჰალტერი", + "ეგიდა", + "ცოცხი", + "სათლი", + "აბზინდა (შესაკრავი)", + "საყასბო", + "ტაქსი", + "ქვაბი", + "სანთელი", + "ბაიდარა", + "კარუსელი", + "ბანკომატი", + "კასეტა", + "ციხე-დარბაზი", + "კომპაქტ-დისკების დამკვრელი", + "ვიოლონჩელი", + "მობილური ტელეფონი", + "ჯაჭვი", + "თორი", + "ბენზოხერხი", + "ყუთი", + "ეკლესია", + "ყავადანი", + "კლავიატურა", + "კონტეინერული ხომალდი", + "კაბრიოლეტი", + "კორპსაძრობი", + "საყვირი", + "აკვანი", + "ამწე", + "ბეგთარი", + "კაშხალი", + "საწერი მაგიდა", + "სამაგიდო კომპიუტერი", + "ციფრული საათი", + "ჭურჭლის სარეცხი მანქანა", + "დოკი", + "ნარტები", + "კამარა", + "დოლი", + "ელექტროგიტარა", + "კონვერტი", + "პუდრი", + "ქლიბი", + "ფლაგშტოკი", + "ფლეიტა", + "შადრევანი", + "მუდმივი კალამი", + "ვალტორნა", + "ტაფა", + "ბეწვის ქურქი", + "რესპირატორი", + "თასი", + "გონდოლა", + "გონგი", + "საბაყლო", + "გილიოტინა", + "ჩაქუჩი", + "მობილური მოწყობილობა", + "ცხვირსახოცი", + "ჰარმონიკა", + "არფა", + "მახე", + "უთო", + "მნათობი ჯეკი", + "ჯინსი", + "ჯიპი", + "მაისური", + "პაზლი", + "რიქშა", + "კიმონო", + "ნასკვი", + "ჩამჩა", + "აბაჟური", + "ნოუთბუქი", + "ლამპა", + "ლიმუზინი", + "პომადა", + "ხმამაღლამოლაპარაკე", + "მარაკასი", + "ქსილოფონი", + "პირბადე", + "ასანთი", + "მეგალითები", + "მიკროფონი", + "მიკროტალღური ღუმელი", + "მიკროავტობუსი", + "მინი-ფურგონი", + "რაკეტა", + "თათმანი", + "მოდელი ტ ფორდი", + "მოდემი", + "მოპედი", + "მეჩეთი", + "მაუსი", + "ლურსმანი", + "ყელსაბამი", + "ობელისკი", + "ჰობოი", + "ოქარინა", + "ოდომეტრი", + "ორგანი", + "პაკეტი", + "ბოქლომი", + "პიჟამა", + "სასახლე", + "პანის ფლეიტა", + "პარაშუტი", + "ვაგონი", + "ტაქსოფონი", + "საყრდენი", + "პარფიუმერია", + "მედიატორი", + "ყულაბა", + "ბალიში", + "შალაშინი", + "პარკი", + "გუთანი", + "პონჩო", + "საყვავილე", + "პრინტერი", + "საპატიმრო", + "შაიბა", + "საფულე", + "ფრთა", + "დალიანდაგებული საბანი", + "ჩოგანი", + "რადიოტელესკოპი", + "მაცივარი", + "პულტი", + "რესტორანი", + "შაშხანა", + "სარწეველა სავარძელი", + "შამფურზე შემწვარი", + "სახაზავი", + "სეიფი", + "სამარილე", + "სანდალი", + "საქსოფონი", + "ქარქაში", + "სასწორი", + "შხუნა", + "ხრახნი", + "სახრახნისი", + "უსაფრთხოების ქამარი", + "საკევრავი მანქანა", + "ფარი", + "ნიჩაბი", + "თხილამურები", + "საძილე ტომარა", + "თოვლმავალი", + "წინდა", + "თითისტარი", + "სცენა", + "ორთქლმავალი", + "სტეტოსკოპი", + "წამზომი", + "ღუმელი", + "ტრამვაი", + "საკაცე", + "წყალქვეშა ნავი", + "კოსტიუმი", + "მზის საათი", + "მზის სათვალეები", + "შვაბრა", + "გადართოთ", + "შპრიცი", + "ტანკი", + "ჩაიდანი", + "ჩოგბურთის ბურთი", + "ჩირაღდანი", + "ტოტემის სვეტი", + "სინი", + "სამთვლიანი ველოსიპედი", + "ტროლეიბუსი", + "ტრომბონი", + "ქოლგა", + "მტვერსასრუტი", + "ვაზა", + "კამარა", + "ხავერდი", + "ვიადუკი", + "ვიოლინო", + "კედლის საათი", + "ქისა", + "საბრძოლო თვითმფრინავები", + "სასტვენი", + "შალი", + "იურტა", + "საიტი", + "კომიქსი", + "კროსვორდი", + "საგზაო ნიშანი", + "შუქნიშანი", + "გვაქამოლე", + "ნაყინი", + "ბრეცელი", + "ჩიზბურგერი", + "კარტოფილის პიურე", + "ყვავილოვანი კომბოსტო", + "კიტრი", + "მარწყვისფერი", + "ლეღვი", + "ანანასი", + "ბროწეული", + "თივა", + "ცომი", + "პიცა", + "ბურიტო", + "შავი ღვინო", + "ესპრესო", + "ბუშტი", + "კლიფი", + "მარჯნის რიფი", + "გეიზერი", + "კონცხი", + "ნაპირის ზონა", + "ხეობა", + "ჩამქრალი ვულკანი", + "საქმრო", + "თალგამურა", + "ზიზილა", + "რკო", + "ასკილი", + "ფოთლოვანი აბედა", + "თავთავი", + "ტუალეტი ქაღალდი" + ] + ], + "BN": [ + [ + 1, + 2, + 3, + 9, + 16, + 21, + 22, + 23, + 29, + 34, + 48, + 51, + 62, + 63, + 65, + 69, + 71, + 79, + 85, + 91, + 93, + 94, + 98, + 99, + 100, + 103, + 105, + 107, + 108, + 110, + 111, + 113, + 122, + 125, + 127, + 128, + 130, + 134, + 141, + 144, + 145, + 146, + 149, + 269, + 272, + 273, + 274, + 276, + 277, + 281, + 286, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 296, + 298, + 299, + 303, + 307, + 308, + 309, + 310, + 313, + 314, + 315, + 316, + 319, + 327, + 329, + 331, + 334, + 337, + 338, + 340, + 341, + 342, + 344, + 346, + 347, + 353, + 355, + 359, + 360, + 365, + 366, + 372, + 374, + 381, + 384, + 385, + 386, + 387, + 388, + 390, + 398, + 399, + 401, + 403, + 407, + 410, + 411, + 412, + 415, + 417, + 418, + 426, + 428, + 429, + 430, + 432, + 435, + 437, + 438, + 445, + 447, + 454, + 456, + 459, + 462, + 463, + 468, + 470, + 480, + 483, + 486, + 487, + 488, + 492, + 497, + 498, + 508, + 510, + 513, + 516, + 519, + 525, + 526, + 527, + 538, + 541, + 546, + 549, + 557, + 558, + 562, + 563, + 567, + 572, + 578, + 580, + 582, + 587, + 590, + 591, + 593, + 606, + 608, + 610, + 612, + 614, + 616, + 618, + 620, + 621, + 623, + 626, + 629, + 632, + 643, + 649, + 650, + 651, + 655, + 657, + 662, + 665, + 668, + 670, + 673, + 674, + 677, + 679, + 681, + 685, + 687, + 688, + 692, + 697, + 698, + 701, + 710, + 711, + 713, + 721, + 725, + 728, + 730, + 732, + 741, + 742, + 743, + 744, + 745, + 747, + 748, + 750, + 753, + 755, + 760, + 762, + 763, + 764, + 766, + 769, + 772, + 774, + 776, + 783, + 785, + 786, + 787, + 793, + 795, + 797, + 806, + 808, + 816, + 823, + 826, + 827, + 833, + 834, + 835, + 837, + 839, + 844, + 845, + 847, + 850, + 852, + 862, + 874, + 879, + 882, + 883, + 885, + 888, + 889, + 890, + 893, + 895, + 897, + 903, + 916, + 917, + 918, + 920, + 928, + 933, + 935, + 943, + 948, + 952, + 953, + 957, + 958, + 960, + 961, + 963, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 982, + 999 + ], + [ + "গোল্ডফিশ", + "সাদা হাঙ্গর", + "বাঘ হাঙ্গর", + "উটপাখী", + "বুলবুলি", + "চিল", + "বল্ড ঈগল", + "শকুন", + "অ্যাক্সোলোটাল", + "বড় চামট সাগর কাছিম", + "কোমোডো ড্রাগন", + "ট্রাইসেরাটপস", + "আফ্রিকান রক পাইথন", + "খৈয়া গোখরা", + "সামুদ্রিক সাপ", + "ট্রাইলোবাইট", + "বিচ্ছু", + "বিছে", + "কোয়েল", + "কুবো", + "ধনেশ", + "হামিংবার্ড", + "লালবুক ডুবুরি হাঁস", + "হংসী", + "কালো রাজহাঁস", + "প্লাটিপাস", + "কোয়ালা", + "জেলিফিশ", + "সাগর কুসুম", + "চ্যাপ্টাকৃমি", + "সুতাকৃমি", + "শামুক", + "আমেরিকান গলদা চিংড়ি", + "সন্ন্যাসী কাঁকড়া", + "ধলা মানিকজোড়", + "কালো মানিকজোড়", + "কানঠুটি", + "সারস", + "লালপা পি-উ", + "গগণবেড়", + "রাজপেঙ্গুইন", + "আলবাট্রস", + "ডুগং", + "নেকড়ে", + "নেকড়েবিশেষ", + "ডিঙ্গো", + "রামকুত্তা", + "হায়েনা", + "লাল শিয়াল", + "ট্যাবি বিড়াল", + "কুগার", + "চিতাবাঘ", + "তুষার চিতা", + "জাগুয়ার", + "সিংহ", + "বাঘ", + "চিতা", + "বাদামি ভাল্লুক", + "মেরু ভালুক", + "বেজি", + "মিরক্যাট", + "দীর্ঘহূলী গুবরেপোকা", + "উইভিল", + "মাছি", + "মৌমাছি", + "পিঁপড়া", + "কাঠিপোকা", + "তেলাপোকা", + "ম্যান্টিস", + "উচ্চিংড়ে", + "ফড়িং", + "তারামাছ", + "সামুদ্রিক শসা", + "বুনো খরগোশ", + "সজারু", + "বীভার", + "গিনিপিগ", + "জেব্রা", + "শূকর", + "দেশি বন শুকর", + "জলহস্তী", + "মোষ", + "বাইসন", + "গ্যাজেল", + "লামা (প্রাণী)", + "কালো পা ফিরেট", + "ভোঁদড়", + "বনমানুষ", + "গরিলা", + "বেবুন", + "হনুমান", + "মাকড়সা বানর", + "ইন্দ্রি", + "ভারতীয় হাতি", + "আফ্রিকান হাতি", + "লাল পান্ডা", + "পান্ডা", + "বানমাছ", + "গণনার ফ্রেম", + "আবায়া", + "বাদ্যযন্ত্রবিশেষ", + "যুদ্ধবিমান পরিবাহক", + "অ্যাম্বুলেন্স", + "মৌমাছি সংরক্ষণাগার", + "অ্যাপ্রন", + "বর্জ্য ধারক", + "বেকারি", + "বেলুন (বিমানচালনাবিদ্যা)", + "কলম", + "ব্যারোমিটার", + "ঠেলাগাড়ি", + "বেসবল (বল)", + "বাস্কেটবল", + "বাসূন", + "বাথটব", + "বাতিঘর", + "বিকার (পরীক্ষাগার সামগ্রী)", + "বিকিনি", + "দূরবীন", + "বইয়ের দোকান", + "ধনু", + "বক্ষবন্ধনী", + "ঝাড়ু", + "বালতি", + "ট্যাক্সি", + "শামা", + "অটোমেটেড টেলার মেশিন", + "গঞ্জ", + "চেলো", + "মোবাইল ফোন", + "শৃঙ্খল", + "সিন্দুক", + "গির্জা", + "চলচ্চিত্র প্রেক্ষাগৃহ", + "কীবোর্ড", + "কন্টেইনার জাহাজ", + "তূর্য", + "ঝুলনা", + "কাঠের বাক্স সিন্দুক", + "বাঁধ", + "ডেস্ক", + "ডেস্কটপ কম্পিউটার", + "গম্বুজ", + "ড্রাম", + "ইলেকট্রিক গিটার", + "খাম", + "পতাকাদণ্ড", + "বাঁশি", + "ফোয়ারা", + "ঝর্ণা কলম", + "ভাজার চাটু", + "সুরাই", + "গাউন", + "গ্রীনহাউস", + "কেরানী", + "হাতুড়ি", + "মোবাইল ডিভাইস", + "রুমাল", + "হারমোনিকা", + "ইস্ত্রি", + "জিন্স", + "টি-শার্ট", + "রিকশা", + "কিমোনো", + "গিঁট", + "হাতা", + "ল্যাপটপ কম্পিউটার", + "ঘাসকাটা যন্ত্র", + "কাগজের ছুরি", + "লাইটার", + "লিপস্টিক", + "লাউডস্পিকার", + "মুখোশ", + "মেগালিথ", + "মাইক্রোফোন", + "মাইক্রোওয়েভ ওভেন", + "মিনিস্কার্ট", + "ক্ষেপণাস্ত্র", + "মডেম", + "মোপেড", + "মসজিদ", + "স্কুটার", + "মাউস", + "ইঁদুরধরা ফাঁদ", + "পেরেক", + "হার", + "ল্যাপটপ", + "ওডোমিটার", + "অর্গান (সঙ্গীত)", + "অসিলোস্কোপ", + "মোড়ক", + "পায়জামা", + "প্রাসাদ", + "প্যারাশুট", + "পেন্সিল শার্পনার", + "সুগন্ধি", + "আলোক চিত্রানুলিপিকারক", + "বালিশ", + "কলসী", + "প্লাস্টিক ব্যাগ", + "হাল", + "তাৎক্ষণিক আলোকচিত্রগ্রহণযন্ত্র", + "জায়নামাজ", + "প্রিন্টার", + "কারাগার", + "প্রাস", + "প্রক্ষেপক", + "পাঞ্চিং ব্যাগ", + "পার্স", + "লেপ", + "ঘর গরম করিবার যন্ত্রবিশেষ", + "বেতার দূরবীক্ষণ যন্ত্র", + "ফ্রিজ", + "রেস্তোরাঁ", + "রিভলভার", + "রাইফেল", + "ঘূর্ণনশীল শিক", + "মাপনী", + "সেফটিপিন", + "চপ্পল", + "স্যাক্সোফোন", + "স্ক্রু", + "নিরাপত্তা বন্ধনী", + "সেলাই মেশিন", + "ঢাল", + "ঝরনা টুপি", + "স্কী", + "স্লিপিং ব্যাগ", + "মোজা", + "সমব্রেরো", + "টাকু", + "স্টেথোস্কোপ", + "বিরামঘড়ি", + "উনুন", + "ডুবোজাহাজ", + "স্যুট", + "সূর্যঘড়ি", + "রোদ চশমা", + "ঝুলন্ত সেতু", + "চাবি (তড়িৎ)", + "সিরিঞ্জ", + "ট্যাংক", + "টেডি বিয়ার", + "টেনিস বল", + "মশাল", + "ট্রলিবাস", + "ছাতা", + "ভ্যাকুয়াম ক্লিনার", + "ফুলদানী", + "মখমল", + "বহুখিলানবিশিষ্ট সেতু", + "বেহালা", + "ভলিবল (বল)", + "মানিব্যাগ", + "সামরিক বিমান", + "ওয়াশিং মেশিন", + "পরচুলা", + "ওয়েবসাইট", + "কমিক বই", + "শব্দছক", + "সিগনাল", + "আইসক্রীম", + "চিজবার্গার", + "ম্যাশড পটেটো", + "শসা", + "গ্র্যানি স্মিথ", + "ডুমুর", + "আনারস", + "ডালিম", + "খড়", + "চকোলেট সিরাপ", + "মাখা ময়দার তাল", + "পিৎজা", + "বুদ্বুদ", + "খাড়া পাহাড়", + "প্রবাল প্রাচীর", + "উষ্ণপ্রস্রবণ", + "উপকূল", + "উপত্যকা", + "আগ্নেয়গিরি", + "জামাই", + "টয়লেট পেপার" + ] + ], + "OR": [ + [ + 5, + 16, + 48, + 51, + 103, + 122, + 148, + 254, + 259, + 272, + 274, + 288, + 289, + 291, + 292, + 293, + 308, + 309, + 310, + 313, + 338, + 340, + 341, + 344, + 352, + 355, + 360, + 368, + 372, + 387, + 398, + 426, + 437, + 456, + 462, + 463, + 468, + 470, + 487, + 508, + 525, + 541, + 549, + 558, + 587, + 591, + 614, + 657, + 668, + 670, + 673, + 677, + 679, + 711, + 730, + 748, + 762, + 766, + 778, + 783, + 806, + 866, + 879, + 882, + 889, + 916, + 928, + 963, + 971, + 974, + 979 + ], + [ + "ବିଜୁଳି ଶାଙ୍କୁଚ", + "ବୁଲବୁଲ୍", + "କୋମୋଡ଼ୋ ଡ୍ରାଗନ", + "Diceratus", + "ପ୍ଲାଟିପସ", + "ଆମେରିକୀୟ ଚିଙ୍ଗୁଡି", + "ଘାତକ ତିମି", + "ପଗ୍ (କୁକୁର ପ୍ରଜାତି)", + "ପୋମେରାନିଆନ", + "କୋୟୋଟ", + "ବଳିଆ କୁକୁର", + "କଲରାପତରିଆ ବାଘ", + "ହିମ କଲରାପତ୍ରିଆ ବାଘ (ସ୍ନୋ ଲେପର୍ଡ୍)", + "ସିଂହ", + "ବାଘ", + "ଚିତାବାଘ", + "ମାଛି", + "ମହୁମାଛି", + "ପିମ୍ପୁଡି", + "କାଠିପୋକ", + "ଗିନି ପିଗ", + "ଜେବ୍ରା", + "ଘୁସୁରି", + "ହିପୋପୋଟାମସ", + "ଇମ୍ପାଲା", + "ଲାମା", + "ଓଧ", + "ଗିବନ", + "ବବୁନ୍ ମାଙ୍କଡ଼", + "ଲାଲ ପାଣ୍ଡା", + "ଆବାକସ୍", + "ବାରୋମିଟର", + "ବତିଘର", + "କୋଦଣ୍ଡ", + "ଝାଡୁ", + "ବାଲଟି", + "ଟ୍ୟାକ୍ସି", + "ବତି", + "ମୋବାଇଲ ଫୋନ", + "କମ୍ପ୍ୟୁଟର କିବୋର୍ଡ଼", + "ବନ୍ଧ", + "ଢାପ", + "ଲିଭୋପା", + "ବଂଶୀ", + "ହାତୁଡ଼ି", + "ରୁମାଲ", + "କିମୋନୋ", + "କ୍ଷେପଣାସ୍ତ୍ର", + "ମସଜିଦ୍", + "ସ୍କୁଟର", + "ମାଉସ", + "କଣ୍ଟା", + "ମାଳା", + "ସୁଗନ୍ଧି", + "ଲଙ୍ଗଳ", + "ଗାଞ୍ଜିଆ", + "ଭୋଜନାଳୟ", + "ରୋଟିସେରି", + "ତରାଜୁ", + "ପେଞ୍ଚ", + "ମୋଜା", + "ଟ୍ରାକ୍ଟର", + "ଛତା", + "ଭ୍ୟାକୁମ୍ କ୍ଲିନର୍", + "ଭାଓଲିନ", + "ୱେବସାଇଟ", + "ଆଇସ କ୍ରୀମ", + "ପିଜା", + "ବୁଦ୍ ବୁଦ୍", + "ଉଷ୍ମୋତ୍ସ", + "ଉପତ୍ୟକା" + ] + ], + "MY": [ + [ + 1, + 9, + 16, + 21, + 22, + 23, + 34, + 39, + 48, + 49, + 61, + 65, + 71, + 79, + 80, + 85, + 88, + 89, + 91, + 93, + 94, + 99, + 100, + 103, + 105, + 107, + 108, + 114, + 124, + 125, + 127, + 129, + 133, + 139, + 141, + 144, + 145, + 148, + 149, + 150, + 151, + 172, + 231, + 248, + 269, + 272, + 273, + 274, + 275, + 276, + 277, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 305, + 307, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 319, + 327, + 331, + 334, + 337, + 338, + 340, + 341, + 342, + 344, + 346, + 348, + 353, + 355, + 357, + 360, + 362, + 365, + 366, + 367, + 368, + 376, + 385, + 387, + 388, + 390, + 394, + 398, + 400, + 401, + 403, + 405, + 407, + 413, + 415, + 418, + 420, + 421, + 426, + 427, + 428, + 430, + 435, + 437, + 447, + 454, + 456, + 462, + 463, + 464, + 468, + 470, + 478, + 480, + 481, + 483, + 487, + 488, + 490, + 497, + 498, + 502, + 508, + 513, + 516, + 525, + 534, + 541, + 546, + 549, + 555, + 557, + 558, + 576, + 587, + 591, + 593, + 594, + 606, + 608, + 612, + 614, + 618, + 619, + 620, + 625, + 626, + 632, + 642, + 643, + 650, + 651, + 668, + 669, + 673, + 677, + 679, + 683, + 687, + 688, + 692, + 696, + 701, + 711, + 713, + 719, + 721, + 730, + 743, + 748, + 760, + 762, + 764, + 769, + 771, + 775, + 776, + 777, + 783, + 784, + 786, + 787, + 792, + 795, + 798, + 806, + 816, + 823, + 830, + 832, + 833, + 834, + 835, + 837, + 844, + 845, + 847, + 857, + 862, + 866, + 870, + 875, + 882, + 883, + 885, + 889, + 893, + 911, + 916, + 920, + 928, + 938, + 943, + 957, + 958, + 963, + 971, + 973, + 979, + 980 + ], + [ + "ရွှေငါး", + "ငှက်ကုလားအုတ်", + "ဗွတ်ကလုံ", + "စွန် (ငှက်)", + "ခေါင်းပြောင်ဝန်လူငှက်", + "လင်းတ", + "ဇင်းကြောလိပ်", + "အီဂွားနာဖွတ်", + "ကိုမိုဒိုနဂါး", + "နိုင်းမိကျောင်း", + "စပါးကြီးမြွေ", + "ပင်လယ်ဂျပ်မြွေ", + "ကင်းမြီးကောက်", + "ကင်းခြေများ", + "ခြေမွေးမဲ့ရစ်နက်", + "ငုံး", + "မကောကြက်တူရွေး", + "အမောက်ဝါကတ္တဝါ", + "ဘုတ်ငှက်", + "အောက်ချင်းငှက်", + "ငှက်ပိတုန်း", + "ဘဲငန်း မျိုးနွယ်စု", + "ငန်းနက်", + "ဘဲတူဖျံတူကောင်", + "ကွားလားကောင်", + "ပင်လယ်ရေခူ", + "ပင်လယ် အနီမိုနီ", + "ပက်ကျိ", + "ကျောက်ပုစွန်", + "ဝင်ကစွပ်", + "ထုံးစပ်ဖြူငှက်", + "ဇွန်းနှုတ်သီးငှက်", + "ရေဘုတ်", + "ရေညှောင့်ရင်မဲ", + "ခြေနီငှက်", + "ဝန်ပိုငှက်", + "ကင်း ပင်ဂွင်း", + "အော်ကာ", + "ရေဝက်", + "ပင်လယ်ခြင်္သေ့ဖျံ", + "ချီဟွာဟွာ", + "ဝှစ်ပက်", + "ကိုလီခွေး", + "ဟတ်စကီခွေး", + "ဝံပုလွေ", + "ကွိုင်းယုတ်", + "ဒင်ဂိုးခွေးရိုင်း", + "တောခွေး", + "အာဖရိက တောခွေး", + "ဟိုင်အီးနား", + "မြေခွေးနီ", + "ကူဂါ", + "ကြောင်မြီးတို", + "ကျားသစ်", + "နှင်းကျားသစ်", + "ဂျိုက်ဂွါး", + "ခြင်္သေ့", + "ဗျဂ္ဃ", + "သစ်ကျုတ်", + "ဝက်ဝံညို", + "အမေရိကန် ဝက်ဝံနက်", + "ဝင်ရိုးစွန်းဝက်ဝံ", + "မြွေပါ", + "ချေးထိုးပိုး", + "ဆင်ပိုး", + "ယင်ကောင်", + "ပျား", + "ပုရွက်ဆိတ်", + "ပုရစ်", + "ပိုးဟပ်", + "မောင်းထောင်းကောင်", + "ပုစဉ်းရင်ကွဲ", + "ပုစဉ်း", + "ရေလက်ဝါး", + "ကွင်းယုန်", + "ဖြူ", + "ဘီဗာဖျံ", + "ပူး", + "မြင်းကျား", + "ဝက်", + "တောဝက်", + "ရေမြင်း", + "ကျွဲ", + "သိုးထီး", + "ဂက်ဇယ်ဆိတ်", + "လာမာကုလားအုတ်", + "မြွေပါမွေးရှည်", + "ဖျံ", + "ခွေးတူဝက်တူ", + "လူဝံ", + "ဂေါ်ရီးလားမျောက်ဝံ", + "ချင်ပန်ဇီမျောက်", + "မျောက်လွှဲကျော်", + "နှာတံရှည်မျောက်", + "အာရှဆင်", + "ပန်ဒါနီ", + "ပန်ဒါဝက်ဝံကြီး", + "ငါးရှဉ့်", + "စတားဂျင်", + "ပေသီး", + "ဘွဲ့ဝတ်စုံ", + "အကော်ဒီယံ", + "လေယာဉ်တင်သင်္ဘော", + "လေသင်္ဘော", + "အရေးပေါ်လူနာတင်ယာဉ်", + "ချေမှုန်းရေးရိုင်ဖယ်", + "မုန့်ဖုတ်ရုံ", + "ဘောပွိုင့်ပင်", + "ဘင်ဂျို", + "နရန်း", + "ဗရိုမီတာ", + "စည်ပိုင်း", + "တစ်ဘီး လက်တွန်းလှည်း", + "ဘတ်စကက်ဘော", + "ရေချိုးကန်", + "မီးပြတိုက်", + "မှန်ပြောင်း", + "စာအုပ်ဆိုင်", + "လေး", + "တံမြက်စည်း", + "ပုံး", + "ထိကပေါက်", + "တက္ကစီ", + "ဖယောင်းတိုင်", + "ကာတွန်း", + "ပိုက်ဆံထုတ်စက်", + "ကက်ဆက်", + "ရဲတိုက်", + "မိုဘိုင်းလ်ဖုန်း", + "သံကြိုး", + "သံချပ်", + "အသင်းတော်ကို", + "ရုပ်ရှင်ရုံ", + "ဂဲတ (ဖိနပ်)", + "လက်နှိပ်ကွက်", + "ထရမ်းပက်", + "ပုခက်", + "ရေကာတာ", + "ပန်းကန်ဆေးစက်", + "စည်", + "လျှပ်စစ်ဂစ်တာ", + "စာအိတ်", + "မီးသတ်ကား", + "အလံတိုင်", + "ပလွေ", + "ဂွန်ဒိုလာ", + "တူ(ကိရိယာ)", + "လက်ကိုင်ပဝါ", + "ဘာဂျာ", + "စောင်း", + "မီးပူ", + "ဂျင်းဘောင်းဘီ", + "လန်ချား", + "ကီမိုနို", + "မှုတ်", + "စလောင်း", + "လက်ပ်တော့ပ် ကွန်ပျူတာ", + "သက်ကယ်လှေ", + "မီးခြစ်", + "အော်လန်", + "ပတ္တလား", + "မျက်နှာဖုံး", + "မိုက်", + "မိုက်ခရိုဝေ့မီးဖို", + "ဗလီ", + "ခြင်ထောင်", + "ကြွက်", + "သံမှို", + "ဘယက်", + "အိုဘိုး", + "ပြွန်အော်ဂင်", + "အော်ဆီလိုစကုပ်", + "အထုပ်", + "စုတ်တံ", + "လေထီး", + "ရေမွှေး", + "မိတ္တူကူးစက်", + "စုဘူး", + "ခေါင်းအုံး", + "ထယ်", + "အကျဉ်းထောင်", + "ပိုက်ဆံအိတ်", + "ရေခဲသေတ္တာ", + "စားသောက်ဆိုင်", + "ရိုင်ဖယ်", + "မျည်းတံ", + "မီးခံသေတ္တာ", + "ထဘီ", + "ဆက်ဆိုဟွန်း", + "ဓားအိမ်", + "ဝက်အူ", + "ဝက်အူလှည့်", + "အပ်ချုပ်စက်", + "ကာ", + "ဂေါ်", + "နှင်းလျှောစီး", + "သင်္ချာလျှောတံ", + "ခြေစွပ်", + "ချည်လုံး", + "နားကြပ်", + "ထမ်းစင်", + "စေတီ", + "ရေငုပ်သင်္ဘော", + "ဝတ်စုံ", + "နေ နာရီ", + "မျက်မှန်", + "ခလုတ်", + "ပြွတ်", + "တင့်ကားများ", + "ပလ္လင်", + "မီးတုတ်", + "ထွန်စက်", + "သုံးဘီးစက်ဘီး", + "ထရွမ်းဗုန်း", + "ဖုန်စုပ်စက်", + "ပန်းအိုး", + "ကတ္တီပါ", + "တယော", + "ပိုက်ဆံအိတ်", + "သိုးမွေး", + "ဝက်ဘ်ဆိုဒ်", + "အသွားအလာအလင်း", + "ရေခဲမုန့်", + "ပန်းဂေါ်ဖီ", + "သခွား", + "သလဲသီး", + "မြက်ခြောက်", + "ပီဇာ", + "ပူဖောင်း", + "သန္တာကျောက်တန်း", + "တောင်ကြား", + "မီးတောင်" + ] + ], + "EN": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999 + ], + [ + "Tinca tinca", + "goldfish", + "man-eating shark", + "tiger shark", + "hammerhead", + "numbfish", + "stingray", + "cock", + "hen", + "Struthio camelus", + "brambling", + "goldfinch", + "linnet", + "snowbird", + "indigo bird", + "Turdus migratorius", + "bulbul", + "jay", + "magpie", + "chickadee", + "water ouzel", + "kite", + "American eagle", + "vulture", + "great gray owl", + "European fire salamander", + "common newt", + "eft", + "spotted salamander", + "axolotl", + "Rana catesbeiana", + "tree-frog", + "Ascaphus trui", + "Caretta caretta", + "leatherback turtle", + "mud turtle", + "terrapin", + "box turtle", + "banded gecko", + "Iguana iguana", + "anole", + "whiptail lizard", + "agama", + "Chlamydosaurus kingi", + "alligator lizard", + "Heloderma suspectum", + "Lacerta viridis", + "African chameleon", + "giant lizard", + "Crocodylus niloticus", + "Alligator mississipiensis", + "triceratops", + "worm snake", + "ring snake", + "puff adder", + "grass snake", + "king snake", + "garter snake", + "water snake", + "vine snake", + "night snake", + "boa constrictor", + "rock snake", + "Naja naja", + "green mamba", + "sea snake", + "horned viper", + "Crotalus adamanteus", + "Crotalus cerastes", + "trilobite", + "daddy longlegs", + "scorpion", + "black and gold garden spider", + "Araneus cavaticus", + "Aranea diademata", + "Latrodectus mactans", + "tarantula", + "hunting spider", + "tick", + "centipede", + "black grouse", + "ptarmigan", + "Bonasa umbellus", + "prairie grouse", + "peacock", + "quail", + "partridge", + "African gray", + "macaw", + "Cacatua galerita", + "lorikeet", + "coucal", + "bee eater", + "hornbill", + "hummingbird", + "jacamar", + "toucan", + "drake", + "red-breasted merganser", + "goose", + "black swan", + "tusker", + "anteater", + "duck-billed platypus", + "brush kangaroo", + "native bear", + "wombat", + "jellyfish", + "anemone", + "brain coral", + "platyhelminth", + "nematode", + "conch", + "snail", + "slug", + "sea slug", + "sea cradle", + "chambered nautilus", + "Dungeness crab", + "rock crab", + "fiddler crab", + "Alaska crab", + "American lobster", + "crayfish", + "crawfish", + "hermit crab", + "isopod", + "white stork", + "Ciconia nigra", + "spoonbill", + "flamingo", + "little blue heron", + "great white heron", + "bittern", + "crane", + "limpkin", + "Porphyrio porphyrio", + "Fulica americana", + "bustard", + "Arenaria interpres", + "Erolia alpina", + "redshank", + "dowitcher", + "oystercatcher", + "Pelecanus", + "Aptenodytes patagonica", + "mollymawk", + "Eschrichtius gibbosus", + "killer whale", + "dugong", + "sea lion", + "Chihuahua", + "Japanese spaniel", + "Maltese terrier", + "Pekinese", + "Shih-Tzu", + "Blenheim spaniel", + "papillon", + "toy terrier", + "Rhodesian ridgeback", + "Afghan", + "basset hound", + "beagle", + "bloodhound", + "bluetick", + "black-and-tan coonhound", + "Walker foxhound", + "English foxhound", + "redbone", + "borzoi", + "Irish wolfhound", + "Italian greyhound", + "whippet", + "Ibizan hound", + "Norwegian elkhound", + "otterhound", + "gazelle hound", + "Scottish deerhound", + "Weimaraner", + "Staffordshire bull terrier", + "American pit bull terrier", + "Bedlington terrier", + "Border terrier", + "Kerry blue terrier", + "Irish terrier", + "Norfolk terrier", + "Norwich terrier", + "Yorkshire terrier", + "wire-haired fox terrier", + "Lakeland terrier", + "Sealyham", + "Airedale terrier", + "cairn", + "Australian terrier", + "Dandie Dinmont terrier", + "Boston bull", + "miniature schnauzer", + "giant schnauzer", + "standard schnauzer", + "Scottish terrier", + "chrysanthemum dog", + "silky terrier", + "soft-coated wheaten terrier", + "West Highland white terrier", + "Lhasa", + "flat-coated retriever", + "curly-coated retriever", + "golden retriever", + "Labrador retriever", + "Chesapeake Bay retriever", + "German short-haired pointer", + "vizsla", + "English setter", + "Irish setter", + "Gordon setter", + "Brittany spaniel", + "clumber spaniel", + "English springer", + "Welsh springer spaniel", + "cocker spaniel", + "Sussex spaniel", + "Irish water spaniel", + "kuvasz", + "schipperke", + "groenendael", + "malinois", + "briard", + "kelpie", + "komondor", + "Old English sheepdog", + "Shetland sheep dog", + "collie", + "Border collie", + "Bouviers des Flandres", + "Rottweiler", + "German police dog", + "Doberman", + "miniature pinscher", + "Greater Swiss Mountain dog", + "Bernese mountain dog", + "Appenzeller", + "EntleBucher", + "boxer", + "bull mastiff", + "Tibetan mastiff", + "French bulldog", + "Great Dane", + "Saint Bernard", + "Eskimo dog", + "Alaskan malamute", + "Siberian husky", + "dalmatian", + "monkey dog", + "basenji", + "pug-dog", + "Leonberg", + "Newfoundland", + "Great Pyrenees", + "Samoyede", + "Pomeranian", + "chow", + "keeshond", + "Brabancon griffon", + "Pembroke", + "Cardigan", + "toy poodle", + "miniature poodle", + "standard poodle", + "Mexican hairless", + "timber wolf", + "white wolf", + "Canis niger", + "prairie wolf", + "Canis dingo", + "Cuon alpinus", + "Cape hunting dog", + "hyena", + "Vulpes vulpes", + "kit fox", + "Arctic fox", + "grey fox", + "tabby cat", + "tiger cat", + "Persian cat", + "Siamese cat", + "Egyptian cat", + "Felis concolor", + "lynx", + "leopard", + "ounce", + "panther", + "lion", + "tiger", + "cheetah", + "brown bear", + "black bear", + "Thalarctos maritimus", + "sloth bear", + "mongoose", + "mierkat", + "tiger beetle", + "ladybug", + "ground beetle", + "longicorn", + "leaf beetle", + "dung beetle", + "rhinoceros beetle", + "weevil", + "fly", + "bee", + "Formicidae", + "grasshopper", + "cricket", + "walkingstick", + "cockroach", + "mantis", + "cicala", + "leafhopper", + "lacewing", + "mosquito hawk", + "damselfly", + "admiral", + "ringlet butterfly", + "monarch", + "cabbage butterfly", + "sulfur butterfly", + "lycaenid", + "sea star", + "sea urchin", + "sea cucumber", + "wood rabbit", + "hare", + "Angora rabbit", + "hamster", + "porcupine", + "Sciurus niger", + "marmot", + "beaver", + "guinea pig", + "sorrel", + "zebra", + "grunter", + "boar", + "warthog", + "hippopotamus", + "ox", + "Asiatic buffalo", + "bison", + "tup", + "bighorn", + "Capra ibex", + "hartebeest", + "Aepyceros melampus", + "gazelle", + "dromedary", + "llama", + "weasel", + "mink", + "foulmart", + "Mustela nigripes", + "otter", + "skunk", + "badger", + "armadillo", + "Bradypus tridactylus", + "orangutang", + "Gorilla gorilla", + "Pan troglodytes", + "Hylobates lar", + "siamang", + "guenon", + "patas", + "baboon", + "macaque", + "langur", + "colobus monkey", + "Nasalis larvatus", + "marmoset", + "capuchin", + "howler", + "titi monkey", + "Ateles geoffroyi", + "Saimiri sciureus", + "Lemur catta", + "Indri indri", + "Indian elephant", + "Loxodonta africana", + "panda", + "giant panda", + "barracouta", + "eel", + "cohoe", + "Holocanthus tricolor", + "anemone fish", + "sturgeon", + "Lepisosteus osseus", + "lionfish", + "blowfish", + "abacus", + "abaya", + "academic gown", + "accordion", + "acoustic guitar", + "aircraft carrier", + "airliner", + "airship", + "altar", + "ambulance", + "amphibious vehicle", + "analog clock", + "bee house", + "apron", + "ashcan", + "assault rifle", + "backpack", + "bakehouse", + "balance beam", + "balloon", + "Biro", + "Band Aid", + "banjo", + "balustrade", + "barbell", + "barber chair", + "barbershop", + "barn", + "barometer", + "cask", + "garden cart", + "baseball", + "basketball", + "bassinet", + "bassoon", + "swimming cap", + "bath towel", + "bath", + "estate car", + "lighthouse", + "beaker", + "shako", + "beer bottle", + "beer glass", + "bell cot", + "bib", + "bicycle-built-for-two", + "bikini", + "binder", + "field glasses", + "birdhouse", + "boathouse", + "bobsleigh", + "bola", + "poke bonnet", + "bookcase", + "bookshop", + "bottlecap", + "bow", + "bow tie", + "brass", + "brassiere", + "groin", + "breastplate", + "broom", + "pail", + "buckle", + "bulletproof vest", + "bullet train", + "butcher shop", + "taxi", + "caldron", + "candle", + "cannon", + "canoe", + "can opener", + "cardigan", + "car mirror", + "carrousel", + "carpenter's kit", + "carton", + "car wheel", + "automated teller", + "cassette", + "cassette player", + "castle", + "catamaran", + "CD player", + "violoncello", + "cellphone", + "chain", + "chainlink fence", + "chain mail", + "chain saw", + "chest", + "chiffonier", + "gong", + "china cabinet", + "Christmas stocking", + "church building", + "movie theater", + "chopper", + "cliff dwelling", + "cloak", + "sabot", + "cocktail shaker", + "coffee mug", + "coffeepot", + "helix", + "combination lock", + "keypad", + "confectionary", + "containership", + "convertible", + "corkscrew", + "trumpet", + "cowboy boot", + "ten-gallon hat", + "cradle", + "crane", + "crash helmet", + "crate", + "crib", + "Crock Pot", + "croquet ball", + "crutch", + "cuirass", + "dam", + "desk", + "desktop computer", + "dial telephone", + "napkin", + "digital clock", + "digital watch", + "dining table", + "dishcloth", + "dishwashing machine", + "disk brake", + "dockage", + "dog sleigh", + "dome", + "welcome mat", + "drilling platform", + "drum", + "drumstick", + "dumbbell", + "Dutch oven", + "blower", + "electric guitar", + "electric locomotive", + "entertainment center", + "envelope", + "espresso maker", + "face powder", + "feather boa", + "file", + "fireboat", + "fire engine", + "fire screen", + "flagpole", + "flute", + "folding chair", + "football helmet", + "forklift", + "fountain", + "fountain pen", + "four-poster", + "freight car", + "French horn", + "skillet", + "fur coat", + "dustcart", + "gasmask", + "petrol pump", + "goblet", + "go-kart", + "golf ball", + "golfcart", + "gondola", + "gong", + "gown", + "grand", + "greenhouse", + "grille", + "grocery", + "guillotine", + "hair slide", + "hair spray", + "half track", + "hammer", + "hamper", + "blow drier", + "hand-held microcomputer", + "handkerchief", + "fixed disk", + "mouth organ", + "harp", + "reaper", + "hatchet", + "holster", + "home theater", + "honeycomb", + "claw", + "hoopskirt", + "horizontal bar", + "horse cart", + "hourglass", + "iPod", + "iron", + "jack-o'-lantern", + "jeans", + "jeep", + "long-sleeved t-shirt", + "jigsaw puzzle", + "ricksha", + "joystick", + "kimono", + "knee pad", + "knot", + "laboratory coat", + "ladle", + "lampshade", + "laptop", + "lawn mower", + "lens cap", + "letter opener", + "library", + "lifeboat", + "light", + "limo", + "liner", + "lip rouge", + "Loafer", + "lotion", + "loudspeaker", + "jeweler's loupe", + "lumbermill", + "magnetic compass", + "mailbag", + "letter box", + "maillot", + "tank suit", + "manhole cover", + "maraca", + "marimba", + "mask", + "matchstick", + "maypole", + "maze", + "measuring cup", + "medicine cabinet", + "megalithic structure", + "mike", + "microwave oven", + "military uniform", + "milk can", + "minibus", + "mini", + "minivan", + "missile", + "mitten", + "mixing bowl", + "manufactured home", + "Model T", + "modem", + "monastery", + "monitor", + "moped", + "mortar", + "mortarboard", + "mosque", + "mosquito net", + "motor scooter", + "all-terrain bike", + "mountain tent", + "mouse", + "mousetrap", + "moving van", + "muzzle", + "nail (fastener)", + "neck brace", + "necklace", + "nipple", + "notebook computer", + "obelisk", + "oboe", + "ocarina", + "odometer", + "oil filter", + "pipe organ", + "cathode-ray oscilloscope", + "overskirt", + "oxcart", + "oxygen mask", + "packet", + "boat paddle", + "paddle wheel", + "padlock", + "paintbrush", + "jammies", + "palace", + "pandean pipe", + "paper towel", + "parachute", + "bars", + "park bench", + "parking meter", + "passenger car", + "patio", + "pay-station", + "plinth", + "pencil case", + "pencil sharpener", + "perfume", + "Petri dish", + "photocopier", + "plectrum", + "pickelhaube", + "picket fence", + "pickup truck", + "pier", + "penny bank", + "pill bottle", + "pillow", + "ping-pong ball", + "pinwheel", + "pirate", + "ewer", + "carpenter's plane", + "planetarium", + "plastic bag", + "plate rack", + "plough", + "plumber's helper", + "Polaroid Land camera", + "pole", + "wagon", + "poncho", + "snooker table", + "pop bottle", + "pot", + "potter's wheel", + "power drill", + "prayer rug", + "printer", + "prison", + "projectile", + "projector", + "hockey puck", + "punching ball", + "purse", + "quill", + "comforter", + "racing car", + "racket (sports equipment)", + "radiator", + "radio", + "radio telescope", + "rain barrel", + "RV", + "reel", + "reflex camera", + "refrigerator", + "remote control", + "eating house", + "revolver", + "rifle", + "rocker", + "rotisserie", + "rubber eraser", + "rugby ball", + "ruler", + "running shoe", + "safe", + "safety pin", + "saltshaker", + "sandal", + "sarong", + "sax", + "scabbard", + "weighing machine", + "school bus", + "schooner", + "scoreboard", + "screen", + "screw", + "screwdriver", + "seat belt", + "sewing machine", + "buckler", + "shoe-shop", + "shoji", + "shopping basket", + "shopping cart", + "shovel", + "shower cap", + "shower curtain", + "ski", + "ski mask", + "sleeping bag", + "slipstick", + "sliding door", + "one-armed bandit", + "snorkel", + "snowmobile", + "snowplough", + "soap dispenser", + "soccer ball", + "sock", + "solar collector", + "sombrero", + "soup bowl", + "space bar", + "space heater", + "space shuttle", + "spatula", + "speedboat", + "spider web", + "spindle", + "sport car", + "spot", + "stage", + "steam locomotive", + "steel arch bridge", + "steel drum", + "stethoscope", + "stole", + "stone wall", + "stop watch", + "stove", + "strainer", + "trolley car", + "stretcher", + "studio couch", + "stupa", + "submarine", + "suit of clothes", + "sundial", + "sunglass", + "shades", + "sunblock", + "suspension bridge", + "swab", + "sweatshirt", + "swimming trunks", + "swing", + "electrical switch", + "syringe", + "table lamp", + "armored combat vehicle", + "tape player", + "teapot", + "teddy bear", + "television", + "tennis ball", + "thatch", + "theater curtain", + "thimble", + "threshing machine", + "throne", + "tile roof", + "toaster", + "tobacconist", + "toilet seat", + "torch", + "totem pole", + "tow truck", + "toyshop", + "tractor", + "rig", + "tray", + "trench coat", + "tricycle", + "trimaran", + "tripod", + "triumphal arch", + "trolleybus", + "trombone", + "tub", + "turnstile", + "typewriter keyboard", + "umbrella", + "unicycle", + "upright", + "vacuum cleaner", + "vase", + "vault", + "velvet", + "vending machine", + "vestment", + "viaduct", + "violin", + "volleyball", + "waffle iron", + "wall clock", + "billfold", + "closet", + "warplane", + "handbasin", + "washing machine", + "water bottle", + "water jug", + "water tower", + "whiskey jug", + "whistle", + "wig", + "window screen", + "window shade", + "Windsor tie", + "wine bottle", + "wing", + "wok", + "wooden spoon", + "wool", + "snake-rail fence", + "wreck", + "yawl", + "yurt", + "website", + "comic book", + "crossword", + "street sign", + "traffic light", + "dust jacket", + "menu", + "plate", + "guacamole", + "consomme", + "hotpot", + "trifle", + "ice cream", + "lollipop", + "French loaf", + "beigel", + "pretzel", + "cheeseburger", + "hot dog", + "mashed potato", + "head cabbage", + "broccoli", + "cauliflower", + "courgette", + "spaghetti squash", + "acorn squash", + "butternut squash", + "cuke", + "artichoke", + "bell pepper", + "cardoon", + "mushroom", + "Granny Smith", + "strawberry", + "orange", + "lemon", + "fig", + "ananas", + "banana", + "jack", + "custard apple", + "pomegranate", + "hay", + "carbonara", + "chocolate sauce", + "dough", + "meat loaf", + "pizza", + "potpie", + "burrito", + "red wine", + "espresso", + "cup", + "eggnog", + "alp", + "bubble", + "drop", + "coral reef", + "geyser", + "lakeside", + "foreland", + "sandbar", + "seashore", + "valley", + "volcano", + "baseball player", + "bridegroom", + "scuba diver", + "rapeseed", + "daisy", + "Cypripedium parviflorum", + "corn", + "acorn", + "hip", + "buckeye", + "coral fungus", + "agaric", + "gyromitra", + "carrion fungus", + "earthstar", + "Polyporus frondosus", + "bolete", + "capitulum", + "bathroom tissue" + ] + ], + "PS": [ + [ + 2, + 9, + 11, + 17, + 18, + 21, + 23, + 45, + 46, + 51, + 63, + 69, + 71, + 78, + 86, + 92, + 93, + 94, + 99, + 107, + 108, + 123, + 134, + 138, + 144, + 148, + 162, + 277, + 279, + 291, + 292, + 296, + 300, + 302, + 309, + 310, + 319, + 320, + 333, + 334, + 341, + 344, + 347, + 350, + 354, + 355, + 360, + 385, + 386, + 388, + 393, + 401, + 426, + 428, + 447, + 456, + 462, + 463, + 468, + 470, + 472, + 480, + 481, + 483, + 486, + 487, + 488, + 491, + 497, + 498, + 517, + 525, + 527, + 541, + 549, + 558, + 587, + 591, + 606, + 620, + 632, + 643, + 650, + 668, + 677, + 679, + 682, + 688, + 741, + 760, + 762, + 769, + 787, + 823, + 833, + 837, + 845, + 847, + 849, + 862, + 882, + 883, + 885, + 893, + 928, + 938, + 957, + 963, + 971, + 973, + 979, + 980 + ], + [ + "لوي سپين شارک", + "شترمرغ‎", + "سايره", + "ټغ", + "کاغۍ", + "ټپوس", + "کجير", + "گيلا هيولا", + "اروپایی زرغون څرموښکۍ", + "تریسراتوپس", + "هندي څمڅه منگور", + "ټریلوبیټ", + "لړم", + "خمندک", + "تارو", + "کورکوړۍ", + "پوپ تنی ډوله مرغان", + "شکرخوره", + "بته‎", + "مېډوسا", + "سمندري شقايق", + "کریفش", + "زاڼۍ‎", + "څاړى", + "کوتان", + "وژونکی نهنگ", + "بیګل", + "سره گيدړه", + "قطبي گيدړ", + "زمری", + "پړانگ", + "قطبي اېږ", + "پړانگی گونگټه", + "ځمکنی غوزاړی", + "غلاوزه‎", + "مېږی", + "ستن", + "څمڅلکی", + "هامستر", + "شکوڼ", + "اهلي خوگ", + "د اوبو آس", + "بيژکۍ", + "الپاین غرڅه", + "عربي اوښ", + "لاما", + "اوبسپی", + "آسیايي بیل", + "افریقايي پیل", + "لوی پانډا", + "کلون مایي", + "اکوردیون‎", + "بارومتر/فشار سنجونکې آله", + "لاس ګاډی‎", + "لروين", + "ليندۍ‎", + "رېبز‎", + "ډولچه‎", + "ټکسي‎", + "شمعه‎", + "کنوه‎", + "د صرافی ماشین", + "کسېټ‎", + "کلا", + "رالیږونکي‎", + "گرځنده غږلېږدی", + "زنځير‎", + "زنځيري غوڅندۍ", + "کنيسه‎", + "سينما", + "درونکښ", + "بند", + "مېزپاسی سولگر", + "ډمبک‎", + "پاکټ‎", + "فلوټ‎", + "څټک", + "دستمال‎", + "اوتو‎", + "ورونپاسی", + "لوړغږی", + "نقاب‎", + "غږتاندی", + "جومات", + "مېخ", + "همېل‎", + "تخن", + "اوسېلوسکوپ", + "مصلا‎", + "يخوونکی‎", + "رستوران‎", + "خط کښ‎", + "سپر‎", + "ستِتوسکوپ", + "اوبتل", + "د لمر ضد عینکې", + "پېچکاري‎", + "شوبله", + "چايبر‎", + "مشعل‎", + "برقي جارو‎", + "ګلدان‎", + "مخمل‎", + "امياني‎", + "سړوپۍ‎", + "گوبي‎", + "انار‎", + "پيزا‎", + "حباب‎", + "مرجاني ډبرې", + "وادي‎", + "اورشيندی" + ] + ], + "FI": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 54, + 55, + 56, + 57, + 58, + 59, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 156, + 157, + 158, + 159, + 160, + 161, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 223, + 224, + 225, + 226, + 227, + 229, + 230, + 231, + 232, + 233, + 235, + 236, + 237, + 238, + 239, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 393, + 394, + 395, + 396, + 397, + 398, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 949, + 950, + 951, + 952, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999 + ], + [ + "suutari", + "Kultakala", + "ihmissyöjä (eläin)", + "tiikerihai", + "Vasarahait", + "sähkörauskukalat", + "keihäsrauskut", + "kukko", + "naaraslintu", + "strutsi", + "järripeippo", + "amerikantikli", + "pihapunavarpunen", + "Junkot", + "Indigokardinaali", + "punarintarastas", + "bulbuli", + "närhi", + "harakka", + "tiainen", + "Koskikarat", + "haarahaukka", + "valkopäämerikotka", + "Korppikotkat", + "lapinpöllö", + "tulisalamanteri", + "vesilisko", + "vesilisko", + "Täpläsalamanteri", + "Aksolotli", + "härkäsammakko", + "puusammakko", + "häntäsammakko", + "valekarettikilpikonna", + "merinahkakilpikonna", + "liejukilpikonna", + "suokilpikonna", + "Kotelokilpikonnat", + "juovagekko", + "leguaani", + "karolinananolis", + "piiskahäntälisko", + "agamat (suku)", + "kauluslisko", + "alligaattorilisko", + "Gilalisko", + "Vihersisilisko", + "afrikkalainen kameleontti", + "komodonvaraani", + "niilinkrokotiili", + "mississippinalligaattori", + "hirmulisko", + "mokkasiinikäärme", + "Heterodon", + "viherkarkeakäärme", + "Kuningaskäärmeet", + "sukkanauhakäärmeet", + "vesikäärme", + "viinikäärme", + "Kuningasboa", + "kalliokäärme", + "silmälasikäärme", + "vihreä mamba", + "Merikäärmeet", + "Sarvikyy", + "timanttikalkkarokäärme", + "kalkkarokäärme", + "trilobiitti", + "lukki", + "skorpioni", + "tarhahämähäkki", + "hämähäkki", + "ristilukki", + "mustaleski", + "tarantelihämähäkki", + "juoksuhämähäkki", + "puutiaiset", + "juoksujalkainen", + "teeri", + "kiiruna", + "röyhelöpyy", + "preeriakana", + "riikinkukko", + "viiriäinen", + "peltopyy", + "Harmaapapukaija", + "kultatöyhtökakadu", + "sateenkaariluri", + "kukaali", + "mehiläissyöjä", + "sarvinokka", + "kolibri", + "jakamari", + "tukaani", + "urossorsa", + "tukkakoskelo", + "hanhi", + "mustajoutsen", + "torahampainen", + "Nokkasiilit", + "vesinokkaeläin", + "vallabi", + "pussikarhu", + "vompatti", + "meduusa", + "merivuokot", + "aivokoralli", + "laakamato", + "sukkulamadot", + "kotilo", + "kotilo", + "etana", + "vapaakiduskotilo", + "nivelkotilot", + "helmivene", + "luolataskurapu", + "taskurapu", + "viittoilijaravut", + "Kiviravut", + "amerikanhummeri", + "langusti", + "Ravut", + "Erakkoravut", + "siira", + "Kattohaikara", + "mustahaikara", + "kapustahaikarat", + "Flamingot", + "sinihaikara", + "jalohaikara", + "nokihaikara", + "kurki", + "kotilokurki", + "sulttaanikana", + "amerikannokikana", + "trappi", + "karikukko", + "Suosirri", + "viklo", + "Kurppelot", + "meriharakka", + "pelikaani", + "kuningaspingviini", + "albatrossit", + "harmaavalas", + "miekkavalas", + "Dugongi", + "merileijonat", + "chihuahua (koira)", + "japaninspanieli", + "maltankoira", + "kiinanpalatsikoira", + "Blenheimin spanieli", + "papillon (koirarotu)", + "kääpiöterrieri", + "rhodesiankoira", + "afgaaninvinttikoira", + "bassetti", + "vihikoira", + "Sininenpesukarhukoira", + "Pesukarhukoira", + "Walkerin kettukoira", + "englanninkettukoira", + "punainen pesukarhukoira", + "venäjänvinttikoira", + "irlanninsusikoira", + "italianvinttikoira", + "ibizanpodenco", + "hirvikoira", + "saukkokoira", + "persianvinttikoira", + "skotlanninhirvikoira", + "weimarinseisoja", + "Staffordshiren bullterrieri", + "amerikanpitbullterrieri", + "bedlingtoninterrieri", + "borderterrieri", + "kerrynterrieri", + "irlanninterrieri", + "norfolkinterrieri", + "norwichinterrieri", + "yorkshirenterrieri", + "karkeakarvainen kettuterrieri", + "lakelandinterrieri", + "sealyhaminterrieri", + "airedalenterrieri", + "cairnterrieri", + "australianterrieri", + "dandiedinmontinterrieri", + "bostoninterrieri", + "kääpiösnautseri", + "suursnautseri", + "keskikokoinen schnautseri", + "skotlanninterrieri", + "Tiibetinterrieri", + "silkkiterrieri", + "pehmeäturkkinen vehnäterrieri", + "länsiylämaanterrieri", + "apso", + "sileäkarvainen noutaja", + "kiharakarvainennoutaja", + "kultainen noutaja", + "labradorinnoutaja", + "Chesapeakelahdennoutaja", + "lyhytkarvainen saksanseisoja", + "unkarinvizsla", + "englanninsetteri", + "irlanninsetteri", + "gordoninsetteri", + "bretoni (koira)", + "clumberinspanieli", + "englanninspringerspanieli", + "walesinspringerspanieli", + "cockerspanieli", + "Sussexinspanieli", + "irlanninvesispanieli", + "Laivakoira", + "belgianpaimenkoira groenendael", + "belgianpaimenkoira malinois", + "brienpaimenkoira", + "australiankelpie", + "vanhaenglanninlammaskoira", + "shetlanninlammaskoira", + "skotlanninpaimenkoira", + "bordercollie", + "bouvier", + "saksanpaimenkoira", + "dobermanni", + "kääpiöpinseri", + "isosveitsinpaimenkoira", + "Berninpaimenkoira", + "bokseri", + "bullmastiffi", + "tiibetinmastiffi", + "ranskanbulldoggi", + "tanskandoggi", + "bernhardinkoira", + "siperianpystykorva", + "alaskanmalamuutti", + "siperianhusky", + "dalmatialainen", + "affenpinseri", + "mopsi", + "leonberginkoira", + "newfoundlandinkoira", + "pyreneittenkoira", + "samojedinkoira", + "Kääpiöpystykorva", + "kiinanpystykorva", + "Hollanninpystykorva", + "Petit brabancon", + "welsh corgi pembroke", + "walesin corgi cardigan", + "kääpiöpuudeli", + "kääpiövillakoira", + "keskikokoinen villakoira", + "meksikonkarvatonkoira", + "susi", + "alaskantundrasusi", + "Harjasusi", + "kojootti", + "villikoira", + "vuorisusi", + "Hyeenakoira", + "Hyeenat", + "kettu", + "meksikonaavikkokettu", + "naali", + "Harmaakettu", + "juovikas kissa", + "raidallinen kissa", + "persialainen", + "Siamilainen", + "egyptiläinen kissa", + "puuma", + "ilves", + "leopardi", + "lumileopardi", + "jaguaari", + "leijona", + "tiikeri", + "gepardi", + "ruskeakarhu", + "mustakarhu", + "jääkarhu", + "huulikarhu", + "mangustit", + "nelisormimangusti", + "hietakiitäjäinen", + "leppäkerttu", + "maakiitäjäiset", + "sarvijäärät", + "Lehtikuoriaiset", + "sittiäinen", + "sarvikuonokas", + "kärsäkäsmäinen", + "kaksisiipinen", + "mehiläinen", + "muurahaiset", + "heinäsirkat", + "laulukaskas", + "sauvasirkka", + "torakat", + "rukoilijasirkat", + "kaskas", + "pikkukaskas", + "verkkosiipiset", + "sudenkorento", + "hentosudenkorennot", + "amiraali", + "tesmaperhonen", + "Monarkkiperhonen", + "kaaliperhonen", + "perhonen", + "sinisiipinen", + "meritähdet", + "merisiilit", + "Merimakkarat", + "Pumpulihäntäkaniinit", + "Jänikset", + "angorakani", + "hamsterit", + "piikkisika", + "kettuorava", + "murmelit", + "majava", + "marsu", + "rautias", + "seepra", + "sika", + "villisika", + "pahkasika", + "virtahepo", + "härkä", + "vesipuhveli", + "Biisonit", + "pässi", + "paksusarvilammas", + "Vuorikauris", + "punalehmäantilooppi", + "Aepycerotinae", + "gasellit (suku)", + "dromedaari", + "laama", + "kärpät (suku)", + "minkki", + "hilleri", + "fretti", + "saukot", + "skunkki", + "mäyrä", + "vyötiäinen", + "kolmivarvaslaiskiainen", + "orangit", + "gorillat", + "simpanssi", + "gibbonit", + "Siamanki", + "marakatti", + "husaariapina", + "paviaani", + "makaki", + "Gueretsat", + "Nenäapina", + "marmosetti", + "kapusiini", + "Mölyapinat", + "titi apina", + "Hämähäkkiapinat (suku)", + "oravasaimiri", + "Kissamaki", + "intiannorsu", + "savanninorsu", + "kissakarhu", + "jättiläispanda", + "barrakuda", + "ankerias", + "hopealohi", + "Vuokkokalat", + "sampi", + "luuhauki", + "leijonakala", + "pallokala", + "laskutaulu", + "akateeminen kaapu", + "harmonikka", + "akustinen kitara", + "lentotukialus", + "matkustajalentokone", + "ilmalaiva", + "alttari", + "ambulanssi", + "Vesikulkuneuvo", + "analogiakello", + "mehiläistarha", + "essu", + "roska-astia", + "rynnäkkökivääri", + "olkareppu", + "leipomo", + "puomi", + "ilmapallo", + "kuulakynä", + "laastari", + "banjisti", + "kaide", + "levytanko", + "parturituoli", + "parturiliike", + "talousrakennus", + "ilmapuntari", + "tynnyri", + "kottikärry", + "baseball-pallo", + "koripallo", + "kehto", + "fagotisti", + "uimalakki", + "kylpypyyhe", + "amme", + "farmariauto", + "majakka", + "Keitinlasi", + "karhunnahkalakki", + "olutpullo", + "olutlasi", + "kellosuoja", + "rintalappu", + "tandempyörä", + "bikinit", + "rengasvihko", + "kiikari", + "linnunpönttö", + "venevaja", + "rattikelkkailu", + "bolo-solmio", + "hilkka (päähine)", + "kirjahylly", + "kirjakauppa", + "pullonkorkki", + "jousi", + "rusetti", + "muistolaatta", + "rintaliivit", + "aallonmurtaja", + "rintahaarniska", + "katuharja", + "kiulu", + "solki", + "Suojaliivi", + "luotijuna", + "lihakauppa", + "taksi", + "pata", + "Kynttilä", + "tykki", + "kanootti", + "purkinavaaja", + "villatakki", + "auton peili", + "karuselli", + "puusepän työkalut", + "rasia", + "auton pyörä", + "pankkiautomaatti", + "kasetti", + "kasettinauhuri", + "linna", + "katamaraani", + "CD-soitin", + "sello", + "kännykkä", + "vitja", + "metallilankaverkko", + "rengashaarniska", + "moottorisaha", + "Arkku", + "senkki", + "kello", + "astiakaappi", + "joulusukka", + "kirkko", + "elokuvateatteri", + "lihakirves", + "luola-asutus", + "verho", + "geta (jalkine)", + "cocktailravistin", + "kahvimuki", + "kahvipannu", + "kierre", + "numerolukko", + "näppäimistö", + "karkkikauppa", + "konttialus", + "avoauto", + "saca-rolhas", + "trumpetti", + "cowboy-saapas", + "cowboyhattu", + "kehto", + "nostokurki", + "suojakypärä", + "sälelaatikko", + "pinnasänky", + "haudutuspata", + "krokettipallo", + "Kainalo- ja kyynärsauvat", + "rintahaarniska", + "pato", + "kirjoituspöytä", + "pöytätietokone", + "automaattipuhelin", + "Vaippa", + "digitaalikello", + "digitaalikello", + "ruokapöytä", + "tiskirätti", + "astianpesukone", + "levyjarru", + "telakka", + "koirareki", + "kupoli", + "kynnysmatto", + "öljynporauslautta", + "rumpu", + "rumpukapula", + "Käsipainot", + "avotulella kuumennettava paistinuuni", + "tuuletin", + "sähkökitara", + "sähköveturi", + "viihdekeskus", + "kirjekuori", + "espressokeitin", + "puuteri", + "höyhenhuivi", + "kansio", + "ruiskulaiva", + "paloauto", + "kipinäsuojus", + "lippusalko", + "poikkihuilu", + "taittotuoli", + "jalkapallokypärä", + "haarukkatrukki", + "kaivo", + "täytekynä", + "pylvässänky", + "tavaravaunu", + "käyrätorvi", + "paistinpannu", + "turkki", + "jäteauto", + "hengityssuojain", + "bensiinipumppu", + "pikari", + "mikroauto", + "golfpallo", + "golfauto", + "Gondoli", + "gongi", + "naisen puku", + "flyygeli", + "kasvihuone", + "jäähdyttimen säleikkö", + "ruokakauppa", + "giljotiini", + "hiussolki", + "hiuslakka", + "Puolitelavaunu", + "vasara", + "kori", + "hiustenkuivaaja", + "mobiililaite", + "Nenäliina", + "kiintolevy", + "huuliharppu", + "harppu", + "elonleikkuukone", + "kirves", + "pistoolikotelo", + "kotiteatteri", + "kenno", + "haka", + "vannehame", + "rekki", + "hevoskärry", + "tiimalasi", + "silitysrauta", + "kurpitsalyhty", + "farmarihousut", + "jeeppi", + "t-paita", + "palapeli", + "riksa", + "ohjaussauva", + "polvisuojus", + "solmu", + "labratakki", + "kauha", + "lampunvarjostin", + "sylimikro", + "niitto", + "linssinsuojus", + "paperiveitsi", + "kirjasto", + "pelastusvene", + "sytytin", + "limusiini", + "matkustajalaiva", + "huulipuna", + "louferi", + "voide", + "kaiutin", + "luuppi", + "saha (teollisuuslaitos)", + "magneettikompassi", + "postilaukku", + "postilaatikko", + "trikoot", + "kokouimapuku", + "kaivonkansi", + "Marakassit", + "ksylofoni", + "naamio", + "tulitikku", + "juhannussalko", + "sokkelo", + "mittakannu", + "lääkekaappi", + "megaliitti", + "mikrofoni", + "mikroaaltouuni", + "sotilasvirkapuku", + "maitotonkka", + "pikkubussi", + "minihame", + "tila-auto", + "ohjus", + "rukkanen", + "sekoituskulho", + "Siirrettävä talo", + "T-Ford", + "modeemi", + "luostari", + "monitori", + "mopo", + "huhmare", + "akateeminen päähine", + "moskeija", + "hyttysverkko", + "skootteri", + "maastoajoneuvo", + "vuoristoteltta", + "hiiri", + "hiirenloukku", + "muuttoauto", + "kuonokoppa", + "naula", + "tukikaulus", + "kaulakoru", + "tutti", + "kannettava tietokone", + "obeliski", + "oboisti", + "okariina", + "matkamittari", + "Öljynsuodatin", + "urku", + "oskilloskooppi", + "Peplum-helma", + "härkäkärryt", + "happinaamari", + "paketti", + "mela", + "siipiratas", + "Riippulukko", + "sivellin", + "yöpuku", + "palatsi", + "panhuilu", + "talouspaperi", + "laskuvarjo", + "nojapuut", + "puistonpenkki", + "pysäköintimittari", + "junavaunu", + "terassi", + "rahapuhelin", + "jalusta", + "Penaali", + "kynänteroitin", + "hajuvesi", + "petrimalja", + "valokopiointi", + "plektra", + "piikkikypärä", + "säleaita", + "lava-auto", + "tukipylväs", + "säästöpossu", + "pilleripurkki", + "tyyny", + "pöytätennispallo", + "pyörä", + "merirosvolaiva", + "vesikannu", + "höylä", + "planetaario", + "muovikassi", + "kuivausteline", + "aura", + "karhupumppu", + "Pikakamera", + "tanko", + "musta maija", + "biljardipöytä", + "limonadipullo", + "kukkaruukku", + "dreija", + "porakone", + "Rukousmatto", + "tulostin", + "vankila", + "ammus", + "projektori", + "kiekko", + "nyrkkeilysäkki", + "rahapussi", + "sulkakynä", + "Tilkkutäkki", + "kilpa-auto", + "mailapeli", + "Lämpöpatteri", + "radiolähetin", + "radioteleskooppi", + "sadevesisäiliö", + "asuntoauto", + "kela", + "peilikamera", + "jäälaatikko", + "kauko-ohjain", + "ravintola", + "Revolveri", + "kivääri", + "keinutuoli", + "varras", + "pyyhekumi", + "balon de rugby à XIII", + "viivain", + "lenkkitossu", + "kassakaappi", + "hakaneula", + "suolasirotin", + "sandaali", + "saronki", + "saksofoni", + "tuppi", + "varsivaaka", + "koulubussi", + "kuunari", + "ottelutaulu", + "CRT-näyttö", + "ruuvi", + "ruuvimeisseli", + "istuinvyö", + "ompelukone", + "kilpi", + "kenkäkauppa", + "ostoskori", + "ostoskärry", + "Lapio", + "suihkumyssy", + "suihkuverho", + "suksi", + "kommandopipo", + "makuupussi", + "laskutikku", + "liukuovi", + "pelilaite", + "snorkkeli", + "moottorikelkka", + "lumiaura", + "saippua-annostelija", + "jalkapallo", + "sukka", + "aurinkokeräin", + "keittokulho", + "välilyöntinäppäin", + "Lämmityslaite", + "avaruussukkula", + "lasta", + "pikamoottori", + "hämähäkinverkko", + "kehräin", + "urheiluauto", + "spotti", + "näyttämö", + "höyryveturi", + "teräspalkkisilta", + "lyömäsoitin", + "stetoskooppi", + "stola (liturgia)", + "kivimuuri", + "sekuntikello", + "kasvihuone", + "suodatin", + "raitioliikenne", + "paarit", + "vuodesohva", + "sukellusvene", + "puku", + "aurinkokello", + "polttolasi", + "aurinkolasit", + "aurinkosuoja", + "riippusilta", + "moppi", + "collegepusero", + "uimahousut", + "keinu", + "kytkin (sähkötekniikka)", + "injektioruisku", + "pöytävalaisin", + "panssarivaunu", + "kasettinauhuri", + "teekannu", + "Teddykarhu", + "näköradio", + "tennispallo", + "katto-oljet", + "väliverho", + "sormustin", + "puimakone", + "valtaistuin", + "tiilikatto", + "leivänpaahdin", + "tupakkakauppias", + "wc-istuin", + "soihtu", + "toteemipaalu", + "hinausauto", + "lelukauppa", + "traktori", + "rekka", + "tarjotin", + "perperi", + "kolmipyörä", + "kolmirunkovene", + "jalusta", + "riemukaari", + "johdinauto", + "pasuuna", + "sammio", + "pyöröovi", + "näppäimistö", + "sateenvarjo", + "yksipyöräinen polkupyörä", + "pystypiano", + "pölynimuri", + "maljakko", + "holvi", + "sametti", + "myyntiautomaatti", + "liturginen asu", + "maasilta", + "viulu", + "lentopallo", + "vohvelirauta", + "seinäkello", + "lompakko", + "komero", + "sotilaslentokone", + "lavuaari", + "pesukone", + "vesipullo", + "vesikannu", + "vesitorni", + "viskikannu", + "pilli", + "peruukki", + "hyttysverkko", + "Windsor", + "viinipullo", + "siipi", + "wokkipannu", + "kapusta", + "villa", + "siksak-mallinen aita", + "laivan hylky", + "pieni vene", + "jurtta", + "verkkosivusto", + "sarjakuvakirja", + "sanaristikko", + "katukilpi", + "liikennevalot", + "kansipaperi", + "menyy", + "annos", + "lihaliemi", + "lihapata", + "kerroskakku", + "jäätelö", + "mehujääpuikko", + "patonki", + "vesirinkeli", + "rinkeli", + "juustohampurilainen", + "nakkisämpylä", + "perunamuusi", + "kaali", + "parsakaali", + "kukkakaali", + "kesäkurpitsa", + "spagettikurpitsa", + "tammenterhokurpitsa", + "jättikurpitsa", + "kurkku", + "artisokka", + "vihannespaprika", + "ruotiartisokka", + "sieni", + "mansikanpunainen", + "appelsiini", + "sitruuna", + "viikuna", + "banaani", + "jakkihedelmä", + "annona", + "granaattiomena", + "heinä", + "Pasta carbonara", + "suklaasiirappi", + "taikina", + "lihamureke", + "pitsa", + "lihapiirakka", + "tortilla", + "punaviini", + "booli", + "advocaat", + "alppi", + "kupla", + "jyrkänne", + "koralliriutta", + "geysiri", + "järvenranta", + "niemi", + "hiekkasärkkä", + "rannikko", + "laakso", + "keila", + "baseballin pelaaja", + "sulhanen", + "sukeltaja", + "rapsi", + "kaunokainen", + "lehtotikankontti", + "jyvä", + "tammenterho", + "Ruusunmarja", + "hevoskastanja", + "nuijasieni", + "Helttasienet", + "korvasieni", + "haisusieni", + "maatähti", + "koppelokääpä", + "tatti", + "tähkä", + "wc-paperi" + ] + ], + "ZH": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 14, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 28, + 29, + 30, + 32, + 34, + 37, + 39, + 40, + 42, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 56, + 57, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 70, + 71, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 239, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 717, + 718, + 719, + 721, + 724, + 725, + 726, + 728, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 754, + 755, + 756, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 793, + 795, + 797, + 798, + 799, + 802, + 803, + 804, + 806, + 808, + 810, + 811, + 812, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 851, + 852, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 904, + 907, + 908, + 909, + 910, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 924, + 925, + 926, + 927, + 928, + 929, + 931, + 932, + 933, + 935, + 937, + 938, + 939, + 941, + 943, + 944, + 948, + 949, + 950, + 951, + 952, + 954, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 978, + 979, + 980, + 981, + 984, + 986, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999 + ], + [ + "丁鱥科", + "鲫鱼", + "大白鲨", + "鼬鯊", + "双髻鲨", + "电鳐目", + "魟魚", + "鴕鳥", + "燕雀", + "红额金翅雀", + "靛蓝彩鹀", + "知更鸟", + "鹎科", + "鵲", + "河乌科", + "鸢 (鸟类通称)", + "白头海雕", + "禿鷲", + "烏林鴞", + "斑點鈍口螈", + "六角龍", + "美国牛蛙", + "尾蟾", + "棱皮龜", + "箱龜屬", + "美洲鬣蜥", + "安乐蜥", + "飞蜥属", + "侧褶蜥", + "美國毒蜥", + "欧洲绿蜥", + "非洲变色龙", + "科莫多巨蜥", + "尼羅鱷", + "美國短吻鱷", + "三角龍屬", + "王蛇屬", + "束带蛇属", + "大蟒", + "非洲岩蟒", + "印度眼鏡蛇", + "海蛇亞科", + "角蝰", + "沙漠響尾蛇", + "三葉蟲", + "盲蛛目", + "蝎子", + "黑寡婦蜘蛛", + "狼蛛科", + "蜱", + "蜈蚣", + "黑琴鸡", + "鹧鸪", + "披肩榛鸡", + "鹑", + "山鹑", + "非洲灰鹦鹉", + "金剛鸚鵡", + "葵花鳳頭鸚鵡", + "澳洲小鸚鵡", + "鸦鹃属", + "食蜂鸟", + "犀鸟", + "蜂鸟", + "鹟鴷科", + "鵎鵼", + "雄鸭", + "红胸秋沙鸭", + "母鹅", + "黑天鹅", + "刺食蟻獸", + "鸭嘴兽", + "小袋鼠", + "考拉", + "袋熊", + "海蜇", + "海葵", + "腦珊瑚", + "扁形动物门", + "线虫", + "螺類", + "蜗牛", + "蛞蝓", + "裸鰓類", + "多板纲", + "鹦鹉螺", + "鄧金斯螃蟹", + "斑紋黃道蟹", + "招潮蟹属", + "石蟹科", + "美洲螯龍蝦", + "棘刺龍蝦", + "淡水龙虾", + "寄居蟹", + "等脚类的动物", + "白鹳", + "黑鹳", + "琵鷺", + "红鹤", + "小苍鹭", + "大白鹭", + "麻鸭", + "鹤", + "秧鹤", + "紫水鸡", + "美洲瓣蹼鷸", + "鸨", + "翻石鹬", + "黑腹滨鹬", + "红脚鹬", + "半蹼鹬", + "蠣鷸科", + "鹈鹕", + "國王企鵝", + "信天翁", + "灰鯨", + "逆戟鲸", + "儒艮", + "海獅", + "吉娃娃", + "日本狆", + "馬爾濟斯", + "京巴犬", + "西施犬", + "布伦海姆狗", + "蝴蝶犬", + "玩具梗犬", + "罗得西亚猎犬", + "阿富汗猎狗", + "矮脚长耳猎犬", + "小獵犬", + "尋血獵犬", + "蓝色快狗", + "黑褐猎浣熊犬", + "猎狐用猎狗", + "英国猎狐狗", + "美洲赤狗", + "俄國狼狗", + "爱尔兰狼犬", + "意大利灵缇犬", + "惠比特犬", + "伊维萨猎犬", + "挪威猎狗", + "奥达猎犬", + "薩路基獵犬", + "勒車犬", + "威瑪犬", + "斯塔福郡狗", + "比特犬", + "贝德林顿猎狗", + "博德猎狐犬", + "凯利蓝㹴", + "爱尔兰梗", + "诺福克梗", + "挪威㹴", + "约克郡犬", + "硬毛猎狐㹴", + "湖区矮犬", + "锡利哈姆犬", + "万能㹴", + "凯恩㹴狗", + "澳大利亚㹴", + "丹迪丁蒙㹴", + "波士顿狗", + "小种髯狗", + "巨斯那策狼犬", + "标准雪纳瑞犬", + "蘇格蘭㹴", + "西藏梗", + "澳洲絲毛㹴", + "爱尔兰软毛㹴", + "西部高地白㹴", + "西藏小狗", + "直毛猎狗", + "卷毛寻回犬", + "黄金猎犬", + "拉布拉多尋回犬", + "维斯拉犬", + "英国谍犬", + "爱尔兰长毛猎犬", + "戈登赛特猎狗", + "布列塔尼猎犬", + "克伦伯猎獚", + "史賓格犬", + "英国可卡犬", + "苏塞克斯猎獚", + "爱尔兰水猎犬", + "库瓦兹犬", + "史其派克犬", + "比利时牧羊犬", + "玛伦牧羊犬", + "伯瑞犬", + "澳洲凱皮犬", + "可蒙犬", + "英國古代牧羊犬", + "喜樂蒂牧羊犬", + "柯利犬", + "博得牧羊犬", + "法兰德斯牧牛犬", + "罗威那", + "德国牧羊犬", + "杜賓犬", + "小种品舍狗", + "伯恩山犬", + "拳師犬", + "鬥牛獒", + "蕃獒", + "法国叭喇狗", + "大丹犬", + "聖伯納犬", + "哈士奇", + "阿拉斯加马拉穆", + "西伯利亚哈士奇", + "大麥町", + "猴绠", + "巴仙吉犬", + "巴哥犬", + "纽芬兰犬", + "大白熊犬", + "薩摩耶犬", + "博美犬", + "松狮犬", + "荷兰卷尾狮毛狗", + "威尔斯柯基犬", + "威尔士柯基犬", + "玩具贵宾犬", + "迷你型贵宾犬", + "标准贵妇犬", + "墨西哥无毛狗", + "灰狼", + "北極狼", + "紅狼", + "郊狼", + "澳大利亞野犬", + "豺", + "非洲野犬", + "鬣狗属", + "狐狸", + "敏狐", + "北極狐", + "灰狐", + "虎斑猫", + "山猫", + "波斯貓", + "暹羅貓", + "埃及猫", + "美洲狮", + "猞猁屬", + "豹", + "雪豹", + "美洲豹", + "獅", + "虎", + "獵豹", + "棕熊", + "美洲黑熊", + "白熊", + "懒熊", + "獴科", + "狐獴", + "虎甲", + "瓢虫", + "步行蟲科", + "天牛科", + "金花蟲科", + "蜣螂", + "兜蟲亞科", + "象鼻蟲", + "蝇", + "蜂族", + "蚁科", + "蚱蜢", + "蟋蟀", + "竹節蟲", + "蟑螂", + "刀螂", + "蝉", + "葉蟬", + "草蛉", + "蜻蜓", + "豆娘", + "花蝶", + "阿芬眼蝶", + "君主斑蝶", + "菜粉蝶", + "白蝴蝶", + "灰蝶", + "海星", + "海膽", + "海参", + "棉尾兔属", + "兔属", + "安哥拉兔", + "仓鼠", + "豪豬", + "狐松鼠", + "土撥鼠", + "海狸", + "豚鼠", + "栗色马", + "斑馬", + "猪", + "野豬", + "疣豬", + "河马", + "公牛", + "水牛", + "野牛属", + "公羊", + "大角羊", + "羱羊", + "狷羚", + "高角羚", + "瞪羚属", + "單峰駱駝", + "大羊驼", + "鼬屬", + "水鼬", + "歐洲鼬", + "白鼬", + "水獭", + "臭鼬", + "獾", + "犰狳", + "树懒科", + "猩猩屬", + "大猩猩", + "黑猩猩", + "长臂猿", + "合趾猿", + "長尾猴", + "赤猴", + "狒狒", + "猢猻", + "疣猴亞科", + "疣猴屬", + "長鼻猴", + "狨猴", + "卷尾猴", + "吼猴属", + "伶猴屬", + "蜘蛛猴", + "松鼠猴", + "环尾狐猴", + "大狐猴", + "亚洲象", + "非洲象", + "红熊猫", + "貓熊", + "杖蛇鯖", + "鳗", + "銀鮭", + "石美人", + "小丑魚", + "鲟鱼", + "长吻雀鳝", + "蓑", + "河豚", + "算盘", + "阿巴雅", + "学位服", + "鍵盤式手風琴", + "木吉他", + "航空母舰", + "客机", + "飞艇", + "圣餐台", + "救生車", + "兩棲車輛", + "養蜂場", + "围裙", + "垃圾桶", + "突击步枪", + "背包", + "糕點店", + "平衡木", + "氣球", + "原子笔", + "邦迪", + "班卓琴", + "欄杆", + "槓鈴", + "理髮椅", + "理发店", + "穀倉", + "气压计", + "桶", + "手推车", + "棒球 (球)", + "篮球", + "婴儿睡篮", + "大管", + "泳帽", + "浴巾", + "浴盆", + "旅行車", + "岸标", + "烧杯", + "熊皮帽", + "啤酒瓶", + "啤酒玻璃杯", + "鐘架", + "围裙上部", + "協力車", + "比基尼", + "活页簿", + "觀劇鏡", + "小鳥舍", + "停船棚屋", + "雪车", + "饰扣式领带", + "童帽", + "书架", + "書店", + "瓶蓋", + "弓", + "領結", + "奶罩", + "海堤", + "埃癸斯", + "掃把", + "水桶", + "帶扣", + "防彈護甲", + "子弹火车", + "肉类市场", + "出租車", + "大鍋", + "蜡烛", + "坦克大炮", + "划艇", + "開罐器", + "開襟衫", + "汽车镜", + "旋轉木馬", + "工具箱", + "紙板盒", + "汽车车轮", + "自動櫃員機", + "卡式", + "卡带播放机", + "城堡", + "雙體船", + "CD播放机", + "大提琴", + "移动电话", + "鏈條", + "鐵絲網", + "鎖子甲", + "链锯", + "箱", + "五斗柜", + "钟琴", + "陶瓷器陈列柜", + "圣诞袜", + "教会", + "電影院", + "剁刀", + "悬崖住所", + "遮盖物", + "下驮", + "調酒器具", + "咖啡杯", + "咖啡壺", + "螺線", + "密碼鎖", + "键盘", + "糖果", + "貨櫃船", + "敞篷车", + "瓶塞起子", + "小号", + "牛仔靴", + "牛仔帽", + "搖籃", + "起重机", + "防撞头盔", + "大板条箱", + "娃娃床", + "慢燉鍋", + "槌球", + "拐杖", + "胸甲", + "大壩", + "書桌", + "桌机", + "自动电话", + "尿片", + "数码时钟", + "数字表", + "餐桌", + "洗碟布", + "洗碟機", + "碟式制動", + "船塢", + "狗拉雪橇", + "圓屋頂", + "门垫", + "钻探平台", + "鼓", + "鼓槌", + "啞鈴", + "荷兰烘箱", + "鼓风机", + "电吉他", + "電力機車", + "娱乐中心", + "信封", + "咖啡机", + "香粉", + "羽毛蟒蛇圍巾", + "檔案", + "救火艇", + "消防車", + "火炉栏", + "旗杆", + "长笛", + "折疊椅", + "橄欖球頭盔", + "铲车", + "噴泉", + "鋼筆", + "四柱大型卧床", + "货车", + "法国号", + "煎鍋", + "皮大衣", + "垃圾車", + "防毒面具", + "加油機", + "高脚杯", + "小型竞赛汽车", + "高尔夫球", + "高尔夫球车", + "贡多拉", + "锣", + "袍", + "大鋼琴", + "溫室", + "散热器格栅", + "雜貨店", + "斷頭台", + "发夹", + "噴髮膠", + "半履帶車", + "錘子", + "电吹风", + "移动设备", + "手絹", + "硬盘", + "口琴", + "豎琴", + "收割機", + "短柄小斧", + "槍套", + "家庭影院", + "堆砌", + "镰刀", + "铁环长裙", + "单杠", + "农用马车", + "沙漏", + "熨斗", + "傑克南瓜燈", + "牛仔褲", + "吉普车", + "丁恤", + "拼圖", + "东洋车", + "操纵杆", + "和服", + "护膝", + "繩結", + "实验服", + "杓子", + "灯罩", + "笔记本电脑", + "除草機", + "镜头盖", + "開信刀", + "藏书楼", + "救生船", + "打火機", + "加长轿车", + "郵船", + "口红", + "樂福鞋", + "露 (医药)", + "揚聲器", + "放大鏡", + "鋸木廠", + "磁罗盘", + "邮包", + "邮箱", + "紧身衣", + "女士泳装", + "马葫芦盖", + "沙锤", + "木琴", + "面具", + "火柴", + "五朔節花柱", + "迷宮", + "量杯", + "药匣", + "巨石", + "麥克風", + "微波爐", + "军装", + "奶桶", + "公共小型巴士", + "迷你裙", + "多功能休旅車", + "导弹", + "连指手套", + "流動房屋", + "福特T型车", + "调制解调器", + "修道院", + "监控器", + "助力车", + "研钵", + "四方帽", + "清真寺", + "蚊帐", + "速克達", + "山地車", + "鼠标", + "捕鼠器", + "釘子", + "頸圈", + "項鏈", + "奶嘴", + "笔记本电脑", + "方尖碑", + "雙簧管", + "陶笛", + "里程表", + "機油濾清器", + "管風琴", + "示波器", + "牛车", + "氧氣面罩", + "包裹", + "桨", + "明輪", + "挂锁", + "畫筆", + "睡衣", + "宫殿", + "排簫", + "纸巾", + "降落伞", + "双杠", + "停車收費碼錶", + "鐵路客車", + "盛土", + "公用電話", + "台座", + "筆盒", + "筆刨", + "香水", + "培养皿", + "複印機", + "撥子", + "釘盔", + "皮卡", + "桥墩", + "猪形扑满", + "枕頭", + "贼船", + "罐子", + "鉋刀", + "塑胶袋", + "犁", + "搋子", + "即时成像相机", + "杆子", + "警用厢型车", + "南美披风", + "台球桌", + "花盆", + "陶钧", + "拜毯", + "打印机", + "監獄", + "拋體", + "图像投影仪", + "冰球", + "拳擊沙包", + "钱包", + "鹅毛笔", + "床罩", + "球拍", + "暖气片", + "收音机", + "射电望远镜", + "雨水儲集槽", + "露營車", + "冰箱", + "遥控器", + "餐廳", + "左轮手枪", + "來福槍", + "摇椅", + "旋轉烤肉", + "橄欖球 (球)", + "尺子", + "保险箱", + "扣针", + "盐瓶", + "草鞋", + "纱笼", + "萨克斯", + "劍鞘", + "磅秤", + "校车", + "双桅纵帆船", + "記分牌", + "螺絲釘", + "螺丝刀", + "安全帶", + "縫紉機", + "盾牌", + "购物车", + "鏟子", + "头套", + "滑雪板", + "睡袋", + "计算尺", + "滑动门", + "雪上摩托車", + "扫雪机", + "給皂機", + "袜子", + "墨西哥帽", + "空格键", + "空间加热器", + "航天飛機", + "锭子", + "跑车", + "聚光燈", + "舞台", + "蒸汽机车", + "中承式拱桥与下承式拱桥", + "鋼鼓", + "听诊器", + "聖帶", + "石牆", + "跑錶", + "爐", + "电车", + "担架床", + "窣堵坡", + "潛艇", + "西服", + "日晷", + "太陽鏡", + "防曬", + "吊桥", + "拖把", + "运动衫", + "秋千", + "电门", + "注射器", + "檯燈", + "裝甲戰鬥車輛", + "茶壺", + "泰迪熊", + "电视", + "網球", + "頂針", + "脱粒机", + "御座", + "烤面包机", + "煙草商", + "马桶座圈", + "薪火", + "圖騰柱", + "拖吊车", + "拖拉机", + "半掛式卡車", + "托盘", + "风衣", + "自行三轮车", + "三腳架", + "凯旋门", + "無軌電車", + "長號", + "大桶", + "自動檢票機", + "傘", + "獨輪車", + "立式鋼琴", + "吸塵器", + "花瓶", + "拱頂", + "絲絨", + "圣衣", + "高架橋", + "梵啞鈴", + "排球 (球)", + "窩夫烘烤模", + "掛鐘", + "钱包", + "衣帽間", + "军用航空器", + "臉盆", + "洗衣機", + "水壶", + "水塔", + "哨子", + "假髮", + "紗窗", + "酒瓶", + "翅膀", + "镬", + "木勺", + "羊毛", + "毡包", + "網站", + "漫画书", + "填字游戏", + "街道標示牌", + "交通號誌", + "护封", + "菜肴", + "鳄梨酱", + "清湯", + "涮鍋子", + "乳脂松糕", + "冰淇淋", + "冰棒", + "貝果", + "椒鹽卷餅", + "起司堡", + "馬鈴薯泥", + "球花甘蓝", + "花菜", + "西葫芦", + "小青番瓜", + "黄瓜", + "朝鲜蓟", + "澳洲青苹", + "草莓", + "橙", + "柠檬", + "无花果", + "香蕉", + "石榴", + "乾草", + "培根蛋醬", + "巧克力糖漿", + "生面团", + "肉卷", + "比萨饼", + "墨西哥卷饼", + "红酒", + "濃縮咖啡", + "蛋諾類", + "高山", + "泡沫", + "悬崖", + "珊瑚礁", + "間歇泉", + "湖邊", + "海角", + "岸", + "谷地", + "火山", + "棒球運動員", + "欧洲油菜", + "杓兰", + "橡子", + "玫瑰果", + "七叶树果实", + "珊瑚状真菌", + "傘菌", + "河豚菌", + "臭角菌", + "地蜘蛛", + "灰樹花", + "牛肝菌", + "麥穗", + "手紙" + ] + ], + "DA": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 14, + 15, + 18, + 20, + 21, + 22, + 23, + 24, + 30, + 34, + 36, + 39, + 40, + 45, + 48, + 49, + 50, + 51, + 61, + 62, + 63, + 69, + 70, + 71, + 74, + 75, + 77, + 79, + 80, + 81, + 82, + 85, + 86, + 87, + 89, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 121, + 122, + 123, + 125, + 127, + 128, + 129, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 153, + 154, + 157, + 160, + 163, + 170, + 180, + 191, + 192, + 194, + 199, + 211, + 213, + 215, + 217, + 230, + 235, + 244, + 246, + 247, + 250, + 251, + 254, + 256, + 269, + 270, + 271, + 272, + 274, + 275, + 276, + 277, + 279, + 280, + 283, + 284, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 353, + 354, + 355, + 356, + 358, + 359, + 360, + 362, + 363, + 365, + 366, + 367, + 368, + 371, + 372, + 373, + 374, + 376, + 379, + 380, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 395, + 397, + 398, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 421, + 422, + 425, + 426, + 427, + 428, + 430, + 433, + 435, + 436, + 437, + 438, + 439, + 440, + 447, + 449, + 450, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 468, + 469, + 470, + 472, + 473, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 496, + 497, + 498, + 499, + 502, + 505, + 507, + 508, + 510, + 512, + 513, + 515, + 516, + 517, + 519, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 541, + 542, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 567, + 568, + 569, + 570, + 571, + 574, + 576, + 577, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 595, + 596, + 602, + 604, + 606, + 607, + 608, + 611, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 625, + 626, + 627, + 628, + 629, + 630, + 632, + 633, + 634, + 636, + 640, + 641, + 642, + 643, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 655, + 657, + 658, + 661, + 662, + 663, + 665, + 668, + 669, + 671, + 673, + 674, + 677, + 678, + 679, + 681, + 683, + 684, + 685, + 686, + 687, + 688, + 691, + 692, + 693, + 694, + 695, + 696, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 721, + 726, + 728, + 730, + 731, + 733, + 734, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 754, + 755, + 757, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 771, + 772, + 773, + 774, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 793, + 795, + 797, + 798, + 802, + 803, + 804, + 806, + 808, + 810, + 811, + 812, + 816, + 817, + 819, + 820, + 822, + 823, + 825, + 826, + 827, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 851, + 852, + 854, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 868, + 873, + 875, + 876, + 877, + 879, + 880, + 882, + 884, + 885, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 900, + 902, + 903, + 904, + 907, + 908, + 910, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 928, + 929, + 933, + 935, + 937, + 938, + 939, + 943, + 949, + 950, + 951, + 952, + 954, + 957, + 958, + 960, + 961, + 962, + 963, + 966, + 969, + 971, + 972, + 973, + 974, + 975, + 976, + 978, + 979, + 980, + 982, + 984, + 986, + 988, + 989, + 992, + 994, + 998, + 999 + ], + [ + "suder", + "guldfisk", + "Hvid haj", + "Tigerhaj", + "Hammerhaj", + "elektrisk rokke", + "pilrokke", + "struds", + "kvækerfinke", + "Stillits", + "Indigofinke", + "vandredrossel", + "skade", + "Vandstære", + "glente", + "hvidhovedet havørn", + "grib", + "lapugle", + "Amerikansk oksefrø", + "Havlæderskildpadde", + "sumpskildpadde", + "leguan", + "Grøn anole", + "gilaøgle", + "Komodovaran", + "Nilkrokodille", + "amerikansk alligator", + "Torosaurus", + "kongeboa", + "Klippepyton", + "Indisk kobra", + "Trilobit", + "mejer", + "skorpion", + "korsedderkop", + "Den Sorte Enke", + "jagtedderkopper", + "Skolopender", + "urfugl", + "fjeldrype", + "Kravehjerpe", + "Vagtel", + "agerhøne", + "grå jaco", + "Stor gultoppet kakadu", + "biæder", + "næsehornsfugle", + "kolibrier", + "Glansfugle", + "tukan", + "andrik", + "toppet skallesluger", + "gås", + "Sortsvane", + "myrepindsvin", + "næbdyr", + "koalabjørn", + "vombat", + "vandmand", + "søanemone", + "Fladorme", + "rundorm", + "snegl", + "dræbersnegl", + "nøgensnegle", + "Troldkrabbe", + "amerikansk hummer", + "languster", + "eremitkrebs", + "Hvid stork", + "sort stork", + "skestorke", + "rørdrum", + "trane", + "Riksetrane", + "Amerikansk Blishøne", + "trappe", + "stenvender", + "almindelig ryle", + "Rødben", + "tjald", + "pelikan", + "kongepingvinen", + "Albatrosser", + "Gråhval", + "spækhugger", + "Dygong", + "søløve", + "chihuahua (hund)", + "Malteser", + "Pekingeser", + "Papillon (hund)", + "afghansk mynde", + "blodhund", + "irsk ulvehund", + "Pitbuller", + "Airedaleterrier", + "cairnterrier", + "Dandie Dinmont-terrier", + "Skotsk Terrier", + "korthåret vizsla", + "irsk setter", + "Breton (hund)", + "Engelsk Springer Spaniel", + "Shetland Sheepdogs", + "schæferhund", + "tibetansk mastiff", + "Granddanois", + "sankt bernard", + "sibirisk husky", + "dalmatiner", + "moppe", + "Newfoundlænder", + "ulv", + "polarulv", + "Mankeulv", + "prærieulv", + "Asiatisk vildhund", + "afrikansk vildhund", + "Hyæner", + "ræv", + "Polarræv", + "gråræv", + "perser (kat)", + "siameser", + "los", + "Leopard (dyr)", + "sneleopard", + "panter", + "løve", + "hvid tiger", + "gepard", + "brun bjørn", + "Amerikansk sortbjørn", + "isbjørn", + "Manguster", + "Surikat", + "Sandspringere", + "mariehøne", + "løbebille", + "Træbuk", + "næsehornsbiller", + "snudebille", + "tovinger", + "bier (Apiformes)", + "Myre", + "græshopper", + "fårekylling", + "Kakerlakker", + "Knæler", + "Småcikader", + "stoppenål", + "vandnymfe", + "Engrandøje", + "monark", + "Søstjerne", + "søpindsvin", + "søpølser", + "Bomuldshalekaniner", + "hamstere", + "træpindsvin", + "murmeldyr", + "bæver", + "marsvin", + "zebraer", + "svin", + "vildsvin", + "vortesvinet", + "flodhest", + "okse", + "vandbøffel", + "Bisoner", + "vædder", + "Bighornfår", + "stenbuk", + "koantilope", + "gazeller", + "dromedar", + "lama", + "Væsel", + "ilder", + "fritte", + "Oddere", + "grævling", + "bæltedyr", + "Borneo-orangutang", + "gorillaer", + "schimpansen", + "Hvidhåndet gibbon", + "Husarabe", + "savannebavianer", + "Makakaber", + "slankaber", + "Næseabe", + "brøleaber", + "springaber", + "edderkopaber", + "dødningehovedabe", + "kattalemur", + "asiatisk elefant", + "afrikansk elefant", + "rød panda", + "Stor panda", + "ål", + "klovnfisk", + "stør", + "hornfisk", + "kuglefisk", + "kugleramme", + "trækharmonika", + "akustisk guitar", + "hangarskib", + "ruteflyver", + "luftskib", + "alter", + "babyambulance", + "forklæde", + "affaldscontainer", + "stormgevær", + "rygsæk", + "bageri", + "bom", + "ballon", + "kuglepen", + "gelænder", + "vægtstang", + "lade", + "aneroidbarometer", + "fad (beholder)", + "trillebør", + "basketballbold", + "badehætte", + "badekar", + "stationcar", + "fyr (navigation)", + "bægerglas", + "bjørneskindshue", + "ølflaske", + "kikkert", + "naust", + "bobslæde", + "kyse", + "bogskab", + "boghandel", + "kapsel", + "bue", + "butterfly", + "mindetavle", + "Brystholder", + "badebro", + "ægide", + "kost", + "spand", + "spænde", + "skudsikker vest", + "højhastighedstog", + "taxa", + "kogekar", + "lys", + "kano", + "dåseåbner", + "karrusel", + "karton", + "pengeautomat", + "kassette", + "herregård", + "katamaran", + "cd-afspiller", + "cellist", + "mobiltelefon", + "kæde", + "trådflethegn", + "ringbrynje", + "motorsav", + "kiste", + "kommode (møbel)", + "klokke", + "julesok", + "kirke", + "biograf", + "kødøkse", + "træsko", + "kaffekande", + "kombinationslås", + "tastatur", + "containerskib", + "proptrækker", + "trompet", + "cowboyhat", + "vugge", + "kran", + "flyttekasse", + "krykke", + "kyras", + "dæmning", + "skrivebord", + "desktop-computer", + "ble", + "digitalur", + "spisebord", + "Karklud", + "opvaskemaskine", + "skivebremse", + "dok", + "hundeslæde", + "kuppel", + "tromme", + "trommestik", + "håndvægt", + "elguitar", + "ellokomotiv", + "konvolut", + "pudder", + "boa (beklædningsdel)", + "arkivalie", + "brandslukningsskib", + "brandbil", + "pejseskærm", + "flagstang", + "fløjte", + "klapstol", + "football-hjelm", + "gaffeltruck", + "fontæne", + "fyldepen", + "himmelseng", + "stegepande", + "pelsmager", + "renovationsvogn", + "gasmaske", + "stander", + "golfbold", + "gondol", + "gongong", + "flygel", + "drivhus", + "dagligvarehandel", + "guillotinen", + "hårspray", + "Halvbæltekøretøj", + "knastskinne", + "hårtørrer", + "mobil enhed", + "lommetørklæde", + "mundharpe", + "harpe", + "mejer", + "Økse", + "reck", + "timeglas", + "strygejern", + "græskarhoved", + "cowboybukser", + "puslespil", + "knæbeskytter", + "knob", + "kittel", + "øse (redskab)", + "lampeskærm", + "bærbar computer", + "mejning", + "linsedæksel", + "brevåbner", + "redningsbåd", + "flamme", + "Limousine (Bil)", + "oceanskib", + "læbestift", + "loafers", + "højttaler", + "lup", + "savværk", + "postsæk", + "kloakdæksel", + "Marakas", + "xylofon", + "maske", + "midsommerstang", + "labyrint", + "køkkenmål", + "toiletskab", + "megalit", + "mikrofon", + "mikrobølge", + "miniskørt", + "missil", + "vante", + "Ford Model T engine", + "V.42", + "kloster", + "knallert", + "moské", + "myggenet", + "offroader", + "mus", + "musefælde", + "søm", + "halskrave", + "halskæde", + "bærbar computer", + "obo", + "okarina", + "milvogn", + "oliefilter", + "orgel", + "oscilloskop", + "iltmaske", + "pakke", + "padleåre", + "skovlhjul", + "hængelås", + "malerpensel", + "palads", + "panfløjte", + "køkkenrulle", + "faldskærm", + "barre (gymnastikredskab)", + "parkometer", + "personvogn", + "terrasse", + "mønttelefon", + "sokkel", + "penalhus", + "blyantspidser", + "duft", + "petriskål", + "kopimaskine", + "plekter", + "pikkelhue", + "stakit", + "pickup (bil)", + "bropille", + "sparegris", + "hovedpude", + "høvl", + "plastikpose", + "Plov", + "svupper", + "stang", + "Salatfad", + "billard", + "urtepotte", + "Pottemagerhjul", + "bønnetæppe", + "skriver", + "fængsel", + "Projektil", + "projektor", + "hockey-puck", + "boksepude", + "pengepung", + "pennefjer", + "sengetæppe", + "ketsjer", + "radiokommunikation", + "radioteleskop", + "Autocamper", + "reflekskamera", + "køleskab", + "fjernbetjening", + "madsted", + "seksløber", + "riffel", + "gyngestol", + "spid", + "rugbybold", + "lineal", + "pengeskab", + "sikkerhedsnål", + "saltbøsse", + "sandaler", + "saxofon", + "skede", + "vægt", + "skolebus", + "skonnert", + "skrue", + "skruetrækker", + "sikkerhedssele", + "symaskine", + "skjold", + "skobutik", + "kundevogn", + "skovl", + "badehætte", + "Skiinstruktør", + "sovepose", + "regnestok", + "snescooter", + "sneplov", + "sæbebeholder", + "sok", + "Mexicaner hat", + "mellemrumstast", + "rumopvarmer", + "rumfærge", + "spindel", + "sportsvogn", + "scene (sted)", + "damplokomotiv", + "Olietønde", + "stetoskop", + "stenmur", + "stopur", + "ovn", + "sporvej", + "Båre", + "undervandsbåd", + "Jakkesæt", + "solur", + "solbriller", + "solbeskytter", + "hængebro", + "gulvmoppe", + "gynge", + "omskifter", + "sprøjte", + "bordlampe", + "kampvogn", + "tekande", + "Teddybjørn", + "fjernsyn", + "tennisbold", + "fortæppe", + "fingerbøl", + "tærskeværk", + "trone", + "brødrister", + "tobakshandler", + "toiletsæde", + "fakkel", + "totempæl", + "bjærgningskøretøj", + "legetøjsbutik", + "traktor", + "bakke", + "triumfbue", + "basun", + "kar", + "korsbom", + "paraply", + "unicykel", + "støvsuger", + "hvælving", + "fløjl", + "viadukt", + "violinbue", + "volleyballbold", + "vaffeljern", + "vægur", + "portemonnæ", + "skab", + "militærfly", + "vask", + "vaskemaskine", + "vandflaske", + "vandtårn", + "fløjte", + "paryk", + "insektnet", + "vinflaske", + "vinge", + "træske", + "uld", + "jurte", + "websted", + "tegneserie", + "kryds-og-tværsopgave", + "vejskilt", + "trafiklys", + "smudsomslag", + "is", + "sodavandsis", + "McDonald's Cheeseburger", + "kartoffelmos", + "aspargeskål", + "blomkål", + "squash", + "agurk", + "jordbærfarve", + "appelsin", + "citron", + "figen", + "banan", + "granatæble", + "hø", + "chokoladesauce", + "dej", + "farsbrød", + "Indbagt pizza", + "rødvin", + "æggelikør", + "boble", + "klippe", + "koralrev", + "gejser", + "søbred", + "pynt", + "kyst", + "dal", + "vulkan", + "brudgom", + "raps", + "fruesko (art)", + "agern", + "hyben", + "paddehat", + "stinksvamp", + "aks", + "wc-papir" + ] + ], + "ML": [ + [ + 1, + 2, + 3, + 6, + 9, + 15, + 16, + 18, + 22, + 23, + 29, + 34, + 39, + 40, + 42, + 45, + 48, + 49, + 50, + 51, + 63, + 66, + 69, + 71, + 78, + 79, + 88, + 89, + 92, + 93, + 94, + 96, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 112, + 113, + 116, + 120, + 122, + 127, + 128, + 129, + 130, + 134, + 137, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 148, + 149, + 151, + 162, + 163, + 180, + 194, + 234, + 235, + 236, + 242, + 246, + 251, + 253, + 259, + 272, + 273, + 274, + 276, + 277, + 279, + 283, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 296, + 298, + 299, + 300, + 308, + 309, + 310, + 312, + 314, + 315, + 316, + 319, + 320, + 323, + 327, + 328, + 329, + 332, + 336, + 337, + 338, + 340, + 341, + 342, + 344, + 346, + 349, + 350, + 351, + 352, + 354, + 355, + 358, + 360, + 362, + 365, + 366, + 373, + 376, + 380, + 381, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 398, + 401, + 403, + 405, + 407, + 415, + 417, + 418, + 426, + 430, + 435, + 437, + 447, + 456, + 459, + 460, + 462, + 463, + 465, + 468, + 470, + 472, + 480, + 484, + 486, + 487, + 488, + 497, + 508, + 513, + 516, + 525, + 527, + 536, + 538, + 541, + 546, + 549, + 555, + 558, + 562, + 570, + 580, + 582, + 583, + 587, + 593, + 594, + 604, + 606, + 610, + 611, + 612, + 614, + 618, + 620, + 629, + 632, + 644, + 650, + 651, + 657, + 662, + 668, + 670, + 673, + 674, + 677, + 679, + 683, + 685, + 687, + 691, + 693, + 697, + 698, + 701, + 711, + 713, + 725, + 730, + 738, + 742, + 743, + 755, + 760, + 762, + 763, + 766, + 772, + 774, + 776, + 777, + 778, + 783, + 786, + 787, + 823, + 827, + 832, + 833, + 835, + 837, + 839, + 843, + 844, + 845, + 847, + 850, + 856, + 862, + 866, + 875, + 879, + 882, + 889, + 895, + 897, + 900, + 909, + 911, + 916, + 920, + 921, + 928, + 933, + 935, + 943, + 952, + 957, + 958, + 960, + 963, + 966, + 971, + 973, + 974, + 979, + 980, + 984, + 989 + ], + [ + "സ്വർണ്ണമത്സ്യം", + "വെള്ളസ്രാവ്", + "കടുവാസ്രാവ്", + "അടവാലൻ തിരണ്ടി", + "ഒട്ടകപക്ഷി", + "അമേരിക്കന് റോബിന്", + "ബുൾബുൾ", + "മാഗ്പീ", + "വെള്ളത്തലയൻ കടൽപ്പരുന്ത്", + "കഴുകൻ", + "അക്സോലോട്ടൽ", + "തോൽപ്പുറകൻ കടലാമ", + "ഇഗ്വാന", + "അനോളെ", + "അഗമ", + "ഗില മോൺസ്റ്റർ", + "കൊമോഡോ ഡ്രാഗൺ", + "നൈൽ ക്രാകഡൈൽ", + "അമേരിക്കൻ ചീങ്കണ്ണി", + "ട്രൈസെറാടോപ്സ്", + "ഇന്ത്യൻ മൂർഖൻ", + "സെറസ്റ്റസ് സെറസ്റ്റസ്", + "ട്രൈലോബൈറ്റ്", + "തേൾ", + "പട്ടുണ്ണി", + "പഴുതാര", + "മക്കൗ", + "സൾഫർ-ക്രെസ്റ്റെഡ് കോക്കറ്റൂ", + "വേലിത്തത്ത", + "വേഴാമ്പൽ", + "ഹമ്മിങ് ബേഡ്", + "ടൂക്കൻ", + "വാത്ത", + "കറുത്ത അരയന്നം", + "എക്കിഡ്ന", + "പ്ലാറ്റിപസ്", + "വാലാബി", + "കൊവാല", + "വൂംബാറ്റ്", + "കടല്ച്ചൊറി", + "സീ അനിമണി", + "പ്ലാറ്റിഹെൽമിന്തസ്", + "നിമറ്റോഡ", + "ശംഖ്", + "ഒച്ച്", + "തേരട്ടക്കക്ക", + "ഫിഡിലർ ഞണ്ട്", + "ഹോമറസ് അമേരിക്കാനസ്", + "വെൺബകം", + "കരിമ്പകം", + "കരണ്ടി കൊക്കൻ കൊക്ക്", + "അരയന്നക്കൊക്ക്", + "ക്രൗഞ്ചം", + "അമേരിക്കൻ കൂട്ട്", + "കല്ലുരുട്ടിക്കാട", + "ഡൻലിൻ", + "ചോരക്കാലി", + "കക്കകൊത്തി", + "പെലിക്കൻ", + "കിങ് പെൻഗ്വിൻ", + "ആൽബട്രോസ്", + "കൊലയാളിത്തിമിംഗലം", + "കടൽപ്പശു", + "ചിഹ്വാഹ", + "ബീഗിൾ", + "ബ്ലഡ്‌ഹൗണ്ട്", + "പിറ്റ് ബുൾ ടെറിയർ", + "ഡാൻഡി ഡിൻമൊന്റ് ടെറിയർ", + "റോട്ട്‌വൈലർ", + "ജർമൻ ഷെപ്പേർഡ്", + "ഡോബർമാൻ പിൻഷർ", + "ബോക്സർ", + "ഗ്രേറ്റ് ഡേൻ", + "ഡാൽമേഷൻ (നായ)", + "ബാസെഞ്ജി", + "പോമറേനിയൻ (നായ)", + "കയോട്ടി", + "ഡിങ്കോ", + "ഇന്ത്യൻ കാട്ടുനായ", + "കഴുതപ്പുലി", + "കുറുക്കൻ", + "ധ്രുവക്കുറുക്കൻ", + "പേർഷ്യൻ (പൂച്ച)", + "പൂമ", + "ലിൻക്സ്", + "പുള്ളിപ്പുലി", + "ഹിമപ്പുലി", + "ജാഗ്വാർ", + "സിംഹം", + "വ്യാഘ്രം", + "ചീറ്റപ്പുലി", + "തവിട്ടുകരടി", + "ധ്രുവക്കരടി", + "കീരി", + "മീർകാറ്റ്", + "ടൈഗർ വണ്ട്", + "ഡിപ്‌റ്റെറ", + "അന്തോഫില", + "ഉറുമ്പ്", + "മണ്ണട്ട", + "പാറ്റ", + "തൊഴുകൈയ്യൻ പ്രാണി", + "ചീവീട്", + "കല്ലൻതുമ്പി", + "സൂചിത്തുമ്പി", + "രാജശലഭം", + "നക്ഷത്രമത്സ്യം", + "കടൽച്ചേന", + "കടൽ വെള്ളരി", + "അങ്കോര മുയൽ", + "നിലയണ്ണാൻ", + "ബീവർ", + "ഗിനിപ്പന്നി", + "വരയൻകുതിര", + "പന്നി", + "കാട്ടുപന്നി", + "നീർക്കുതിര", + "പോത്ത്", + "ബിഗ് ഹോൺ ഷീപ്പ്", + "ആൽപ്പൈൻ ഇബക്സ്", + "ഹർട്ടെബീസ്റ്റ്", + "ഇംപാല", + "ഡ്രോമെഡറി", + "ല്ലാമ", + "യൂറോപ്യൻ ധ്രുവപ്പൂച്ച", + "നീർനായ", + "ബാഡ്ജർ", + "ബോർണിയൻ ഒറംഗുട്ടാൻ", + "ഗോറില്ല", + "മകാക്", + "പ്രോബോസ്കിസ് മങ്കി", + "ടിറ്റി", + "ജെഫ്രീസ് സ്പൈഡർ മങ്കി", + "റിങ്-റ്റെയ്ല്ഡ് ലീമർ", + "ഇന്ത്യൻ ആന", + "ആഫ്രിക്കൻ ആന", + "ചെമ്പൻ പാണ്ട", + "ഭീമൻ പാൻഡ", + "ആരൽ", + "കോമാളി മത്സ്യം", + "മണിച്ചട്ടം", + "അക്കോർഡിയൻ", + "വിമാനവാഹിനിക്കപ്പൽ", + "ആകാശക്കപ്പൽ", + "ആംബുലൻസ്", + "ബേക്കറി", + "ബലൂൺ", + "ബോൾ പെൻ", + "മർദ്ദമാപിനി", + "ബാസ്ക്കറ്റ്ബോള്", + "കുളിതൊട്ടി", + "വിളക്കുമാടം", + "ബൈനൊക്കുലേഴ്സ്", + "വില്ല്", + "ബ്രാ", + "തരംഗരോധി", + "ചൂൽ", + "ബക്കറ്റ്", + "ബുള്ളറ്റ് പ്രൂഫ് വസ്ത്രം", + "ടാക്സി", + "മെഴുകുതിരി", + "തോണി", + "ഓട്ടോമേറ്റഡ് ടെല്ലർ മെഷീൻ", + "കാറ്റമരൻ", + "ചെല്ലോ", + "സെൽഫോൺ", + "ചങ്ങല", + "പള്ളി", + "കീബോഡ്", + "ട്രംപറ്റ്", + "തൊട്ടിൽ", + "അണക്കെട്ട്", + "ഡെസ്ക്ടോപ്പ് കമ്പ്യൂട്ടർ", + "ഡ്രൈഡോക്ക്", + "അർധകുംഭകം", + "ഡ്രം", + "ഇലക്ട്രിക് ഗിറ്റാർ", + "ലക്കോട്ട്", + "ഫയർ എഞ്ചിൻ", + "ഓടക്കുഴൽ", + "ജലധാര", + "റെസ്പിറേറ്റർ", + "ഹരിതഗൃഹം", + "പലചരക്ക് കട", + "ഗില്ലറ്റിൻ", + "ചുറ്റിക", + "മൗത്ത്ഓർഗൺ", + "ഹാർപ്പ്", + "മണൽ ഘടികാരം", + "ഇസ്തിരിപ്പെട്ടി", + "ടീ ഷർട്ട്", + "ജിഗ്-സോ പസ്സിൽ", + "റിക്ഷാവണ്ടി", + "കിമോണോ", + "കയിൽ", + "ലാപ്ടോപ്പ്", + "ലിപ്സ്റ്റിക്ക്", + "ഉച്ചഭാഷിണി", + "തീപ്പെട്ടി", + "മൈക്രോഫോൺ", + "മൈക്രോവേവ് ഓവൻ", + "മിസൈൽ", + "മോഡം", + "ജുമുഅ മസ്ജിദ്", + "സ്കൂട്ടർ", + "മൗസ്", + "എലിക്കെണി", + "ആണി", + "കണ്ഠമാല", + "ഓബോ", + "ഓഡോമീറ്റർ", + "ഓർഗൻ (സംഗീതോപകരണം)", + "ഓക്സിജൻ മാസ്ക്ക്", + "പങ്കായം", + "പൈജാമ", + "കൊട്ടാരം", + "പാരച്യൂട്ട്", + "സുഗന്ധലേപനങ്ങൾ", + "കോപിയർ", + "കിണ്ടി", + "കലപ്പ", + "ചെടിച്ചട്ടി", + "പ്രിന്റർ", + "ജയിൽ", + "റേഡിയോ ദൂരദർശിനി", + "റഫ്രിജറേറ്റർ", + "റെസ്റ്റോറൻറ്‌", + "റിവോൾവർ", + "റൊട്ടിസെറി", + "സേഫ്റ്റി പിൻ", + "ചെരുപ്പ്", + "സാക്സഫോൺ", + "വാളുറ", + "തുലാസ്", + "പിരിയാണി", + "തയ്യൽ യന്ത്രം", + "പരിച", + "സ്റ്റെതസ്കോപ്പ്", + "സ്റ്റൌ", + "സ്തൂപം", + "അന്തർവാഹിനി", + "സൂര്യഘടികാരം", + "സൺഗ്ലാസ്", + "തൂക്കുപാലം", + "ഊഞ്ഞാൽ", + "വൈദ്യുതസ്വിച്ച്", + "സിറിഞ്ച്", + "യുദ്ധ ടാങ്ക്", + "ടെഡി ബെയർ", + "മെതിയന്ത്രം", + "ചൂട്ട്", + "ട്രാക്ടർ", + "ട്രോംബോൺ", + "കുട", + "വാക്വം ക്ലീനർ", + "വയലിൻ", + "സൈനികവിമാനം", + "അലക്കുയന്ത്രം", + "വാട്ടർ ടാങ്ക്", + "ചീനച്ചട്ടി", + "കമ്പിളി", + "വെബ്‌സൈറ്റ്", + "ട്രാഫിക് ലൈറ്റ്", + "പുസ്തക ജാക്കറ്റ്", + "ഐസ്‌ക്രീം", + "ചീസ് ബർഗർ", + "കലക്കിയ ഉരുളക്കിഴങ്ങ്", + "വെള്ളരി", + "അത്തിപ്പഴം", + "മാതളനാരങ്ങ", + "ഹേ", + "ചോക്ലേറ്റ് സിറപ്പ്", + "പിത്സ", + "റെഡ് വൈൻ (മുന്തിരി)", + "കുമിള", + "പവിഴപ്പുറ്റ്", + "ഉഷ്ണജലധാര", + "താഴ്വര", + "അഗ്നിപർവ്വതം", + "റേപ്സീഡ്", + "റോസ റുഗോസ" + ] + ], + "BE": [ + [ + 0, + 1, + 3, + 4, + 5, + 9, + 10, + 11, + 22, + 24, + 29, + 30, + 39, + 48, + 51, + 63, + 65, + 69, + 71, + 77, + 79, + 80, + 87, + 89, + 92, + 93, + 94, + 96, + 98, + 99, + 102, + 103, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 116, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 138, + 139, + 141, + 143, + 144, + 145, + 146, + 148, + 149, + 151, + 162, + 235, + 242, + 247, + 249, + 250, + 254, + 256, + 258, + 271, + 272, + 273, + 274, + 276, + 277, + 279, + 280, + 283, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 301, + 302, + 303, + 304, + 308, + 309, + 310, + 312, + 315, + 317, + 319, + 320, + 327, + 328, + 329, + 331, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 347, + 348, + 349, + 350, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 365, + 366, + 367, + 372, + 373, + 377, + 379, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 398, + 401, + 402, + 403, + 404, + 405, + 407, + 410, + 411, + 412, + 413, + 415, + 417, + 418, + 420, + 421, + 425, + 426, + 427, + 428, + 430, + 432, + 435, + 436, + 437, + 445, + 447, + 450, + 453, + 454, + 456, + 459, + 461, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 497, + 498, + 502, + 508, + 511, + 513, + 516, + 517, + 525, + 527, + 534, + 536, + 538, + 541, + 543, + 546, + 547, + 549, + 551, + 553, + 555, + 557, + 558, + 561, + 562, + 563, + 567, + 570, + 576, + 577, + 578, + 579, + 580, + 582, + 583, + 587, + 591, + 593, + 594, + 595, + 604, + 606, + 607, + 608, + 610, + 611, + 612, + 614, + 615, + 618, + 619, + 620, + 621, + 626, + 627, + 629, + 632, + 634, + 641, + 642, + 643, + 644, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 662, + 665, + 668, + 669, + 670, + 671, + 673, + 677, + 679, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 692, + 693, + 695, + 696, + 697, + 698, + 699, + 701, + 705, + 706, + 708, + 711, + 713, + 714, + 715, + 719, + 721, + 725, + 730, + 734, + 736, + 738, + 742, + 743, + 745, + 746, + 747, + 748, + 749, + 760, + 761, + 762, + 763, + 764, + 769, + 771, + 772, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 786, + 787, + 792, + 795, + 797, + 798, + 806, + 816, + 820, + 823, + 824, + 827, + 830, + 833, + 834, + 835, + 837, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 854, + 856, + 857, + 859, + 860, + 862, + 866, + 872, + 873, + 874, + 875, + 877, + 879, + 881, + 882, + 883, + 884, + 885, + 888, + 889, + 893, + 895, + 896, + 897, + 900, + 903, + 911, + 915, + 916, + 918, + 919, + 920, + 924, + 927, + 928, + 933, + 935, + 938, + 939, + 943, + 957, + 958, + 961, + 963, + 965, + 966, + 967, + 971, + 972, + 973, + 974, + 978, + 979, + 980, + 984, + 986, + 988, + 989, + 996, + 998, + 999 + ], + [ + "Лінь", + "Залатая рыбка", + "Тыгровая акула", + "Молатагаловыя акулы", + "Электрычныя скаты", + "стра́ус", + "юрок", + "шчыго́л", + "Белагаловы арлан", + "Барадатая кугакаўка", + "Аксалотль", + "Жаба-бык", + "Ігуана звычайная", + "Варан камодскі", + "Трыцэратапсы", + "Змяя-акулярніца", + "Марскія змеі", + "Трылабіты", + "скарпіён", + "Павукі-ваўкі", + "губаногія", + "Цецярук", + "жако", + "Какаду вялікі жоўтахохлы", + "Шчуркавыя", + "Птушкі-насарогі", + "калібры", + "тукан", + "Крахаль даўгадзюбы", + "гусь", + "Яхідны", + "качканос", + "Каала", + "Вамбатавыя", + "Медузы", + "Актыніі", + "Плоскія чэрві", + "Круглыя чэрві", + "Слімак", + "смоўж", + "панцырныя малюскі", + "ракі-пустэльнікі", + "Белы бусел", + "Чорны бусел", + "Коўпіцы", + "Фламінга", + "Botaurus", + "Жураўліныя", + "Драфіныя", + "Каменешарка", + "Траўнік", + "Кулікі-сарокі", + "пелікан", + "Каралеўскі пінгвін", + "Альбатросы", + "касатка", + "Дзюгонь", + "чыхуахуа", + "Бігль", + "няме́цкая аўча́рка", + "Нямецкі баксёр", + "Сенбернар", + "аляскінскі маламут", + "сібірскі хаскі", + "мопс", + "Ньюфаўндленд (парода сабак)", + "Самаедскі сабака", + "Руды воўк", + "Каёт", + "Дынга", + "Чырвоны воўк", + "гіенавыя", + "Звычайны ліс", + "Пясец", + "Шэрая лісіца", + "Персідская котка", + "Пума", + "ры́ся", + "леапард", + "сне́жны леапа́рд", + "ягуар", + "леў", + "тыгр", + "гепа́рд", + "буры мядзведзь", + "Барыбал", + "бе́лы мядзве́дзь", + "Мангуставыя", + "сурыка́т", + "каро́ўка-баго́ўка", + "жужалі", + "вусачы", + "лістаеды", + "Двухкрылыя", + "Пчолы", + "Мурашкі", + "цвырку́н", + "Багамолы", + "Цыкадкі", + "страказа́", + "Раўнакрылыя стракозы", + "Марскія зоркі", + "марскія вожыкі", + "Галатурыі", + "Зайцы", + "дзікабра́з", + "Суркі", + "бабёр", + "Марская свінка", + "Зебры", + "Дзікі", + "дзік", + "Афрыканскі бародавачнік", + "бегемот", + "Вол", + "Бізоны", + "бара́н", + "Снежны баран", + "горны альпійскі казел", + "вярблюд аднагорбы", + "Лама (жывёла)", + "Тхары", + "норка", + "Тхор лясны", + "тхор", + "вы́дра", + "ласіца", + "барсу́к", + "браняно́сец", + "Арангутаны", + "гарыла", + "шымпанзэ́", + "павіяны", + "Макакі", + "ма́лпачка", + "Малпы-равуны", + "Азіяцкі слон", + "Саванавы афрыканскі слон", + "Чырвоная панда", + "вялікая панда", + "вуго́р", + "Асятровыя", + "Звычайны сарган", + "Абак", + "акардэон", + "акустычная гітара", + "авіяно́сец", + "пасажырскі самалёт", + "дырыжа́бль", + "ху́ткая дапамо́га", + "пчо́льнік", + "фа́ртух", + "Кантэйнер для смецця", + "Аўтамат (зброя)", + "пяка́рня", + "Паветраны шар", + "ру́чка", + "Банджа", + "парэ́нча", + "сві́ран", + "Барометр", + "Бочка", + "та́чка", + "баскетбо́л", + "Фагот", + "Ванна", + "універсал", + "маяк", + "бікі́ні", + "Бінокль", + "Бабслей", + "кніжная шафа", + "кні́жны магазі́н", + "лук", + "бюстгальтар", + "Эгіда", + "мятла́", + "Вядро", + "за́сцежка", + "бронежыле́т", + "Таксі", + "кацёл", + "све́чка", + "Каноэ", + "адкрыва́льнік", + "Кофта", + "Карусель", + "банкамат", + "касе́та", + "за́мак", + "Катамаран", + "віяланчэ́ль", + "мабі́льны тэлефо́н", + "ланцу́г", + "Кальчуга", + "бензапіла́", + "Куфар", + "Камод", + "касцёл", + "кінатэатр", + "Дзеравяшкі", + "камп’ютарная клавіятура", + "кабрыялет", + "Карнет (музычны інструмент)", + "зы́бка", + "Пад’ёмны кран", + "Плаціна (збудаванне)", + "настольны камп'ютар", + "пасудамы́йная машы́на", + "Сухі док", + "Купал", + "Барабан", + "Гантэлі", + "Электрагітара", + "Электравоз", + "канве́рт", + "пудра", + "картатэ́ка", + "Пажарны аўтамабіль", + "флагшто́к", + "флейта", + "Вілачны пагрузчык", + "Фантан", + "ве́чнае пяро́", + "Патэльня", + "Процівагаз", + "Гандола", + "гонг", + "Сукенка", + "рая́ль", + "Цяпліца", + "бакале́я", + "Гільяціна", + "Молат", + "насо́ўка", + "Губны гармонік", + "Арфа", + "касец", + "пясочны гадзіннік", + "Прас", + "Свяцільня Джэка", + "джы́нсы", + "цішотка", + "Пазл", + "ры́кша", + "Кімано", + "накаленнік", + "Апалонік (сталовы прыбор)", + "абажу́р", + "Ноўтбук", + "Газонакасілка", + "Запальніца", + "Лімузін", + "губная памада", + "гучнагаварыцель", + "Лесапільня", + "Маракас", + "ксілафон", + "маска", + "запа́лка", + "Мегаліты", + "Мікрафон", + "мікрахва́леўка", + "мікрааўтобус", + "міні-спадніца", + "мінівэн", + "ракетная зброя", + "пальчатка", + "Мадэм", + "мапед", + "мячэць", + "маскітная сетка", + "скутэр", + "Горны веласіпед", + "камп’ютарная мыш", + "цьвік", + "мані́ста", + "Абеліск", + "Габой", + "акарына", + "адо́метр", + "масляны фільтр", + "арган", + "Асцылограф", + "па́чка", + "вясло́", + "замак навясны", + "пэндзаль", + "піжа́ма", + "палац", + "Флейта Пана", + "парашу́т", + "Пасажырскі вагон", + "Тэраса", + "п'едэста́л", + "духі", + "ксерако́пія", + "пле́ктар", + "Пікельхельм", + "скарбо́нка", + "Падушка", + "Гаршчок", + "плуг", + "аўтаза́к", + "Більярдны стол", + "Кветкавы гаршчок", + "прынтар", + "турма", + "прае́ктар", + "ша́йба", + "Баксёрская груша", + "кашалёк", + "Гусінае пяро", + "халадзільнік", + "дыстанцы́йнае кірава́нне", + "стало́вая", + "Рэвальвер", + "вінто́ўка", + "лінейка", + "сейф", + "шпі́лька", + "Сандалі", + "Саронг, вопратка", + "саксафон", + "но́жны", + "Вагі", + "Школьны аўтобус", + "Шхуна", + "шру́ба", + "зашру́бка", + "Швейная машына", + "Шчыт", + "Рыдлёўка", + "лыжы", + "спа́льны мяшо́к", + "лагарыфмічная лінейка", + "шкарпэтка", + "верацяно́", + "паравоз", + "Стэтаскоп", + "Стула", + "печ", + "насі́лкі", + "Падводная лодка", + "касцю́м", + "со́нечныя гадзі́ны", + "сонцаахо́ўныя акуля́ры", + "Вісячы мост", + "шва́бра", + "арэлі", + "выключа́льнік", + "шпрыц", + "Танк", + "імбры́чак", + "Тэатральная заслона", + "Малатарня", + "Трон", + "то́стар", + "тытуневая крама", + "Паходня", + "трактар", + "Штатыў", + "трыўмфальная арка", + "тралейбус", + "Трамбон", + "турнікет", + "Парасон", + "піяні́на", + "пыласос", + "ваза", + "скляпе́нне", + "аксамі́т", + "віядук", + "скрыпка", + "кашалёк", + "ваенны самалёт", + "умыва́льнік", + "Пральная машына", + "воданапорная вежа", + "Парык", + "пра́жа", + "Юрта", + "сайт", + "Красворд", + "вулічная таблічка", + "Святлафор", + "Гуакамоле", + "Трайфл", + "Марожанае", + "Чызбургер", + "Бульбяное пюрэ", + "цвятна́я капу́ста", + "Кабачок", + "агуро́к", + "грана́т", + "се́на", + "цеста", + "Піца", + "Бурыта", + "чырво́нае віно́", + "Эспрэса", + "пузы́р", + "Кліф", + "каралавыя рыфы", + "Гейзер", + "Узбярэжжа", + "даліна", + "Вулкан", + "Рапс", + "Венерын чаравічак", + "Жолуд", + "Шыпшына", + "Грыфала мнагашапкавая", + "Колас", + "туалетная папера" + ] + ], + "EO": [ + [ + 0, + 1, + 2, + 3, + 4, + 6, + 9, + 10, + 11, + 13, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 32, + 34, + 39, + 45, + 48, + 49, + 50, + 51, + 63, + 65, + 66, + 69, + 71, + 75, + 77, + 78, + 79, + 80, + 82, + 85, + 86, + 87, + 88, + 91, + 92, + 93, + 94, + 95, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 120, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 153, + 154, + 157, + 162, + 163, + 164, + 169, + 170, + 172, + 176, + 177, + 178, + 191, + 199, + 201, + 211, + 213, + 215, + 222, + 228, + 229, + 230, + 231, + 234, + 235, + 236, + 242, + 246, + 247, + 248, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 268, + 269, + 271, + 272, + 274, + 275, + 276, + 277, + 279, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 304, + 305, + 308, + 309, + 310, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 370, + 372, + 373, + 375, + 376, + 379, + 381, + 382, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 394, + 395, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 439, + 440, + 444, + 445, + 447, + 449, + 450, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 468, + 469, + 470, + 472, + 473, + 474, + 476, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 497, + 498, + 502, + 503, + 505, + 508, + 509, + 510, + 511, + 512, + 513, + 515, + 516, + 517, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 534, + 536, + 537, + 538, + 541, + 543, + 546, + 547, + 549, + 553, + 554, + 555, + 557, + 558, + 559, + 561, + 562, + 563, + 567, + 568, + 570, + 571, + 574, + 575, + 576, + 577, + 579, + 580, + 582, + 583, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 599, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 616, + 618, + 619, + 620, + 621, + 623, + 626, + 628, + 629, + 631, + 632, + 633, + 634, + 640, + 641, + 642, + 643, + 645, + 646, + 647, + 649, + 650, + 651, + 654, + 655, + 656, + 657, + 658, + 660, + 661, + 662, + 665, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 687, + 688, + 690, + 691, + 692, + 693, + 695, + 696, + 697, + 698, + 699, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 717, + 719, + 721, + 726, + 728, + 730, + 731, + 735, + 738, + 739, + 742, + 743, + 744, + 745, + 746, + 748, + 750, + 752, + 753, + 755, + 757, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 788, + 791, + 792, + 793, + 794, + 795, + 797, + 798, + 802, + 803, + 805, + 806, + 807, + 810, + 816, + 817, + 818, + 819, + 820, + 822, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 843, + 844, + 845, + 847, + 849, + 850, + 852, + 854, + 855, + 856, + 857, + 859, + 861, + 862, + 863, + 866, + 868, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 897, + 900, + 902, + 903, + 907, + 909, + 911, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 924, + 926, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 952, + 953, + 957, + 958, + 960, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 976, + 978, + 979, + 980, + 984, + 988, + 989, + 998, + 999 + ], + [ + "tinko", + "Orfiŝo (fiŝo)", + "Blanka ŝarko", + "Tigroŝarko", + "Martelŝarko", + "rajo", + "struto", + "montofringo", + "Kardelo", + "Junkuloj", + "Migra turdo", + "Piknonotedoj", + "Garolo", + "pigo", + "Cinkledoj", + "Milvenoj", + "Blankkapa maraglo", + "vulturo", + "Lapona strigo", + "aksolotlo", + "taŭra rano", + "Askafedoj", + "leddorsa kelonio", + "igvano", + "Gila monstro", + "Komoda varano", + "Nila krokodilo", + "Misisipa aligatoro", + "Triceratopo", + "Hindia kobro", + "Marserpentoj", + "cerasto", + "Trilobuloj", + "skorpio", + "nigra vidvino", + "luparaneo", + "iksodo", + "Centpieduloj", + "Tetro", + "Kanada bonazio", + "koturno", + "Perdrikoj", + "Griza papago", + "arao", + "Centropoj", + "Meropedoj", + "Buceredoj", + "kolibro", + "Galbuledoj", + "Mezgranda merĝo", + "ansero", + "Nigra cigno", + "Ekidno", + "ornitorinko", + "valabio", + "koalo", + "vombato", + "meduzo", + "Maranemono", + "Platvermo", + "Nematodoj", + "Heliko", + "limako", + "Nudbrankuloj", + "Violonkrabo", + "palinuro", + "kankro", + "Ermitokrabo", + "Blanka cikonio", + "Nigra cikonio", + "Kulerbekuloj", + "Flamengo", + "botaŭro", + "gruo", + "Aramo", + "Amerika fuliko", + "Otidedoj", + "Koluma ŝtonturnulo", + "Bunta kalidro", + "Ruĝkrura tringo", + "Galinaga tringo", + "Hematopedoj", + "pelikano", + "Reĝa pingveno", + "Talasarkoj", + "Griza baleno", + "Granda orcino", + "Dugongo", + "Marleono", + "Ĉivava hundo", + "Malta hundo", + "Pekina hundo", + "papilihundo", + "Biglo", + "sanghundo", + "blumakula prociona ĉashundo", + "Rusa leporhundo", + "irlanda lupohundo", + "Angla malgranda leporhundo", + "persa leporhundo", + "skota leporhundo", + "vajmarhundo", + "Ajrvala terhundo", + "skota terhundo", + "Aŭstralia silka terhundo", + "hungara mallonghara halthundo", + "Irlanda halthundo", + "bretona hundo", + "Kuvaso", + "Komondoro", + "antikva angla ŝafhundo", + "Ŝetlanda ŝafhundo", + "skota ŝafhundo", + "Rotvejla hundo", + "germana ŝafhundo", + "dobermanno", + "boksero", + "Danhundo", + "San-Bernarda hundo", + "ĥaskio", + "Dalmata hundo", + "Simihundo", + "Basenĝo", + "mopso", + "Novlanda hundo", + "granda Pirenea hundo", + "samojeda hundo", + "Pomerihundo", + "Ĉaŭĉaŭo", + "ŝoloickvintlo", + "lupino", + "Kolhara lupo", + "kojoto", + "Montara kuono", + "Makul-likaono", + "Hienedoj", + "vulpo", + "Arkta vulpo", + "Persa kato", + "Siama kato", + "pumo", + "linko", + "leopardo", + "neĝleopardo", + "jaguaro", + "leono", + "tigro", + "gepardo", + "bruna urso", + "Amerika nigra urso", + "blanka urso", + "Mungotedoj", + "surikato", + "Cicindelenoj", + "kokcinelo", + "Grundoskarabo", + "Foliskaraboj", + "Sterkoskarabo", + "Dipteroj", + "abelo", + "formiko", + "grilo", + "fasmo", + "blato", + "mantoj", + "cikado", + "Cikadelo", + "libelo", + "zigoptero", + "Monarka papilio", + "marstelo", + "eĥino", + "Markukumo", + "Leporo", + "Hamstro", + "histriko", + "marmoto", + "kastoro", + "kobajo", + "zebro", + "porko", + "apro", + "fakoĉero", + "Amfibia hipopotamo", + "okso", + "Akvobubalo", + "Bizono", + "virŝafo", + "Kanada ŝafo", + "ibekso", + "Stepa alcelafo", + "impalo", + "gazelo", + "dromedaro", + "Lamo", + "Musteloj", + "mustelo", + "putoro", + "furo", + "Lutrenoj", + "mefito", + "melo", + "armadelo", + "Bradipo", + "orangutango", + "gorilo", + "ĉimpanzo", + "Gibonoj", + "simiino", + "paviano", + "Makako", + "Blank-nigraj stumposimioj", + "Nazulo", + "Hurlulo", + "Atelo", + "Sajmirienoj", + "Ringvosta lemuro", + "azia elefanto", + "Afrika elefanto", + "Malgranda pando", + "granda pando", + "angilo", + "Klaŭnfiŝo", + "Acipenseredoj", + "Belono", + "abako", + "Abajo", + "Akademia vesto", + "akordiono", + "akustika gitaro", + "aviporta ŝipo", + "Komercaviadilo", + "aerŝipo", + "ambulanco", + "Amfibia veturilo", + "Abelejo", + "antaŭtuko", + "rubujo", + "Sturmofusilo", + "Dorsosako", + "bakejo", + "baloneto", + "globkrajono", + "banĝo", + "balustrado", + "Halterego", + "garbejo", + "barometro", + "barelo", + "ĉarumo", + "basbala pilko", + "korbopilko", + "Lulilo", + "fagoto", + "Banĉapo", + "bantuko", + "banujo", + "staciaŭto", + "lumturo", + "Ĉako", + "Bierbotelo", + "tandemo", + "bikino", + "Binoklo", + "Boatremizo", + "bobado", + "bretaro", + "librobutiko", + "Ŝtopilo", + "arko", + "Bantokravato", + "mamzono", + "Ĝeto", + "Egido", + "balailo", + "sitelo", + "Buko", + "Kuglorezista veŝto", + "ŝinkanseno", + "kabo", + "kaldrono", + "kandelo", + "kanoto", + "skatolmalfermilo", + "Kardigano", + "karuselo", + "bankaŭtomato", + "kasedo", + "kastelo", + "Katamarano", + "violonĉelo", + "posxtelefono", + "ĉeno", + "Dratreto", + "Maŝkuto", + "motorsegilo", + "kofro", + "komodo (meblo)", + "kirko", + "kinejo", + "Getaoj", + "koktelskuilo", + "kafkruĉo", + "klavaro", + "sukeraĵejo", + "Kontenerŝipo", + "Kabrioleto", + "Korktirilo", + "trumpeto", + "vakera ĉapelo", + "lulilo", + "Gruo (maŝino)", + "Aromonesto", + "Lambastono", + "Kiraso", + "akvobaraĵo", + "skribotablo", + "Surtabla komputilo", + "Vindotuko", + "vazarlavilo", + "Doko", + "hundosledo", + "kupolo", + "Membranofono", + "Haltero", + "elektrogitaro", + "elektra lokomotivo", + "koverto", + "dosiero", + "fajrestinga boato", + "fajropumpila veturilo", + "flagstango", + "fluto", + "Faldseĝo", + "levĉaro", + "Fontano", + "fontplumo", + "pato", + "peltisto", + "gasmasko", + "Fuelpumpilo", + "golfpilko", + "Golfĉaro", + "gondolo", + "gongo", + "pianego", + "forcejo", + "manĝbutiko", + "gilotino", + "martelo", + "korbo", + "harsekigilo", + "poŝkomputilo", + "naztuko", + "Buŝharmoniko", + "harpo", + "kahelaro", + "reko", + "Sablohorloĝo", + "gladilo", + "kukurbolanterno", + "ĝinzo", + "ĵipo", + "T-ĉemizo", + "puzlo", + "rikiŝo", + "nodo", + "Ĉerpokulero", + "Lampŝirmilo", + "sinokomputilo", + "Traba falĉmaŝino", + "kovertomalfermilo", + "flamigilo", + "transoceana homveturiga ŝipo", + "lipoŝminko", + "kosmetika ŝmiraĵo", + "laŭtparolilo", + "lupeo", + "Segejo", + "Kloaka kovrilo", + "Marako", + "ksilofono", + "Masko", + "Majarbo", + "Labirinto", + "Mezurkruĉo", + "Megalito", + "mikrofono", + "mikroondilo", + "Buseto", + "minijupo", + "unuvolumena aŭtomobilo", + "misilo", + "duonganto", + "Movebla domo", + "Ford Modelo T", + "modemo", + "mopedo", + "moskeo", + "kulvualo", + "skotero", + "montbiciklo", + "muso", + "Muskaptilo", + "najlo", + "kolĉeno", + "cicumo", + "tekokomputilo", + "obelisko", + "hobojo", + "okarino", + "hodometro", + "orgeno", + "osciloskopo", + "bovĉaro", + "oksigena masko", + "pako", + "Pagajo", + "pendseruro", + "peniko", + "piĵamo", + "palaco", + "pajnoŝalmo", + "paraŝuto", + "Paralelaj bariloj", + "parkhorloĝo", + "pasaĝervagono", + "Korto", + "publika telefono", + "Piedestalo", + "Skribilujo", + "krajonpintigilo", + "parfumo", + "Petri-plado", + "kopiilo", + "plektro", + "kamioneto", + "monoskatoleto", + "Kapkuseno", + "rabotilo", + "plasta saketo", + "plugilo", + "Sonorilo (ilo)", + "Ponĉo", + "Florpoto", + "Potista rado", + "presilo", + "malliberejo", + "Pafaĵo", + "projekciilo", + "hokedisko", + "monujo", + "litkovrilo", + "rakedo", + "Radiadilo", + "radioteleskopo", + "Kampadveturilo", + "fridujo", + "teleregilo", + "restoracio", + "revolvero", + "fusilo", + "lulseĝo", + "liniilo", + "monŝranko", + "sendanĝera pinglo", + "salujo", + "sandalo", + "Sarongo", + "saksofono", + "glavingo", + "pesilo", + "lernejobuso", + "Skuno", + "ŝraŭbo", + "ŝraŭbturnilo", + "sekurbendo", + "kudromaŝino", + "ŝildo", + "ŝuvendejo", + "aĉetĉareto", + "ŝovelilo", + "duŝoĉapo", + "duŝkurteno", + "skio", + "dormosako", + "Glitkalkulilo", + "motorsledo", + "Neĝoplugilo", + "piedpilko", + "ŝtrumpeto", + "Sunforno", + "spacostango", + "ŝpinilo", + "sporta aŭto", + "planklumo", + "Scenejo", + "Vaporlokomotivo", + "Ŝtaltamburo", + "Stetoskopo", + "Stolo (liturgio)", + "ŝtonmuro", + "klikhorloĝo", + "Stovo", + "tramo", + "Brankardo", + "stupao", + "submarŝipo", + "kompleto de vestoj", + "sunhorloĝo", + "sunokulvitro", + "Sunprotektilo", + "pendoponto", + "ŝvabrilo", + "pendolilo", + "Ŝaltilo", + "injektilo", + "tanko", + "Tekruĉo", + "pluŝa urso", + "tenisa pilko", + "Teatra kurteno", + "fingringo", + "draŝmaŝino", + "Trono", + "panrostilo", + "Neceseja sidejo", + "torĉo", + "Totema paliso", + "traktoro", + "Pleto", + "Triciklo", + "stativo", + "Triumfa arko", + "trolebuso", + "trombono", + "turnokruco", + "ombrelo", + "unuciklo", + "pianeto", + "polvosuĉilo", + "vazo", + "volbo", + "veluro", + "ornato", + "viadukto", + "violono", + "volejbala pilko", + "vaflofero", + "murhorloĝo", + "biletujo", + "ŝranko", + "milita aviadilo", + "lavmaŝino", + "akvoturo", + "Fajfilo", + "Peruko", + "Vinbotelo", + "uoko", + "lano", + "Jurto", + "retejo", + "komikslibro", + "krucvortenigmo", + "trafiksigno", + "trafiklumoj", + "jaketo", + "avokada kaĉo", + "orient-azia miksopoto", + "Glaciaĵo", + "stangoglaciaĵo", + "Bagelo", + "krakeno", + "fromaĝburgero", + "terpomkaĉo", + "florbrasiko", + "Legomkukurbo", + "kukumo", + "figo", + "ananaso", + "granato", + "fojno", + "ĉokoladsiropo", + "pasto", + "viandokuko", + "pico", + "burito", + "ruĝa vino", + "Espreso", + "ovopunĉo", + "bobelo", + "klifo", + "Korala rifo", + "gejsero", + "terpinto", + "marbordo", + "malaltejo", + "Vulkano", + "Kolzo", + "glano", + "rozbero", + "spiko", + "neceseja papero" + ] + ], + "HA": [ + [ + 9, + 71, + 87, + 113, + 127, + 128, + 138, + 276, + 288, + 291, + 309, + 310, + 334, + 340, + 341, + 344, + 428, + 435, + 462, + 463, + 468, + 470, + 472, + 497, + 498, + 508, + 525, + 542, + 558, + 668, + 693, + 695, + 710, + 711, + 760, + 762, + 787, + 805, + 806, + 879, + 889, + 911, + 916, + 939, + 952, + 971, + 979 + ], + [ + "jimina", + "Kunama", + "Aku", + "Katantanwa", + "Galantoyi", + "Ganshamo", + "Tuje", + "Kurã", + "Damisa", + "Zaki", + "Ƙudan zuma", + "kwari", + "Beguwa", + "Jakin daji", + "Aladu", + "dṑrinā", + "Baro", + "bāhṑ", + "másháaríi", + "guga", + "tā̀sî", + "kyándìr̃", + "Kwale-kwale", + "coci", + "gidan siliman", + "Fasahar mashigar rubutun kwamfuta", + "madatsar ruwa", + "makaɗi", + "mabusa", + "masallaci", + "filafili", + "Kwado", + "Mawashin fensir", + "Turare", + "Firinji", + "gidan abinci", + "garkuwa", + "tamaula", + "Safa", + "Lema", + "Goge", + "ulu", + "yanar gizo", + "kabewa", + "ɓaure", + "kumfa", + "ƙorama" + ] + ], + "EU": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 15, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 30, + 34, + 37, + 39, + 45, + 46, + 48, + 49, + 50, + 61, + 62, + 63, + 65, + 70, + 71, + 75, + 77, + 78, + 79, + 80, + 82, + 84, + 85, + 86, + 88, + 92, + 93, + 94, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 107, + 108, + 110, + 111, + 112, + 113, + 114, + 115, + 120, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 133, + 134, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 150, + 151, + 153, + 154, + 158, + 160, + 162, + 163, + 173, + 213, + 215, + 229, + 230, + 231, + 235, + 242, + 246, + 247, + 250, + 251, + 257, + 259, + 269, + 270, + 272, + 273, + 275, + 277, + 279, + 281, + 283, + 284, + 287, + 288, + 289, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 303, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 319, + 320, + 321, + 322, + 323, + 327, + 328, + 329, + 331, + 333, + 334, + 337, + 338, + 339, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 352, + 353, + 354, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 367, + 368, + 369, + 371, + 372, + 373, + 376, + 378, + 379, + 380, + 381, + 383, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 397, + 398, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 433, + 435, + 436, + 437, + 438, + 441, + 443, + 444, + 446, + 447, + 448, + 452, + 453, + 454, + 455, + 456, + 457, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 467, + 468, + 469, + 470, + 472, + 473, + 474, + 475, + 476, + 478, + 480, + 481, + 482, + 483, + 484, + 486, + 487, + 488, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 502, + 503, + 505, + 506, + 508, + 509, + 510, + 511, + 512, + 513, + 516, + 517, + 520, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 533, + 534, + 535, + 536, + 538, + 539, + 541, + 542, + 543, + 545, + 546, + 549, + 552, + 553, + 555, + 556, + 557, + 558, + 559, + 561, + 562, + 563, + 566, + 567, + 568, + 569, + 570, + 572, + 573, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 595, + 597, + 599, + 600, + 604, + 606, + 607, + 608, + 610, + 611, + 612, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 623, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 634, + 636, + 637, + 641, + 642, + 643, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 655, + 656, + 657, + 658, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 682, + 684, + 685, + 687, + 688, + 689, + 692, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 704, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 716, + 717, + 718, + 719, + 721, + 725, + 726, + 727, + 728, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 758, + 760, + 762, + 763, + 764, + 765, + 767, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 790, + 791, + 792, + 793, + 795, + 796, + 797, + 801, + 802, + 803, + 806, + 807, + 809, + 811, + 813, + 814, + 816, + 817, + 818, + 819, + 820, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 847, + 849, + 850, + 851, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 862, + 865, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 876, + 877, + 879, + 880, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 892, + 893, + 894, + 895, + 896, + 897, + 899, + 900, + 902, + 903, + 905, + 908, + 911, + 914, + 916, + 917, + 918, + 919, + 920, + 923, + 925, + 928, + 929, + 934, + 936, + 937, + 938, + 939, + 943, + 944, + 947, + 949, + 950, + 951, + 952, + 953, + 954, + 956, + 957, + 958, + 961, + 966, + 967, + 970, + 971, + 972, + 973, + 974, + 976, + 977, + 978, + 979, + 980, + 982, + 983, + 984, + 985, + 987, + 988, + 989, + 992, + 996, + 998, + 999 + ], + [ + "tenka", + "urre-arrain", + "marrazo zuri", + "Tigre-marrazo", + "mailu-arrain", + "Ikaraio", + "bastanga", + "oilar", + "oilo", + "ostruka", + "negu-txonta", + "karnaba", + "txoka", + "Zozo papargorri", + "eskinoso", + "pika", + "ur-zozo", + "abendu", + "Arrano buruzuri", + "Sai", + "Laponiako urubi", + "axolot", + "zezen-igel", + "Laut dortoka", + "Kaxa-dortoka", + "iguana (generoa)", + "Gila munstro", + "musker berde", + "Komodoko dragoi", + "Nilotar krokodilo", + "Mississippiko aligatore", + "boa hertsatzaile", + "Seba pitoi", + "Kobra betaurrekodun", + "itsasoko suge", + "opilioi", + "eskorpioi", + "Alargun beltz", + "likosido", + "akain", + "ehunzango", + "Lira-oilar", + "eper", + "hegazterren", + "Galeper", + "eper", + "guakamaio", + "erlatxori", + "buzerotido", + "Kolibri", + "tukan", + "ahate", + "Zerra ertain", + "antzara", + "Beltxarga beltz", + "Ekidna", + "ornitorrinko", + "Walabi", + "marmoka", + "itsas anemona", + "Platelminto", + "nematodo", + "itsas kurkuilu", + "barraskilo", + "bare", + "Nudibrankio", + "txamar", + "Otarrain", + "Ibai-karramarro", + "Ermitau (karramarroa)", + "isopodo", + "Amiamoko zuri", + "Amiamoko beltz", + "Mokozabal", + "Flamenko", + "txori zezen", + "Kurrilo", + "Amerikar kopetazuri", + "basoilo", + "Harri-iraulari", + "Txirri arrunt", + "Bernagorri arrunt", + "hematopodido", + "pelikano", + "Pinguino errege", + "Albatros", + "Balea gris", + "Orka", + "Itsas lehoi", + "chihuahua (txakurra)", + "Maltatar (txakurra)", + "txakur pekindar", + "terrier", + "Afganistango ehiza-txakur", + "Beagle (txakurra)", + "untxari", + "Ibizako ehiza-txakur", + "irlandar setter", + "Bretainiar spaniel", + "artzain-txakur", + "Shetlandeko ardi txakurra", + "eskoziar artzain-zakur", + "Artzain-txakur aleman", + "boxer (txakurra)", + "Danes handi", + "San Bernardo (txakurra)", + "siberiar husky", + "Dalmaziar", + "Pirinioetako mendiko zakur", + "Pomeraniar (txakurra)", + "otso", + "Otso artiko", + "koiote", + "Dingo txakur", + "Likaon", + "azeri", + "Azeri artiko", + "katu", + "Persiar katu", + "Katu siamdar", + "Katamotz", + "Lehoinabar", + "Elur-lehoinabar", + "lehoi", + "tigre", + "gepardo", + "hartz arre", + "Hartz beltz", + "hartz zuri", + "mangosta", + "Surikata", + "kikindera", + "marigorringo", + "Zeranbizido", + "Gurgurio", + "euli", + "Erle", + "inurri", + "matxinsalto", + "kilker", + "intsektu makila", + "labezomorro", + "Marisorgin", + "txitxar", + "burruntzi", + "sorgin-orratz", + "almirante", + "Kiribil-tximeleta", + "Monarka tximeleta", + "Itsas izar", + "Itsas trikua", + "holoturia", + "Erbi", + "Hamsterrak", + "Arantzurde", + "kastore", + "akuri", + "zaldi beilegi", + "txerria", + "basurde", + "fakokero", + "hipopotamo", + "idi", + "Asiar bufalo", + "bisonte", + "ahari", + "zimarroi", + "basahuntz", + "inpala", + "gazela", + "dromedario", + "erbinude", + "bisoi", + "Ipurtats", + "hudo", + "igaraba", + "mofeta", + "azkonar", + "armadilo", + "Nagi hiruhatz zama-argia", + "txinpantze", + "giboi", + "Symphalangus", + "Erythrocebus", + "Babuino", + "Makako", + "Tximino sudurrandi", + "tximino kaputxino", + "tximino orroalari", + "Callicebus", + "tximino armiarma", + "Maki lemur", + "Asiar elefante", + "Afrikar elefante", + "panda gorri", + "panda handi", + "aingira", + "Gaizkata", + "akula", + "globo-arrain", + "abako", + "eskusoinu", + "gitarra akustiko", + "hegazkin-ontzi", + "hegazkin komertzial", + "Baloi gidatu", + "aldare", + "Anbulantzia", + "anfibio", + "erlategi", + "mantal", + "zabor-edukiontzi", + "Eraso fusil", + "Bizkar-zorro", + "Okindegi", + "oreka-barra", + "puxika", + "Bolaluma", + "eskudel", + "haltera", + "Ileapaindegiko aulki", + "bizartegi", + "nekazaritzako eraikin", + "barometro", + "Barrika (ontzia)", + "Eskorga", + "beisbol-pilota", + "saskibaloi", + "Sehaska", + "Igeriketa txano", + "bainuontzi", + "Familiar (automobila)", + "itsasargi", + "Hauspeakin ontzi", + "garagardo-pitxer", + "bular", + "Tandem (bizikleta)", + "uztai-karpeta", + "Prismatikoak", + "usategi", + "Txano", + "liburutegi", + "liburudenda", + "botila-tapoi", + "arku", + "Tximeleta-begizta", + "bularretako", + "Harri-lubeta", + "Egida", + "erratza", + "Suil", + "Belarri (osagarria)", + "Balen aurkako txaleko", + "harategi", + "taxista", + "pertz", + "kandela", + "kanoa", + "lata-irekitzekoa", + "Cardigan (jertsea)", + "atzerako ispilu", + "zaldiko-maldiko", + "kartoi", + "Kutxazain automatiko", + "kasete", + "kasete-irakurtzaile", + "gaztelu", + "Katamaran", + "txelo", + "telefono mugikor", + "kate", + "maila kota", + "Motozerra", + "kutxatzar", + "Komoda", + "kariloi", + "beira-arasa", + "Eguberriko galtzerdi", + "eliza", + "zinema-areto", + "Xafla", + "eskalapoi", + "koktel-ontzi", + "kafeontzi", + "espiral", + "teklatu", + "gozoki", + "kontainer-ontzi", + "kabriolet", + "kortxo-kentzeko", + "tronpeta", + "sehaska", + "garabi", + "sehaska", + "Makulu", + "koraza", + "Presa", + "idazmahai", + "mahai gaineko ordenagailu", + "Pixoihal", + "erloju digital", + "espartzu", + "Ontzi-garbigailu", + "Disko-balazta", + "ditxo", + "kupula", + "lanpas", + "Menbranofono", + "danbor-makila", + "Haltera", + "haizagailu", + "gitarra elektriko", + "sobre", + "lepoko", + "fitxategi", + "Suhiltzaile-kamioi", + "pantaila", + "masta", + "zeharkako xirula", + "Aulki tolesgarri", + "Orga jasotzaile", + "iturri", + "estilografiko", + "tronpa", + "zartagin", + "larrugintza", + "Zabor-bilketako kamioi", + "Maskara (iragazkia)", + "kopa", + "kart", + "isats-piano", + "Berotegi", + "parrilla", + "auzo-denda", + "gillotina", + "orratz", + "finkatzaile", + "mailu", + "saski", + "Ile-lehorgailu", + "Gailu mugikor", + "Zapi", + "aho-soinu", + "harpa", + "Sega-makina", + "pistola-zorro", + "aberaska", + "mako", + "Harea-erloju", + "Lisaburdina", + "Jack Linterna", + "bakero", + "elastiko", + "buruhausgarri", + "esku-karrosa", + "belaunetako", + "korapilo", + "mantal", + "Burruntzali", + "pantaila", + "Ordenagailu eramangarri", + "mozte", + "gutun-irekitzeko", + "salbamendu txalupa", + "pizgailu", + "limusina", + "Transatlantiko", + "Ezpainetako", + "mokasin", + "lozio", + "bozgorailu", + "Zerrategi", + "zorro", + "postontzi", + "Maraka", + "Xilofono", + "Maskara (mozorroa)", + "maiatzeko zuhaitz", + "Labirinto", + "Neurketa-pitxer", + "botikin", + "megalito", + "mikrofono", + "Mikrouhin labe", + "uniforme militar", + "esne-ontzi", + "Minigona", + "Monobolumen", + "Misil", + "eskuzorro", + "zenobio", + "monitore", + "ziklomotor", + "motrailu", + "Birreta (klerikala)", + "meskita", + "eltxo-sare", + "Scooter (motozikleta)", + "Mendiko bizikleta", + "sagu", + "sagutegi", + "iltze", + "lepoko", + "Obelisko", + "Okarina", + "odometro", + "organo", + "osziloskopio", + "gaingona", + "pakete", + "giltzarrapo", + "Pintzel", + "pijama", + "jauregi", + "Panen flauta", + "Paper xurgatzaile", + "jausgailu", + "Parkimetro", + "Terraza", + "Telefono publiko", + "Plinto", + "plumier", + "Zorrozkailu", + "Lurrin", + "Petri plaka", + "fotokopiagailu", + "Plektro", + "oholesi", + "furgoneta", + "zubi-pilare", + "Itsulapiko", + "Burko", + "Pitxer", + "marrusketa", + "planetario", + "Plastikozko poltsa", + "Golde", + "Libragailu", + "instanteko argazki-kamera", + "pertika", + "poliziaren furgoneta", + "pontxo", + "Billar-mahai", + "Loreontzi", + "eltzegile-gurpil", + "Errezo-alfonbra", + "Inprimagailu", + "espetxe", + "jaurtigai", + "proiektagailu", + "Disko (hockey)", + "boxeo zakua", + "diru-zorro", + "idazluma", + "Ohazal", + "bolido", + "Erraketa", + "erradiadore", + "irratifonia", + "irrati-teleskopio", + "txirrika", + "Hozkailu", + "jatetxe", + "Errebolber", + "Fusil", + "Kulunkaulki", + "goma", + "Erregela graduatu", + "Kirol-oinetako", + "Kutxa gotor", + "kateorratz", + "gatzontzi", + "sandalia", + "Saronga", + "saxofoi", + "zorro", + "Balantza", + "goleta", + "markagailu", + "pantailla", + "torloju", + "bihurkin", + "segurtasun-uhal", + "Josteko makina", + "Ezkutu", + "zapata-denda", + "erosketa-saski", + "Erosketa orga", + "Pala", + "bainu-txano", + "eski", + "borrero-txano", + "Lo-zaku", + "esnorkel", + "elurretako motor", + "Elur-kentzeko makina", + "galtzetin", + "Eguzki-labe", + "zopa-ontzi", + "Berogailu", + "espatula", + "txalupa bizkor", + "txaratila", + "kirol-automobil", + "foku", + "eszenatoki", + "Lurrun tren-makina", + "fonendoskopio", + "Estola", + "harresi", + "kronometro", + "berogailu", + "iragazki", + "trolebus", + "Ohatila", + "itsaspeko", + "traje", + "Eguzki erloju", + "Eguzkitako betaurreko", + "Eguzkitako krema", + "zubi eseki", + "Lanbas", + "izerditzeko jertse", + "zabu", + "etengailu", + "xiringa", + "tanke", + "teontzi", + "peluxezko hartz", + "telebista", + "lastozko teilatu", + "oihal", + "titare", + "garia jotzeko makina", + "Tronu", + "teilazko teilatu", + "Txigorgailu", + "Tabako-denda", + "Lastargi", + "jostailu-denda", + "traktore", + "trailer", + "Erretilu", + "Gabardina", + "Triziklo", + "Tripode", + "Garaipen arku", + "Trolebus", + "tronboi", + "upel", + "ate birakari", + "euritako", + "Monoziklo", + "xurgagailu", + "lorontzi", + "Ganga", + "belus", + "jantzi", + "biaduktu", + "biolin", + "boleibol-pilota", + "horma-erloju", + "Diru-zorro", + "armairu", + "hegazkin militar", + "konketa", + "Garbigailu", + "ur-txarro", + "Ur-dorre", + "txilibitu", + "ileorde", + "lehio-sareta", + "hegal", + "artile", + "iola", + "webgune", + "komiki", + "Hitz gurutzatuak", + "trafiko seinale", + "Zirkulazio-argi", + "plater", + "salda", + "izozki", + "Polo (izozkia)", + "saltxitxa-ogitarteko", + "azaburu", + "brokoli", + "azalore", + "kuiatxo", + "luzoker", + "orburu", + "perretxiko", + "marrubi", + "laranja", + "limoi", + "piku", + "anana", + "platano", + "txirimoia", + "mingrana", + "belar", + "ore", + "ardo beltz", + "Kafe espres", + "garaiera handiko edozein mendi", + "burbuila", + "labar", + "koralezko arrezife", + "Geiser", + "lurmutur", + "barra", + "itsasertz", + "haran", + "Sumendi", + "ezkongai", + "murgilari", + "olio-arbi", + "bitxilore", + "arto", + "ezkur", + "Arkakarats", + "tintausain argi", + "Ardagai hostotsu", + "galburu", + "komuneko paper" + ] + ], + "AS": [ + [ + 9, + 28, + 29, + 63, + 69, + 71, + 79, + 91, + 93, + 94, + 96, + 102, + 103, + 110, + 111, + 113, + 114, + 130, + 134, + 144, + 148, + 151, + 235, + 274, + 288, + 289, + 291, + 292, + 293, + 296, + 298, + 309, + 310, + 312, + 315, + 327, + 334, + 341, + 344, + 346, + 355, + 360, + 365, + 367, + 368, + 385, + 387, + 388, + 398, + 407, + 417, + 418, + 428, + 456, + 459, + 462, + 463, + 468, + 480, + 487, + 488, + 508, + 541, + 558, + 591, + 606, + 612, + 643, + 668, + 673, + 677, + 679, + 705, + 719, + 725, + 730, + 742, + 750, + 762, + 771, + 774, + 787, + 806, + 827, + 879, + 889, + 893, + 916, + 928, + 935, + 943, + 952, + 957, + 958, + 971, + 973, + 979, + 980 + ], + [ + "উট চৰাই", + "ফুটুকী জেঠী", + "আচলটল", + "চকৰিফেঁটী সাপ", + "তিনিভগীয়া পোক", + "বিচ্ছু", + "চেলা", + "কুকুহা", + "ধনেশ", + "মৌপিয়া", + "টুকান", + "গোৱালিয়ান", + "হাঁহঠুঁটীয়া", + "চেপেটা কৃমি", + "ঘূৰণীয়া কৃমি", + "শামুক", + "কুমজেলুকা", + "ফ্লেমিংগ", + "বগলী", + "ভেলা", + "অৰকা", + "চিৱাৱা", + "জাৰ্মান শ্বেফাৰ্ড", + "ৰাংকুকুৰ", + "নাহৰফুটুকী বাঘ", + "বৰফৰ বাঘ", + "সিংহ", + "ঢেঁকীয়াপতীয়া বাঘ", + "চিতা বাঘ", + "বগা ভালুক", + "নেউল", + "মৌমাখি", + "পৰুৱা", + "উঁইচিৰিঙা", + "গাগিনী", + "তৰামাছ", + "কেঁটেলা পহু", + "গাহৰি", + "জলহস্তী", + "বনৰীয়া ম’হ", + "লামা", + "উদ", + "ওৰাঙোটাং", + "চিম্পাঞ্জী", + "গিবন", + "হাতী", + "পাণ্ডা", + "ডাঙৰ পাণ্ডা", + "এবাকাছ", + "এম্বুলেঞ্চ", + "গৰম বতাহৰ বেলুন", + "বলপে'ন", + "ঠেলাগাড়ী", + "ধনু", + "বক্ষবন্ধনী", + "বাঢ়নী", + "বাল্টি", + "টেক্সী", + "এ টি এম", + "ম’বাইল ফোন", + "শিকলি", + "কীব'ৰ্ড", + "ঢোল", + "বাঁহী", + "ৰুমাল", + "ইস্ত্ৰি", + "ৰিক্সা", + "মুখা", + "মছজিদ", + "কম্পিউটাৰ মাউচ", + "খিলি", + "হাৰ", + "দবা", + "পিগি বেংক", + "কলহ", + "নাঙল", + "প্ৰিণ্টাৰ (কম্পিউটাৰ সম্বন্ধীয়)", + "লেপ", + "ৰেস্তোৰাঁ", + "চন্দুক", + "চেণ্ডেল", + "ঢাল", + "মোজা", + "চৌকা", + "ছাতি", + "বেহেলা", + "ৱালেট", + "ৱেবছাইট", + "আইচক্ৰিম", + "আলু পিটিকা", + "তিয়ঁহ", + "ডিমৰু", + "ডালিম", + "খেৰ", + "বুৰবুৰণি", + "প্ৰবাল প্ৰাচীৰ", + "উপত্যকা", + "আগ্নেয়গিৰি" + ] + ], + "TE": [ + [ + 1, + 4, + 6, + 18, + 23, + 63, + 71, + 79, + 86, + 92, + 94, + 99, + 102, + 103, + 105, + 110, + 111, + 112, + 113, + 129, + 130, + 134, + 144, + 148, + 149, + 151, + 162, + 235, + 242, + 246, + 254, + 269, + 274, + 276, + 277, + 286, + 288, + 289, + 290, + 291, + 292, + 293, + 296, + 298, + 305, + 308, + 309, + 310, + 312, + 314, + 315, + 319, + 323, + 327, + 331, + 334, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 348, + 360, + 365, + 366, + 368, + 372, + 385, + 390, + 398, + 403, + 407, + 412, + 418, + 426, + 430, + 435, + 437, + 445, + 447, + 454, + 456, + 459, + 462, + 463, + 465, + 468, + 470, + 476, + 480, + 485, + 486, + 487, + 488, + 491, + 497, + 498, + 508, + 513, + 517, + 525, + 527, + 538, + 558, + 562, + 563, + 567, + 576, + 578, + 580, + 583, + 587, + 591, + 593, + 594, + 606, + 612, + 616, + 618, + 620, + 626, + 629, + 644, + 650, + 651, + 655, + 657, + 662, + 668, + 670, + 673, + 677, + 679, + 695, + 696, + 697, + 701, + 710, + 711, + 713, + 721, + 730, + 732, + 739, + 742, + 743, + 744, + 745, + 750, + 760, + 762, + 763, + 765, + 769, + 772, + 778, + 783, + 784, + 786, + 787, + 791, + 792, + 816, + 820, + 823, + 833, + 834, + 835, + 837, + 838, + 843, + 844, + 845, + 850, + 854, + 866, + 879, + 882, + 889, + 892, + 893, + 897, + 902, + 911, + 916, + 918, + 928, + 929, + 943, + 952, + 953, + 957, + 958, + 963, + 971, + 973, + 974, + 978, + 979, + 980 + ], + [ + "గోల్డ్ ఫిష్", + "సుత్తి తల సొరచేప", + "స్టింగ్రే", + "కొండకాటి పిట్ట", + "రాబందు", + "నాగుపాము", + "తేలు", + "శతపది", + "చకోరం", + "పచ్చరెక్క", + "హమ్మింగ్ పక్షి", + "బాతు", + "ఎఖిడ్నా", + "ప్లాటిపస్", + "కోలా", + "ప్లాటీహెల్మింథిస్", + "నెమటోడ", + "శంఖం", + "నత్త", + "తెడ్డుమూతి కొంగ", + "రోహిత పక్షి", + "కొంగ", + "గూడ బాతు", + "ఓర్కా", + "దుగోంగ్", + "చువావా", + "బీగల్", + "జర్మన్ షెపర్డ్", + "బాక్సర్ (కుక్క)", + "గ్రేట్ డేన్", + "పగ్ కుక్క", + "తోడేలు", + "రేచుకుక్కలు", + "దుమ్ములగొండి", + "నక్క", + "కౌగర్", + "చిరుతపులి", + "మంచు చిరుత", + "జాగ్వర్", + "సింహం", + "పులి", + "చిరుతగండు", + "ధృవపు ఎలుగుబంట", + "ముంగిస", + "పేడ పురుగు", + "ఈగ", + "తేనెటీగ", + "చీమ", + "కీచురాయి", + "బొద్దింక", + "గొల్లభామ (కీటకం)", + "తూనీగ", + "మోనార్క్ సీతాకోకచిలుక", + "స్టార్ ఫిష్", + "చెవుల పిల్లి", + "ముళ్ళపంది", + "గినియా పిగ్", + "జీబ్రా", + "పంది", + "అడవిపంది", + "నీటి ఏనుగు", + "ఎద్దు , వృషభం", + "గేదె", + "పొట్టేలు", + "ఉద్రము", + "ఒరంగుటాన్", + "గొరిల్లా", + "గిబ్బన్", + "కొండముచ్చు", + "eenugu pradarshana", + "పాముచేప", + "అబాకస్", + "విమాన వాహకనౌక", + "అంబులెన్సు", + "chetta butta", + "బాల్ పెన్", + "భారమితి", + "బాస్కెట్ బాల్", + "స్నానపు తొట్టె", + "దీపస్తంభం", + "బికినీ", + "బైనాక్యులర్స్", + "పుస్తకాల దుకాణం", + "ధనుస్సు", + "బ్రా", + "చీపురు", + "బక్కెట్టు", + "బుల్లెట్‌ప్రూఫ్ జాకెట్", + "టాక్సీ", + "కొవ్వొత్తి", + "రంగులరాట్నం", + "ఆటోమేటెడ్ టెల్లర్ మెషీన్", + "సిడి ప్లేయర్", + "సెల్లో", + "చరవాణి", + "గొలుసు", + "చెయిన్ సా", + "చర్చి", + "సినిమా హాలు", + "కంప్యూటర్ కీబోర్డ్", + "ట్రంపెట్", + "క్రేన్", + "ఆనకట్ట", + "డెస్క్ టాప్ కంప్యూటర్", + "గుమ్మటం", + "వేణువు", + "ఫౌంటైన్", + "ఫౌంటెన్ పెన్", + "పెనం", + "గాండల", + "గౌను", + "గ్రీన్‌హౌస్", + "గిలెటిన్", + "సుత్తి", + "రుమాలు", + "హార్మోనికా", + "హార్ప్", + "ఇస్త్రీ", + "రిక్షా", + "ముడి", + "గరిటె", + "ల్యాప్‌టాప్", + "అంటించు", + "లిప్‌స్టిక్", + "అగ్గిపుల్ల", + "మైక్రోఫోన్", + "మైక్రోవేవ్ ఓవెన్", + "మిని", + "క్షిపణి", + "మోడెమ్", + "మస్జిద్", + "స్కూటర్", + "మౌస్", + "మేకు", + "చంద్రహారం", + "తాళము", + "కుంచె", + "పైజామా", + "పారాచూట్", + "పెన్సిల్ షార్పనర్", + "అత్తరు", + "ఫోటో కాపీ", + "తలగడ", + "నాగలి", + "ఇన్స్టంట్ కెమెరా", + "కుమ్మరి చక్రం", + "కంప్యూటర్ ప్రింటర్", + "కారాగారము", + "ప్రక్షిప్త వస్తువు", + "ప్రొజెక్టర్", + "బొంత", + "రిఫ్రిజిరేటర్", + "ఫలహారశాల", + "రివాల్వర్", + "ఊగేచేరు", + "రూలర్ (స్కేల్)", + "పిన్నీసు", + "కాటా", + "స్క్రూ", + "స్క్రూడ్రైవర్", + "కుట్టు మిషను", + "డాలు", + "షాపింగ్ బండి", + "పార", + "కదురు", + "స్టీము లోకోమోటివ్ చరిత్ర", + "స్టెతస్కోప్", + "జలాంతర్గామి", + "సూటు", + "పలభా యంత్రము", + "సన్ గ్లాసెస్", + "సన్‌స్క్రీన్ లేపనము", + "ఉయ్యాల", + "స్విచ్చి", + "సిరంజి", + "టెడ్డీబేర్", + "యవనిక (తెర)", + "ట్రాక్టర్", + "గొడుగు", + "వాక్యూమ్ క్లీనర్", + "వాయులీనము", + "గోడ గడియారం", + "పర్సులో", + "వాషింగ్ మెషీన్", + "విజిల్", + "బొచ్చు", + "వెబ్‌సైటు", + "గళ్ళ నుడికట్టు", + "ఐస్ క్రీం", + "ఐస్ పాప్", + "దోసకాయలు", + "అత్తి పండు", + "అనాస", + "దానిమ్మపండు", + "ఎండు గడ్డి", + "పిజ్జా", + "బుడగ", + "పగడపు దిబ్బ", + "వేడి నీటి బుగ్గ", + "సముద్రతీరము", + "లోయ", + "అగ్నిపర్వతం" + ] + ], + "TH": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 39, + 45, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 56, + 58, + 60, + 61, + 62, + 63, + 65, + 66, + 67, + 68, + 69, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 83, + 85, + 86, + 88, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 119, + 120, + 121, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 229, + 230, + 231, + 232, + 234, + 235, + 236, + 237, + 242, + 243, + 244, + 246, + 247, + 248, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 263, + 264, + 265, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 303, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 314, + 315, + 316, + 319, + 322, + 323, + 324, + 326, + 327, + 328, + 329, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 348, + 350, + 352, + 353, + 354, + 355, + 356, + 357, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 504, + 505, + 506, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 580, + 582, + 583, + 584, + 585, + 587, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 640, + 641, + 642, + 643, + 644, + 646, + 647, + 648, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 660, + 661, + 662, + 663, + 664, + 665, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 719, + 720, + 721, + 722, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 937, + 938, + 939, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 988, + 989, + 990, + 991, + 992, + 997, + 998, + 999 + ], + [ + "ปลาเทนช์", + "ปลาทอง", + "ปลาฉลามขาว", + "ปลาฉลามเสือ", + "ปลาฉลามหัวค้อน", + "ปลากระเบนไฟฟ้า", + "ปลากระเบนธง", + "ไก่เพศผู้", + "นกตัวเมีย", + "กระจอกเทศ", + "นกจาบปีกอ่อนอกส้ม", + "นกโกลด์ฟินช์", + "นกเฮาส์ฟินช์", + "นกจังโก้", + "นกอินดิโกบันติง", + "นกโรบิน", + "นกปรอด", + "นกเจย์", + "นกสาลิกา", + "นกชิกคาดี", + "นกวอเตอร์อูเซิล", + "นกไคต์", + "อินทรีหัวขาว", + "แร้ง", + "นกเค้าแมวสีน้ำตาลยักษ์", + "ซาลามานเดอร์ไฟยุโรป", + "แอกโซลอเติล", + "กบอเมริกันบูลฟร็อก", + "กบต้นไม้", + "วงศ์กบมีหาง", + "เต่าหัวฆ้อน", + "เต่ามะเฟือง", + "เต่าโคลน", + "เต่า", + "อิกัวนา", + "กิล่ามอนสเตอร์", + "มังกรโกโมโด", + "จระเข้แม่น้ำไนล์", + "แอลลิเกเตอร์อเมริกา", + "ไทรเซราทอปส์", + "งูสายฟ้า", + "งูริงเน็ก", + "งูพัฟแอดเดอร์", + "งูพระราชา", + "งูน้ำ", + "งูกลางคืน", + "งูเหลือมโบอาคอนสตริกเตอร์", + "งูหลามแอฟริกา", + "งูเห่าอินเดีย", + "งูทะเล", + "งูพิษมีเขาทะเลทราย", + "งูไดมอนด์แบ็ก", + "งูหางกระดิ่งไซด์ไวน์เดอร์", + "ไทรโลไบต์", + "แมงป่อง", + "แมงมุมสวนสีดำทอง", + "แมงมุมยุ้งฉาง", + "แมงมุมสวน", + "แมงมุมแม่ม่ายดำ", + "แมงมุมทาแรนทูรา", + "แมงมุมหมาป่า", + "เห็บ", + "ตะขาบ", + "ไก่ป่า", + "นกกระทา", + "นกกระทา", + "มาคอว์", + "นกกระตั้วใหญ่หงอนเหลือง", + "นกกะปูด", + "นกกินผึ้ง", + "นกเงือก", + "ฮัมมิงเบิร์ด", + "นกจาคามาร์", + "นกปากใหญ่", + "เป็ด", + "เป็ดเมอร์แกนเซอร์อกแดง", + "ห่าน", + "หงส์ดำ", + "อิคิดนา", + "ตุ่นปากเป็ด", + "วอลลาบี", + "หมีโคอาลา", + "วอมแบต", + "แมงกะพรุน", + "ซีแอนนีโมน", + "ปะการังสมอง", + "หนอนตัวแบน", + "นีมาโทดา", + "หอยสังข์", + "หอยทาก", + "ทาก", + "ทากทะเล", + "ชั้นพอลิพลาโคฟอรา", + "หอยงวงช้างมุก", + "ปูใบ้", + "ปูก้ามดาบ", + "ปูจักรพรรดิ", + "กุ้งมังกร", + "เครย์ฟิช", + "ปูเสฉวน", + "นกกระสาขาว", + "นกกระสาดำ", + "นกปากช้อน", + "นกฟลามิงโก", + "นกยางสีน้ำเงินเล็ก", + "นกอเมริกันอีเกรต", + "นกบิตเทิร์น", + "นกกระเรียน", + "นกลิมป์กิน", + "นกกัลลินูลยุโรป", + "นกอเมริกันคูต", + "นกบัสตาร์ด", + "นกเทิร์นสโตนสีแดง", + "นกชายเลนปากยาว", + "นกทะเลขาแดงธรรมดา", + "นกโดวิทเชอร์", + "กระทุง", + "เพนกวินราชา", + "นกอัลบาทรอส", + "ปลาวาฬสีเทา", + "วาฬเพชฌฆาต", + "พะยูน", + "สิงโตทะเล", + "ชิวาวา", + "เจแปนิสสเปเนียล", + "สุนัขพันธุ์มอลทีส", + "ปักกิ่ง (พันธุ์สุนัข)", + "ซือจื่อ", + "เบลนเฮมสเปเนียล", + "สุนัขพันธุ์ปาปิลลอน", + "สุนัขพันธุ์ทอยเทอร์เรีย", + "โรเดเซียนริดจ์แบ็ก", + "อัฟกันเฮานด์", + "บาสเซตเฮานด์", + "บีเกิล", + "บลัดฮาวด์", + "บลูติก", + "สุนัขพันธุ์แบล็กแอนด์แทน คูนเฮานด์", + "วอล์เกอร์เฮานด์", + "อิงลิชฟอกซ์เฮานด์", + "เรดโบน", + "สุนัขพันธุ์บอร์ซอย", + "สุนัขพันธุ์ไอริช วูลฟ์เฮานด์", + "สุนัขพันธุ์อิตาเลียนเกรย์ฮาวด์", + "สุนัขพันธุ์วิปเพต", + "สุนัขพันธุ์อิบิซาน เฮานด์", + "สุนัขพันธุ์นอร์เวเจียนเอลก์ฮาวด์", + "สุนัขพันธุ์ออตเตอร์ เฮานด์", + "สุนัขพันธุ์ซาลูกิ", + "สุนัขพันธุ์เดียร์เฮานด์", + "สุนัขพันธุ์ไวย์มาราเนอร์", + "สุนัขพันธุ์สตาฟฟอร์ดไชร์ บูลเทอร์เรีย", + "สุนัขพันธุ์พิต บูล เ่ทอร์เรีย", + "สุนัขพันธุ์เบดลิงตัน เทอร์เรีย", + "สุนัขพันธุ์บอร์เดอร์เทอเรีย", + "สุนัขพันธุ์เคอร์รี บลู เทอร์เรีย", + "สุนัขพันธุ์ไอริช เทอร์เรีย", + "สุนัขพันธุ์นอร์โฟล์ก เทอร์เรีย", + "สุนัขพันธุ์นอร์วิช เทอร์เรีย", + "สุนัขพันธุ์ยอร์กเชียร์ เทอร์เรีย", + "สุนัขพันธุ์ฟอกซ์ เทอร์เรียร์ขนลวด", + "สุนัขพันธุ์เลกแลนด์ เทอร์เรีย", + "สุนัขพันธุ์ซีลีแฮม เทอร์เรีย", + "สุนัขพันธ์แอร์ริเดล เทอร์เรีย", + "สุนัขพันธุ์เคร์น", + "สุนัขพันธุ์ออสเตรเัลียน เทอร์เรีย", + "สุนัขพันธุ์แดนดี ดินมอนต์ เทอร์เรีย", + "สุนัขพันธุ์บอสตัน เทอร์เรีย", + "สุนัขพันธุ์สเนาเซอร์เล็ก", + "สุนัขพันธุ์สเนาเซอร์ใหญ่", + "สุนัขพันธุ์สเนาเซอร์มาตรฐาน", + "สุนัขพันธุ์สก็อตติช เทอร์เรีย", + "สุนัขพันธุ์ทิเบตัน เทอร์เรียร์", + "ซิลกี เทอร์เรียร์", + "สุนัขพันธุ์ซอฟต์โคต วีเทน เทอร์เรีย", + "สุนัขพันธุ์เวสต์ ไฮแลนด์ ไวท์ เทอร์เรีย", + "สุนัขพันธุ์ลาซา", + "สุนัขพันธุ์แฟลตโคต รีทรีเวอร์", + "สุนัขพันธุ์เคอร์ลีโคต รีทรีเวอร์", + "สุนัขพันธุ์โกลเดนรีทรีเวอร์", + "สุนัขพันธุ์ลาบาดอร์ รีทรีเวอร์", + "สุนัขพันธุ์เชซาปีก เบย์ รีทรีเวอร์", + "สุนัขพันธุ์เยอรมันพอยน์เตอร์ขนสั้น", + "สุนัขพันธุ์ฮังกาเรียนพอยน์เตอร์", + "สุนัขพันธุ์อิงลิชเซตเตอร์", + "สุนัขพันธุ์เรดเซตเตอร์", + "สุนัขพันธุ์กอร์ดอนเซตเตอร์", + "บริตทานีสแปเนียล", + "สุนัขพันธุ์คลัมเบอร์", + "สุนัขพันธุ์อิงลิชสปริงเกอร์", + "สุนัขพันธุ์เวลช์สปริงเกอร์ สเปเนียล", + "สุนัขพันธุ์คอกเกอร์ สเปเนียล", + "สุนัขพันธุ์ซัสเซกซ์ สเปเนียล", + "สุนัขพันธุ์ไอริช วอเตอร์ สเปเนียล", + "คูเวซ", + "โอลด์อิงลิชชีปด็อก", + "สุนัขเลี้ยงแกะ", + "สุนัขพันธุ์คอลลี่", + "สุนัขพันธุ์บอร์เดอร์คอลลี่", + "รอทท์ไวเลอร์", + "เยอรมันเชเพิร์ด", + "สุนัขพันธุ์โดเบอร์แมน", + "สุนัขพันธุ์มินิเจอร์ พินเชอร์", + "บ็อกเซอร์", + "บุลล์แมสติฟฟ์", + "แมสทิฟทิเบต", + "เกรตเดน", + "เซนต์เบอร์นาร์ด", + "สุนัขลากเลื่อน", + "สุนัขพันธุ์ไซบีเรียนฮัสกี", + "แดลเมเชียน", + "สุนัขพันธุ์แอฟเฟนพินเชอร์", + "บาเซนจี", + "ปั๊ก", + "ลีออนเบิร์ก", + "สุนัขพันธุ์นิวฟันด์แลนด์", + "เกรตไพรีนีส", + "ซาโมเยด", + "พอเมอเรเนียน", + "เชาเชา", + "สุนัขพันธุ์เพมโบรกเวลช์คอร์กี้", + "สุนัขพันธุ์คาร์ดิกันเวลช์คอร์กิ", + "พุดเดิ้ลทอย", + "พุดเดิ้ลสแตนดาร์ด", + "สุนัขพันธุ์เม็กซิกันแฮร์เลส", + "สุนัขบ้า", + "สุนัขป่าขาว", + "หมาป่าเคราขาว", + "ไคโยตี", + "หมาป่าดิงโก", + "หมาใน", + "หมาป่าไฮยีนา", + "ไฮยีนา", + "จิ้งจอก", + "หมาจิ้งจอกอาร์กติก", + "สุนัขจิ้งจอกเทา", + "แมวลาย", + "เปอร์เซีย (พันธุ์แมว)", + "แมววิเชียรมาศ", + "แมวอียิปต์", + "เสือพูมา", + "ลิงซ์", + "เสือดาว", + "เสือดาวหิมะ", + "เสือจากัวร์", + "สิงโต", + "เสือโคร่ง", + "เสือชีตาห์", + "หมีสีน้ำตาล", + "หมีดำ", + "หมีขั้วโลก", + "หมีสลอท", + "วงศ์พังพอน", + "เมียร์แคต", + "ด้วงเสือ", + "ตัาแมลงเต่าทอง", + "ด้วงหนวดยาว", + "ด้วงกว่าง", + "ด้วงงวง", + "แมลงวัน", + "ภมร", + "มด", + "ตั๊กแตน", + "จิ้งหรีด", + "แมลงสาบ", + "ตั๊กแตนตำข้าว", + "จักจั่น", + "แมลงปอ", + "ผีเสื้อริงเลต", + "ผีเสื้อจักรพรรดิ", + "ผีเสื้อแคบเบจ", + "ผีเสื้อไลแคนิด", + "ดาวทะเล", + "เม่นทะเล", + "ปลิงทะเล", + "กระต่ายแจ็ก", + "กระต่ายแองโกรา", + "แฮมสเตอร์", + "เม่น", + "กระรอกจิ้งจอก", + "มาร์มอต", + "บีเวอร์", + "หนูตะเภา", + "ม้าสีน้ำตาลอมแดงอ่อน", + "ม้าลาย", + "หมู", + "หมูป่า", + "ฮิปโปโปเตมัส", + "วัว", + "ควาย", + "ไบสัน", + "แกะตัวผู้", + "แพะป่า", + "อิมพาลา", + "กาเซลล์", + "อูฐโหนกเดียว", + "ยามา (สัตว์)", + "เพียงพอน", + "มิงค์", + "เฟร์ริต", + "นาก", + "สกังค์", + "แบดเจอร์", + "อาร์มาดิลโล", + "สลอทสามนิ้ว", + "อุรังอุตัง", + "ลิงกอริลลา", + "ลิงชิมแปนซี", + "ชะนีมือขาว", + "ชะนีเซียมัง", + "ลิงกูนอน", + "ลิงฮัสซาร์", + "ลิงบาบูน", + "ลิงแม็กแคก", + "ค่าง", + "ลิงโคโลบัส", + "ลิงจมูกยาว", + "ลิงมาร์โมเซต", + "ลิงคาปูชิน", + "ลิงฮาวเลอร์", + "ลิงตีตี้", + "ลิงแมงมุม", + "ลิงกระรอกปากดำ", + "มาดากัสการ์แคท", + "อินดรี", + "ช้างอินเดีย", + "ช้างพุ่มไม้แอฟริกา", + "แพนด้าแดง", + "แพนด้ายักษ์", + "ปลาบาร์ราคอตา", + "ปลาไหล", + "ปลาโคโฮแซลมอน", + "ปลาร็อกบิวตี้", + "ปลาการ์ตูน", + "ปลาสเตอร์เจียน", + "ปลาการ์", + "ปลาสิงโต", + "ปักเป้า", + "ลูกคิด", + "ชุดอาบาย่า", + "ครุย", + "แอกคอร์เดียน", + "กีต้าร์โปร่ง", + "เรือบรรทุกอากาศยาน", + "เครื่องบินพาณิชย์", + "เรือเหาะ", + "รถพยาบาล", + "รถสะเทินน้ำสะเทินบก", + "นาฬิกาอนาล็อก", + "โรงเลี้ยงผึ้ง", + "ผ้ากันเปื้อน", + "ถังขยะ", + "ปืนเล็กยาวจู่โจม", + "เป้", + "ร้านขนมปัง", + "คานทรงตัว", + "ลูกโป่ง", + "ปากกาหมึกแห้ง", + "แบนโจ", + "ราว", + "เก้าอี้ร้านตัดผม", + "ร้านตัดผม", + "ยุ้ง", + "บารอมิเตอร์", + "ถังใส่เหล้า", + "รถเข็นล้อเดียว", + "ลูกเบสบอล", + "บาสเกตบอล", + "เปล", + "บาสซูน", + "หมวกว่ายน้ำ", + "ผ้าเช็ดตัว", + "อ่างอาบน้ำ", + "รถตู้ห้าประตู", + "เรือนตะเกียง", + "บีกเกอร์", + "หมวกบัสบี", + "ขวดเบียร์", + "แก้วเบียร์", + "จักรยานขี่สองคน", + "บิกินี", + "แฟ้มห่วงเหล็ก", + "กล้องสองตา", + "บ้านนก", + "โรงเก็บเรือ", + "เลื่อนหิมะ", + "โบโลไท", + "หมวกที่มีผ้าผูกใต้คาง", + "ตู้หนังสือ", + "ร้านหนังสือ", + "จุกขวด", + "ศร", + "ผ้าผูกคอหูกระต่าย", + "แผ่นสลักภาพ", + "เครื่องยกทรง", + "พนัง", + "เกราะเเผ่นอก", + "ไม้กวาด", + "ถัง", + "หัวเข็มขัด", + "เสื้อเกราะกันกระสุน", + "รถไฟความเร็วสูง", + "ร้านขายเนื้อ", + "แท็กซี่", + "หม้อน้ำ", + "เทียนไข", + "ปืนบนรถถัง", + "เรือแจว", + "ที่เปิดกระป๋อง", + "เสื้อถัก", + "กระจกรถ", + "ม้าหมุน", + "ชุดเครื่องมือช่างไม้", + "กล่อง", + "ล้อรถยนต์", + "เครื่องรับจ่ายเงินอัตโนมัติ", + "คาสเซ็ต", + "เครื่องเล่นเทปคาสเซ็ท", + "ปราสาท", + "เรือใบแฝด", + "เครื่องเล่นซีดี", + "เชลโล", + "โทรศัพท์มือถือ", + "โซ่", + "รั้วลวดตาข่าย", + "ชุดเกราะห่วงโซ่", + "เลื่อยยนต์", + "หีบ", + "ตู้ลิ้นชัก", + "ระฆัง", + "ตู้จานกระเบื้อง", + "ถุงเท้าคริสต์มาส", + "โบสถ์", + "โรงภาพยนตร์", + "มีดชำแหละเนื้อ", + "ที่อยู่อาศัยบนหน้าผา", + "สิ่งปกคลุม", + "เกี๊ยะ", + "แก้วกาแฟ", + "กาใส่กาแฟ", + "เกลียวสว่าน", + "แป้นพิมพ์", + "ขนม", + "เรือบรรทุกคอนเทนเนอร์", + "รถเปิดประทุน", + "เหล็กไขจุก", + "คอร์เนต", + "รองเท้าบูทคาวบอย", + "หมวกโคบาล", + "อู่", + "เครน", + "หมวกกันกระแทก", + "ลักษณะใบอ่อน", + "เตียงเด็ก", + "ลูกโครเก็ต", + "ไม้ยันรักแร้", + "ชุดเกราะควิแรส", + "เขื่อน", + "โต๊ะทำงาน", + "คอมพิวเตอร์ตั้งโต๊ะ", + "โทรศัพท์หมุน", + "ผ้าอ้อม", + "นาฬิกาดิจิตอล", + "นาฬิกาข้อมือดิจิตอล", + "โต๊ะกินข้าว", + "ผ้าล้างจาน", + "เครื่องล้างจาน", + "เบรกจาน", + "อู่เรือ", + "เลื่อนสุนัข", + "โดม", + "แท่นขุดเจาะน้ำมัน", + "กลอง", + "ไม้กลอง", + "ตุ้มน้ำหนัก", + "เตาอบดัตช์", + "พัดลม", + "กีตาร์ไฟฟ้า", + "รถจักรไฟฟ้า", + "ซองจดหมาย", + "เครื่องชงการแฟเอสเพรสโซ", + "แป้งผัดหน้า", + "หนังงู", + "แฟ้ม", + "เรือดับเพลิง", + "รถดับเพลิง", + "ตะแกรงหน้าเตาผิง", + "เสาธง", + "ฟลุต", + "เก้าอี้พับ", + "หมวกอเมริกันฟุตบอล", + "รถยก", + "ปากกาหมึกซึม", + "เตียงสี่เสา", + "รถไฟบรรทุกสินค้า", + "แตรฝรั่งเศส", + "กระทะ", + "เสื้อโค้ตขนเฟอร์", + "รถเก็บขยะ", + "หน้ากากป้องกันการหายใจ", + "เครื่องปั๊มน้ำมัน", + "แก้วแบบมีก้าน", + "รถโกคาร์ท", + "ลูกกอล์ฟ", + "รถกอล์ฟ", + "เรือกอนโดลา", + "ฆ้อง", + "เรือนเพาะชำ", + "ตลาด", + "กิโยติน", + "กิ๊บติดผม", + "แฮร์สเปรย์", + "ค้อน", + "ที่เป่าผม", + "คอมพิวเตอร์มือถือ", + "ผ้าเช็ดหน้า", + "ฮาร์ดดิสก์", + "หีบปาก", + "ฮาร์ป", + "เครื่องเก็บเกี่ยวผลผลิต", + "ขวานสั้น", + "ซองหนังใส่ปืนพก", + "โฮมเธียเตอร์", + "รังผึ้ง", + "ขอ", + "กระโปรงสุ่มไก่", + "บาร์สูง", + "เกวียนเทียมม้า", + "นาฬิกาทราย", + "เตารีด", + "แจ็กโอแลนเทิร์น", + "ยีน", + "จี๊ป", + "ทีเชิร์ต", + "ตัวต่อ", + "รถลาก", + "จอยสติก", + "กิโมโน", + "สนับเขา", + "เงื่อน", + "เสื้อกาวน์", + "กระบวย", + "โป๊ะ", + "แล็ปท็อป", + "ที่ตัดหญ้า", + "ฝาครอบเลนส์", + "ที่เปิดจดหมาย", + "หอสมุด", + "เรือฉุกเฉิน", + "ไฟแช็ก", + "ลีมูซีน", + "เรือเดินสมุทร", + "ลิปสติก", + "โลชั่น", + "ลำโพง", + "ลูป", + "โรงเลื่อย", + "เข็มทิศ", + "ถุงไปรษณีย์", + "กล่องจดหมาย", + "กางเกงยิมนาสติก", + "ฝาท่อ", + "มาราคัส", + "ไซโลโฟน", + "หน้ากาก", + "ก้านไม้ขีดไฟ", + "ลายวงกต", + "ถ้วยตวง", + "ตู้ยา", + "ไมโครโฟน", + "เตาอบไมโครเวฟ", + "ชุดทหาร", + "กระป๋องนม", + "เมล์เล็ก", + "กระโปรงสั้น", + "มินิแวน", + "ขีปนาวุธ", + "ถุงมือชนิดไม่มีนิ้ว", + "รถบ้าน", + "ฟอร์ด โมเดลที", + "โมเด็ม", + "วัด", + "มอนิเตอร์", + "โมเพด", + "หมวกรับปริญญาบัตร", + "มัสยิด", + "มุ้ง", + "สกู๊ตเตอร์", + "จักรยานเสือภูเขา", + "เต็นท์ภูเขา", + "เมาส์", + "กับดักหนู", + "รถบรรทุกรับจ้าง", + "ครอบปากสุนัข", + "ตะปู", + "เฝือกดามคอ", + "สร้อย", + "จุกนม", + "คอมพิวเตอร์โน้ตบุ๊ค", + "โอโบ", + "โอคาริน่า", + "มาตรระยะทาง", + "เครื่องกรองน้ำมัน", + "ออร์แกน", + "ออสซิลโลสโคป", + "กระโปรงชั้นนอก", + "เกวียน", + "หน้ากากออกซิเจน", + "ห่อ", + "ไม้พาย", + "กังหันตีน้ำ", + "แม่กุญแจ", + "พู่กัน", + "ชุดนอน", + "วัง", + "ขลุ่ยแพนไพป์", + "กระดาษเช็ดมือ", + "กระโดดร่ม", + "บาร์คู่", + "เก้าอี้สาธารณะ", + "มิเตอร์จอดรถ", + "ตู้โดยสาร", + "ชาน", + "โทรศัพท์ตู้", + "แท่น", + "กล่องใส่ดินสอ", + "กบ", + "น้ำหอม", + "จานเพาะเชื้อ", + "เครื่องถ่ายเอกสาร", + "ปิ๊ก", + "หมวกเกราะพิกเคิลฮอบี", + "รั้วไม้", + "ปิคอัพ", + "กระปุกหมู", + "ขวดยาเม็ด", + "หมอน", + "ลูกปิงปอง", + "เรือสลัด", + "เหยือก", + "กบไสไม้", + "หอดูดาว", + "ถุงพลาสติก", + "ตะแกรงวางจาน", + "การไถดิน", + "กล้องโพลารอยด์", + "เสา", + "รถบรรทุกนักโ่ทษ", + "ปอนโช", + "โต๊ะบิลเลียด", + "ขวดโซดา", + "กระถางดอกไม้", + "แป้นหมุน", + "สว่านไฟฟ้า", + "พรมปูละหมาด", + "เครื่องพิมพ์", + "เรือนจำ", + "ขีปนาวุธ", + "โปรเจคเตอร์", + "ลูกพัค", + "กระสอบทรายซ้อมมวย", + "กระเป๋า", + "ปากกาขนนก", + "ผ้านวม", + "รถแข่ง", + "ไม้แร็กเก็ต", + "หม้อน้ำรถยนต์", + "ระบบไวร์เลส", + "กล้องโทรทรรศน์วิทยุ", + "ถังน้ำฝนใต้ดิน", + "รถบ้าน", + "รอกตกปลา", + "กล้องรีเฟล็กซ์", + "ตู้เย็น", + "รีโมต", + "ร้านอาหาร", + "ปืนพกลูก", + "ไรเฟิล", + "ม้าโยก", + "เตาย่างแบบหมุน", + "ยางลบดินสอ", + "ลูกรักบี้", + "ไม้บรรทัด", + "รองเท้ากีฬา", + "กำปั่น", + "เข็มกลัด", + "ขวดเกลือป่น", + "รองเท้าแตะ", + "ผ้าขาวม้า", + "แซกโซโฟน", + "ฝัก", + "เครื่องชั่ง", + "รถโรงเรียน", + "เรือใบเดินสมุทร", + "สกอร์บอร์ด", + "จอภาพแบบซีอาร์ที", + "สกรู", + "ไขควง", + "เข็มขัดนิรภัย", + "จักรเย็บผ้า", + "เขน", + "ร้านขายรองเท้า", + "ตะกร้าซื้อของ", + "รถเข็นชอปปิ้ง", + "พลั่ว", + "หมวกครอบผม", + "ม่านกั้นฝักบัว", + "skidor", + "หน้ากากกันหิมะ", + "ถุงนอน", + "สไลด์รูล", + "ประตูสไลด์", + "สล็อตแมชชีน", + "สนอร์เกิล", + "สโนว์โมบิล", + "รถกวาดหิมะ", + "ขวดสบู่เหลว", + "ลูกฟุตบอล", + "ถุงเท้า", + "เตารังสีแสงอาทิตย์", + "หมวกซอมบรีโร", + "ชามซุป", + "คานเว้นวรรค", + "กระสวยอวกาศ", + "ตะหลิวสแปชูลา", + "เรือเร็ว", + "ใยแมงมุม", + "กระสวย", + "สปอร์ตคาร์", + "สบอตไลท์", + "เวที", + "รถจักรไอน้ำ", + "สะพานโครงเหล็ก", + "สตีลดรัม", + "เครื่องฟังตรวจ", + "ผ้าคลุมไหล่", + "กำแพงหิน", + "เตาไฟ", + "รถราง", + "คานหาม", + "ธาตุ", + "เรือดำน้ำ", + "สูท", + "นาฬิกาแดด", + "แว่นรวมแสงแดด", + "แว่นตากันแดด", + "สารกันแดด", + "สะพานแขวน", + "ไม้ถูบ้าน", + "กางเกงว่ายน้ำ", + "ชิงช้า", + "สวิตช์", + "เข็มฉีดยา", + "โคมไฟตั้งโต๊ะ", + "รถถัง", + "เครื่องเล่นเทป", + "กา", + "หมีเท็ดดี้", + "ระบบโทรทัศน์", + "ลูกสักหลาด", + "หลังคามุงฟาง", + "ม่านเวที", + "ปลอกนิ้ว", + "เครื่องแยกเมล็ด", + "บัลลังก์", + "หลังคากระเบื้องลอน", + "เครื่องปิ้งขนมปัง", + "ร้านบุหรี่", + "ที่นั่งชักโครก", + "คบเพลิง", + "เสาโทเทม", + "รถลาก", + "ร้านขายของเล่น", + "รถแทรกเตอร์", + "รถพ่วง", + "ถาด", + "เสื้อโค้ตทหาร", + "สามล้อ", + "ขาตั้ง", + "ประตูชัย", + "รถไฟฟ้าล้อยาง", + "ทรอมโบน", + "แป้นพิมพ์ดีด", + "ร่ม", + "จักรยานล้อเดียว", + "อัพไรท์เปียโน", + "เครื่องดูดฝุ่น", + "แจกัน", + "โครงสร้างทรงโค้ง", + "ผ้ากำมะหยี่", + "เครื่องจำหน่ายสินค้าอัตโนมัติ", + "สะพาน", + "ไวโอลิน", + "ลูกวอลเลย์บอล", + "เครื่องทำขนมวัลเฟิล", + "นาฬิกาแบบแขวน", + "กระเป๋าเงิน", + "ตู้เสื้อผ้า", + "อากาศยานทางการทหาร", + "อ่างล้างหน้า", + "เครื่องซักผ้า", + "ขวดน้ำ", + "เหยือกน้ำ", + "หอประปา", + "เหยือกวิสกี้", + "นกหวีด", + "วิกผม", + "ที่กั้นแมลง", + "ม่านกันแสง", + "เนคไทที่ผูกแบบวินเซอร์", + "ขวดไวน์", + "ปีก", + "กระทะ", + "ช้อนไม้", + "สักหลาด", + "รั้วหยักฟันปลา", + "เรืออับปาง", + "เรือบด", + "เยิร์ต", + "เว็บไซต์", + "หนังสือการ์ตูน", + "ปริศนาอักษรไขว้", + "เครื่องหมายจราจร", + "ไฟจราจร", + "ปกหนังสือ", + "อาหารในเมนู", + "จาน", + "กัวกาโมเล", + "กงซอเม", + "หม้อไฟ", + "ทรัยเฟิล", + "ไอศกรีม", + "ไอศกรีมแท่ง", + "ขนมปังฝรั่งเศส", + "เบเกิล", + "เพรตเซล", + "ชีสเบอร์เกอร์", + "ฮอตดอก", + "มันฝรั่งบด", + "บร็อคเคอลี่", + "กะหล่ำต้น", + "ซุกคินี", + "เอคอร์นสคว็อช", + "บัตเตอร์นัตสคว็อช", + "แตงกวา", + "อาร์ติโชค", + "พริกหยวก", + "คาร์ดูน", + "เห็ด", + "แอปเปิ้ลเขียว", + "สตรอเบอร์รี่", + "ผลส้ม", + "ลูกเลมอน", + "มะเดื่อ", + "สับปะรด", + "กล้วย", + "ขนุน", + "ลูกน้อยหน่า", + "ทับทิม", + "ฟาง", + "การ์โบนารา", + "ซอสช็อคโกแลต", + "โด", + "มีตโลฟ", + "พิซซ่า", + "พ็อทพาย", + "บูร์ริโต", + "ไวน์แดง", + "เอสเปรสโซ", + "คัพ", + "เอ็กน็อก", + "ไหล่เขาสูง", + "ฟอง", + "หน้าผา", + "พืดหินปะการัง", + "ไกเซอร์ (ธรณีวิทยา)", + "ชายฝั่งทะเลสาบ", + "หัวแหลมผาชัน", + "สันดอนทราย", + "ชายฝั่ง", + "หุบเขา", + "ภูเขาไฟ", + "นักเบสบอล", + "เจ้าบ่าว", + "มนุษย์กบ", + "ผักกาดก้านขาว", + "เดซี", + "รองเท้านารีสีทอง", + "ลูกเอคอร์น", + "ผลกุหลาบ", + "ต้นบัคอาย", + "เห็ดปะการัง", + "แอ็กเกอริก", + "โบลีต", + "รวง", + "กระดาษทิชชู" + ] + ], + "CY": [ + [ + 0, + 1, + 2, + 3, + 4, + 9, + 10, + 11, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 29, + 34, + 48, + 71, + 78, + 79, + 80, + 81, + 82, + 87, + 89, + 90, + 92, + 93, + 94, + 95, + 96, + 98, + 99, + 100, + 102, + 103, + 104, + 106, + 107, + 110, + 111, + 113, + 114, + 125, + 127, + 128, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 146, + 147, + 148, + 151, + 152, + 153, + 154, + 155, + 157, + 162, + 163, + 165, + 172, + 175, + 176, + 178, + 180, + 190, + 191, + 194, + 199, + 213, + 215, + 217, + 229, + 230, + 235, + 242, + 243, + 244, + 246, + 247, + 248, + 250, + 251, + 254, + 256, + 257, + 258, + 259, + 260, + 269, + 276, + 277, + 286, + 287, + 289, + 290, + 291, + 292, + 293, + 294, + 296, + 299, + 301, + 306, + 307, + 308, + 309, + 310, + 312, + 313, + 314, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 331, + 333, + 334, + 336, + 337, + 338, + 340, + 341, + 342, + 344, + 345, + 346, + 347, + 348, + 350, + 353, + 354, + 355, + 357, + 358, + 359, + 360, + 362, + 363, + 365, + 366, + 367, + 372, + 373, + 385, + 386, + 387, + 388, + 390, + 394, + 395, + 398, + 401, + 402, + 405, + 407, + 411, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 422, + 425, + 426, + 428, + 430, + 432, + 434, + 435, + 437, + 438, + 439, + 445, + 447, + 454, + 456, + 457, + 460, + 462, + 463, + 464, + 468, + 469, + 470, + 472, + 474, + 476, + 480, + 481, + 483, + 485, + 486, + 487, + 488, + 491, + 492, + 496, + 497, + 498, + 508, + 510, + 512, + 513, + 515, + 516, + 517, + 525, + 529, + 532, + 534, + 536, + 538, + 541, + 543, + 546, + 549, + 552, + 553, + 557, + 558, + 561, + 562, + 563, + 567, + 569, + 580, + 583, + 587, + 589, + 590, + 591, + 593, + 594, + 602, + 607, + 608, + 610, + 611, + 616, + 618, + 620, + 621, + 625, + 627, + 629, + 632, + 642, + 643, + 645, + 650, + 651, + 655, + 657, + 658, + 668, + 671, + 673, + 677, + 679, + 681, + 682, + 683, + 687, + 688, + 691, + 692, + 695, + 696, + 697, + 698, + 701, + 702, + 709, + 711, + 713, + 714, + 719, + 721, + 725, + 730, + 732, + 734, + 739, + 742, + 743, + 745, + 749, + 750, + 760, + 761, + 762, + 763, + 764, + 765, + 769, + 772, + 774, + 776, + 777, + 779, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 795, + 797, + 798, + 805, + 806, + 816, + 820, + 823, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 841, + 843, + 844, + 845, + 847, + 849, + 850, + 856, + 857, + 859, + 861, + 862, + 870, + 873, + 877, + 880, + 882, + 883, + 884, + 885, + 888, + 889, + 893, + 897, + 898, + 900, + 907, + 909, + 911, + 916, + 917, + 918, + 920, + 927, + 928, + 935, + 938, + 943, + 953, + 957, + 958, + 959, + 960, + 961, + 963, + 966, + 967, + 969, + 971, + 972, + 974, + 976, + 978, + 979, + 980, + 982, + 984, + 986, + 988, + 989, + 990, + 996, + 999 + ], + [ + "Sgreten", + "Pysgodyn aur", + "Morgi mawr gwyn", + "Morgi rhesog", + "Morgi pen morthwyl", + "estrys", + "Pinc y Mynydd", + "nico", + "Bras goleulas", + "Robin America", + "Bwlbwliaid", + "Y Sgrechod", + "pioden", + "Cincius", + "Barcud", + "Eryr Moel", + "fultur", + "Tylluan fawr lwyd", + "Acsolotl", + "Crwban môr lledrgefn", + "Draig Comodo", + "Sgorpion", + "Trogen", + "neidr gantroed", + "Grugiar Ddu", + "grugiar", + "Cochiad crych", + "Parot llwyd", + "Cocatŵ cribfelyn mawr", + "parot enfys", + "Gwenynysorion", + "Cornbigau", + "Sïednod", + "Jacamarod", + "gŵydd Americanaidd", + "Hwyaden frongoch", + "gwÿdd", + "Alarch du", + "Ecidna", + "Hwyatbig", + "Walabi", + "Arth godog", + "sglefren fôr", + "Llyngyren ledog", + "Llyngyren gron", + "Malwen", + "Gwlithen", + "cranc meudwyol", + "Ciconia gwyn", + "Ciconia du", + "fflamingos", + "adar y bwn", + "Garannod", + "Herciwr", + "Cwtiar America", + "Ceiliogod y Waun", + "Cwtiad y traeth", + "Pibydd y mawn", + "Pibydd Coesgoch", + "pioden y mor", + "pelig", + "Pengwin Patagonia", + "Albatros", + "Morfil Llwyd", + "Lleiddiad", + "shiwawa", + "Chin (ci)", + "Ci Malta", + "Ci Pecin", + "Shi Tsw", + "Sbaengi Clustlaes", + "Corhelgi", + "gwaetgi", + "Ci Hela Racŵn Melyn a Du", + "Corfilgi", + "Ci Hela Dyfrgwn", + "Salwci", + "Ci Weimaraner", + "Daeargi Pydew", + "Daeargi Sealyham", + "Daeargi Airedale", + "Daeargi Dandie Dinmont", + "Daeargi Albanaidd", + "Cyfeirgi Gwyddelig", + "Ci Llydaw", + "Sbaengi Hela Seisnig", + "hen gi defaid Seisnig", + "Ci Defaid Shetland", + "Ci Defaid Almaenig", + "Bocser", + "Gafaelgi Tarw", + "gafaelgi Tibetaidd", + "Ci Mawr Denmarc", + "Ci Sant Bernard", + "hysgi", + "hysgi Siberaidd", + "Ci Dalmataidd", + "Ci Smwt", + "Newfoundland (ci)", + "Ci Mynydd y Pyreneau", + "Samoied (ci)", + "Ci Pomeranaidd", + "Tsiow Tsiow", + "blaidd", + "Udfil", + "cadno", + "Pwma", + "lyncs", + "llewpard eira", + "jagwar", + "llew", + "Teigr", + "llewpart hela", + "Arth frown", + "arth wen", + "Swricat", + "buwch goch gota", + "chwilen ryncorniog", + "Gwiddonyn", + "pryfed", + "gwenynen", + "Morgrugyn", + "criced", + "pryf brigyn", + "chwilod duon", + "Gwas neidr", + "Mursen", + "Gweirlöyn y glaw", + "Glöyn y llaethlys", + "Sêr môr", + "môr-ddraenog", + "chwerwddwr y môr", + "Ysgyfarnog", + "Bochdew", + "Ballasg", + "twrlla", + "llostlydan", + "mochyn cwta", + "sebra", + "mochyn", + "Baedd Gwyllt", + "hipopotamws", + "Ych", + "Byfflo Dŵr", + "beison", + "hwrdd", + "alpafr", + "gafrewig", + "camel rhedeg", + "lama", + "Minc", + "ffwlbart", + "ffured", + "dwrgi", + "broch", + "armadilo", + "Orangwtan", + "Gorillini", + "tsimpansî", + "babwn", + "macaco", + "Eliffant Asiaidd", + "Eliffant Affricanaidd", + "Panda Coch", + "Panda Mawr", + "llysywen", + "stwrsiwn", + "Cornbig", + "Abacws", + "Acordion", + "gitâr acwstig", + "Llong awyr", + "ambiwlans", + "ffedogau", + "reiffl ymosod", + "Gwarbac", + "siop fara", + "Trawst (gymnasteg)", + "balŵn", + "beiro", + "banjô", + "Barbwysau", + "ysgubor", + "baromedr", + "whilber", + "pêl fasged", + "basŵn", + "lliain mawr", + "bàth", + "goleudy", + "bicer", + "cap croen arth", + "bicini", + "ysbienddrych", + "siop lyfrau", + "bwa", + "Tei bô", + "morglawdd", + "ysgubell", + "bwced", + "bwcwl", + "tacsi", + "Pair", + "cannwyll", + "canŵ", + "côt weu", + "chwyrligwgan", + "peiriant tynnu arian", + "casét", + "caer", + "chwaraewr CD", + "soddgrwth", + "ffôn symudol", + "cadwyn", + "Llif gadwyn", + "cist", + "Hosan Nadolig", + "eglwys", + "sinema", + "allweddell", + "llong gynwysyddion", + "corcsgriw", + "Trwmped", + "het gowboi", + "crud", + "craen", + "argae", + "Cewyn", + "byrddau bwyd", + "peiriant golchi llestri", + "doc", + "cromen", + "drwm", + "Dymbel", + "gitâr drydan", + "amlen", + "Bwa pluog", + "cabined ffeilio", + "polyn fflag", + "ffliwt", + "wagen fforch godi", + "ffynnon", + "pin llenwi", + "padell ffrio", + "lori ludw", + "tŷ gwydr", + "gilotîn", + "morthwyl", + "sychwr gwallt", + "dyfais electronig symudol", + "macyn", + "yr organ geg", + "telyn", + "Bar llorweddol", + "Jac Lantar", + "jîns", + "Crys-T", + "Jig-so", + "cwlwm", + "lletwad", + "cliniadur", + "Peiriant torri gwair", + "bad achub", + "Limwsîn", + "lipstic", + "uchelseinydd", + "seiloffon", + "Mwgwd", + "Y Fedwen Fai", + "microffon", + "popty ping", + "Sgert gwta", + "taflegryn", + "mitens", + "mosg", + "beic mynydd", + "Llygoden (cyfrifiaduro)", + "hoelen", + "gwddfdorch", + "cliniadur", + "obelisg", + "Obo", + "organ (offeryn cerdd)", + "Osgilosgop", + "mwgwd ocsigen", + "pecyn", + "clo clwt", + "brwsh paent", + "siwt nos", + "Palas", + "parasiwt", + "Barrau cyflin", + "Cas pensiliau", + "Perarogl", + "llungopi", + "Plectrwm", + "cadw-mi-gei", + "clustog", + "stên", + "aradr", + "Camera sydyn", + "Fan yr heddlu", + "troell crochenydd", + "Argraffydd", + "carchar", + "Taflunydd", + "Cwilsyn", + "Cwilt", + "oergell", + "teclyn rheoli o bell", + "bwyty", + "Rifolfer", + "Reiffl", + "cadair siglo", + "pren mesur", + "Pin cau", + "sandalau", + "Sacsoffon", + "gwain", + "bws ysgol", + "Sgwner", + "bwrdd sgorio", + "Sgriw", + "tyrnsgriw", + "gwregys diogelwch", + "Peiriant gwnïo", + "tarian", + "troli", + "rhaw", + "sgi", + "Sach cysgu", + "Llithriwl", + "pêl droed", + "hosan", + "gwerthyd", + "Injan stêm", + "stethosgop", + "cludwely", + "llong danfor", + "siwt", + "deial haul", + "Sbectol haul", + "Eli haul", + "Pont grog", + "crys chwys", + "siglen", + "switsh", + "chwistrell", + "Tanc", + "Tebot", + "Tedi bêr", + "dyrnwr", + "gorsedd", + "tostydd", + "sedd tŷ bach", + "ffagl", + "treisigl", + "porth gorfoledd", + "Giât dro", + "beic un olwyn", + "hwfer", + "fâs", + "fowt", + "melfed", + "Traphont", + "feiolin", + "gwaled", + "peiriant golchi", + "potel ddŵr", + "twr dŵr", + "costrel win", + "woc", + "gwlân", + "safwe", + "llyfrau comic", + "croesair", + "goleuadau", + "treiffl", + "Hufen iâ", + "tatws stwnsh", + "colifflŵar", + "ciwcymbr", + "pinafal", + "pomgranad", + "gwair", + "Sbageti carbonara", + "saws siocled", + "Toes", + "pitsa", + "gwin coch", + "Coffi ecspres", + "maidd yr iâr", + "yswigen", + "clogwyn", + "Geiser", + "pentir", + "arfordir", + "cwm", + "Llosgfynydd", + "priodfab", + "Rêp", + "Esgid Fair", + "mesen", + "egroes", + "marchgastan", + "iâr y coed", + "papur tŷ bach" + ] + ], + "SI": [ + [ + 48, + 69, + 71, + 78, + 107, + 111, + 144, + 150, + 234, + 235, + 236, + 254, + 259, + 269, + 277, + 288, + 291, + 292, + 293, + 296, + 298, + 309, + 310, + 331, + 334, + 338, + 340, + 341, + 342, + 344, + 346, + 385, + 401, + 403, + 407, + 428, + 430, + 437, + 438, + 459, + 462, + 463, + 464, + 468, + 470, + 487, + 488, + 491, + 497, + 498, + 508, + 541, + 558, + 580, + 620, + 642, + 649, + 650, + 657, + 668, + 677, + 679, + 681, + 682, + 697, + 701, + 711, + 712, + 738, + 739, + 743, + 760, + 762, + 764, + 768, + 775, + 783, + 785, + 787, + 806, + 819, + 823, + 832, + 833, + 847, + 866, + 879, + 889, + 890, + 916, + 928, + 943, + 953, + 963, + 971, + 973, + 980 + ], + [ + "කොමොඩෝ මකරා", + "ට්‍රයිලොබයිටා", + "ගෝනුස්සා", + "කිණිතුල්ලෝ", + "ලොඩි", + "නෙමටෝඩ්", + "පැස්තුඩුවා", + "මුහුදු සිංහයා", + "රොට්වෙයිල(ර්)", + "ජර්මන් ෂෙපර්ඩ්", + "dobemen dog", + "පග්", + "පොමරේනියන්", + "වෘකයා", + "රතු හිවලා", + "කොටියා", + "සිංහය", + "බ්යග්ඝ", + "චීටා", + "හිම වලසා", + "මුගටියෝ", + "මීමැස්සා", + "කූඹියා", + "හාවෝ", + "ඉත්තෑවා", + "ගිනි හාවා", + "‍zසීබ්‍රා", + "ගං ඌරා", + "වල් ඌරා", + "හිපපොටේමස්", + "මී හරකා", + "ආසියානු අලි", + "එකෝඩියන්", + "ගුවන් යානා ගෙන යන නෞකා", + "ගිලන් රථය", + "වීල්බැරැක්කය", + "පැසිපන්දු", + "ප්රදීපාගාරය", + "බීකරය", + "තනපට", + "කොස්ස", + "බාල්දිය", + "ගාංචුව", + "ටැක්සිය", + "විලක්කුව", + "ජංගම දුරකථනය", + "ඇකිල්ල", + "දම්වැල් කියත", + "ක්‍රිස්තියානි පල්ලි", + "සිනමාහල", + "පරිගණක යතුරු පුවරුව", + "බෙර", + "බටනලාව", + "හරිතාගාර", + "ජංගම පරිගණකය", + "සයිලොෆෝන්", + "මහාශිලා(Megalith)", + "මයික්රොපෝනය", + "මිසයිල", + "මුස්ලිම් පල්ලි", + "ඇණ", + "මාලය", + "ජංගම පරිගණකය", + "ඔබලිස්කය", + "පිජාමා", + "පැරෂුටය", + "සුවඳ විලවුන්", + "පෙට්රි දීසි", + "මල්පොච්චි", + "කුඹල් සක", + "බන්ධනාගාර", + "ශීතකරණ", + "අවන්හල", + "තුවක්කුව", + "රග්බි පන්දුව", + "සරම", + "ඉස්කුරුප්පු ඇණ", + "ආසන පටි", + "පළිහ", + "මේස්", + "ෙවිදිකාව", + "වෙදනලාව", + "ස්තූපය", + "සබ්මැරීනය", + "සන්නාහ යුද්ධ රථ", + "ට්‍රැක්ටර්", + "කුඩය", + "වයලීනය", + "වොලිබෝලය", + "වෙබ් අඩවි", + "අයිස් ක්රීම්", + "පිපිඤ්ඤා", + "අන්නාසි", + "පීසා", + "බුබුළු", + "කොරල් පර", + "ගිනි කඳු" + ] + ], + "RU": [ + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 10, + 11, + 13, + 14, + 15, + 16, + 17, + 18, + 20, + 21, + 22, + 23, + 24, + 28, + 29, + 30, + 32, + 34, + 37, + 39, + 40, + 42, + 45, + 46, + 48, + 49, + 50, + 51, + 53, + 56, + 57, + 60, + 61, + 62, + 63, + 65, + 66, + 68, + 69, + 70, + 71, + 74, + 75, + 77, + 78, + 79, + 80, + 81, + 82, + 85, + 86, + 87, + 88, + 89, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 116, + 117, + 118, + 121, + 122, + 123, + 124, + 125, + 127, + 128, + 129, + 130, + 133, + 134, + 135, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 157, + 160, + 162, + 163, + 165, + 169, + 170, + 172, + 175, + 176, + 177, + 178, + 180, + 191, + 192, + 194, + 199, + 201, + 206, + 208, + 211, + 213, + 215, + 217, + 219, + 222, + 223, + 224, + 226, + 227, + 228, + 229, + 230, + 231, + 233, + 234, + 235, + 236, + 242, + 243, + 244, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 283, + 284, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 319, + 320, + 322, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 408, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 420, + 421, + 422, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 444, + 445, + 447, + 448, + 450, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 476, + 478, + 480, + 481, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 497, + 498, + 499, + 500, + 502, + 503, + 505, + 506, + 507, + 508, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 520, + 521, + 523, + 524, + 525, + 526, + 527, + 529, + 530, + 532, + 534, + 535, + 536, + 537, + 538, + 541, + 542, + 543, + 546, + 547, + 549, + 551, + 552, + 553, + 554, + 555, + 557, + 558, + 561, + 562, + 563, + 564, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 579, + 580, + 582, + 583, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 593, + 594, + 595, + 597, + 599, + 602, + 604, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 623, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 636, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 649, + 650, + 651, + 653, + 654, + 655, + 656, + 657, + 658, + 660, + 661, + 662, + 665, + 667, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 731, + 732, + 734, + 735, + 736, + 738, + 739, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 752, + 753, + 755, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 783, + 784, + 785, + 786, + 787, + 791, + 792, + 793, + 795, + 797, + 798, + 799, + 802, + 803, + 806, + 807, + 808, + 810, + 811, + 812, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 829, + 830, + 832, + 833, + 834, + 835, + 837, + 838, + 839, + 840, + 841, + 843, + 844, + 845, + 846, + 847, + 849, + 850, + 852, + 854, + 855, + 856, + 857, + 859, + 860, + 861, + 862, + 863, + 864, + 866, + 867, + 868, + 869, + 870, + 872, + 873, + 874, + 875, + 877, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 900, + 902, + 903, + 904, + 909, + 910, + 911, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 924, + 925, + 926, + 927, + 928, + 929, + 931, + 932, + 933, + 935, + 938, + 939, + 943, + 944, + 948, + 949, + 952, + 953, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 965, + 966, + 967, + 969, + 971, + 972, + 973, + 974, + 975, + 976, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 986, + 988, + 989, + 990, + 992, + 996, + 998, + 999 + ], + [ + "линь", + "Золотая рыбка", + "больша́я бе́лая аку́ла", + "тигро́вая аку́ла", + "молотоголовые акулы", + "электри́ческий скат", + "хвостокол", + "страус", + "Вьюрок", + "Черноголовый щегол", + "Юнко", + "индиговый овсянковый кардинал", + "стра́нствующий дрозд", + "Бюльбюлевые", + "Сойки (значения)", + "сорока", + "оляпки", + "коршуны", + "белоголовый орлан", + "Падальщики", + "бородатая неясыть", + "Жёлтопятнистая амбистома", + "аксолотль", + "Лягушка-бык", + "Хвостатые лягушки", + "Кожистая черепаха", + "коробчатые черепахи", + "Настоящие игуаны", + "североамериканский красногорлый анолис", + "Агамы", + "жилатье́", + "Зелёная ящерица", + "комодский варан", + "Нильский крокодил", + "миссисипский аллигатор", + "Трицератопсы", + "точечная ошейниковая змея", + "Королевские змеи", + "подвязочные змеи", + "Ночной уж Гюнтера", + "обыкновенный удав", + "иероглифовый питон", + "очковая змея", + "морские змеи", + "Рогатая гадюка", + "Рогатый гремучник", + "трилобиты", + "сеноко́сец", + "скорпион", + "пау́к-крестови́к", + "чёрная вдова", + "пауки-волки", + "иксодовые клещи", + "сороконо́жка", + "тетерев-косач", + "бе́лая куропа́тка", + "воротничковый рябчик", + "Перепел", + "куропатки", + "жако", + "а́ра", + "Большой желтохохлый какаду", + "шпо́рцевая куку́шка", + "щурковые", + "пти́ца-носоро́г", + "колибри", + "Якамаровые", + "тука́н", + "селезень", + "Средний крохаль", + "гусь", + "чёрный лебедь", + "сека́ч", + "ехидновые", + "утконос", + "валлаби", + "коала", + "вомбат", + "медуза", + "акти́ния", + "плоские черви", + "аскари́да", + "улитка (жизненная форма)", + "слизня́к", + "голожаберные", + "панцирные моллюски", + "наутилус помпилиус (моллюск)", + "краб Да́ндженесса", + "крабоиды", + "американский омар", + "Настоящие лангусты", + "речные раки", + "раки-отшельники", + "белый аист", + "чёрный аист", + "колпицы", + "флами́нго", + "выпь", + "журавль", + "Арама", + "Американская лысуха", + "дрофа́", + "камнешарка", + "чернозобик", + "красноно́жка", + "бекасовидные веретенники", + "кулики-сороки", + "пелика́н", + "королевский пингвин", + "альбатрос", + "серый кит", + "косатка", + "дюгонь", + "Морские львы", + "чихуахуа", + "японский хин", + "мальтийская болонка", + "пекине́с", + "ши-тцу", + "Континентальный той-спаниель", + "афга́нская борза́я", + "Бигль", + "ище́йка", + "Чёрно-подпалый кунхаунд", + "русская псовая борзая", + "ирла́ндский волкода́в", + "уиппет", + "Оттерхаунд", + "салюки", + "дирхаунд", + "Веймаранер", + "питбуль", + "Эрдельтерьер", + "керн-терье́р", + "Денди-динмонт-терьер", + "шотландский терьер", + "австралийский шелковистый терьер", + "Курчавошёрстный ретривер", + "лабрадо́р-ретри́вер", + "венгерская выжла", + "Ирландский красный сеттер", + "Эпаньол бретон", + "английский спрингер-спаниель", + "кокер-спаниель", + "Кувас", + "схипперке", + "Грюнендаль", + "бриар (порода собак)", + "австралийский келпи", + "Комондор", + "бобтейл", + "Шелти", + "шотла́ндская овча́рка", + "фландрский бувье", + "ротве́йлер", + "неме́цкая овча́рка", + "Доберман", + "немецкий боксёр", + "бульмастиф", + "тибе́тский мастиф", + "да́тский дог", + "Сенбернар", + "эскимо́сская ла́йка", + "Аляскинский маламут", + "Сибирский хаски", + "далмати́н", + "аффенпи́нчер", + "ба́сенджи", + "Мопс", + "ньюфаундленд (порода собак)", + "пиренейская горная собака", + "самое́дская ла́йка", + "померанский шпиц", + "Чау-чау", + "Вольфшпиц", + "ксолоитцкуи́нтли", + "волчица", + "мелвильский островной волк", + "гривистый волк", + "койо́т", + "ди́нго", + "красный волк", + "Гиеновидная собака", + "гиены", + "лис", + "Песец", + "серая лисица", + "полосатая кошка", + "персидская кошка", + "сиамская кошка", + "пума", + "рысь", + "леопард", + "и́рбис", + "пантера", + "лев", + "тигр", + "гепард", + "бурый медведь", + "барибал", + "белый медведь", + "мангустовые", + "сурикат", + "жук-скаку́н", + "божья коровка", + "жу́желица", + "усачи", + "листоеды", + "жук-носоро́г", + "долгоносик", + "двукрылые", + "пчела́", + "муравьи", + "кузнечик", + "сверчок", + "па́лочник", + "таракан", + "богомоловые", + "цикада", + "цикадки", + "стрекоза́", + "стрекоза́", + "Глазок цветочный", + "Данаида монарх", + "морская звезда", + "морской ёж", + "морско́й огуре́ц", + "Американские кролики", + "Зайцы", + "Ангорский кролик", + "Хомяки", + "дикобра́з", + "лисья белка", + "Сурки", + "бобр", + "морска́я сви́нка", + "зебры", + "свинья", + "ди́кая свинья́", + "бородавочник", + "обыкновенный бегемот", + "вол", + "Азиатский буйвол", + "бизоны", + "баран", + "толсторог", + "Ибекс", + "конгони", + "импала", + "газели", + "дромадер", + "лама (животное)", + "хорьки", + "норка", + "Лесной хорёк", + "хорёк", + "выдровые", + "скунс", + "барсук", + "бронено́сец", + "трёхпалый ленивец", + "орангута́н", + "горилла", + "шимпанзе", + "Белорукий гиббон", + "сиаманг", + "марты́шка", + "мартышка-гусар", + "бабуин", + "макаки", + "тонкотелые обезьяны", + "Колобусы", + "Носач", + "обезья́нка", + "Ревуны", + "прыгуны (род обезьян)", + "Коаты", + "Обыкновенная беличья обезьяна", + "кошачий лемур", + "Индри", + "инди́йский слон", + "африка́нский слон", + "малая панда", + "большая панда", + "Снэк (рыба)", + "угорь", + "кижуч", + "Рыбы-клоуны", + "осетровые", + "па́нцирник", + "крыла́тка", + "иглобрю́хая ры́ба", + "абак", + "абайя", + "Академическая одежда", + "гармонь", + "акустическая гитара", + "авианосец", + "авиала́йнер", + "дирижабль", + "санита́рная маши́на", + "машина-амфибия", + "пасека", + "фа́ртук", + "Контейнер для мусора", + "автома́т", + "рюкзак", + "бу́лочная", + "Бревно", + "аэростат", + "шариковая ручка", + "ба́нджо", + "Перила", + "штанга (снаряд)", + "амбар", + "барометр", + "бочка", + "теле́жка", + "Бейсбольный мяч", + "баскетбольный мяч", + "колыбель", + "фагот", + "ша́почка для купа́ния", + "ба́нное полоте́нце", + "Ванна", + "универсал", + "маяк", + "Лабораторный стакан", + "кивер", + "тандем", + "бики́ни", + "бинокль", + "скворе́чник", + "бобсле́й", + "Чепец", + "кни́жный шкаф", + "кни́жный магази́н", + "крышка для бутылки", + "лук", + "галстук-бабочка", + "табли́чка", + "лифчик", + "волнолом", + "нагру́дник", + "метла", + "ведро", + "пряжка", + "бронежилет", + "высокоскоростно́й по́езд", + "такси", + "Котёл", + "све́чка", + "Пушка", + "кано́э", + "консервный нож", + "кардиган", + "карусель", + "коро́бка", + "банкомат", + "кассе́та", + "за́мок", + "катамаран", + "проигрыватель компакт-дисков", + "виолонче́ль", + "моби́льник", + "цепо́чка", + "сетка Рабица", + "кольчуга", + "бензопила", + "сундук", + "Тансу", + "колоко́льчики", + "церковь", + "кинотеатр", + "секач", + "скальные жилища", + "Деревянные башмаки", + "шейкер", + "кофейник", + "кольцо́", + "ко́довый замо́к", + "клавиатура", + "контейнерово́з", + "кабриолет", + "штопор", + "труба́", + "ковбойские сапоги", + "Ковбойская шляпа", + "колыбе́ль", + "кран", + "крова́тка", + "крокпо́т", + "Костыль", + "кира́са", + "плотина", + "стол", + "настольный компьютер", + "подгузник", + "электронные часы", + "обеденный стол", + "посудомоечная машина", + "дисковый тормоз", + "корабельный док", + "нарты", + "купол", + "барабан", + "бараба́нная па́лочка", + "гантель", + "электрогитара", + "электровоз", + "конве́рт", + "пудра", + "горже́тка", + "папка", + "пожарное судно", + "пожарный автомобиль", + "дре́вко", + "флейта", + "вилочный погрузчик", + "фонтан", + "авторучка", + "четырёхно́гий", + "валторна", + "сковоро́дка", + "торговля пушниной", + "му́сорная маши́на", + "противогаз", + "газовый насос", + "бока́л", + "карт (машина)", + "мяч для гольфа", + "Машина для гольфа", + "гондола", + "гонг", + "роя́ль", + "парни́к", + "бакале́я", + "гильотина", + "лак для воло́с", + "полугусеничное транспортное средство", + "молот", + "корзи́на", + "фен", + "мобильное устройство", + "Носовой платок", + "губная гармоника", + "арфа", + "жатка", + "Кобура", + "соты (геометрия)", + "Перекладина", + "песочные часы", + "утюг", + "Светильник Джека", + "джи́нсы", + "джип", + "футболка", + "пазл", + "рикша", + "Кимоно", + "наколе́нник", + "узел", + "хала́т", + "половник", + "абажур", + "ноутбук", + "газонокосилка", + "нож для вскры́тия пи́сем", + "спасательное судно", + "зажигалка", + "лимузин", + "ла́йнер", + "помада", + "лоферы", + "лосьон", + "громкоговоритель", + "увеличи́тельное стекло́", + "лесопилка", + "почтовый мешок", + "Майо (купальник)", + "Крышка канализационного люка", + "маракас (музыкальный инструмент)", + "ксилофон", + "личи́на", + "спи́чка", + "майское дерево", + "лабиринт", + "ме́рный стака́н", + "мегалит", + "микрофон", + "микроволновка", + "бидо́н для молока́", + "микроавтобус", + "мини-юбка", + "минивэн", + "ракета", + "ва́режка", + "Переносные дома", + "Жестянка Лиззи", + "моде́м", + "мопед", + "квадратная академическая шапочка", + "мечеть", + "москитная сетка", + "скутер", + "горный велосипед", + "мышка", + "мышеловка", + "гвоздь", + "Шина-воротник Шанца", + "ожерелье", + "со́ска", + "ноутбук", + "обелиск", + "гобо́й", + "окари́на", + "одо́метр", + "Масляный фильтр", + "духовой орган", + "Осциллограф", + "Кислородное оборудование", + "па́чка", + "весло́", + "Гребное колесо", + "Навесной замок", + "кисть", + "пижама", + "дворец", + "флейта Пана", + "бумажный рулон", + "парашю́т", + "Параллельные брусья", + "парко́метр", + "пассажирский вагон", + "вера́нда", + "таксофо́н", + "постаме́нт", + "пенал (принадлежность)", + "точилка для карандашей", + "духи", + "чашка Петри", + "копирова́льный аппара́т", + "плектр", + "пикельхе́льм", + "штакетник", + "пикап (кузов)", + "копилка", + "подушка", + "кувшин", + "струг", + "Полиэтиленовый пакет", + "плуг", + "вантуз (инструмент)", + "мгновенная камера", + "чёрный во́рон", + "пончо", + "билья́рдный стол", + "горшо́к", + "гончарный круг", + "саджа́да", + "принтер", + "тюрьма", + "Снаряд (баллистика)", + "прое́ктор", + "шайба (хоккей)", + "боксёрский мешо́к", + "портмоне", + "гусиное перо", + "покрыва́ло", + "ракетка", + "радиатор", + "радиотелеско́п", + "Зеркальный фотоаппарат", + "холодильник", + "дистанционное управление", + "ресторан", + "револьвер", + "винтовка", + "кресло-качалка", + "жаркое на вертеле", + "мяч для регби", + "лине́йка", + "кроссовки", + "сейф", + "английская булавка", + "соло́нка", + "босоно́жка", + "саро́нг", + "саксофон", + "но́жны", + "весы", + "школьный автобус", + "шхуна", + "доска́ счёта", + "винт", + "отвертка", + "ремень безопасности", + "шве́йная маши́нка", + "щит", + "тележка", + "лопата", + "ша́почка", + "лы́жи", + "спальный мешок", + "логарифмическая линейка", + "Сдвижная дверь", + "снегохо́д", + "плужный снегоочиститель", + "носок", + "солнечная печь (кулинария)", + "Сомбреро", + "пробе́л", + "нагреватель", + "многора́зовый тра́нспортный косми́ческий кора́бль", + "веретено́", + "спортивный автомобиль", + "проже́ктор", + "сцена", + "паровоз", + "арочный мост с ездой посередине", + "Стальной барабан", + "стетоскоп", + "стола", + "каменная стена", + "секундомер", + "печь", + "трамвайная система", + "носилки", + "сту́па", + "подводная лодка", + "костюм", + "со́лнечные часы́", + "тёмные очки", + "крем от зага́ра", + "висячий мост", + "швабра", + "ма́стерка", + "каче́ли", + "ключ (электротехника)", + "шприц", + "насто́льная ла́мпа", + "танк", + "чайник", + "плюшевый мишка", + "теннисный мяч", + "театральный занавес", + "напёрсток", + "молоти́лка", + "трон", + "тостер", + "торго́вец таба́чными изде́лиями", + "сиде́нье унита́за", + "фа́кел", + "тоте́мный столб", + "эвакуатор (транспортное средство)", + "тяга́ч", + "седельный автопоезд", + "лоток", + "Тренчкот", + "три́цикл", + "штатив", + "триумфальная арка", + "троллейбус", + "тромбон", + "турникет", + "зонт", + "моноци́кл", + "пиани́но", + "пылесос", + "ваза", + "Свод", + "бархат", + "риза (церковная утварь)", + "виадук", + "Народная скрипка", + "волейбольный мяч", + "вафельница", + "насте́нные часы́", + "бума́жник", + "шкаф", + "военно-воздушное судно", + "умыва́льник", + "стиральная машина", + "водонапо́рная ба́шня", + "Свисток", + "парик", + "моски́тная се́тка", + "вок", + "меси́лка", + "шерсть", + "ял", + "Юрта", + "веб-са́йт", + "ко́микс", + "кроссворд", + "аншлаг", + "светофор", + "суперобложка", + "Гуакамоле", + "консоме", + "горящий котёл", + "бискви́т", + "мороженое", + "Фруктовый лёд", + "бублик", + "брецель", + "чизбургер", + "картофельное пюре", + "цветна́я капу́ста", + "цукини", + "огурец", + "Лесная зелень", + "Гренни Смит", + "клубни́чный", + "фи́га", + "ананас", + "грана́т", + "се́но", + "Карбонара", + "шоколадный сироп", + "тесто", + "фальшивый заяц", + "пицца", + "бурри́то", + "красное вино", + "еспрессо", + "гоголь-моголь", + "пузырек", + "клиф", + "коралловый риф", + "гейзер", + "бе́рег", + "мыс", + "примо́рье", + "долина", + "вулкан", + "бейсболи́ст", + "жених", + "акваланги́стка", + "рапс", + "Башмачок мелкоцветковый", + "желудь", + "Шиповник", + "ко́нский кашта́н", + "пластинчатые грибы", + "Грифола курчавая", + "початок", + "туалетная бумага" + ] + ], + "LA": [ + [ + 0, + 2, + 4, + 6, + 9, + 11, + 18, + 21, + 23, + 34, + 40, + 49, + 58, + 65, + 69, + 71, + 78, + 79, + 86, + 92, + 94, + 99, + 103, + 104, + 105, + 107, + 113, + 114, + 122, + 123, + 124, + 125, + 130, + 133, + 134, + 138, + 144, + 235, + 269, + 272, + 277, + 279, + 287, + 288, + 291, + 292, + 293, + 308, + 309, + 310, + 312, + 314, + 319, + 322, + 327, + 328, + 333, + 334, + 337, + 338, + 341, + 342, + 345, + 348, + 352, + 353, + 354, + 356, + 359, + 360, + 362, + 367, + 385, + 388, + 390, + 394, + 398, + 401, + 403, + 405, + 407, + 410, + 411, + 414, + 415, + 417, + 418, + 420, + 425, + 426, + 427, + 428, + 430, + 432, + 435, + 437, + 447, + 450, + 453, + 454, + 456, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 468, + 469, + 470, + 472, + 480, + 483, + 486, + 487, + 488, + 490, + 492, + 497, + 498, + 508, + 509, + 510, + 512, + 513, + 516, + 517, + 520, + 525, + 529, + 534, + 538, + 541, + 543, + 546, + 549, + 558, + 567, + 568, + 572, + 580, + 582, + 587, + 591, + 594, + 604, + 606, + 608, + 610, + 611, + 612, + 616, + 618, + 620, + 621, + 626, + 632, + 642, + 643, + 646, + 650, + 651, + 660, + 668, + 669, + 670, + 671, + 673, + 674, + 677, + 679, + 682, + 683, + 687, + 688, + 692, + 696, + 697, + 701, + 708, + 710, + 711, + 725, + 726, + 728, + 730, + 738, + 739, + 742, + 743, + 744, + 746, + 747, + 748, + 750, + 760, + 762, + 764, + 769, + 771, + 773, + 774, + 775, + 776, + 777, + 778, + 783, + 784, + 786, + 787, + 792, + 795, + 806, + 808, + 816, + 820, + 822, + 823, + 827, + 830, + 833, + 835, + 839, + 843, + 844, + 845, + 847, + 850, + 855, + 859, + 862, + 866, + 870, + 874, + 879, + 882, + 883, + 884, + 888, + 889, + 891, + 893, + 896, + 897, + 900, + 903, + 911, + 915, + 916, + 917, + 918, + 920, + 925, + 928, + 932, + 935, + 938, + 943, + 952, + 957, + 958, + 963, + 966, + 967, + 971, + 973, + 974, + 976, + 978, + 979, + 980, + 988, + 989, + 998, + 999 + ], + [ + "Tinca", + "Carcharodon", + "Sphymidae", + "trȳgōn", + "struthio", + "carduelis", + "pica", + "Milano", + "vultur", + "Dermochelys", + "Polychrotidae", + "Crocodilus Niloticus", + "natrix", + "Anguis marinus", + "Trilobitomorpha", + "scorpio", + "Ixodoida", + "scolopendra", + "perdiz", + "merops", + "colibris", + "anser", + "ornithorhynchus", + "Notamacropus", + "Ursus Coalus", + "pulmo", + "cochlea (animal)", + "Limax", + "Locusta marina", + "Locustarium genus", + "Astacorum genus", + "pīnotērēs", + "Phoenicopteriformes", + "butio", + "grus", + "Otidimorphae", + "pelecānus", + "Canis pastoralis Theodiscus", + "lupus", + "Coiotes", + "vulpes", + "Alopex", + "chama", + "Pardus", + "leo", + "byaggha", + "Gattus pardus", + "musca", + "apis", + "Formica", + "gryllus", + "blatta", + "libellula", + "Papilio hyperantus", + "stella marina", + "echīnus", + "Cricetus", + "hystrix", + "castor (genus)", + "Cavaia porcellus", + "porcus", + "aper", + "bōs", + "aries", + "Aepyceros", + "Gazella (genus)", + "dromedaria", + "Mustella", + "viverra", + "lutra", + "mēlēs", + "satyrus", + "Elephas asiaticus", + "Panda maior", + "anguilla", + "acipenser", + "abax", + "accordio", + "Navis aëroplanigera", + "Aëronavis", + "Arcera", + "Apiarium", + "subligāculum", + "Sacciperium dorsuale", + "pistrīnum", + "Globus aerostaticus", + "stilus sphæratus", + "Banio", + "stadīle", + "barometrum", + "tunna", + "pabō", + "canistrilūdium", + "Fagottus", + "balneum", + "pharus", + "geminum perspicillum", + "Sclodia gubernabilis", + "librarium", + "taberna librāriī", + "arcus", + "tabella", + "Strophium", + "Moles fluctifraga", + "pectorāle", + "okosale", + "situla", + "buccula", + "Taxiraeda", + "cortīna", + "Cereus", + "Caudica", + "Automatum monetale", + "castrum", + "violoncellum", + "tēlephōnulum", + "catēna", + "Lorica hamata", + "scrinium", + "ecclesia", + "Cinemateum", + "claviatura", + "bellaria", + "Navis exceptaculifera", + "extraculum", + "Salpinx", + "cunae", + "Tolleno", + "cunae", + "Moles", + "linteum", + "Machina elutoria", + "Tholus", + "Membranophonum", + "Halter", + "cithara electrica", + "thēca", + "tībia", + "Sartago", + "pellio", + "cibōrium", + "Caldarium", + "macellum", + "malleus", + "sūdārium", + "sambuca", + "Clepsydra (horologium)", + "Complanatorium", + "genuenses", + "Tunicula", + "Opus vermiculatum", + "Rixo birotarius", + "Nodus", + "trulla", + "Ordinatrulum portabile", + "Herbisectrum", + "lumen", + "Megaphonum", + "xylophonium", + "Persona", + "Labyrinthus", + "microphonum", + "Furnus brevibus undis agens", + "Domuncula subrotata", + "meschita", + "Conopium", + "Birotula automataria", + "Birota montana", + "Mus (computatralis)", + "mūscipula", + "Clavus", + "monile", + "Obeliscus", + "Lituus Gallicus", + "Organum (instrumentum musicum)", + "Oscilloscopium", + "fascis", + "pēnicillum", + "Paiama", + "umbrella descensoria", + "crepīdō", + "Acuminarium", + "Liquor odoratus", + "urceus", + "Runcina", + "Sacculus plasticus", + "Aratrum", + "tēsta", + "Tornus figlinus", + "Typographum", + "carcer", + "Proiectilum", + "Disculus hocceius", + "cōrycus", + "crumēna", + "strātum", + "Armarium frigidarium", + "Popina sellariola", + "sclopetum", + "rēgula", + "arca", + "salīnum", + "solea", + "Sarongum", + "Saxophonum", + "vāgīna", + "Libra", + "Clavus cochleatus", + "Cochleatorstrum", + "Machina sartoria", + "Scutum", + "rutrum", + "Narta", + "udo", + "causia", + "fūsus", + "Vaporitraha", + "Patina chalybis", + "Stethoscopium", + "Furnulus", + "Lecticula (medicina)", + "Navis submarina", + "sōlārium", + "Pons pendulus", + "cunae", + "waylu", + "Syringa iniectionis", + "autocurrus armatus", + "Ursulus (lusorius)", + "Digitale", + "Tostrum", + "fax", + "Tractorium", + "triicyclettus", + "Filoraeda", + "Umbella", + "Pulveris hauritorium", + "vāsis", + "Camera", + "Viaeductus", + "ñaañooru", + "Forma ferrea laganorum", + "pēra", + "pollubrum", + "Machina lavatoria", + "turris aquaria", + "Capillamentum", + "lana", + "Iurta", + "Situs interretialis", + "Liber nubeculatus", + "Crucigramma", + "Semaphorum", + "Iusculum consummatum", + "Glacies edibilis", + "Panis quadragesimalis", + "Patatae contusae", + "brassica oleracea var. botrytis", + "cucumer", + "ficus", + "malum granatum", + "Fenum", + "placenta neapolitana", + "vinum rubrum", + "Cafea expressa", + "bulla", + "Scopulus curalii", + "aquae calidae salientes", + "promontorium", + "acta", + "valles", + "mons ignifer", + "glans", + "rosa canina", + "spica", + "Charta hygienica" + ] + ], + "PA": [ + [ + 2, + 16, + 23, + 45, + 65, + 71, + 79, + 85, + 86, + 94, + 105, + 107, + 111, + 120, + 122, + 134, + 144, + 146, + 162, + 234, + 254, + 259, + 286, + 288, + 289, + 290, + 291, + 292, + 293, + 296, + 298, + 309, + 310, + 314, + 319, + 327, + 334, + 340, + 341, + 346, + 350, + 367, + 372, + 387, + 388, + 398, + 403, + 407, + 418, + 426, + 437, + 447, + 462, + 463, + 465, + 468, + 470, + 472, + 476, + 480, + 487, + 492, + 497, + 502, + 508, + 510, + 513, + 525, + 527, + 538, + 541, + 558, + 580, + 582, + 583, + 587, + 594, + 604, + 620, + 629, + 632, + 643, + 650, + 657, + 662, + 668, + 673, + 677, + 679, + 682, + 688, + 698, + 701, + 711, + 721, + 730, + 742, + 743, + 760, + 762, + 766, + 783, + 784, + 786, + 787, + 806, + 819, + 833, + 844, + 847, + 850, + 866, + 889, + 893, + 897, + 916, + 928, + 933, + 935, + 957, + 960, + 963, + 967, + 971, + 973, + 974, + 979, + 980 + ], + [ + "ਮਹਾਨ ਚਿੱਟੀ ਸ਼ਾਰਕ", + "ਬੁਲਬੁਲ", + "ਗਿੱਧ", + "ਗਿਲਾ ਮੌਂਸਟਰ", + "ਸਮੁੰਦਰੀ ਸੱਪ", + "ਠੂਹਾਂ", + "ਕੰਨਖਜੂਰਾ", + "ਬਟੇਰ", + "ਤਿੱਤਰ", + "ਹਮਿੰਗ ਪੰਛੀ", + "ਕੁਆਲਾ", + "ਜੈਲੀਫਿਸ਼", + "ਨੇਮਾਟੋਡ", + "kemon aso", + "ਅਮਰੀਕੀ ਲਾਬਸਟਰ", + "ਸਾਰਸ (ਪੰਛੀ)", + "ਪੈਲਿਕਾਨ", + "ਅਲਬਾਟਰੌਸ", + "ਬੀਗਲ", + "ਰੌਟਵੀਲਰ", + "ਪਗ", + "ਪੋਮੇਰਿਅਨ (ਕੁੱਤਾ)", + "ਕੂਗਰ", + "ਚਿੱਤਰਾ", + "ਬਰਫ਼ੀਲਾ ਤੇਂਦੂਆ", + "ਜੈਗੁਆਰ", + "ਸ਼ੇਰ", + "ਬਾਘ", + "ਚੀਤਾ", + "ਧਰੁਵੀ ਭਾਲੂ", + "ਨਿਓਲਾ", + "ਭੌਰਾ", + "ਕੀੜੀ", + "ਕਾਕਰੋਚ", + "ਡਰੈਗਨਫਲਾਈ", + "ਸਟਾਰਫਿਸ਼", + "ਸੇਹ", + "ਜੈਬਰਾ", + "ਸੂਰ", + "ਮੱਝ", + "ਅਲਪਾਇਨੀ ਬੱਕਰੀ", + "ਚਿਪਾਂਜ਼ੀ", + "ਬਬੂਨ", + "ਲਾਲ ਪਾਂਡਾ", + "ਪਾਂਡਾ", + "ਅਬੈਕਸ", + "ਏਅਰਕ੍ਰਾਫਟ ਕੈਰੀਅਰ", + "ਐਂਬੂਲੈਂਸ", + "ਬਾਲ ਪੈੱਨ", + "ਬੈਰੋਮੀਟਰ", + "ਚਾਨਣ ਮੁਨਾਰਾ", + "ਦੂਰਬੀਨ ਦੋਚਸ਼ਮੀ", + "ਝਾੜੂ", + "ਬਾਲਟੀ", + "ਬੁਲੇਟ ਪਰੂਫ ਵੈਸਟ", + "ਟੈਕਸੀ", + "ਮੋਮਬੱਤੀ", + "ਕੇਨੋਏ", + "ਹਿੰਡੋਲਾ", + "ਏ. ਟੀ. ਐਮ.", + "ਮੋਬਾਈਲ ਫ਼ੋਨ", + "ਸੰਦੂਕ", + "ਗਿਰਜਾ", + "ਗੇਤਾ", + "ਕੰਪਿਊਟਰ ਕੀਬੋਰਡ", + "ਕੰਟੇਨਰ ਸ਼ਿਪ", + "ਤੂਤਨੀ", + "ਬੰਨ੍ਹ", + "ਡੈਸਕਟਾਪ ਕੰਪਿਊਟਰ", + "ਗੁੰਬਦ", + "ਢੋਲ", + "ਫ਼ਲੂਟ", + "ਗ੍ਰੀਨਹਾਊਸ", + "ہَٹّی‎", + "ਗੀਓਤੀਨ", + "ਹਥੌੜਾ", + "ਹਾਰਪ", + "ਰੇਤ ਘੜੀ", + "ਲੈਪਟਾਪ", + "ਸੁਰਖੀ", + "ਲਾਊਡਸਪੀਕਰ", + "ਮਖੌਟਾ", + "ਮਾਇਕਰੋਫੋਨ", + "ਮਿਜ਼ਾਇਲ", + "ਮੋਡਮ", + "ਮਸਜਿਦ", + "ਮਾਉਸ", + "ਮੇਖ਼", + "ਹਾਰ", + "ਆਬਲਿਸਕ", + "ਓਸੀਲੋਸਕੋਪ", + "ਮਹਿਲ", + "ਪੈਰਾਸ਼ੂਟ", + "ਅਤਰ", + "ਸਰ੍ਹਾਣਾ", + "ਹਲ", + "ਪ੍ਰਿੰਟਰ", + "ਜੇਲ੍ਹ", + "ਰੈਫ੍ਰਿਜਰੇਟਰ", + "ਭੋਜਨਾਲਾ", + "ਰੋਤੀਸੁਆਰ", + "ਪੇਚ", + "ਪੇਚਕਸ", + "ਸਿਲਾਈ ਮਸ਼ੀਨ", + "ਢਾਲ", + "ਜੁਰਾਬਾਂ", + "ਸਟੇਜ", + "ਪਣਡੁੱਬੀ", + "ਸਵਿੱਚ", + "ਟੈਂਕ", + "ਟੇਡੀ ਬੇਅਰ", + "ਟਰੈਕਟਰ", + "ਵਾਇਲਿਨ", + "ਬਟੂਆ", + "ਕੱਪੜੇ ਧੋਣ ਵਾਲੀ ਮਸ਼ੀਨ", + "ਵੈੱਬਸਾਈਟ", + "ਆਈਸ ਕਰੀਮ", + "ਚੀਜ਼ਬਰਗਰ", + "ਆਲੂ ਭੜਥਾ", + "ਅਨਾਰ", + "ਚੌਕਲੇਟ ਸਿਰਪ", + "ਪਿਜ਼ਾ", + "ਐਸਪ੍ਰੈਸੋ", + "ਬੁਲਬੁਲਾ", + "ਮੂੰਗਾ ਚਟਾਨ", + "ਗਰਮ ਪਾਣੀ ਦੇ ਚਸ਼ਮੇ", + "ਘਾਟੀ", + "ਜੁਆਲਾਮੁਖੀ" + ] + ], + "MS": [ + [ + 1, + 2, + 3, + 4, + 6, + 9, + 17, + 22, + 23, + 34, + 36, + 37, + 48, + 49, + 63, + 65, + 71, + 77, + 78, + 79, + 85, + 87, + 88, + 89, + 92, + 93, + 94, + 99, + 100, + 104, + 107, + 108, + 110, + 111, + 113, + 114, + 115, + 121, + 124, + 125, + 130, + 134, + 139, + 140, + 141, + 144, + 146, + 148, + 149, + 151, + 152, + 153, + 154, + 157, + 160, + 161, + 162, + 163, + 165, + 169, + 170, + 172, + 173, + 175, + 176, + 177, + 178, + 180, + 191, + 194, + 199, + 201, + 206, + 208, + 211, + 213, + 215, + 217, + 222, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 233, + 234, + 235, + 236, + 242, + 243, + 244, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 256, + 257, + 258, + 259, + 260, + 261, + 266, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 279, + 280, + 281, + 286, + 288, + 289, + 291, + 292, + 293, + 294, + 296, + 298, + 300, + 301, + 302, + 303, + 304, + 306, + 307, + 308, + 309, + 310, + 314, + 315, + 317, + 319, + 320, + 323, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 337, + 338, + 340, + 341, + 342, + 344, + 346, + 350, + 353, + 354, + 359, + 360, + 362, + 365, + 367, + 368, + 369, + 371, + 372, + 376, + 383, + 385, + 386, + 387, + 388, + 390, + 393, + 397, + 398, + 400, + 401, + 402, + 403, + 404, + 405, + 407, + 412, + 413, + 414, + 415, + 417, + 418, + 425, + 426, + 428, + 430, + 432, + 437, + 438, + 447, + 450, + 453, + 454, + 456, + 459, + 460, + 462, + 463, + 464, + 465, + 468, + 469, + 470, + 472, + 474, + 476, + 480, + 481, + 483, + 484, + 486, + 487, + 488, + 490, + 491, + 492, + 497, + 498, + 508, + 509, + 510, + 512, + 513, + 516, + 517, + 521, + 524, + 525, + 527, + 529, + 534, + 535, + 537, + 538, + 541, + 546, + 547, + 549, + 557, + 558, + 561, + 562, + 563, + 567, + 569, + 570, + 575, + 582, + 583, + 585, + 586, + 587, + 589, + 590, + 591, + 593, + 594, + 596, + 604, + 606, + 609, + 610, + 611, + 612, + 618, + 619, + 620, + 626, + 627, + 628, + 629, + 632, + 641, + 642, + 643, + 649, + 650, + 651, + 656, + 657, + 665, + 668, + 669, + 670, + 673, + 674, + 677, + 679, + 681, + 683, + 685, + 687, + 695, + 696, + 697, + 698, + 701, + 707, + 709, + 711, + 713, + 714, + 717, + 719, + 721, + 725, + 726, + 728, + 730, + 732, + 734, + 739, + 741, + 742, + 743, + 744, + 748, + 752, + 755, + 760, + 761, + 762, + 764, + 766, + 769, + 771, + 772, + 776, + 778, + 779, + 780, + 783, + 784, + 785, + 786, + 787, + 792, + 793, + 797, + 802, + 806, + 823, + 826, + 830, + 833, + 834, + 835, + 837, + 838, + 839, + 843, + 844, + 845, + 847, + 849, + 850, + 855, + 857, + 859, + 862, + 864, + 866, + 874, + 875, + 879, + 880, + 882, + 883, + 885, + 889, + 895, + 896, + 897, + 898, + 900, + 902, + 909, + 916, + 917, + 918, + 920, + 926, + 928, + 929, + 933, + 935, + 938, + 943, + 952, + 953, + 957, + 958, + 960, + 961, + 962, + 966, + 971, + 973, + 974, + 979, + 980, + 984, + 992, + 999 + ], + [ + "Ikan Mas", + "Yu putih", + "jerung harimau", + "Yu tukul", + "ikan pari", + "burung unta", + "Jay (burung)", + "helang Botak", + "Burung Hering", + "penyu Belimbing", + "labi-labi", + "Kura-kura Katup Amerika", + "Biawak komodo", + "Buaya Nil", + "Ular Tedung India", + "ular laut", + "Kala jengking", + "labah-labah serigala", + "sengkenit", + "kelabang", + "Burung puyuh", + "Parrot Kelabu Afrika", + "Makaw", + "Kakaktua Jambul Sulfur", + "Burung Berek-berek", + "Burung Enggang", + "Burung madu", + "rangsa", + "joyinah Hitam", + "Walabi", + "ampai-ampai", + "buran", + "cacing pipih", + "cacing gelang", + "siput", + "lintah bulan", + "Nudibrankia", + "Ketam raja", + "udang krai", + "umang-umang", + "Burung Flamingo", + "burung jenjang", + "Burung Kedidi Batu", + "burung Kedidi Dunlin", + "Kedidi kaki merah", + "Burung Undan", + "Albatros", + "paus pembunuh", + "Dugung", + "Anjing Chihuahua", + "Anjing chin Jepun", + "Anjing Malta", + "anjing Beijing", + "Papillon (anjing)", + "anjing pemburu Afghan", + "anjing pemburu basset", + "Beagle Inggeris", + "Anjing pemburu darah", + "Anjing pemburu rakun hitam dan sawo matang", + "anjing serigala Rusia", + "Anjing Buru Serigala Ireland", + "Anjing whippet", + "anjing pemburu Ibiza", + "Anjing pemburu berang-berang", + "Persian Greyhound", + "Anjing pemburu rusa Scotland", + "Anjing Weimar", + "anjing pitbull", + "Terier Airedale", + "Anjing terrier Dandie Dinmont", + "Terier Scotland", + "Anjing terrier sutera Australia", + "Anjing pengutip berbulu keriting", + "anjing pengutip Labrador", + "Anjing penuding Hungary", + "Anjing setter Ireland", + "Anjing Bretagne", + "Springer spaniel Inggeris", + "Kuvasz Hungary", + "Anjing gembala Belgium Groenendael", + "anjing Belgium Malinois", + "Anjing Brie", + "Kelpie Australia", + "Komondor Hungary", + "anjing gembala Inggeris lama", + "Anjing gembala Shetland", + "Anjing collie", + "Anjing lembu Flandre", + "Anjing Rottweil", + "Anjing gembala Jerman", + "Pincer Dobermann", + "Boxer (anjing)", + "Anjing bullmastiff", + "mastif Tibet", + "Anjing besar Denmark", + "Anjing Santo Bernard", + "Anjing husky", + "malamut Alaska", + "husky Siberia", + "Anjing Dalmatia", + "Pinscher monyet", + "Anjing Semak Afrika", + "Anjing pug", + "Anjing Newfoundland", + "Anjing Pyrénées besar", + "anjing Samoyed", + "Anjing Pomerania", + "Anjing chow chow", + "Anjing Kees", + "pudel kecil", + "zib", + "Serigala tundra Alaska", + "Serigala bersurai", + "koyote", + "Anjing asli Australia", + "Anjing Hutan", + "Anjing liar Afrika", + "dubuk", + "rubah", + "Rubah Artik", + "Rubah kelabu", + "Kucing tabi", + "Singa gunung", + "harimau Bintang", + "harimau dahan salji", + "singa", + "harimau", + "citah", + "beruang perang", + "Beruang kutub", + "cerpelai", + "kumbang harimau", + "kumbang", + "Kumbang tanah", + "Kumbang longikorn", + "kumbang daun", + "Kumbang badak", + "Kekabuh", + "lalat", + "lebah", + "semut", + "lipas", + "mentadak", + "Lelompat daun", + "Pepatung", + "pepatung jarum", + "Kupu-kupu raja", + "tapak Sulaiman", + "Landak laut", + "gamat", + "Arnab ekor kapas", + "Kelinci", + "Arnab Angora", + "tikus belanda", + "Landak", + "memerang", + "Tikus Belanda", + "Kuda belang", + "khinzir", + "babi hutan", + "Badak air", + "kerbau", + "kambing gurun", + "gazel", + "Unta Arab", + "feret", + "berang-berang", + "Bejar", + "Orang utan Borneo", + "cimpanzi", + "Ungka Tangan Putih", + "سيامڠ", + "Monyet Patas", + "babun", + "Kera Bekantan", + "Lemur ekor gelang", + "Gajah Asia", + "Gajah Afrika", + "Panda merah", + "Panda Gergasi", + "moa", + "Ikan badut", + "buntal", + "sempoa", + "Pakaian akademik", + "Akordion", + "gitar akustik", + "kapal pengangkut pesawat", + "pesawat penumpang", + "Kapal udara", + "ambulans", + "Tong sampah", + "Raifal gempur", + "Beg galas", + "kedai membuat roti", + "Belon udara panas", + "pen mata bulat", + "Bangsal", + "jangka tekanan", + "kereta sorong", + "bola keranjang", + "Basun", + "rumah api", + "Bikar", + "teropong", + "Lumba kereta gelongsor", + "almari buku", + "kedai buku", + "busur", + "coli", + "Benteng hakisan", + "Penyapu", + "baldi", + "gesper", + "Baju kalis peluru", + "teksi", + "kenceng", + "lilin", + "kanu", + "kardigan", + "Karusel", + "Mesin juruwang automatik", + "kaset", + "istana kota", + "katamaran", + "selo", + "telefon bimbit", + "rantai", + "baju rantai", + "Gergaji rantai", + "peti", + "gereja", + "Panggung wayang gambar", + "papan kekunci (pengkomputan)", + "gedung konfeksi", + "kapal kontena", + "pencabut gabus", + "trompet", + "buaian", + "kren", + "periuk masak perlahan", + "baju zirah", + "pengempang", + "komputer atas meja", + "Lampin", + "Mesin pencuci pinggan", + "Brek cakera", + "Kereta luncur salji anjing", + "kubah", + "Dram", + "gitar elektrik", + "Lokomotif elektrik", + "sampul surat", + "tiang bendera", + "seruling", + "foklif", + "air pancut", + "Pen founten", + "kuali leper", + "trak sampah", + "Topeng gas", + "Kereta golf", + "kedai runcit", + "gilotin", + "Penyembur rambut", + "Kenderaan separa landasan", + "tukul", + "pengering rambut", + "peranti mudah alih", + "sapu tangan", + "Harmonika", + "harpa", + "kapak kecil", + "Jam pasir", + "Seterika", + "jip", + "Kemeja-T", + "Susun suai gambar", + "beca", + "Senduk", + "kap lampu", + "komputer riba", + "pemetik api", + "Limousin", + "Kapal samudera", + "Gincu", + "Pembesar suara", + "Marakas", + "Xilofon", + "kedok", + "Megalit", + "mikrofon", + "ketuhar mikro", + "Kenderaan Serba Guna", + "Peluru berpandu", + "kapcai", + "masjid", + "kelambu", + "skuter", + "tetikus", + "Perangkap tikus", + "paku", + "rantai", + "komputer riba", + "Obo", + "jangka jarak", + "Organ paip", + "mangga (ibu kunci)", + "Berus", + "pijama", + "istana", + "payung terjun", + "Telefon awam", + "Bekas pensel", + "Minyak wangi", + "fotostat", + "plektrum", + "lori pikap", + "tabung", + "bantal", + "kendi", + "Ketam kayu", + "beg plastik", + "bajak", + "Kamera Polaroid", + "Kenderaan Black Maria", + "Roda pemutar", + "sejadah", + "pencetak", + "penjara", + "Projektil", + "dompet", + "raket", + "teleskop radio", + "peti sejuk", + "alat kawalan jauh", + "rumah makan", + "raifal", + "Rotiseri", + "Pembaris", + "peti keselamatan", + "pin keselamatan", + "saksofon", + "Alat penimbang", + "bas sekolah", + "sekonyar", + "skru", + "pemutar skru", + "tali pinggang keledar", + "Mesin jahit", + "perisai", + "Penyodok", + "Topi mandi", + "beg tidur", + "Kereta salji", + "sarung kaki", + "stetoskop", + "Jam randik", + "pengusung", + "Kapal selam", + "sut", + "jam matahari", + "cermin mata hitam", + "Pelindung cahaya matahari", + "jambatan gantung", + "buaian", + "suis", + "Picagari", + "kereta kebal", + "teko", + "Beruang teddy", + "Jidal", + "singgahsana", + "Pembakar roti", + "obor", + "Trak tunda", + "jentarik", + "Bas troli", + "trombon", + "payung", + "kenderaan beroda satu", + "pembersih hampagas", + "pasu", + "baldu", + "biola", + "Pesawat tentera", + "sinki", + "mesin basuh", + "botol air", + "menara air", + "Wisel", + "kuali", + "tapak sesawang", + "Buku komik", + "silang kata", + "Lampu isyarat", + "Stimbot", + "aiskrim", + "Loli ais", + "burger keju", + "Kentang lecek", + "kubis bunga", + "timun", + "buah ara", + "nanas", + "delima", + "rumput kering", + "Sirap coklat", + "doh", + "roti daging", + "wain merah", + "buih", + "terumbu karang", + "Geiser", + "lurah", + "gunung berapi", + "Biji sesawi", + "Agarik", + "Kertas tandas" + ] + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/babel_imagenet.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/babel_imagenet.py new file mode 100644 index 0000000000000000000000000000000000000000..40a05df9436f352e0f6830f99f3c4c16664f436f --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/babel_imagenet.py @@ -0,0 +1,20 @@ +import torchvision + +""" +BabelImageNet from https://arxiv.org/pdf/2306.08658.pdf +Adapted from https://github.com/gregor-ge/Babel-ImageNet, thanks to the authors +""" +class BabelImageNet(torchvision.datasets.ImageNet): + def __init__(self, root: str, idxs, split: str = "val", download=None, **kwargs) -> None: + super().__init__(root, split, **kwargs) + examples_per_class = len(self.targets) // 1000 + select_idxs = [idx*examples_per_class + i for idx in idxs for i in range(examples_per_class)] + self.targets = [i for i in range(len(idxs)) for _ in range(examples_per_class)] + self.imgs = [self.imgs[i] for i in select_idxs] + self.samples = [self.samples[i] for i in select_idxs] + self.idxs = idxs + + def __getitem__(self, i): + img, target = super().__getitem__(i) + target = self.idxs.index(target) + return img, target \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/builder.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/builder.py new file mode 100644 index 0000000000000000000000000000000000000000..96d51157b805b15bdad9ca0c06acf974bc4fd81a --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/builder.py @@ -0,0 +1,898 @@ +import json +import os +import sys +import warnings +from subprocess import call + +import torch +from torch.utils.data import default_collate +from torchvision.datasets import (CIFAR10, CIFAR100, DTD, GTSRB, MNIST, PCAM, + STL10, SUN397, CocoCaptions, Country211, + EuroSAT, FGVCAircraft, Flowers102, Food101, + ImageFolder, ImageNet, OxfordIIITPet, + RenderedSST2, StanfordCars) + +from . import (babel_imagenet, caltech101, flickr, imagenetv2, objectnet, + sugar_crepe, voc2007, winoground) + + +def build_dataset(dataset_name, root="root", transform=None, split="test", download=True, annotation_file=None, language="en", task="zeroshot_classification", wds_cache_dir=None, custom_classname_file=None, custom_template_file=None, **kwargs): + """ + Main function to use in order to build a dataset instance, + + dataset_name: str + name of the dataset + + root: str + root folder where the dataset is downloaded and stored. can be shared among datasets. + + transform: torchvision transform applied to images + + split: str + split to use, depending on the dataset can have different options. + In general, `train` and `test` are available. + For specific splits, please look at the corresponding dataset. + + annotation_file: str or None + only for datasets with captions (used for retrieval) such as COCO + and Flickr. + + custom_classname_file: str or None + Custom classname file where keys are dataset names and values are list of classnames. + + custom_template_file: str or None + Custom template file where keys are dataset names and values are list of prompts, or dicts + where keys are classnames and values are class-specific prompts. + + """ + use_classnames_and_templates = task in ('zeroshot_classification', 'linear_probe') + if use_classnames_and_templates: # Only load templates and classnames if we have to + current_folder = os.path.dirname(__file__) + + # Load _classnames.json (packaged with CLIP benchmark that are used by default) + default_classname_file = os.path.join(current_folder, language + "_classnames.json") + if os.path.exists(default_classname_file): + with open(default_classname_file, "r") as f: + default_classnames = json.load(f) + else: + default_classnames = None + + # Load _zeroshot_classification_templates.json (packaged with CLIP benchmark that are used by default) + default_template_file = os.path.join(current_folder, language + "_zeroshot_classification_templates.json") + if os.path.exists(default_template_file): + with open(default_template_file, "r") as f: + default_templates = json.load(f) + else: + default_templates = None + + # Load custom classnames file if --custom_classname_file is specified + if custom_classname_file: + if not os.path.exists(custom_classname_file): + custom_classname_file = os.path.join(current_folder, custom_classname_file) + assert os.path.exists(custom_classname_file), f"Custom classname file '{custom_classname_file}' does not exist" + with open(custom_classname_file, "r") as f: + custom_classnames = json.load(f) + else: + custom_classnames = None + + # Load custom template file if --custom_template_file is specified + if custom_template_file: + if not os.path.exists(custom_template_file): + # look at current_folder + custom_template_file = os.path.join(current_folder, custom_template_file) + assert os.path.exists(custom_template_file), f"Custom template file '{custom_template_file}' does not exist" + with open(custom_template_file, "r") as f: + custom_templates = json.load(f) + else: + custom_templates = None + + def download_imagenet(r): + os.makedirs(r, exist_ok=True) + call(f"wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_devkit_t12.tar.gz --output-document={r}/ILSVRC2012_devkit_t12.tar.gz", shell=True) + call(f"wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar --output-document={r}/ILSVRC2012_img_val.tar", shell=True) + + train = (split == "train") + if dataset_name == "cifar10": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = CIFAR10(root=root, train=train, transform=transform, download=download, **kwargs) + elif dataset_name == "cifar100": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = CIFAR100(root=root, train=train, transform=transform, download=download, **kwargs) + elif dataset_name == "imagenet1k": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + if not os.path.exists(root): + download_imagenet(root) + ds = ImageNet(root=root, split="train" if train else "val", transform=transform, **kwargs) + ds.classes = default_classnames["imagenet1k"] + elif dataset_name == "imagenet-w": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + from imagenet_w import AddWatermark + from torchvision.transforms import CenterCrop, Normalize + if not os.path.exists(root): + download_imagenet(root) + index_normalize = None + crop_size = None + for i, t in enumerate(transform.transforms): + if isinstance(t, Normalize): + index_normalize = i + elif isinstance(t, CenterCrop): + crop_size = min(t.size) + assert crop_size is not None, "CenterCrop not found in transform" + assert index_normalize is not None, "Normalize not found in transform" + transform.transforms.insert(index_normalize, AddWatermark(crop_size)) + ds = ImageNet(root=root, split="train" if train else "val", transform=transform, **kwargs) + ds.classes = custom_classnames["imagenet1k"] + elif dataset_name == "babel_imagenet": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + # babel ImageNet from https://github.com/gregor-ge/Babel-ImageNet + if not os.path.exists(root): + download_imagenet(root) + classnames = json.load(open(os.path.join(current_folder, "babel_imagenet.json"))) + assert language.upper() in classnames, f"Language '{language}' not supported for Babel-ImageNet" + classnames = classnames[language.upper()] + templates = json.load(open(os.path.join(current_folder, "nllb_dist13b_prompts.json"))) + templates = templates[language.upper()] + templates = [t.replace('{}', '{c}') for t in templates] + idxs, classnames = classnames + ds = babel_imagenet.BabelImageNet(root=root, idxs=idxs, split="train" if train else "val", transform=transform, **kwargs) + ds.classes = classnames + ds.templates = templates + elif dataset_name == "imagenet1k-unverified": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + split = "train" if train else "val" + ds = ImageFolder(root=os.path.join(root, split), transform=transform, **kwargs) + # use classnames from OpenAI + ds.classes = default_classnames["imagenet1k"] + elif dataset_name == "imagenetv2": + assert split == "test", f"Only `test` split available for {dataset_name}" + os.makedirs(root, exist_ok=True) + ds = imagenetv2.ImageNetV2Dataset(variant="matched-frequency", transform=transform, location=root) + ds.classes = default_classnames["imagenet1k"] + elif dataset_name == "imagenet_sketch": + assert split == "test", f"Only `test` split available for {dataset_name}" + # Downloadable from https://drive.google.com/open?id=1Mj0i5HBthqH1p_yeXzsg22gZduvgoNeA + if not os.path.exists(root): + # Automatic download + print("Downloading imagenet_sketch...") + if not has_gdown(): + print("GDown is needed to download the dataset. Please install it via `pip install gdown`") + sys.exit(1) + # Download ImageNet-Sketch.zip + call("gdown --id 1Mj0i5HBthqH1p_yeXzsg22gZduvgoNeA", shell=True) + assert os.path.exists("ImageNet-Sketch.zip") + # Unzip and move to `root` + call("unzip ImageNet-Sketch.zip", shell=True) + call(f"mv sketch {root}", shell=True) + ds = ImageFolder(root=root, transform=transform, **kwargs) + ds.classes = default_classnames["imagenet1k"] + elif dataset_name == "imagenet-a": + assert split == "test", f"Only `test` split available for {dataset_name}" + # Downloadable from https://people.eecs.berkeley.edu/~hendrycks/imagenet-a.tar + if not os.path.exists(root): + print("Downloading imagenet-a...") + call("wget https://people.eecs.berkeley.edu/~hendrycks/imagenet-a.tar", shell=True) + # Untar and move to `root` + call("tar xvf imagenet-a.tar", shell=True) + call(f"mv imagenet-a {root}", shell=True) + ds = ImageFolder(root=root, transform=transform, **kwargs) + ds.classes = default_classnames["imagenet1k"] + imagenet_a_wnids = ['n01498041', 'n01531178', 'n01534433', 'n01558993', 'n01580077', 'n01614925', 'n01616318', 'n01631663', 'n01641577', 'n01669191', 'n01677366', 'n01687978', 'n01694178', 'n01698640', 'n01735189', 'n01770081', 'n01770393', 'n01774750', 'n01784675', 'n01819313', 'n01820546', 'n01833805', 'n01843383', 'n01847000', 'n01855672', 'n01882714', 'n01910747', 'n01914609', 'n01924916', 'n01944390', 'n01985128', 'n01986214', 'n02007558', 'n02009912', 'n02037110', 'n02051845', 'n02077923', 'n02085620', 'n02099601', 'n02106550', 'n02106662', 'n02110958', 'n02119022', 'n02123394', 'n02127052', 'n02129165', 'n02133161', 'n02137549', 'n02165456', 'n02174001', 'n02177972', 'n02190166', 'n02206856', 'n02219486', 'n02226429', 'n02231487', 'n02233338', 'n02236044', 'n02259212', 'n02268443', 'n02279972', 'n02280649', 'n02281787', 'n02317335', 'n02325366', 'n02346627', 'n02356798', 'n02361337', 'n02410509', 'n02445715', 'n02454379', 'n02486410', 'n02492035', 'n02504458', 'n02655020', 'n02669723', 'n02672831', 'n02676566', 'n02690373', 'n02701002', 'n02730930', 'n02777292', 'n02782093', 'n02787622', 'n02793495', 'n02797295', 'n02802426', 'n02814860', 'n02815834', 'n02837789', 'n02879718', 'n02883205', 'n02895154', 'n02906734', 'n02948072', 'n02951358', 'n02980441', 'n02992211', 'n02999410', 'n03014705', 'n03026506', 'n03124043', 'n03125729', 'n03187595', 'n03196217', 'n03223299', 'n03250847', 'n03255030', 'n03291819', 'n03325584', 'n03355925', 'n03384352', 'n03388043', 'n03417042', 'n03443371', 'n03444034', 'n03445924', 'n03452741', 'n03483316', 'n03584829', 'n03590841', 'n03594945', 'n03617480', 'n03666591', 'n03670208', 'n03717622', 'n03720891', 'n03721384', 'n03724870', 'n03775071', 'n03788195', 'n03804744', 'n03837869', 'n03840681', 'n03854065', 'n03888257', 'n03891332', 'n03935335', 'n03982430', 'n04019541', 'n04033901', 'n04039381', 'n04067472', 'n04086273', 'n04099969', 'n04118538', 'n04131690', 'n04133789', 'n04141076', 'n04146614', 'n04147183', 'n04179913', 'n04208210', 'n04235860', 'n04252077', 'n04252225', 'n04254120', 'n04270147', 'n04275548', 'n04310018', 'n04317175', 'n04344873', 'n04347754', 'n04355338', 'n04366367', 'n04376876', 'n04389033', 'n04399382', 'n04442312', 'n04456115', 'n04482393', 'n04507155', 'n04509417', 'n04532670', 'n04540053', 'n04554684', 'n04562935', 'n04591713', 'n04606251', 'n07583066', 'n07695742', 'n07697313', 'n07697537', 'n07714990', 'n07718472', 'n07720875', 'n07734744', 'n07749582', 'n07753592', 'n07760859', 'n07768694', 'n07831146', 'n09229709', 'n09246464', 'n09472597', 'n09835506', 'n11879895', 'n12057211', 'n12144580', 'n12267677'] + imagenet_a_mask = [wnid in set(imagenet_a_wnids) for wnid in all_imagenet_wordnet_ids] + ds.classes = [cl for cl, mask in zip(ds.classes, imagenet_a_mask) if mask] + elif dataset_name == "imagenet-r": + assert split == "test", f"Only `test` split available for {dataset_name}" + # downloadable from https://people.eecs.berkeley.edu/~hendrycks/imagenet-r.tar + if not os.path.exists(root): + print("Downloading imagenet-r...") + call("wget https://people.eecs.berkeley.edu/~hendrycks/imagenet-r.tar", shell=True) + # Untar and move to `root` + call("tar xvf imagenet-r.tar", shell=True) + call(f"mv imagenet-r {root}", shell=True) + imagenet_r_wnids = {'n01443537', 'n01484850', 'n01494475', 'n01498041', 'n01514859', 'n01518878', 'n01531178', 'n01534433', 'n01614925', 'n01616318', 'n01630670', 'n01632777', 'n01644373', 'n01677366', 'n01694178', 'n01748264', 'n01770393', 'n01774750', 'n01784675', 'n01806143', 'n01820546', 'n01833805', 'n01843383', 'n01847000', 'n01855672', 'n01860187', 'n01882714', 'n01910747', 'n01944390', 'n01983481', 'n01986214', 'n02007558', 'n02009912', 'n02051845', 'n02056570', 'n02066245', 'n02071294', 'n02077923', 'n02085620', 'n02086240', 'n02088094', 'n02088238', 'n02088364', 'n02088466', 'n02091032', 'n02091134', 'n02092339', 'n02094433', 'n02096585', 'n02097298', 'n02098286', 'n02099601', 'n02099712', 'n02102318', 'n02106030', 'n02106166', 'n02106550', 'n02106662', 'n02108089', 'n02108915', 'n02109525', 'n02110185', 'n02110341', 'n02110958', 'n02112018', 'n02112137', 'n02113023', 'n02113624', 'n02113799', 'n02114367', 'n02117135', 'n02119022', 'n02123045', 'n02128385', 'n02128757', 'n02129165', 'n02129604', 'n02130308', 'n02134084', 'n02138441', 'n02165456', 'n02190166', 'n02206856', 'n02219486', 'n02226429', 'n02233338', 'n02236044', 'n02268443', 'n02279972', 'n02317335', 'n02325366', 'n02346627', 'n02356798', 'n02363005', 'n02364673', 'n02391049', 'n02395406', 'n02398521', 'n02410509', 'n02423022', 'n02437616', 'n02445715', 'n02447366', 'n02480495', 'n02480855', 'n02481823', 'n02483362', 'n02486410', 'n02510455', 'n02526121', 'n02607072', 'n02655020', 'n02672831', 'n02701002', 'n02749479', 'n02769748', 'n02793495', 'n02797295', 'n02802426', 'n02808440', 'n02814860', 'n02823750', 'n02841315', 'n02843684', 'n02883205', 'n02906734', 'n02909870', 'n02939185', 'n02948072', 'n02950826', 'n02951358', 'n02966193', 'n02980441', 'n02992529', 'n03124170', 'n03272010', 'n03345487', 'n03372029', 'n03424325', 'n03452741', 'n03467068', 'n03481172', 'n03494278', 'n03495258', 'n03498962', 'n03594945', 'n03602883', 'n03630383', 'n03649909', 'n03676483', 'n03710193', 'n03773504', 'n03775071', 'n03888257', 'n03930630', 'n03947888', 'n04086273', 'n04118538', 'n04133789', 'n04141076', 'n04146614', 'n04147183', 'n04192698', 'n04254680', 'n04266014', 'n04275548', 'n04310018', 'n04325704', 'n04347754', 'n04389033', 'n04409515', 'n04465501', 'n04487394', 'n04522168', 'n04536866', 'n04552348', 'n04591713', 'n07614500', 'n07693725', 'n07695742', 'n07697313', 'n07697537', 'n07714571', 'n07714990', 'n07718472', 'n07720875', 'n07734744', 'n07742313', 'n07745940', 'n07749582', 'n07753275', 'n07753592', 'n07768694', 'n07873807', 'n07880968', 'n07920052', 'n09472597', 'n09835506', 'n10565667', 'n12267677'} + imagenet_r_mask = [wnid in imagenet_r_wnids for wnid in all_imagenet_wordnet_ids] + ds = ImageFolder(root=root, transform=transform, **kwargs) + ds.classes = default_classnames["imagenet1k"] + ds.classes = [cl for cl, mask in zip(ds.classes, imagenet_r_mask) if mask] + elif dataset_name == "imagenet-o": + assert split == "test", f"Only `test` split available for {dataset_name}" + # downloadable from https://people.eecs.berkeley.edu/~hendrycks/imagenet-o.tar + if not os.path.exists(root): + print("Downloading imagenet-o...") + call("wget https://people.eecs.berkeley.edu/~hendrycks/imagenet-o.tar", shell=True) + # Untar and move to `root` + call("tar xvf imagenet-o.tar", shell=True) + call(f"mv imagenet-o {root}", shell=True) + ds = ImageFolder(root=root, transform=transform, **kwargs) + ds.classes = default_classnames["imagenet1k"] + imagenet_o_wnids = ['n01443537', 'n01704323', 'n01770081', 'n01784675', 'n01819313', 'n01820546', 'n01910747', 'n01917289', 'n01968897', 'n02074367', 'n02317335', 'n02319095', 'n02395406', 'n02454379', 'n02606052', 'n02655020', 'n02666196', 'n02672831', 'n02730930', 'n02777292', 'n02783161', 'n02786058', 'n02787622', 'n02791270', 'n02808304', 'n02817516', 'n02841315', 'n02865351', 'n02877765', 'n02892767', 'n02906734', 'n02910353', 'n02916936', 'n02948072', 'n02965783', 'n03000134', 'n03000684', 'n03017168', 'n03026506', 'n03032252', 'n03075370', 'n03109150', 'n03126707', 'n03134739', 'n03160309', 'n03196217', 'n03207743', 'n03218198', 'n03223299', 'n03240683', 'n03271574', 'n03291819', 'n03297495', 'n03314780', 'n03325584', 'n03344393', 'n03347037', 'n03372029', 'n03376595', 'n03388043', 'n03388183', 'n03400231', 'n03445777', 'n03457902', 'n03467068', 'n03482405', 'n03483316', 'n03494278', 'n03530642', 'n03544143', 'n03584829', 'n03590841', 'n03598930', 'n03602883', 'n03649909', 'n03661043', 'n03666591', 'n03676483', 'n03692522', 'n03706229', 'n03717622', 'n03720891', 'n03721384', 'n03724870', 'n03729826', 'n03733131', 'n03733281', 'n03742115', 'n03786901', 'n03788365', 'n03794056', 'n03804744', 'n03814639', 'n03814906', 'n03825788', 'n03840681', 'n03843555', 'n03854065', 'n03857828', 'n03868863', 'n03874293', 'n03884397', 'n03891251', 'n03908714', 'n03920288', 'n03929660', 'n03930313', 'n03937543', 'n03942813', 'n03944341', 'n03961711', 'n03970156', 'n03982430', 'n03991062', 'n03995372', 'n03998194', 'n04005630', 'n04023962', 'n04033901', 'n04040759', 'n04067472', 'n04074963', 'n04116512', 'n04118776', 'n04125021', 'n04127249', 'n04131690', 'n04141975', 'n04153751', 'n04154565', 'n04201297', 'n04204347', 'n04209133', 'n04209239', 'n04228054', 'n04235860', 'n04243546', 'n04252077', 'n04254120', 'n04258138', 'n04265275', 'n04270147', 'n04275548', 'n04330267', 'n04332243', 'n04336792', 'n04347754', 'n04371430', 'n04371774', 'n04372370', 'n04376876', 'n04409515', 'n04417672', 'n04418357', 'n04423845', 'n04429376', 'n04435653', 'n04442312', 'n04482393', 'n04501370', 'n04507155', 'n04525305', 'n04542943', 'n04554684', 'n04557648', 'n04562935', 'n04579432', 'n04591157', 'n04597913', 'n04599235', 'n06785654', 'n06874185', 'n07615774', 'n07693725', 'n07695742', 'n07697537', 'n07711569', 'n07714990', 'n07715103', 'n07716358', 'n07717410', 'n07718472', 'n07720875', 'n07742313', 'n07745940', 'n07747607', 'n07749582', 'n07753275', 'n07753592', 'n07754684', 'n07768694', 'n07836838', 'n07871810', 'n07873807', 'n07880968', 'n09229709', 'n09472597', 'n12144580', 'n12267677', 'n13052670'] + imagenet_o_mask = [wnid in set(imagenet_o_wnids) for wnid in all_imagenet_wordnet_ids] + ds.classes = [cl for cl, mask in zip(ds.classes, imagenet_o_mask) if mask] + elif dataset_name == "objectnet": + assert split == "test", f"Only `test` split available for {dataset_name}" + # downloadable from https://objectnet.dev/downloads/objectnet-1.0.zip or https://www.dropbox.com/s/raw/cxeztdtm16nzvuw/objectnet-1.0.zip + if not os.path.exists(root): + print("Downloading objectnet...") + call("wget https://objectnet.dev/downloads/objectnet-1.0.zip", shell=True) + # Untar and move to `root` + call("UNZIP_DISABLE_ZIPBOMB_DETECTION=TRUE unzip -P objectnetisatestset objectnet-1.0.zip", shell=True) + os.makedirs(root) + call(f"mv objectnet-1.0 {root}", shell=True) + call(f"cp {root}/objectnet-1.0/mappings/* {root}", shell=True) + ds = objectnet.ObjectNetDataset(root=root, transform=transform) + elif dataset_name == "voc2007": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = voc2007.PASCALVoc2007Cropped(root=root, set=split, transform=transform, download=download, **kwargs) + elif dataset_name == "voc2007_multilabel": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = voc2007.PASCALVoc2007(root=root, set=split, transform=transform, download=download, **kwargs) + elif dataset_name.startswith("sugar_crepe"): + # https://github.com/RAIVNLab/sugar-crepe/tree/main + _, task = dataset_name.split("/") + assert task in ("add_att", "add_obj", "replace_att", "replace_obj", "replace_rel", "swap_att", "swap_obj"), f"Unknown task {task} for {dataset_name}" + assert split == "test", f"Only `test` split available for {dataset_name}" + archive_name = "val2017.zip" + root_split = os.path.join(root, archive_name.replace(".zip", "")) + if not os.path.exists(root_split): + print(f"Downloading coco captions {archive_name}...") + if not os.path.exists(os.path.join(root, archive_name)): + call(f"wget http://images.cocodataset.org/zips/{archive_name} --output-document={root}/{archive_name}", shell=True) + call(f"unzip {root}/{archive_name} -d {root}", shell=True) + ann = f"{root}/{task}.json" + if not os.path.exists(ann): + url = f"https://raw.githubusercontent.com/RAIVNLab/sugar-crepe/main/data/{task}.json" + call(f"wget {url} --output-document={ann}", shell=True) + ds = sugar_crepe.SugarCrepe(root=os.path.join(root, "val2017"), ann_file=ann, transform=transform, **kwargs) + elif dataset_name == "winoground": + ds = winoground.WinoGround(root=root, transform=transform) + elif dataset_name == "mscoco_captions": + # https://github.com/mehdidc/retrieval_annotations/releases/tag/1.0.0(annotations) + if split == "train": + archive_name = "train2014.zip" + elif split in ("val", "test"): + archive_name = "val2014.zip" + else: + raise ValueError(f"split should be `train` or `val` or `test` for `{dataset_name}`") + root_split = os.path.join(root, archive_name.replace(".zip", "")) + if not os.path.exists(root_split): + print(f"Downloading mscoco_captions {archive_name}...") + if not os.path.exists(os.path.join(root, archive_name)): + call(f"wget http://images.cocodataset.org/zips/{archive_name} --output-document={root}/{archive_name}", shell=True) + call(f"unzip {root}/{archive_name} -d {root}", shell=True) + if not annotation_file: + annotation_file = f"{root}/coco_{split}_karpathy.json" + if not os.path.exists(annotation_file): + call(f"wget https://github.com/mehdidc/retrieval_annotations/releases/download/1.0.0/coco_{split}_karpathy.json --output-document={annotation_file}", shell=True) + ds = CocoCaptions(root=root_split, annFile=annotation_file, transform=transform, **kwargs) + elif dataset_name == 'multilingual_mscoco_captions': + from clip_benchmark.datasets import multilingual_mscoco + if language not in multilingual_mscoco.SUPPORTED_LANGUAGES: + raise ValueError("Unsupported language for multilingual_ms_coco:", language) + + annotation_file = os.path.join(root, multilingual_mscoco.OUTPUT_FILENAME_TEMPLATE.format(language)) + if not os.path.exists(annotation_file): + multilingual_mscoco.create_annotation_file(root, language) + + ds = multilingual_mscoco.Multilingual_MSCOCO(root=root, ann_file=annotation_file, transform=transform, **kwargs) + elif dataset_name == 'crossmodal3600': + from clip_benchmark.datasets import crossmodal3600 + if language not in crossmodal3600.SUPPORTED_LANGUAGES: + raise ValueError("Unsupported language for Crossmodal-3600:", language) + + annotation_file = os.path.join(root, crossmodal3600.OUTPUT_FILENAME_TEMPLATE.format(language)) + if not os.path.exists(annotation_file): + crossmodal3600.create_annotation_file(root, language) + + ds = crossmodal3600.Crossmodal3600(root=root, ann_file=annotation_file, transform=transform, **kwargs) + elif dataset_name == 'xtd200': + from clip_benchmark.datasets import xtd200 + if language not in xtd200.SUPPORTED_LANGUAGES: + raise ValueError("Unsupported language for xtd200:", language) + + annotation_file = os.path.join(root, xtd200.OUTPUT_FILENAME_TEMPLATE.format(language)) + if not os.path.exists(annotation_file): + xtd200.create_annotation_file(root, language) + + ds = xtd200.XTD200(root=root, ann_file=annotation_file, transform=transform, **kwargs) + elif dataset_name == 'flickr30k-200': + from clip_benchmark.datasets import flickr30k_200 + if language not in flickr30k_200.SUPPORTED_LANGUAGES: + raise ValueError("Unsupported language for flickr30k-200:", language) + + annotation_file = os.path.join(root, flickr30k_200.OUTPUT_FILENAME_TEMPLATE.format(language)) + if not os.path.exists(annotation_file): + flickr30k_200.create_annotation_file(root, language) + + ds = flickr30k_200.Flickr30k_200(root=root, ann_file=annotation_file, transform=transform, **kwargs) + elif dataset_name == "flickr30k": + # downloadable from https://www.kaggle.com/datasets/adityajn105/flickr30k + # https://github.com/mehdidc/retrieval_annotations/releases/tag/1.0.0(annotations) + # `kaggle datasets download -d adityajn105/flickr30k` + assert split in ("train", "val", "test"), f"Only `train` and `val` and `test` split available for {dataset_name}" + if not os.path.exists(root): + # Automatic download + print("Downloading flickr30k...") + if not has_kaggle(): + print("Kaggle is needed to download the dataset. Please install it via `pip install kaggle`") + sys.exit(1) + call("kaggle datasets download -d hsankesara/flickr-image-dataset", shell=True) + call(f"unzip flickr-image-dataset.zip", shell=True) + call(f"mv flickr30k_images/flickr30k_images {root} && rm -rf flickr30k_images", shell=True) + if not annotation_file: + if language == "en": + annotation_file = f"{root}/flickr30k_{split}_karpathy.txt" + elif language == "zh": + annotation_file = f"{root}/flickr30k_{split}_zh.txt" + else: + raise ValueError(f"Unsupported language {language} for `{dataset_name}`") + if not os.path.exists(annotation_file): + # Download Flickr30K Karpathy test set + if language== "en": + call(f"wget https://github.com/mehdidc/retrieval_annotations/releases/download/1.0.0/flickr30k_{split}_karpathy.txt --output-document={annotation_file}", shell=True) + elif language =="zh": + call(f"wget https://github.com/mehdidc/retrieval_annotations/releases/download/1.0.0/flickr30k_{split}_zh.txt --output-document={annotation_file}", shell=True) + else: + raise ValueError(f"Unsupported language {language} for `{dataset_name}`") + ds = flickr.Flickr(root=root, ann_file=annotation_file, transform=transform, **kwargs) + elif dataset_name == "flickr8k": + assert split in ("train", "val", "test"), f"Only `train` and `val` and `test` split available for {dataset_name}" + # downloadable from https://www.kaggle.com/datasets/adityajn105/flickr8k + # `kaggle datasets download -d adityajn105/flickr8k` + # https://github.com/mehdidc/retrieval_annotations/releases/tag/1.0.0(annotations) + if not os.path.exists(root): + # Automatic download + print("Downloading flickr8k...") + if not has_kaggle(): + print("Kaggle is needed to download the dataset. Please install it via `pip install kaggle`") + sys.exit(1) + call("kaggle datasets download -d adityajn105/flickr8k", shell=True) + call(f"unzip flickr8k.zip", shell=True) + call(f"mv Images {root}", shell=True) + call(f"mv captions.txt {root}", shell=True) + if not annotation_file: + if language == "en": + annotation_file = f"{root}/flickr8k_{split}_karpathy.txt" + elif language == "zh": + annotation_file = f"{root}/flickr8k_{split}_zh.txt" + else: + raise ValueError(f"Unsupported language {language} for `{dataset_name}`") + if not os.path.exists(annotation_file): + # Download Flickr8K Karpathy test set + if language == "en": + call(f"wget https://github.com/mehdidc/retrieval_annotations/releases/download/1.0.0/flickr8k_{split}_karpathy.txt --output-document={annotation_file}", shell=True) + elif language == "zh": + call(f"wget https://github.com/mehdidc/retrieval_annotations/releases/download/1.0.0/flickr8k_{split}_zh.txt --output-document={annotation_file}", shell=True) + else: + raise ValueError(f"Unsupported language {language} for `{dataset_name}`") + ds = flickr.Flickr(root=root, ann_file=annotation_file, transform=transform, **kwargs) + elif dataset_name == "food101": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = Food101(root=root, split=split, transform=transform, download=download, **kwargs) + # we use the default class names, we just replace "_" by spaces + # to delimit words + ds.classes = [cl.replace("_", " ") for cl in ds.classes] + elif dataset_name == "sun397": + warnings.warn(f"split argument ignored for `{dataset_name}`, there are no pre-defined train/test splits for this dataset") + # we use the default class names, we just replace "_" and "/" by spaces + # to delimit words + ds = SUN397(root=root, transform=transform, download=download, **kwargs) + ds.classes = [cl.replace("_", " ").replace("/", " ") for cl in ds.classes] + elif dataset_name == "cars": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = StanfordCars(root=root, split=split, transform=transform, download=download, **kwargs) + elif dataset_name == "fgvc_aircraft": + assert split in ("train", "val", "trainval", "test"), f"Only `train` and `val` and `trainval` and `test` split available for {dataset_name}" + ds = FGVCAircraft(root=root, annotation_level="variant", split=split, transform=transform, download=download, **kwargs) + elif dataset_name == "dtd": + assert split in ("train", "val", "test"), f"Only `train` and `val` and `test` split available for {dataset_name}" + ds = DTD(root=root, split=split, transform=transform, download=download, **kwargs) + elif dataset_name == "pets": + assert split in ("trainval", "test"), f"Only `trainval` and `test` split available for {dataset_name}" + ds = OxfordIIITPet(root=root, split=split, target_types="category", transform=transform, download=download, **kwargs) + elif dataset_name == "caltech101": + warnings.warn(f"split argument ignored for `{dataset_name}`, there are no pre-defined train/test splits for this dataset") + # broken download link (can't download google drive), fixed by this PR https://github.com/pytorch/vision/pull/5645 + # also available in "vtab/caltech101" using VTAB splits, we advice to use VTAB version rather than this one + # since in this one (torchvision) there are no pre-defined test splits + ds = caltech101.Caltech101(root=root, target_type="category", transform=transform, download=download, **kwargs) + ds.classes = default_classnames["caltech101"] + elif dataset_name == "flowers": + assert split in ("train", "val", "test"), f"Only `train` and `val` and `test` split available for {dataset_name}" + ds = Flowers102(root=root, split=split, transform=transform, download=download, **kwargs) + # class indices started by 1 until it was fixed in a PR (#TODO link of the PR) + # if older torchvision version, fix it using a target transform that decrements label index + # TODO figure out minimal torchvision version needed instead of decrementing + if ds[0][1] == 1: + ds.target_transform = lambda y:y-1 + ds.classes = default_classnames["flowers"] + elif dataset_name == "mnist": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = MNIST(root=root, train=train, transform=transform, download=download, **kwargs) + ds.classes = default_classnames["mnist"] + elif dataset_name == "stl10": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = STL10(root=root, split=split, transform=transform, download=download, **kwargs) + elif dataset_name == "eurosat": + warnings.warn(f"split argument ignored for `{dataset_name}`, there are no pre-defined train/test splits for this dataset") + ds = EuroSAT(root=root, transform=transform, download=download, **kwargs) + ds.classes = default_classnames["eurosat"] + elif dataset_name == "gtsrb": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + ds = GTSRB(root=root, split=split, transform=transform, download=download, **kwargs) + ds.classes = default_classnames["gtsrb"] + elif dataset_name == "country211": + assert split in ("train", "valid", "test"), f"Only `train` and `valid` and `test` split available for {dataset_name}" + ds = Country211(root=root, split=split, transform=transform, download=download, **kwargs) + ds.classes = default_classnames["country211"] + elif dataset_name == "pcam": + assert split in ("train", "val", "test"), f"Only `train` and `val` and `test` split available for {dataset_name}" + # Dead link. Fixed by this PR on torchvision https://github.com/pytorch/vision/pull/5645 + # TODO figure out minimal torchvision version needed + ds = PCAM(root=root, split=split, transform=transform, download=download, **kwargs) + ds.classes = default_classnames["pcam"] + elif dataset_name == "renderedsst2": + assert split in ("train", "val", "test"), f"Only `train` and `val` and `test` split available for {dataset_name}" + ds = RenderedSST2(root=root, split=split, transform=transform, download=download, **kwargs) + elif dataset_name == "fer2013": + assert split in ("train", "test"), f"Only `train` and `test` split available for {dataset_name}" + # Downloadable from https://www.kaggle.com/datasets/msambare/fer2013 + # `kaggle datasets download -d msambare/fer2013` + if not os.path.exists(root): + # Automatic download + print("Downloading fer2013...") + if not has_kaggle(): + print("Kaggle is needed to download the dataset. Please install it via `pip install kaggle`") + sys.exit(1) + call("kaggle datasets download -d msambare/fer2013", shell=True) + call(f"unzip fer2013.zip -d {root}", shell=True) + root = os.path.join(root, "train" if train else "test") + ds = ImageFolder(root=root, transform=transform) + ds.classes = default_classnames["fer2013"] + elif dataset_name.startswith("tfds/"): + # TFDS datasets support using `timm` and `tensorflow_datasets` + prefix, *name_list = dataset_name.split("/") + name = "/".join(name_list) + ds = build_tfds_dataset(name, download=download, split=split, data_dir=root, transform=transform) + elif dataset_name.startswith("vtab/"): + # VTAB datasets support using `tensorflow_datasets` and `task_adaptation` + prefix, *name_list = dataset_name.split("/") + name = "/".join(name_list) + ds = build_vtab_dataset(name, download=download, split=split, data_dir=root, transform=transform, classnames=default_classnames) + elif dataset_name.startswith("wds/"): + # WebDataset support using `webdataset` library + name = dataset_name.split("/", 1)[1] + ds = build_wds_dataset(name, transform=transform, split=split, data_dir=root, cache_dir=wds_cache_dir) + # WDS specify classnames and templates on its own. + elif dataset_name == "dummy": + ds = Dummy() + else: + raise ValueError(f"Unsupported dataset: {dataset_name}.") + + default_dataset_for_templates = "imagenet1k" + if dataset_name.startswith("tfds/") or dataset_name.startswith("vtab/") or dataset_name.startswith("wds/"): + prefix, *rest = dataset_name.split("/") + short_name = "/".join(rest) + # if it's a vtab/tfds/wds/ dataset, we look for e.g. vtab/ + # as well as in the custom template file/classname file, + # whichever is found. + keys_to_lookup = [dataset_name, short_name] + else: + keys_to_lookup = [dataset_name] + + if use_classnames_and_templates: + # Specify templates for the dataset (if needed) + if custom_templates: + # We override with custom templates ONLY if they are provided, + # which is the case when `custom_templates` is loaded. + ds.templates = value_from_first_key_found( + custom_templates, keys=keys_to_lookup + [default_dataset_for_templates] + ) + assert ds.templates is not None, f"Templates not specified for {dataset_name}" + elif not hasattr(ds, "templates"): + # No templates specified by the dataset itself, + # so we use templates are packaged with CLIP benchmark + # (loaded from _zeroshot_classification_templates.json). + ds.templates = value_from_first_key_found(default_templates, keys=keys_to_lookup + [default_dataset_for_templates]) + assert ds.templates is not None, f"Templates not specified for {dataset_name}" + else: + # dataset has templates already (e.g., WDS case), so we keep it as is. + pass + + # We override with custom classnames ONLY if they are provided. + if custom_classnames: + ds.classes = value_from_first_key_found(custom_classnames, keys=keys_to_lookup) + + assert ds.classes is not None, f"Classes not specified for {dataset_name}" + assert ds.templates is not None, f"Templates not specified for {dataset_name}" + return ds + +def value_from_first_key_found(dic, keys): + for k in keys: + if k in dic: + return dic[k] + + +class Dummy(): + + def __init__(self): + self.classes = ["blank image", "noisy image"] + + def __getitem__(self, i): + return torch.zeros(3,224,224), 0 + + def __len__(self): + return 1 + +def get_dataset_default_task(dataset): + if dataset in ("flickr30k", "flickr8k", "mscoco_captions", "multilingual_mscoco_captions", "flickr30k-200", "crossmodal3600", "xtd200"): + return "zeroshot_retrieval" + elif dataset.startswith("sugar_crepe") or dataset == "winoground": + return "image_caption_selection" + else: + return "zeroshot_classification" + +def get_dataset_collate_fn(dataset_name): + if dataset_name in ("mscoco_captions", "multilingual_mscoco_captions", "flickr30k", "flickr8k", "flickr30k-200", "crossmodal3600", "xtd200", "winoground") or dataset_name.startswith("sugar_crepe"): + return image_captions_collate_fn + else: + return default_collate + +def has_gdown(): + return call("which gdown", shell=True) == 0 + +def has_kaggle(): + return call("which kaggle", shell=True) == 0 + + +def build_vtab_dataset(dataset_name, transform, download=True, split="test", data_dir="root", classnames=[]): + # Using VTAB splits instead of default TFDS splits + from .tfds import (VTABIterableDataset, disable_gpus_on_tensorflow, + download_tfds_dataset) + + # avoid Tensorflow owning GPUs to not clash with PyTorch + disable_gpus_on_tensorflow() + + # by default we take classes from TFDS (default behavior if `classes` stays None), + # except for the datasets that will override `classes` (e.g., clevr_*) + classes = None + if dataset_name == "caltech101": + from task_adaptation.data.caltech import Caltech101 + tfds_dataset = Caltech101(data_dir=data_dir) + classes = classnames["caltech101_vtab"] + elif dataset_name == "cars": + from task_adaptation.data.cars import CarsData + tfds_dataset = CarsData(data_dir=data_dir) + elif dataset_name in ("cifar10", "cifar100"): + from task_adaptation.data.cifar import CifarData + tfds_dataset = CifarData(data_dir=data_dir, num_classes=10 if dataset_name == "cifar10" else 100) + elif dataset_name.startswith("clevr_"): + from task_adaptation.data.clevr import CLEVRData + task = _extract_task(dataset_name) + assert task in ("count_all", "closest_object_distance") + tfds_dataset = CLEVRData(task=task, data_dir=data_dir) + if task == "count_all": + classes = classnames["clevr_count_all"] + elif task == "closest_object_distance": + classes = classnames["clevr_closest_object_distance"] + else: + raise ValueError(f"non supported: {task}") + elif dataset_name == "cub": + from task_adaptation.data.cub import CUB2011Data + tfds_dataset = CUB2011Data(data_dir=data_dir) + elif dataset_name == "diabetic_retinopathy": + # Needs manual download from Kaggle + # 1) `kaggle competitions download -c diabetic-retinopathy-detection` on $ROOT/downloads/manual + # 2) extract archives on $ROOT/downloads/manual + if not os.path.exists(data_dir): + # Automatic download + print("Downloading diabetic_retinopathy...") + if not has_kaggle(): + print("Kaggle is needed to download the dataset. Please install it via `pip install kaggle`") + sys.exit(1) + os.makedirs(os.path.join(data_dir, "downloads", "manual")) + call(f"kaggle competitions download -c diabetic-retinopathy-detection -p {data_dir}/downloads/manual", shell=True) + call(f"cd {data_dir}/downloads/manual;unzip diabetic-retinopathy-detection.zip;cat train.zip*>train.zip;cat test.zip*>test.zip;unzip train.zip; unzip test.zip;unzip sample.zip;unzip trainLabels.csv.zip", shell=True) + from task_adaptation.data.diabetic_retinopathy import RetinopathyData + tfds_dataset = RetinopathyData(config="btgraham-300", data_dir=data_dir) + classes = classnames["diabetic_retinopathy"] + elif dataset_name == "dmlab": + from task_adaptation.data.dmlab import DmlabData + download_tfds_dataset("dmlab", data_dir=data_dir) # it's not called in the original VTAB code, so we do it explictly + tfds_dataset = DmlabData(data_dir=data_dir) + classes = classnames["dmlab"] + elif dataset_name.startswith("dsprites_"): + from task_adaptation.data.dsprites import DSpritesData + task = _extract_task(dataset_name) + assert task in ("label_shape", "label_scale", "label_orientation", "label_x_position", "label_y_position") + tfds_dataset = DSpritesData(task, data_dir=data_dir) + classes = tfds_dataset._dataset_builder.info.features[task].names + elif dataset_name == "dtd": + from task_adaptation.data.dtd import DTDData + tfds_dataset = DTDData(data_dir=data_dir) + elif dataset_name == "eurosat": + from task_adaptation.data.eurosat import EurosatData + tfds_dataset = EurosatData(subset="rgb", data_key="image", data_dir=data_dir) + classes = classnames["eurosat"] + elif dataset_name == "food101": + from task_adaptation.data.food101 import Food101Data + tfds_dataset = Food101Data(data_dir=data_dir) + elif dataset_name == "inaturalist": + from task_adaptation.data.inaturalist import INaturalistData + tfds_dataset = INaturalistData(data_dir=data_dir, year=2017) + elif dataset_name.startswith("kitti_"): + from .kitti import KittiData + task = _extract_task(dataset_name) + assert task in ( + "count_all", "count_left", "count_far", "count_near", + "closest_object_distance", "closest_object_x_location", + "count_vehicles", "closest_vehicle_distance", + ) + tfds_dataset = KittiData(task=task, data_dir=data_dir) + if task == "closest_vehicle_distance": + classes = classnames["kitti_closest_vehicle_distance"] + else: + raise ValueError(f"Unsupported task: {task}") + elif dataset_name == "flowers": + from task_adaptation.data.oxford_flowers102 import OxfordFlowers102Data + tfds_dataset = OxfordFlowers102Data(data_dir=data_dir) + elif dataset_name == "pets": + from task_adaptation.data.oxford_iiit_pet import OxfordIIITPetData + tfds_dataset = OxfordIIITPetData(data_dir=data_dir) + classes = classnames["pets"] + elif dataset_name == "pcam": + from task_adaptation.data.patch_camelyon import PatchCamelyonData + tfds_dataset = PatchCamelyonData(data_dir=data_dir) + classes = classnames["pcam"] + elif dataset_name == "resisc45": + # Needs download from OneDrive: https://1drv.ms/u/s!AmgKYzARBl5ca3HNaHIlzp_IXjs + # The archive needs to to be put at /downloads/manual then extracted + if not os.path.exists(data_dir): + os.makedirs(os.path.join(data_dir, "downloads", "manual")) + call(f"wget 'https://onedrive.live.com/download?resid=5C5E061130630A68!107&authkey=!AHHNaHIlzp_IXjs' --output-document={data_dir}/downloads/manual/resisc45.rar", shell=True) + call(f"cd {data_dir}/downloads/manual;unrar x resisc45.rar", shell=True) + from task_adaptation.data.resisc45 import Resisc45Data + tfds_dataset = Resisc45Data(data_dir=data_dir) + elif dataset_name.startswith("smallnorb_"): + from task_adaptation.data.smallnorb import SmallNORBData + task = _extract_task(dataset_name) + assert task in ("label_category", "label_elevation", "label_azimuth", "label_lighting") + tfds_dataset = SmallNORBData(predicted_attribute=task, data_dir=data_dir) + classes = tfds_dataset._dataset_builder.info.features[task].names + elif dataset_name == "sun397": + from task_adaptation.data.sun397 import Sun397Data + + #FIXME There is a problem in `sun397`, when TFDS tries download it + # there is an image that cannot be decoded. For the time being + # we will use torchvision's SUN397 instead. + tfds_dataset = Sun397Data(config="tfds", data_dir=data_dir) + elif dataset_name == "svhn": + from task_adaptation.data.svhn import SvhnData + tfds_dataset = SvhnData(data_dir=data_dir) + classes = classnames["svhn"] + else: + raise ValueError(f"Unsupported dataset: {dataset_name}") + ds = VTABIterableDataset( + tfds_dataset, + input_name="image", label_name="label", + transform=transform, + target_transform=int, + split=split, + classes=classes, + ) + return ds + +def build_tfds_dataset(name, transform, download=True, split="test", data_dir="root", classes=None): + from .tfds import disable_gpus_on_tensorflow + disable_gpus_on_tensorflow() + import tensorflow_datasets as tfds + import timm + builder = tfds.builder(name, data_dir=data_dir) + if download: + builder.download_and_prepare() + splits = list(builder.info.splits.keys()) + assert split in splits, (split, splits) + ds = timm.data.create_dataset(f"tfds/{name}", data_dir, split=split, transform=transform, target_transform=int) + ds.classes = builder.info.features['label'].names if classes is None else classes + return ds + + +def build_wds_dataset(dataset_name, transform, split="test", data_dir="root", cache_dir=None): + """ + Load a dataset in WebDataset format. Either local paths or HTTP URLs can be specified. + Expected file structure is: + ``` + data_dir/ + train/ + nshards.txt + 0.tar + 1.tar + ... + test/ + nshards.txt + 0.tar + 1.tar + ... + classnames.txt + zeroshot_classification_templates.txt + dataset_type.txt + ``` + Classnames and templates are required for zeroshot classification, while dataset type + (equal to "retrieval") is required for zeroshot retrieval datasets. + + You can use the `clip_benchmark_export_wds` or corresponding API + (`clip_benchmark.webdataset_builder.convert_dataset`) to convert datasets to this format. + + Set `cache_dir` to a path to cache the dataset, otherwise, no caching will occur. + """ + import webdataset as wds + + def read_txt(fname): + if "://" in fname: + stream = os.popen("curl -L -s --fail '%s'" % fname, "r") + value = stream.read() + if stream.close(): + raise FileNotFoundError("Failed to retreive data") + else: + with open(fname, "r") as file: + value = file.read() + return value + # Special handling for Huggingface datasets + # Git LFS files have a different file path to access the raw data than other files + if data_dir.startswith("https://huggingface.co/datasets"): + # Format: https://huggingface.co/datasets///tree/ + *split_url_head, _, url_path = data_dir.split("/", 7) + url_head = "/".join(split_url_head) + metadata_dir = "/".join([url_head, "raw", url_path]) + tardata_dir = "/".join([url_head, "resolve", url_path]) + else: + metadata_dir = tardata_dir = data_dir + # Get number of shards + nshards_fname = os.path.join(metadata_dir, split, "nshards.txt") + nshards = int(read_txt(nshards_fname)) # Do not catch FileNotFound, nshards.txt should be mandatory + # Get dataset type (classification or retrieval) + type_fname = os.path.join(metadata_dir, "dataset_type.txt") + try: + dataset_type = read_txt(type_fname).strip().lower() + except FileNotFoundError: + # print("WARNING: dataset_type.txt not found, assuming type=classification") + dataset_type = "classification" + # + filepattern = os.path.join(tardata_dir, split, "{0..%d}.tar" % (nshards - 1)) + # Load webdataset (support WEBP, PNG, and JPG for now) + if not cache_dir or not isinstance(cache_dir, str): + cache_dir = None + dataset = ( + wds.WebDataset(filepattern, cache_dir=cache_dir, nodesplitter=lambda src: src) + .decode(wds.autodecode.ImageHandler("pil", extensions=["webp", "png", "jpg", "jpeg"])) + ) + # Load based on classification or retrieval task + if dataset_type == "retrieval": + dataset = (dataset + .to_tuple(["webp", "png", "jpg", "jpeg"], "txt") + .map_tuple(transform, str.splitlines) + ) + dataset.classes = dataset.templates = None + else: + label_type = "npy" if dataset_type == "multilabel" else "cls" # Special case for multilabel + dataset = (dataset + .to_tuple(["webp", "png", "jpg", "jpeg"], label_type) + .map_tuple(transform, None) + ) + # Get class names if present + classnames_fname = os.path.join(metadata_dir, "classnames.txt") + try: + dataset.classes = [line.strip() for line in read_txt(classnames_fname).splitlines()] + except FileNotFoundError: + print("WARNING: classnames.txt not found") + dataset.classes = None + # Get zeroshot classification templates if present + templates_fname = os.path.join(metadata_dir, "zeroshot_classification_templates.txt") + try: + dataset.templates = [line.strip() for line in read_txt(templates_fname).splitlines()] + except FileNotFoundError: + print("WARNING: zeroshot_classification_templates.txt not found") + dataset.templates = None + + return dataset + + +def _extract_task(dataset_name): + prefix, *task_name_list = dataset_name.split("_") + task = "_".join(task_name_list) + return task + + +def image_captions_collate_fn(batch): + transposed = list(zip(*batch)) + imgs = default_collate(transposed[0]) + texts = transposed[1] + return imgs, texts + +def get_dataset_collection_from_file(path): + return [l.strip() for l in open(path).readlines()] + +dataset_collection = { + "vtab": [ + "vtab/caltech101", + "vtab/cifar100", + "vtab/clevr_count_all", + "vtab/clevr_closest_object_distance", + "vtab/diabetic_retinopathy", + "vtab/dmlab", + "vtab/dsprites_label_orientation", + "vtab/dsprites_label_x_position", + "vtab/dtd", + "vtab/eurosat", + "vtab/kitti_closest_vehicle_distance", + "vtab/flowers", + "vtab/pets", + "vtab/pcam", + "vtab/resisc45", + "vtab/smallnorb_label_azimuth", + "vtab/smallnorb_label_elevation", + "sun397", + "vtab/svhn", + ], + "vtab+":[ + "imagenet1k", + "imagenetv2", + "imagenet_sketch", + "imagenet-a", + "imagenet-r", + "objectnet", + "fer2013", + "voc2007", + "voc2007_multilabel", + "sun397", + "cars", + "fgvc_aircraft", + "mnist", + "stl10", + "gtsrb", + "country211", + "renderedsst2", + "vtab/caltech101", + "vtab/cifar10", + "vtab/cifar100", + "vtab/clevr_count_all", + "vtab/clevr_closest_object_distance", + "vtab/diabetic_retinopathy", + "vtab/dmlab", + "vtab/dsprites_label_orientation", + "vtab/dsprites_label_x_position", + "vtab/dtd", + "vtab/eurosat", + "vtab/kitti_closest_vehicle_distance", + "vtab/flowers", + "vtab/pets", + "vtab/pcam", + "vtab/resisc45", + "vtab/smallnorb_label_azimuth", + "vtab/smallnorb_label_elevation", + "vtab/svhn", + ], + "retrieval": [ + "mscoco_captions", + "flickr8k", + "flickr30k", + ], + "imagenet_robustness": [ + "imagenetv2", + "imagenet_sketch", + "imagenet-a", + "imagenet-r", + "objectnet", + ], + "sugar_crepe":[ + "sugar_crepe/add_att", + "sugar_crepe/add_obj", + "sugar_crepe/replace_att", + "sugar_crepe/replace_obj", + "sugar_crepe/replace_rel", + "sugar_crepe/swap_att", + "sugar_crepe/swap_obj", + ] +} +# use by imagenet robustness datasets +all_imagenet_wordnet_ids = ['n01440764', 'n01443537', 'n01484850', 'n01491361', 'n01494475', 'n01496331', 'n01498041', 'n01514668', 'n01514859', 'n01518878', 'n01530575', 'n01531178', 'n01532829', 'n01534433', 'n01537544', 'n01558993', 'n01560419', 'n01580077', 'n01582220', 'n01592084', 'n01601694', 'n01608432', 'n01614925', 'n01616318', 'n01622779', 'n01629819', 'n01630670', 'n01631663', 'n01632458', 'n01632777', 'n01641577', 'n01644373', 'n01644900', 'n01664065', 'n01665541', 'n01667114', 'n01667778', 'n01669191', 'n01675722', 'n01677366', 'n01682714', 'n01685808', 'n01687978', 'n01688243', 'n01689811', 'n01692333', 'n01693334', 'n01694178', 'n01695060', 'n01697457', 'n01698640', 'n01704323', 'n01728572', 'n01728920', 'n01729322', 'n01729977', 'n01734418', 'n01735189', 'n01737021', 'n01739381', 'n01740131', 'n01742172', 'n01744401', 'n01748264', 'n01749939', 'n01751748', 'n01753488', 'n01755581', 'n01756291', 'n01768244', 'n01770081', 'n01770393', 'n01773157', 'n01773549', 'n01773797', 'n01774384', 'n01774750', 'n01775062', 'n01776313', 'n01784675', 'n01795545', 'n01796340', 'n01797886', 'n01798484', 'n01806143', 'n01806567', 'n01807496', 'n01817953', 'n01818515', 'n01819313', 'n01820546', 'n01824575', 'n01828970', 'n01829413', 'n01833805', 'n01843065', 'n01843383', 'n01847000', 'n01855032', 'n01855672', 'n01860187', 'n01871265', 'n01872401', 'n01873310', 'n01877812', 'n01882714', 'n01883070', 'n01910747', 'n01914609', 'n01917289', 'n01924916', 'n01930112', 'n01943899', 'n01944390', 'n01945685', 'n01950731', 'n01955084', 'n01968897', 'n01978287', 'n01978455', 'n01980166', 'n01981276', 'n01983481', 'n01984695', 'n01985128', 'n01986214', 'n01990800', 'n02002556', 'n02002724', 'n02006656', 'n02007558', 'n02009229', 'n02009912', 'n02011460', 'n02012849', 'n02013706', 'n02017213', 'n02018207', 'n02018795', 'n02025239', 'n02027492', 'n02028035', 'n02033041', 'n02037110', 'n02051845', 'n02056570', 'n02058221', 'n02066245', 'n02071294', 'n02074367', 'n02077923', 'n02085620', 'n02085782', 'n02085936', 'n02086079', 'n02086240', 'n02086646', 'n02086910', 'n02087046', 'n02087394', 'n02088094', 'n02088238', 'n02088364', 'n02088466', 'n02088632', 'n02089078', 'n02089867', 'n02089973', 'n02090379', 'n02090622', 'n02090721', 'n02091032', 'n02091134', 'n02091244', 'n02091467', 'n02091635', 'n02091831', 'n02092002', 'n02092339', 'n02093256', 'n02093428', 'n02093647', 'n02093754', 'n02093859', 'n02093991', 'n02094114', 'n02094258', 'n02094433', 'n02095314', 'n02095570', 'n02095889', 'n02096051', 'n02096177', 'n02096294', 'n02096437', 'n02096585', 'n02097047', 'n02097130', 'n02097209', 'n02097298', 'n02097474', 'n02097658', 'n02098105', 'n02098286', 'n02098413', 'n02099267', 'n02099429', 'n02099601', 'n02099712', 'n02099849', 'n02100236', 'n02100583', 'n02100735', 'n02100877', 'n02101006', 'n02101388', 'n02101556', 'n02102040', 'n02102177', 'n02102318', 'n02102480', 'n02102973', 'n02104029', 'n02104365', 'n02105056', 'n02105162', 'n02105251', 'n02105412', 'n02105505', 'n02105641', 'n02105855', 'n02106030', 'n02106166', 'n02106382', 'n02106550', 'n02106662', 'n02107142', 'n02107312', 'n02107574', 'n02107683', 'n02107908', 'n02108000', 'n02108089', 'n02108422', 'n02108551', 'n02108915', 'n02109047', 'n02109525', 'n02109961', 'n02110063', 'n02110185', 'n02110341', 'n02110627', 'n02110806', 'n02110958', 'n02111129', 'n02111277', 'n02111500', 'n02111889', 'n02112018', 'n02112137', 'n02112350', 'n02112706', 'n02113023', 'n02113186', 'n02113624', 'n02113712', 'n02113799', 'n02113978', 'n02114367', 'n02114548', 'n02114712', 'n02114855', 'n02115641', 'n02115913', 'n02116738', 'n02117135', 'n02119022', 'n02119789', 'n02120079', 'n02120505', 'n02123045', 'n02123159', 'n02123394', 'n02123597', 'n02124075', 'n02125311', 'n02127052', 'n02128385', 'n02128757', 'n02128925', 'n02129165', 'n02129604', 'n02130308', 'n02132136', 'n02133161', 'n02134084', 'n02134418', 'n02137549', 'n02138441', 'n02165105', 'n02165456', 'n02167151', 'n02168699', 'n02169497', 'n02172182', 'n02174001', 'n02177972', 'n02190166', 'n02206856', 'n02219486', 'n02226429', 'n02229544', 'n02231487', 'n02233338', 'n02236044', 'n02256656', 'n02259212', 'n02264363', 'n02268443', 'n02268853', 'n02276258', 'n02277742', 'n02279972', 'n02280649', 'n02281406', 'n02281787', 'n02317335', 'n02319095', 'n02321529', 'n02325366', 'n02326432', 'n02328150', 'n02342885', 'n02346627', 'n02356798', 'n02361337', 'n02363005', 'n02364673', 'n02389026', 'n02391049', 'n02395406', 'n02396427', 'n02397096', 'n02398521', 'n02403003', 'n02408429', 'n02410509', 'n02412080', 'n02415577', 'n02417914', 'n02422106', 'n02422699', 'n02423022', 'n02437312', 'n02437616', 'n02441942', 'n02442845', 'n02443114', 'n02443484', 'n02444819', 'n02445715', 'n02447366', 'n02454379', 'n02457408', 'n02480495', 'n02480855', 'n02481823', 'n02483362', 'n02483708', 'n02484975', 'n02486261', 'n02486410', 'n02487347', 'n02488291', 'n02488702', 'n02489166', 'n02490219', 'n02492035', 'n02492660', 'n02493509', 'n02493793', 'n02494079', 'n02497673', 'n02500267', 'n02504013', 'n02504458', 'n02509815', 'n02510455', 'n02514041', 'n02526121', 'n02536864', 'n02606052', 'n02607072', 'n02640242', 'n02641379', 'n02643566', 'n02655020', 'n02666196', 'n02667093', 'n02669723', 'n02672831', 'n02676566', 'n02687172', 'n02690373', 'n02692877', 'n02699494', 'n02701002', 'n02704792', 'n02708093', 'n02727426', 'n02730930', 'n02747177', 'n02749479', 'n02769748', 'n02776631', 'n02777292', 'n02782093', 'n02783161', 'n02786058', 'n02787622', 'n02788148', 'n02790996', 'n02791124', 'n02791270', 'n02793495', 'n02794156', 'n02795169', 'n02797295', 'n02799071', 'n02802426', 'n02804414', 'n02804610', 'n02807133', 'n02808304', 'n02808440', 'n02814533', 'n02814860', 'n02815834', 'n02817516', 'n02823428', 'n02823750', 'n02825657', 'n02834397', 'n02835271', 'n02837789', 'n02840245', 'n02841315', 'n02843684', 'n02859443', 'n02860847', 'n02865351', 'n02869837', 'n02870880', 'n02871525', 'n02877765', 'n02879718', 'n02883205', 'n02892201', 'n02892767', 'n02894605', 'n02895154', 'n02906734', 'n02909870', 'n02910353', 'n02916936', 'n02917067', 'n02927161', 'n02930766', 'n02939185', 'n02948072', 'n02950826', 'n02951358', 'n02951585', 'n02963159', 'n02965783', 'n02966193', 'n02966687', 'n02971356', 'n02974003', 'n02977058', 'n02978881', 'n02979186', 'n02980441', 'n02981792', 'n02988304', 'n02992211', 'n02992529', 'n02999410', 'n03000134', 'n03000247', 'n03000684', 'n03014705', 'n03016953', 'n03017168', 'n03018349', 'n03026506', 'n03028079', 'n03032252', 'n03041632', 'n03042490', 'n03045698', 'n03047690', 'n03062245', 'n03063599', 'n03063689', 'n03065424', 'n03075370', 'n03085013', 'n03089624', 'n03095699', 'n03100240', 'n03109150', 'n03110669', 'n03124043', 'n03124170', 'n03125729', 'n03126707', 'n03127747', 'n03127925', 'n03131574', 'n03133878', 'n03134739', 'n03141823', 'n03146219', 'n03160309', 'n03179701', 'n03180011', 'n03187595', 'n03188531', 'n03196217', 'n03197337', 'n03201208', 'n03207743', 'n03207941', 'n03208938', 'n03216828', 'n03218198', 'n03220513', 'n03223299', 'n03240683', 'n03249569', 'n03250847', 'n03255030', 'n03259280', 'n03271574', 'n03272010', 'n03272562', 'n03290653', 'n03291819', 'n03297495', 'n03314780', 'n03325584', 'n03337140', 'n03344393', 'n03345487', 'n03347037', 'n03355925', 'n03372029', 'n03376595', 'n03379051', 'n03384352', 'n03388043', 'n03388183', 'n03388549', 'n03393912', 'n03394916', 'n03400231', 'n03404251', 'n03417042', 'n03424325', 'n03425413', 'n03443371', 'n03444034', 'n03445777', 'n03445924', 'n03447447', 'n03447721', 'n03450230', 'n03452741', 'n03457902', 'n03459775', 'n03461385', 'n03467068', 'n03476684', 'n03476991', 'n03478589', 'n03481172', 'n03482405', 'n03483316', 'n03485407', 'n03485794', 'n03492542', 'n03494278', 'n03495258', 'n03496892', 'n03498962', 'n03527444', 'n03529860', 'n03530642', 'n03532672', 'n03534580', 'n03535780', 'n03538406', 'n03544143', 'n03584254', 'n03584829', 'n03590841', 'n03594734', 'n03594945', 'n03595614', 'n03598930', 'n03599486', 'n03602883', 'n03617480', 'n03623198', 'n03627232', 'n03630383', 'n03633091', 'n03637318', 'n03642806', 'n03649909', 'n03657121', 'n03658185', 'n03661043', 'n03662601', 'n03666591', 'n03670208', 'n03673027', 'n03676483', 'n03680355', 'n03690938', 'n03691459', 'n03692522', 'n03697007', 'n03706229', 'n03709823', 'n03710193', 'n03710637', 'n03710721', 'n03717622', 'n03720891', 'n03721384', 'n03724870', 'n03729826', 'n03733131', 'n03733281', 'n03733805', 'n03742115', 'n03743016', 'n03759954', 'n03761084', 'n03763968', 'n03764736', 'n03769881', 'n03770439', 'n03770679', 'n03773504', 'n03775071', 'n03775546', 'n03776460', 'n03777568', 'n03777754', 'n03781244', 'n03782006', 'n03785016', 'n03786901', 'n03787032', 'n03788195', 'n03788365', 'n03791053', 'n03792782', 'n03792972', 'n03793489', 'n03794056', 'n03796401', 'n03803284', 'n03804744', 'n03814639', 'n03814906', 'n03825788', 'n03832673', 'n03837869', 'n03838899', 'n03840681', 'n03841143', 'n03843555', 'n03854065', 'n03857828', 'n03866082', 'n03868242', 'n03868863', 'n03871628', 'n03873416', 'n03874293', 'n03874599', 'n03876231', 'n03877472', 'n03877845', 'n03884397', 'n03887697', 'n03888257', 'n03888605', 'n03891251', 'n03891332', 'n03895866', 'n03899768', 'n03902125', 'n03903868', 'n03908618', 'n03908714', 'n03916031', 'n03920288', 'n03924679', 'n03929660', 'n03929855', 'n03930313', 'n03930630', 'n03933933', 'n03935335', 'n03937543', 'n03938244', 'n03942813', 'n03944341', 'n03947888', 'n03950228', 'n03954731', 'n03956157', 'n03958227', 'n03961711', 'n03967562', 'n03970156', 'n03976467', 'n03976657', 'n03977966', 'n03980874', 'n03982430', 'n03983396', 'n03991062', 'n03992509', 'n03995372', 'n03998194', 'n04004767', 'n04005630', 'n04008634', 'n04009552', 'n04019541', 'n04023962', 'n04026417', 'n04033901', 'n04033995', 'n04037443', 'n04039381', 'n04040759', 'n04041544', 'n04044716', 'n04049303', 'n04065272', 'n04067472', 'n04069434', 'n04070727', 'n04074963', 'n04081281', 'n04086273', 'n04090263', 'n04099969', 'n04111531', 'n04116512', 'n04118538', 'n04118776', 'n04120489', 'n04125021', 'n04127249', 'n04131690', 'n04133789', 'n04136333', 'n04141076', 'n04141327', 'n04141975', 'n04146614', 'n04147183', 'n04149813', 'n04152593', 'n04153751', 'n04154565', 'n04162706', 'n04179913', 'n04192698', 'n04200800', 'n04201297', 'n04204238', 'n04204347', 'n04208210', 'n04209133', 'n04209239', 'n04228054', 'n04229816', 'n04235860', 'n04238763', 'n04239074', 'n04243546', 'n04251144', 'n04252077', 'n04252225', 'n04254120', 'n04254680', 'n04254777', 'n04258138', 'n04259630', 'n04263257', 'n04264628', 'n04265275', 'n04266014', 'n04270147', 'n04273569', 'n04275548', 'n04277352', 'n04285008', 'n04286575', 'n04296562', 'n04310018', 'n04311004', 'n04311174', 'n04317175', 'n04325704', 'n04326547', 'n04328186', 'n04330267', 'n04332243', 'n04335435', 'n04336792', 'n04344873', 'n04346328', 'n04347754', 'n04350905', 'n04355338', 'n04355933', 'n04356056', 'n04357314', 'n04366367', 'n04367480', 'n04370456', 'n04371430', 'n04371774', 'n04372370', 'n04376876', 'n04380533', 'n04389033', 'n04392985', 'n04398044', 'n04399382', 'n04404412', 'n04409515', 'n04417672', 'n04418357', 'n04423845', 'n04428191', 'n04429376', 'n04435653', 'n04442312', 'n04443257', 'n04447861', 'n04456115', 'n04458633', 'n04461696', 'n04462240', 'n04465501', 'n04467665', 'n04476259', 'n04479046', 'n04482393', 'n04483307', 'n04485082', 'n04486054', 'n04487081', 'n04487394', 'n04493381', 'n04501370', 'n04505470', 'n04507155', 'n04509417', 'n04515003', 'n04517823', 'n04522168', 'n04523525', 'n04525038', 'n04525305', 'n04532106', 'n04532670', 'n04536866', 'n04540053', 'n04542943', 'n04548280', 'n04548362', 'n04550184', 'n04552348', 'n04553703', 'n04554684', 'n04557648', 'n04560804', 'n04562935', 'n04579145', 'n04579432', 'n04584207', 'n04589890', 'n04590129', 'n04591157', 'n04591713', 'n04592741', 'n04596742', 'n04597913', 'n04599235', 'n04604644', 'n04606251', 'n04612504', 'n04613696', 'n06359193', 'n06596364', 'n06785654', 'n06794110', 'n06874185', 'n07248320', 'n07565083', 'n07579787', 'n07583066', 'n07584110', 'n07590611', 'n07613480', 'n07614500', 'n07615774', 'n07684084', 'n07693725', 'n07695742', 'n07697313', 'n07697537', 'n07711569', 'n07714571', 'n07714990', 'n07715103', 'n07716358', 'n07716906', 'n07717410', 'n07717556', 'n07718472', 'n07718747', 'n07720875', 'n07730033', 'n07734744', 'n07742313', 'n07745940', 'n07747607', 'n07749582', 'n07753113', 'n07753275', 'n07753592', 'n07754684', 'n07760859', 'n07768694', 'n07802026', 'n07831146', 'n07836838', 'n07860988', 'n07871810', 'n07873807', 'n07875152', 'n07880968', 'n07892512', 'n07920052', 'n07930864', 'n07932039', 'n09193705', 'n09229709', 'n09246464', 'n09256479', 'n09288635', 'n09332890', 'n09399592', 'n09421951', 'n09428293', 'n09468604', 'n09472597', 'n09835506', 'n10148035', 'n10565667', 'n11879895', 'n11939491', 'n12057211', 'n12144580', 'n12267677', 'n12620546', 'n12768682', 'n12985857', 'n12998815', 'n13037406', 'n13040303', 'n13044778', 'n13052670', 'n13054560', 'n13133613', 'n15075141'] + + diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/caltech101.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/caltech101.py new file mode 100644 index 0000000000000000000000000000000000000000..bfe7cf0fe0b39188f719d44844bdbee8ee8633f5 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/caltech101.py @@ -0,0 +1,243 @@ +""" +Code adapted from https://github.com/pytorch/vision/blob/main/torchvision/datasets/caltech.py +Modification of caltech101 from torchvision where the background class is not removed +Thanks to the authors of torchvision +""" +from glob import glob +import os +import os.path +from typing import Any, Callable, List, Optional, Union, Tuple + +from PIL import Image + +from torchvision.datasets.utils import download_and_extract_archive, verify_str_arg +from torchvision.datasets.vision import VisionDataset + + +class Caltech101(VisionDataset): + """`Caltech 101 `_ Dataset. + + .. warning:: + + This class needs `scipy `_ to load target files from `.mat` format. + + Args: + root (string): Root directory of dataset where directory + ``caltech101`` exists or will be saved to if download is set to True. + target_type (string or list, optional): Type of target to use, ``category`` or + ``annotation``. Can also be a list to output a tuple with all specified + target types. ``category`` represents the target class, and + ``annotation`` is a list of points from a hand-generated outline. + Defaults to ``category``. + transform (callable, optional): A function/transform that takes in an PIL image + and returns a transformed version. E.g, ``transforms.RandomCrop`` + target_transform (callable, optional): A function/transform that takes in the + target and transforms it. + download (bool, optional): If true, downloads the dataset from the internet and + puts it in root directory. If dataset is already downloaded, it is not + downloaded again. + """ + + def __init__( + self, + root: str, + target_type: Union[List[str], str] = "category", + transform: Optional[Callable] = None, + target_transform: Optional[Callable] = None, + download: bool = False, + ) -> None: + super().__init__(os.path.join(root, "caltech101"), transform=transform, target_transform=target_transform) + os.makedirs(self.root, exist_ok=True) + if isinstance(target_type, str): + target_type = [target_type] + self.target_type = [verify_str_arg(t, "target_type", ("category", "annotation")) for t in target_type] + + if download: + self.download() + + if not self._check_integrity(): + raise RuntimeError("Dataset not found or corrupted. You can use download=True to download it") + + self.categories = sorted(os.listdir(os.path.join(self.root, "101_ObjectCategories"))) + #self.categories.remove("BACKGROUND_Google") # this is not a real class + + # For some reason, the category names in "101_ObjectCategories" and + # "Annotations" do not always match. This is a manual map between the + # two. Defaults to using same name, since most names are fine. + name_map = { + "Faces": "Faces_2", + "Faces_easy": "Faces_3", + "Motorbikes": "Motorbikes_16", + "airplanes": "Airplanes_Side_2", + } + self.annotation_categories = list(map(lambda x: name_map[x] if x in name_map else x, self.categories)) + + self.index: List[int] = [] + self.y = [] + for (i, c) in enumerate(self.categories): + n = len(glob(os.path.join(self.root, "101_ObjectCategories", c, "*.jpg"))) + self.index.extend(range(1, n + 1)) + self.y.extend(n * [i]) + + def __getitem__(self, index: int) -> Tuple[Any, Any]: + """ + Args: + index (int): Index + + Returns: + tuple: (image, target) where the type of target specified by target_type. + """ + import scipy.io + + img = Image.open( + os.path.join( + self.root, + "101_ObjectCategories", + self.categories[self.y[index]], + f"image_{self.index[index]:04d}.jpg", + ) + ) + + target: Any = [] + for t in self.target_type: + if t == "category": + target.append(self.y[index]) + elif t == "annotation": + data = scipy.io.loadmat( + os.path.join( + self.root, + "Annotations", + self.annotation_categories[self.y[index]], + f"annotation_{self.index[index]:04d}.mat", + ) + ) + target.append(data["obj_contour"]) + target = tuple(target) if len(target) > 1 else target[0] + + if self.transform is not None: + img = self.transform(img) + + if self.target_transform is not None: + target = self.target_transform(target) + + return img, target + + def _check_integrity(self) -> bool: + # can be more robust and check hash of files + return os.path.exists(os.path.join(self.root, "101_ObjectCategories")) + + def __len__(self) -> int: + return len(self.index) + + def download(self) -> None: + if self._check_integrity(): + print("Files already downloaded and verified") + return + + download_and_extract_archive( + "https://drive.google.com/file/d/137RyRjvTBkBiIfeYBNZBtViDHQ6_Ewsp", + self.root, + filename="101_ObjectCategories.tar.gz", + md5="b224c7392d521a49829488ab0f1120d9", + ) + download_and_extract_archive( + "https://drive.google.com/file/d/175kQy3UsZ0wUEHZjqkUDdNVssr7bgh_m", + self.root, + filename="Annotations.tar", + md5="6f83eeb1f24d99cab4eb377263132c91", + ) + + def extra_repr(self) -> str: + return "Target type: {target_type}".format(**self.__dict__) + + +class Caltech256(VisionDataset): + """`Caltech 256 `_ Dataset. + + Args: + root (string): Root directory of dataset where directory + ``caltech256`` exists or will be saved to if download is set to True. + transform (callable, optional): A function/transform that takes in an PIL image + and returns a transformed version. E.g, ``transforms.RandomCrop`` + target_transform (callable, optional): A function/transform that takes in the + target and transforms it. + download (bool, optional): If true, downloads the dataset from the internet and + puts it in root directory. If dataset is already downloaded, it is not + downloaded again. + """ + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + target_transform: Optional[Callable] = None, + download: bool = False, + ) -> None: + super().__init__(os.path.join(root, "caltech256"), transform=transform, target_transform=target_transform) + os.makedirs(self.root, exist_ok=True) + + if download: + self.download() + + if not self._check_integrity(): + raise RuntimeError("Dataset not found or corrupted. You can use download=True to download it") + + self.categories = sorted(os.listdir(os.path.join(self.root, "256_ObjectCategories"))) + self.index: List[int] = [] + self.y = [] + for (i, c) in enumerate(self.categories): + n = len( + [ + item + for item in os.listdir(os.path.join(self.root, "256_ObjectCategories", c)) + if item.endswith(".jpg") + ] + ) + self.index.extend(range(1, n + 1)) + self.y.extend(n * [i]) + + def __getitem__(self, index: int) -> Tuple[Any, Any]: + """ + Args: + index (int): Index + + Returns: + tuple: (image, target) where target is index of the target class. + """ + img = Image.open( + os.path.join( + self.root, + "256_ObjectCategories", + self.categories[self.y[index]], + f"{self.y[index] + 1:03d}_{self.index[index]:04d}.jpg", + ) + ) + + target = self.y[index] + + if self.transform is not None: + img = self.transform(img) + + if self.target_transform is not None: + target = self.target_transform(target) + + return img, target + + def _check_integrity(self) -> bool: + # can be more robust and check hash of files + return os.path.exists(os.path.join(self.root, "256_ObjectCategories")) + + def __len__(self) -> int: + return len(self.index) + + def download(self) -> None: + if self._check_integrity(): + print("Files already downloaded and verified") + return + + download_and_extract_archive( + "https://drive.google.com/file/d/1r6o0pSROcV1_VwT4oSjA2FBUSCWGuxLK", + self.root, + filename="256_ObjectCategories.tar", + md5="67b4f42ca05d46448c6bb8ecd2220f6d", + ) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/cn_classnames.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/cn_classnames.json new file mode 100644 index 0000000000000000000000000000000000000000..779c07556ee25ca6eeedd90b05057988038c4b91 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/cn_classnames.json @@ -0,0 +1,1004 @@ +{ + "imagenet1k": [ + "\u4e01\u9cb7", + "\u91d1\u9c7c", + "\u5927\u767d\u9ca8", + "\u864e\u9ca8", + "\u9524\u5934\u9ca8", + "\u7535\u9cd0", + "\u9ec4\u8c82\u9c7c", + "\u516c\u9e21", + "\u6bcd\u9e21", + "\u9e35\u9e1f", + "\u71d5\u96c0", + "\u91d1\u7fc5\u96c0", + "\u5bb6\u6731\u96c0", + "\u706f\u82af\u8349\u96c0", + "\u975b\u84dd\u96c0", + "\u84dd\u9e40", + "\u591c\u83ba", + "\u677e\u9e26", + "\u559c\u9e4a", + "\u5c71\u96c0", + "\u6cb3\u9e1f", + "\u9e22\uff08\u731b\u79bd\uff09", + "\u79c3\u5934\u9e70", + "\u79c3\u9e6b", + "\u5927\u7070\u732b\u5934\u9e70", + "\u6b27\u6d32\u706b\u877e\u8788", + "\u666e\u901a\u877e\u8788", + "\u6c34\u8725", + "\u6591\u70b9\u877e\u8788", + "\u877e\u8788", + "\u725b\u86d9", + "\u6811\u86d9", + "\u5c3e\u86d9", + "\u7ea2\u6d77\u9f9f", + "\u76ae\u9769\u9f9f", + "\u6ce5\u9f9f", + "\u6de1\u6c34\u9f9f", + "\u7bb1\u9f9f", + "\u5e26\u72b6\u58c1\u864e", + "\u666e\u901a\u9b23\u8725", + "\u7f8e\u56fd\u53d8\u8272\u9f99", + "\u97ad\u5c3e\u8725\u8734", + "\u98de\u9f99\u79d1\u8725\u8734", + "\u8936\u8fb9\u8725\u8734", + "\u9cc4\u9c7c\u8725\u8734", + "\u6bd2\u8725", + "\u7eff\u8725\u8734", + "\u975e\u6d32\u53d8\u8272\u9f99", + "\u79d1\u83ab\u591a\u8725\u8734", + "\u975e\u6d32\u9cc4", + "\u7f8e\u56fd\u9cc4\u9c7c", + "\u4e09\u89d2\u9f99", + "\u96f7\u86c7", + "\u73af\u86c7", + "\u5e0c\u814a\u86c7", + "\u7eff\u86c7", + "\u56fd\u738b\u86c7", + "\u889c\u5e26\u86c7", + "\u6c34\u86c7", + "\u85e4\u86c7", + "\u591c\u86c7", + "\u5927\u87d2\u86c7", + "\u5ca9\u77f3\u87d2\u86c7", + "\u5370\u5ea6\u773c\u955c\u86c7", + "\u7eff\u66fc\u5df4", + "\u6d77\u86c7", + "\u89d2\u8179\u86c7", + "\u83f1\u7eb9\u54cd\u5c3e\u86c7", + "\u89d2\u54cd\u5c3e\u86c7", + "\u4e09\u53f6\u866b", + "\u76f2\u8718\u86db", + "\u874e\u5b50", + "\u9ed1\u91d1\u82b1\u56ed\u8718\u86db", + "\u8c37\u4ed3\u8718\u86db", + "\u82b1\u56ed\u8718\u86db", + "\u9ed1\u5be1\u5987\u8718\u86db", + "\u72fc\u86db", + "\u72fc\u8718\u86db", + "\u58c1\u8671", + "\u8708\u86a3", + "\u9ed1\u677e\u9e21", + "\u677e\u9e21", + "\u62ab\u80a9\u9e21", + "\u8349\u539f\u9e21", + "\u5b54\u96c0", + "\u9e4c\u9e51", + "\u9e67\u9e2a", + "\u975e\u6d32\u7070\u9e66\u9e49", + "\u91d1\u521a\u9e66\u9e49", + "\u786b\u51a0\u9e66\u9e49", + "\u77ed\u5c3e\u9e66\u9e49", + "\u8910\u7fc5\u9e26\u9e43", + "\u98df\u8702\u9e1f\uff1b\u8702\u864e", + "\u7280\u9e1f", + "\u8702\u9e1f", + "\u9e5f\u4d15", + "\u5de8\u5634\u9e1f\uff1b\u5927\u5634\u9e1f", + "\u91ce\u9e2d", + "\u7ea2\u80f8\u79cb\u6c99\u9e2d", + "\u9e45", + "\u9ed1\u5929\u9e45", + "\u5927\u8c61", + "\u9488\u9f39\u9f20", + "\u9e2d\u5634\u517d", + "\u6c99\u888b\u9f20", + "\u8003\u62c9", + "\u888b\u718a", + "\u6c34\u6bcd", + "\u6d77\u8475", + "\u8111\u73ca\u745a", + "\u6241\u5f62\u866b\u6241\u866b", + "\u7ebf\u866b", + "\u6d77\u87ba", + "\u8717\u725b", + "\u9f3b\u6d95\u866b", + "\u6d77\u86de\u8753\uff1b\u6d77\u53c2", + "\u77f3\u9cd6", + "\u9e66\u9e49\u87ba", + "\u73cd\u5b9d\u87f9", + "\u77f3\u87f9", + "\u62db\u6f6e\u87f9", + "\u5e1d\u738b\u87f9", + "\u7f8e\u56fd\u9f99\u867e", + "\u5927\u87af\u867e", + "\u5c0f\u9f99\u867e", + "\u5bc4\u5c45\u87f9", + "\u7b49\u8db3\u76ee\u52a8\u7269\uff08\u660e\u867e\u548c\u8783\u87f9\u8fd1\u4eb2\uff09", + "\u767d\u9e73", + "\u9ed1\u9e73", + "\u9e6d", + "\u706b\u70c8\u9e1f", + "\u5c0f\u84dd\u9e6d", + "\u7f8e\u56fd\u9e6d", + "\u9ebb\u9e26", + "\u9e64", + "\u79e7\u9e64", + "\u6b27\u6d32\u6c34\u9e21", + "\u6cbc\u6cfd\u6ce5\u6bcd\u9e21", + "\u9e28", + "\u7ea2\u7ffb\u77f3\u9e6c", + "\u7ea2\u80cc\u9e6c", + "\u7ea2\u811a\u9e6c", + "\u534a\u8e7c\u9e6c", + "\u86ce\u9e6c", + "\u9e48\u9e55", + "\u56fd\u738b\u4f01\u9e45", + "\u4fe1\u5929\u7fc1", + "\u7070\u9cb8", + "\u6740\u4eba\u9cb8", + "\u6d77\u725b", + "\u6d77\u72ee", + "\u5409\u5a03\u5a03", + "\u65e5\u672c\u72c6\u72ac", + "\u9a6c\u5c14\u6d4e\u65af\u72ac", + "\u72ee\u5b50\u72d7", + "\u897f\u65bd\u72ac", + "\u5e03\u83b1\u5c3c\u59c6\u730e\u72ac", + "\u5df4\u6bd4\u72d7", + "\u73a9\u5177\u72ac", + "\u7f57\u5f97\u897f\u4e9a\u957f\u80cc\u730e\u72d7", + "\u963f\u5bcc\u6c57\u730e\u72ac", + "\u5df4\u5409\u5ea6\u730e\u72ac", + "\u6bd4\u683c\u72ac", + "\u4fa6\u63a2\u72ac", + "\u84dd\u8272\u5feb\u72d7", + "\u9ed1\u8910\u730e\u6d63\u718a\u72ac", + "\u6c83\u514b\u730e\u72ac", + "\u82f1\u56fd\u730e\u72d0\u72ac", + "\u7f8e\u6d32\u8d64\u72d7", + "\u4fc4\u7f57\u65af\u730e\u72fc\u72ac", + "\u7231\u5c14\u5170\u730e\u72fc\u72ac", + "\u610f\u5927\u5229\u7070\u72d7", + "\u60e0\u6bd4\u7279\u72ac", + "\u4f9d\u6bd4\u6c99\u730e\u72ac", + "\u632a\u5a01\u730e\u72ac", + "\u5965\u8fbe\u730e\u72ac", + "\u6c99\u514b\u72ac", + "\u82cf\u683c\u5170\u730e\u9e7f\u72ac", + "\u5a01\u739b\u730e\u72ac", + "\u65af\u5854\u798f\u5fb7\u90e1\u6597\u725b\u72ac", + "\u7f8e\u56fd\u65af\u5854\u798f\u5fb7\u90e1\u6897", + "\u8d1d\u5fb7\u7075\u987f\u6897", + "\u8fb9\u5883\u6897", + "\u51ef\u4e3d\u84dd\u6897", + "\u7231\u5c14\u5170\u6897", + "\u8bfa\u798f\u514b\u6897", + "\u8bfa\u7ef4\u5947\u6897", + "\u7ea6\u514b\u72ac\uff1b\u7ea6\u514b\u590f\u6897\u72ac", + "\u521a\u6bdb\u730e\u72d0\u6897", + "\u83b1\u514b\u5170\u6897", + "\u9521\u5229\u54c8\u59c6\u6897", + "\u827e\u5c14\u8c37\u72ac", + "\u51ef\u6069\u6897", + "\u6fb3\u5927\u5229\u4e9a\u6897", + "\u4e39\u8fea\u4e01\u8499\u6897", + "\u6ce2\u58eb\u987f\u6897", + "\u8ff7\u4f60\u96ea\u7eb3\u745e\u72ac", + "\u5de8\u578b\u96ea\u7eb3\u745e\u72ac", + "\u6807\u51c6\u96ea\u7eb3\u745e\u72ac", + "\u82cf\u683c\u5170\u6897\u72ac", + "\u897f\u85cf\u6897", + "\u4e1d\u6bdb\u6897", + "\u7231\u5c14\u5170\u8f6f\u6bdb\u6897\u72ac", + "\u897f\u9ad8\u5730\u767d\u6897", + "\u62c9\u8428\u963f\u666e\u7d22\u72ac", + "\u5e73\u6bdb\u5bfb\u56de\u72ac", + "\u5377\u6bdb\u5bfb\u56de\u72ac", + "\u91d1\u6bdb\u730e\u72ac", + "\u62c9\u5e03\u62c9\u591a\u730e\u72ac", + "\u4e5e\u6c99\u6bd4\u514b\u730e\u72ac", + "\u5fb7\u56fd\u77ed\u6bdb\u6307\u793a\u72ac", + "\u7ef4\u5179\u62c9\u72ac", + "\u82f1\u56fd\u585e\u7279\u72ac", + "\u7231\u5c14\u5170\u96ea\u8fbe\u72ac", + "\u6208\u767b\u96ea\u8fbe\u72ac", + "\u5e03\u5217\u5854\u5c3c\u72ac\u730e\u72ac", + "\u9ec4\u6bdb", + "\u82f1\u56fd\u53f2\u5bbe\u683c\u72ac", + "\u5a01\u5c14\u58eb\u53f2\u5bbe\u683c\u72ac", + "\u53ef\u5361\u72ac", + "\u8428\u585e\u514b\u65af\u730e\u72ac", + "\u7231\u5c14\u5170\u6c34\u730e\u72ac", + "\u54e5\u5a01\u65af\u72ac", + "\u8212\u67cf\u5947\u72ac", + "\u6bd4\u5229\u65f6\u7267\u7f8a\u72ac", + "\u9a6c\u91cc\u52aa\u963f\u72ac", + "\u4f2f\u745e\u72ac", + "\u51ef\u5c14\u76ae\u72ac", + "\u5308\u7259\u5229\u7267\u7f8a\u72ac", + "\u8001\u82f1\u56fd\u7267\u7f8a\u72ac", + "\u559c\u4e50\u8482\u7267\u7f8a\u72ac", + "\u7267\u7f8a\u72ac", + "\u8fb9\u5883\u7267\u7f8a\u72ac", + "\u6cd5\u5170\u5fb7\u65af\u7267\u725b\u72d7", + "\u7f57\u7279\u97e6\u5c14\u72ac", + "\u5fb7\u56fd\u7267\u7f8a\u72ac", + "\u591a\u4f2f\u66fc\u72ac", + "\u9e7f\u72ac\uff1b\u8ff7\u4f60\u675c\u5bbe\u72ac", + "\u5927\u745e\u58eb\u5c71\u5730\u72ac", + "\u4f2f\u6069\u5c71\u72ac", + "\u963f\u7b56\u5c14\u5c71\u72ac", + "\u6069\u7279\u5c14\u5e03\u8d6b\u5c71\u72ac", + "\u62f3\u5e08\u72d7", + "\u6597\u725b\u7352", + "\u85cf\u7352", + "\u6cd5\u56fd\u6597\u725b\u72ac", + "\u5927\u4e39\u72ac", + "\u5723\u4f2f\u7eb3\u5fb7\u72d7", + "\u7231\u65af\u57fa\u6469\u72ac", + "\u963f\u62c9\u65af\u52a0\u96ea\u6a47\u72ac", + "\u54c8\u58eb\u5947", + "\u8fbe\u5c14\u9a6c\u63d0\u4e9a", + "\u72ee\u6bdb\u72d7", + "\u5df4\u8f9b\u5409\u72d7", + "\u516b\u54e5\u72ac", + "\u83b1\u6602\u8d1d\u683c\u72d7", + "\u7ebd\u82ac\u5170\u72ac", + "\u5927\u767d\u718a\u72ac", + "\u8428\u6469\u8036\u72ac", + "\u535a\u7f8e\u72ac", + "\u677e\u72ee", + "\u51ef\u65af\u72ac", + "\u5e03\u9c81\u585e\u5c14\u683c\u6797\u82ac\u72ac", + "\u5f6d\u5e03\u6d1b\u514b\u5a01\u5c14\u58eb\u79d1\u57fa\u72ac", + "\u5a01\u5c14\u58eb\u67ef\u57fa\u72ac", + "\u73a9\u5177\u8d35\u5bbe\u72ac", + "\u8ff7\u4f60\u8d35\u5bbe\u72ac", + "\u6807\u51c6\u8d35\u5bbe\u72ac", + "\u58a8\u897f\u54e5\u65e0\u6bdb\u72ac", + "\u7070\u72fc", + "\u767d\u72fc", + "\u7ea2\u592a\u72fc", + "\u72fc", + "\u6fb3\u6d32\u91ce\u72d7", + "\u8c7a", + "\u975e\u6d32\u730e\u72ac", + "\u9b23\u72d7", + "\u7ea2\u72d0\u72f8", + "\u6c99\u72d0", + "\u5317\u6781\u72d0\u72f8", + "\u7070\u72d0\u72f8", + "\u864e\u6591\u732b", + "\u5c71\u732b", + "\u6ce2\u65af\u732b", + "\u66b9\u7f57\u732b", + "\u57c3\u53ca\u732b", + "\u7f8e\u6d32\u72ee", + "\u731e\u7301", + "\u8c79\u5b50", + "\u96ea\u8c79", + "\u7f8e\u6d32\u864e", + "\u72ee\u5b50", + "\u8001\u864e", + "\u730e\u8c79", + "\u68d5\u718a", + "\u7f8e\u6d32\u9ed1\u718a", + "\u51b0\u718a", + "\u61d2\u718a", + "\u7374", + "\u732b\u9f2c", + "\u864e\u7532\u866b", + "\u74e2\u866b", + "\u571f\u9cd6\u866b", + "\u5929\u725b", + "\u9f9f\u7532\u866b", + "\u7caa\u7532\u866b", + "\u7280\u725b\u7532\u866b", + "\u8c61\u7532", + "\u82cd\u8747", + "\u871c\u8702", + "\u8682\u8681", + "\u86b1\u8722", + "\u87cb\u87c0", + "\u7af9\u8282\u866b", + "\u87d1\u8782", + "\u87b3\u8782", + "\u8749", + "\u53f6\u8749", + "\u8349\u873b\u86c9", + "\u873b\u8713", + "\u8c46\u5a18", + "\u4f18\u7ea2\u86f1\u8776", + "\u5c0f\u73af\u8774\u8776", + "\u541b\u4e3b\u8774\u8776", + "\u83dc\u7c89\u8776", + "\u767d\u8774\u8776", + "\u7070\u8776", + "\u6d77\u661f", + "\u6d77\u80c6", + "\u6d77\u9ec4\u74dc\uff1b\u6d77\u53c2", + "\u91ce\u5154", + "\u5154", + "\u5b89\u54e5\u62c9\u5154", + "\u4ed3\u9f20", + "\u523a\u732c", + "\u9ed1\u677e\u9f20", + "\u571f\u62e8\u9f20", + "\u6d77\u72f8", + "\u8c5a\u9f20", + "\u6817\u8272\u9a6c", + "\u6591\u9a6c", + "\u732a", + "\u91ce\u732a", + "\u75a3\u732a", + "\u6cb3\u9a6c", + "\u725b", + "\u6c34\u725b", + "\u91ce\u725b", + "\u516c\u7f8a", + "\u5927\u89d2\u7f8a", + "\u5c71\u7f8a", + "\u72f7\u7f9a", + "\u9ed1\u6591\u7f9a", + "\u77aa\u7f9a", + "\u963f\u62c9\u4f2f\u5355\u5cf0\u9a86\u9a7c", + "\u9a86\u9a7c", + "\u9ec4\u9f20\u72fc", + "\u6c34\u8c82", + "\u81ed\u732b", + "\u9ed1\u8db3\u9f2c", + "\u6c34\u736d", + "\u81ed\u9f2c", + "\u737e", + "\u72b0\u72f3", + "\u6811\u61d2", + "\u7329\u7329", + "\u5927\u7329\u7329", + "\u9ed1\u7329\u7329", + "\u957f\u81c2\u733f", + "\u5408\u8dbe\u733f\u957f\u81c2\u733f", + "\u957f\u5c3e\u7334", + "\u8d64\u7334", + "\u72d2\u72d2", + "\u6052\u6cb3\u7334", + "\u767d\u5934\u53f6\u7334", + "\u75a3\u7334", + "\u957f\u9f3b\u7334", + "\u72e8\uff08\u7f8e\u6d32\u4ea7\u5c0f\u578b\u957f\u5c3e\u7334\uff09", + "\u5377\u5c3e\u7334", + "\u543c\u7334", + "\u4f36\u7334", + "\u8718\u86db\u7334", + "\u677e\u9f20\u7334", + "\u9a6c\u8fbe\u52a0\u65af\u52a0\u73af\u5c3e\u72d0\u7334", + "\u5927\u72d0\u7334", + "\u5370\u5ea6\u5927\u8c61", + "\u975e\u6d32\u8c61", + "\u5c0f\u718a\u732b", + "\u5927\u718a\u732b", + "\u6756\u9c7c", + "\u9cd7\u9c7c", + "\u94f6\u9c91", + "\u4e09\u8272\u523a\u8776\u9c7c", + "\u6d77\u8475\u9c7c", + "\u9c9f\u9c7c", + "\u96c0\u9cdd", + "\u72ee\u5b50\u9c7c", + "\u6cb3\u8c5a", + "\u7b97\u76d8", + "\u957f\u888d", + "\u5b66\u4f4d\u888d", + "\u624b\u98ce\u7434", + "\u539f\u58f0\u5409\u4ed6", + "\u822a\u7a7a\u6bcd\u8230", + "\u5ba2\u673a", + "\u98de\u8247", + "\u796d\u575b", + "\u6551\u62a4\u8f66", + "\u6c34\u9646\u4e24\u7528\u8f66", + "\u6a21\u62df\u65f6\u949f", + "\u8702\u623f", + "\u56f4\u88d9", + "\u5783\u573e\u6876", + "\u653b\u51fb\u6b65\u67aa", + "\u80cc\u5305", + "\u9762\u5305\u5e97", + "\u5e73\u8861\u6728", + "\u70ed\u6c14\u7403", + "\u5706\u73e0\u7b14", + "\u521b\u53ef\u8d34", + "\u73ed\u5353\u7434", + "\u680f\u6746", + "\u6760\u94c3", + "\u7406\u53d1\u5e08\u7684\u6905\u5b50", + "\u7406\u53d1\u5e97", + "\u7272\u53e3\u68da", + "\u6674\u96e8\u8868", + "\u5706\u7b52", + "\u56ed\u5730\u5c0f\u8f66", + "\u68d2\u7403", + "\u7bee\u7403", + "\u5a74\u513f\u5e8a", + "\u5df4\u677e\u7ba1", + "\u6e38\u6cf3\u5e3d", + "\u6c90\u6d74\u6bdb\u5dfe", + "\u6d74\u7f38", + "\u6c99\u6ee9\u8f66", + "\u706f\u5854", + "\u70e7\u676f", + "\u718a\u76ae\u9ad8\u5e3d", + "\u5564\u9152\u74f6", + "\u5564\u9152\u676f", + "\u949f\u5854", + "\uff08\u5c0f\u513f\u7528\u7684\uff09\u56f4\u5634", + "\u4e32\u8054\u81ea\u884c\u8f66", + "\u6bd4\u57fa\u5c3c", + "\u88c5\u8ba2\u518c", + "\u53cc\u7b52\u671b\u8fdc\u955c", + "\u9e1f\u820d", + "\u8239\u5e93", + "\u53cc\u4eba\u96ea\u6a47", + "\u9970\u6263\u5f0f\u9886\u5e26", + "\u9614\u8fb9\u5973\u5e3d", + "\u4e66\u6a71", + "\u4e66\u5e97", + "\u74f6\u76d6", + "\u5f13\u7bad", + "\u8774\u8776\u7ed3\u9886\u7ed3", + "\u94dc\u5236\u724c\u4f4d", + "\u5976\u7f69", + "\u9632\u6ce2\u5824", + "\u94e0\u7532", + "\u626b\u5e1a", + "\u6876", + "\u6263\u73af", + "\u9632\u5f39\u80cc\u5fc3", + "\u52a8\u8f66", + "\u8089\u94fa", + "\u51fa\u79df\u8f66", + "\u5927\u9505", + "\u8721\u70db", + "\u5927\u70ae", + "\u72ec\u6728\u821f", + "\u5f00\u74f6\u5668", + "\u5f00\u886b", + "\u8f66\u955c", + "\u65cb\u8f6c\u6728\u9a6c", + "\u6728\u5320\u7684\u5de5\u5177\u5305", + "\u7eb8\u7bb1", + "\u8f66\u8f6e", + "\u53d6\u6b3e\u673a", + "\u76d2\u5f0f\u5f55\u97f3\u5e26", + "\u5361\u5e26\u64ad\u653e\u5668", + "\u57ce\u5821", + "\u53cc\u4f53\u8239", + "CD\u64ad\u653e\u5668", + "\u5927\u63d0\u7434", + "\u79fb\u52a8\u7535\u8bdd", + "\u94c1\u94fe", + "\u56f4\u680f", + "\u94fe\u7532", + "\u7535\u952f", + "\u7bb1\u5b50", + "\u68b3\u5986\u53f0", + "\u7f16\u949f", + "\u4e2d\u56fd\u6a71\u67dc", + "\u5723\u8bde\u889c", + "\u6559\u5802", + "\u7535\u5f71\u9662", + "\u5207\u8089\u5200", + "\u60ac\u5d16\u5c4b", + "\u6597\u7bf7", + "\u6728\u5c50", + "\u9e21\u5c3e\u9152\u8c03\u9152\u5668", + "\u5496\u5561\u676f", + "\u5496\u5561\u58f6", + "\u87ba\u65cb\u7ed3\u6784\uff08\u697c\u68af\uff09", + "\u7ec4\u5408\u9501", + "\u7535\u8111\u952e\u76d8", + "\u7cd6\u679c", + "\u96c6\u88c5\u7bb1\u8239", + "\u655e\u7bf7\u8f66", + "\u74f6\u585e\u94bb", + "\u77ed\u53f7", + "\u725b\u4ed4\u9774", + "\u725b\u4ed4\u5e3d", + "\u6447\u7bee", + "\u8d77\u91cd\u673a", + "\u5934\u76d4", + "\u677f\u6761\u7bb1", + "\u5c0f\u513f\u5e8a", + "\u7802\u9505", + "\u69cc\u7403", + "\u62d0\u6756", + "\u80f8\u7532", + "\u5927\u575d", + "\u4e66\u684c", + "\u53f0\u5f0f\u7535\u8111", + "\u6709\u7ebf\u7535\u8bdd", + "\u5c3f\u5e03\u6e7f", + "\u6570\u5b57\u65f6\u949f", + "\u6570\u5b57\u624b\u8868", + "\u9910\u684c\u677f", + "\u62b9\u5e03", + "\u6d17\u7897\u673a", + "\u76d8\u5f0f\u5236\u52a8\u5668", + "\u7801\u5934", + "\u72d7\u62c9\u96ea\u6a47", + "\u5706\u9876", + "\u95e8\u57ab", + "\u94bb\u4e95\u5e73\u53f0", + "\u9f13", + "\u9f13\u69cc", + "\u54d1\u94c3", + "\u8377\u5170\u70e4\u7bb1", + "\u7535\u98ce\u6247", + "\u7535\u5409\u4ed6", + "\u7535\u529b\u673a\u8f66", + "\u7ec4\u5408\u7535\u89c6\u67dc", + "\u4fe1\u5c01", + "\u6d53\u7f29\u5496\u5561\u673a", + "\u6251\u9762\u7c89", + "\u5973\u7528\u957f\u56f4\u5dfe", + "\u6587\u4ef6", + "\u6d88\u9632\u8239", + "\u6d88\u9632\u8f66", + "\u706b\u7089\u680f", + "\u65d7\u6746", + "\u957f\u7b1b", + "\u6298\u53e0\u6905", + "\u6a44\u6984\u7403\u5934\u76d4", + "\u53c9\u8f66", + "\u55b7\u6cc9", + "\u94a2\u7b14", + "\u6709\u56db\u6839\u5e37\u67f1\u7684\u5e8a", + "\u8fd0\u8d27\u8f66\u53a2", + "\u5706\u53f7", + "\u714e\u9505", + "\u88d8\u76ae\u5927\u8863", + "\u5783\u573e\u8f66", + "\u9632\u6bd2\u9762\u5177", + "\u6c7d\u6cb9\u6cf5", + "\u9ad8\u811a\u676f", + "\u5361\u4e01\u8f66", + "\u9ad8\u5c14\u592b\u7403", + "\u9ad8\u5c14\u592b\u7403\u8f66", + "\u72ed\u957f\u5c0f\u8239", + "\u9523", + "\u793c\u670d", + "\u94a2\u7434", + "\u6e29\u5ba4", + "\u6563\u70ed\u5668\u683c\u6805", + "\u6742\u8d27\u5e97", + "\u65ad\u5934\u53f0", + "\u5c0f\u53d1\u5939", + "\u5934\u53d1\u55b7\u96fe", + "\u534a\u5c65\u5e26\u88c5\u7532\u8f66", + "\u9524\u5b50", + "\u5927\u7bee\u5b50", + "\u624b\u6447\u9f13\u98ce\u673a", + "\u624b\u63d0\u7535\u8111", + "\u624b\u5e15", + "\u786c\u76d8", + "\u53e3\u7434", + "\u7ad6\u7434", + "\u6536\u5272\u673a", + "\u65a7\u5934", + "\u624b\u67aa\u76ae\u5957", + "\u5bb6\u5ead\u5f71\u9662", + "\u8702\u7a9d", + "\u94a9\u722a", + "\u886c\u88d9", + "\u5355\u6760", + "\u9a6c\u8f66", + "\u6c99\u6f0f", + "iPod", + "\u71a8\u6597", + "\u5357\u74dc\u706f\u7b3c", + "\u725b\u4ed4\u88e4", + "\u5409\u666e\u8f66", + "T\u6064\u886b", + "\u62fc\u56fe", + "\u4eba\u529b\u8f66", + "\u64cd\u7eb5\u6746", + "\u548c\u670d", + "\u62a4\u819d", + "\u8774\u8776\u7ed3", + "\u5927\u8902", + "\u957f\u67c4\u52fa", + "\u706f\u7f69", + "\u7b14\u8bb0\u672c\u7535\u8111", + "\u5272\u8349\u673a", + "\u955c\u5934\u76d6", + "\u5f00\u4fe1\u5200\uff1b\u62c6\u4fe1\u5200", + "\u56fe\u4e66\u9986", + "\u6551\u751f\u8247", + "\u70b9\u706b\u5668", + "\u8c6a\u534e\u8f7f\u8f66", + "\u8fdc\u6d0b\u73ed\u8f6e", + "\u5507\u818f", + "\u5e73\u5e95\u4fbf\u978b", + "\u6d17\u5242", + "\u626c\u58f0\u5668", + "\u653e\u5927\u955c", + "\u952f\u6728\u5382", + "\u78c1\u7f57\u76d8", + "\u90ae\u888b", + "\u4fe1\u7bb1", + "\u5973\u6e38\u6cf3\u8863", + "\u6709\u80a9\u5e26\u6d74\u8863", + "\u7aa8\u4e95\u76d6", + "\u6c99\u7403\uff08\u4e00\u79cd\u6253\u51fb\u4e50\u5668\uff09", + "\u9a6c\u6797\u5df4\u6728\u7434", + "\u9762\u819c", + "\u706b\u67f4", + "\u82b1\u67f1", + "\u8ff7\u5bab", + "\u91cf\u676f", + "\u836f\u7bb1", + "\u5de8\u77f3", + "\u9ea6\u514b\u98ce", + "\u5fae\u6ce2\u7089", + "\u519b\u88c5", + "\u5976\u6876", + "\u8ff7\u4f60\u5df4\u58eb", + "\u8ff7\u4f60\u88d9", + "\u9762\u5305\u8f66\uff1b\u5c0f\u578b\u8d27\u8f66", + "\u5bfc\u5f39", + "\u8fde\u6307\u624b\u5957", + "\u6405\u62cc\u94b5", + "\u6d3b\u52a8\u623f\u5c4b\uff08\u7531\u6c7d\u8f66\u62d6\u62c9\u7684\uff09", + "\u798f\u7279T\u578b\u8f66", + "\u8c03\u5236\u89e3\u8c03\u5668\uff1b\u5149\u732b", + "\u4fee\u9053\u9662", + "\u663e\u793a\u5668", + "\u7535\u74f6\u8f66", + "\u7802\u6d46", + "\u5b66\u58eb", + "\u6e05\u771f\u5bfa", + "\u868a\u5e10", + "\u6469\u6258\u8f66", + "\u5c71\u5730\u81ea\u884c\u8f66", + "\u767b\u5c71\u5e10", + "\u9f20\u6807", + "\u6355\u9f20\u5668", + "\u642c\u5bb6\u8d27\u8f66", + "\u52a8\u7269\u7684\u53e3\u5957", + "\u91d1\u5c5e\u9489\u5b50", + "\u9888\u6258", + "\u9879\u94fe", + "\u4e73\u5934\uff08\u74f6\uff09", + "\u5e73\u677f\u7535\u8111", + "\u65b9\u5c16\u7891", + "\u53cc\u7c27\u7ba1", + "\u5c0f\u9e45\u7b1b\uff1b\u7403\u5f62\u7b1b(\u7ba1\u8eab\u692d\u5706\u5f62)", + "\u91cc\u7a0b\u8868", + "\u6ee4\u6cb9\u5668", + "\u98ce\u7434", + "\u793a\u6ce2\u5668", + "\u7f69\u88d9", + "\u725b\u8f66", + "\u6c27\u6c14\u9762\u7f69", + "\u5305\u88c5", + "\u8239\u6868", + "\u660e\u8f6e", + "\u6302\u9501", + "\u753b\u7b14", + "\u7761\u8863", + "\u5bab\u6bbf", + "\u6392\u7bab", + "\u7eb8\u5dfe", + "\u964d\u843d\u4f1e", + "\u53cc\u6760", + "\u516c\u56ed\u957f\u6905", + "\u505c\u8f66\u6536\u8d39\u8868", + "\u5ba2\u8f66", + "\u9732\u53f0", + "\u4ed8\u8d39\u7535\u8bdd", + "\u57fa\u5ea7", + "\u94c5\u7b14\u76d2", + "\u5377\u7b14\u5200", + "\u9999\u6c34\uff08\u74f6\uff09", + "\u57f9\u517b\u76bf", + "\u590d\u5370\u673a", + "\u62e8\u5f26\u7247", + "\u5c16\u9876\u5934\u76d4", + "\u7528\u5c16\u677f\u6761\u8fde\u6210\u7684\u5c16\u6869\u7bf1\u6805", + "\u76ae\u5361", + "\u6865\u58a9", + "\u5b58\u94b1\u7f50", + "\u836f\u74f6", + "\u6795\u5934", + "\u4e52\u4e53\u7403", + "\u98ce\u8f66", + "\u6d77\u76d7\u8239", + "\u6c34\u7f50", + "\u6728\u5de5\u5228", + "\u5929\u6587\u9986", + "\u5851\u6599\u888b", + "\u677f\u67b6", + "\u7281\u578b\u94f2\u96ea\u673a", + "\u624b\u538b\u76ae\u7897\u6cf5", + "\u5b9d\u4e3d\u6765\u76f8\u673a", + "\u7535\u7ebf\u6746", + "\u8b66\u8f66", + "\u96e8\u62ab", + "\u53f0\u7403\u684c", + "\u5145\u6c14\u996e\u6599\u74f6", + "\u82b1\u76c6", + "\u9676\u5de5\u65cb\u76d8", + "\u7535\u94bb", + "\u7948\u7977\u57ab", + "\u6253\u5370\u673a", + "\u76d1\u72f1", + "\u70ae\u5f39", + "\u6295\u5f71\u4eea", + "\u51b0\u7403", + "\u6c99\u5305", + "\u5c0f\u94b1\u888b\uff1b\u624b\u888b", + "\u7fbd\u7ba1\u7b14", + "\u88ab\u5b50", + "\u8d5b\u8f66", + "\u7403\u62cd", + "\u6563\u70ed\u5668", + "\u6536\u97f3\u673a", + "\u5c04\u7535\u671b\u8fdc\u955c", + "\u96e8\u6876", + "\u4f11\u95f2\u8f66", + "\u5377\u8f74", + "\u53cd\u5c04\u5f0f\u7167\u76f8\u673a", + "\u51b0\u7bb1", + "\u9065\u63a7\u5668", + "\u9910\u5385", + "\u5de6\u8f6e\u624b\u67aa", + "\u6b65\u67aa", + "\u6447\u6905", + "\u7535\u8f6c\u70e4\u8089\u67b6", + "\u6a61\u76ae", + "\u6a44\u6984\u7403", + "\u76f4\u5c3a", + "\u8dd1\u6b65\u978b", + "\u4fdd\u9669\u67dc", + "\u5b89\u5168\u522b\u9488", + "\u76d0\u74f6\uff08\u8c03\u5473\u7528\uff09", + "\u51c9\u978b", + "\u7eb1\u7b3c", + "\u8428\u514b\u65af\u7ba1", + "\u5251\u9798", + "\u79e4", + "\u6821\u8f66", + "\u5e06\u8239", + "\u8bb0\u5206\u724c", + "\u5c4f\u5e55", + "\u87ba\u4e1d", + "\u87ba\u4e1d\u5200", + "\u5b89\u5168\u5e26", + "\u7f1d\u7eab\u673a", + "\u76fe\u724c", + "\u76ae\u978b\u5e97", + "\u969c\u5b50", + "\u8d2d\u7269\u7bee", + "\u8d2d\u7269\u8f66", + "\u94c1\u9539", + "\u6d74\u5e3d", + "\u6d74\u5e18", + "\u6ed1\u96ea\u677f", + "\u6ed1\u96ea\u9762\u7f69", + "\u7761\u888b", + "\u6ed1\u5c3a", + "\u6ed1\u52a8\u95e8", + "\u89d2\u5b50\u8001\u864e\u673a", + "\u6f5c\u6c34\u901a\u6c14\u7ba1", + "\u6469\u6258\u96ea\u6a47\uff1b\u96ea\u5730\u673a\u52a8\u8f66", + "\u626b\u96ea\u673a", + "\u7682\u6db2\u5668", + "\u8db3\u7403", + "\u889c\u5b50", + "\u789f\u5f0f\u592a\u9633\u80fd", + "\u5bbd\u8fb9\u5e3d", + "\u6c64\u7897", + "\u7a7a\u683c\u952e", + "\u7a7a\u95f4\u52a0\u70ed\u5668", + "\u822a\u5929\u98de\u673a", + "\u9505\u94f2\uff1b\u505a\u996d\u7684\u94f2\u5b50", + "\u5feb\u8247", + "\u8718\u86db\u7f51", + "\u7eba\u9524\uff1b\u624b\u7eba\u7528\u7684\u7ed5\u7ebf\u6746", + "\u8dd1\u8f66", + "\u805a\u5149\u706f", + "\u821e\u53f0", + "\u84b8\u6c7d\u673a\u8f66", + "\u94a2\u62f1\u6865", + "\u94a2\u6eda\u7b52", + "\u542c\u8bca\u5668", + "\u5973\u7528\u62ab\u80a9", + "\u77f3\u5934\u5899", + "\u79d2\u8868", + "\u706b\u7089", + "\u8fc7\u6ee4\u5668", + "\u6709\u8f68\u7535\u8f66", + "\u62c5\u67b6", + "\u6c99\u53d1\u5e8a", + "\u4f5b\u5854", + "\u6f5c\u8247", + "\u5957\u88c5", + "\u65e5\u6677", + "\u592a\u9633\u955c", + "\u592a\u9633\u955c", + "\u9632\u6652\u971c", + "\u60ac\u7d22\u6865", + "\u62d6\u628a", + "\u8fd0\u52a8\u886b", + "\u6e38\u6cf3\u88e4", + "\u79cb\u5343", + "\u5f00\u5173", + "\u6ce8\u5c04\u5668\uff1b\u5438\u7ba1", + "\u53f0\u706f", + "\u5766\u514b", + "\u5f55\u97f3\u673a", + "\u8336\u58f6", + "\u6cf0\u8fea", + "\u7535\u89c6", + "\u7f51\u7403\uff1b\u6253\u7f51\u7403\u7684\u7403", + "\u8305\u8349", + "\u5e55\u5e03", + "\u9876\u9488", + "\u6253\u8c37\u673a\uff1b\u8131\u7c92\u673a", + "\u5b9d\u5ea7", + "\u74e6\u5c4b\u9876", + "\u70e4\u9762\u5305\u673a", + "\u70df\u8349\u5e97", + "\u9a6c\u6876", + "\u706b\u70ac", + "\u56fe\u817e\u67f1", + "\u62d6\u8f66\uff1b\u7275\u5f15\u8f66", + "\u73a9\u5177\u5e97", + "\u62d6\u62c9\u673a", + "\u534a\u6302\u6c7d\u8f66", + "\u6258\u76d8", + "\u98ce\u8863", + "\u4e09\u8f6e\u8f66", + "\u4e09\u4f53\u8239", + "\u4e09\u811a\u67b6", + "\u51ef\u65cb\u95e8", + "\u65e0\u8f68\u7535\u8f66", + "\u957f\u53f7", + "\u6d74\u76c6", + "\u65cb\u8f6c\u5f0f\u6805\u95e8", + "\u6253\u5b57\u673a\u952e\u76d8", + "\u4f1e", + "\u72ec\u8f6e\u8f66", + "\u76f4\u7acb\u5f0f\u94a2\u7434", + "\u5438\u5c18\u5668", + "\u82b1\u74f6\uff1b\u88c5\u9970\u74f6", + "\u62f1\u9876", + "\u5929\u9e45\u7ed2", + "\u81ea\u52a8\u552e\u8d27\u673a", + "\u6cd5\u8863\uff1b\u796d\u8863\uff1b\u796d\u670d", + "\u9ad8\u67b6\u6865", + "\u5c0f\u63d0\u7434", + "\u6392\u7403", + "\u677e\u997c\u673a", + "\u6302\u949f", + "\u94b1\u5305\uff1b\u94b1\u5939", + "\u8863\u67dc\u8863\u6a71", + "\u519b\u7528\u98de\u673a", + "\u6d17\u8138\u76c6", + "\u6d17\u8863\u673a", + "\u6c34\u74f6", + "\u6c34\u58f6", + "\u6c34\u5854", + "\u5a01\u58eb\u5fcc\u58f6", + "\u54e8\u5b50", + "\u5047\u53d1", + "\u7eb1\u7a97", + "\u767e\u53f6\u7a97", + "\u6e29\u838e\u9886\u5e26", + "\u8461\u8404\u9152\u74f6", + "\u98de\u673a\u7fc5\u8180", + "\u7092\u83dc\u9505", + "\u6728\u52fa\u5b50\uff1b\u6728\u5934\u52fa\u5b50", + "\u6bdb\u7ec7\u54c1", + "\u539f\u6728\u6805\u680f", + "\u6c89\u8239", + "\u53cc\u6845\u8239", + "\u8499\u53e4\u5305", + "\u7f51\u7ad9\uff1b\u7f51\u9875", + "\u6f2b\u753b", + "\u7eb5\u6a2a\u5b57\u8c1c", + "\u8def\u6807", + "\u4ea4\u901a\u4fe1\u53f7\u706f", + "\u9632\u5c18\u7f69", + "\u83dc\u5355", + "\u76d8\u5b50", + "\u58a8\u897f\u54e5\u9cc4\u68a8\u9171\uff1b\u58a8\u897f\u54e5\u725b\u6cb9\u679c\u9171", + "\u6e05\u7096\u8089\u6c64", + "\u706b\u9505", + "\u4e73\u8102\u86cb\u7cd5\uff1b\u82f1\u56fd\u751c\u70b9", + "\u51b0\u6dc7\u6dcb", + "\u51b0\u68cd\uff1b\u96ea\u7cd5", + "\u6cd5\u5f0f\u9762\u5305", + "\u767e\u5409\u997c", + "\u6912\u76d0\u8106\u997c", + "\u829d\u58eb\u6c49\u5821", + "\u70ed\u72d7", + "\u571f\u8c46\u6ce5", + "\u7ed3\u7403\u7518\u84dd", + "\u897f\u5170\u82b1\uff1b\u7eff\u83dc\u82b1", + "\u83dc\u82b1\uff1b\u82b1\u6930\u83dc", + "\u897f\u846b\u82a6", + "\u91d1\u4e1d\u74dc\uff1b\u610f\u9762\u5357\u74dc\uff1b\u9762\u6761\u74dc", + "\u7eff\u8272\u5c0f\u5357\u74dc\uff1b\u9752\u5357\u74dc", + "\u5357\u74dc", + "\u9ec4\u74dc", + "\u6d0b\u84df\uff1b\u7403\u84df", + "\u751c\u6912", + "\u523a\u68d8\u84df", + "\u8611\u83c7", + "\u7eff\u82f9\u679c", + "\u8349\u8393", + "\u6a58\u5b50", + "\u67e0\u6aac", + "\u65e0\u82b1\u679c", + "\u83e0\u841d", + "\u9999\u8549", + "\u83e0\u841d\u871c", + "\u756a\u8354\u679d", + "\u77f3\u69b4", + "\u5e72\u8349", + "\u57f9\u6839\u86cb\u9171\u610f\u5927\u5229\u9762", + "\u5de7\u514b\u529b\u9171", + "\u751f\u9762\uff1b\u9762\u56e2", + "\u745e\u58eb\u8089\u5305", + "\u62ab\u8428", + "\u9985\u997c", + "\u5377\u997c", + "\u7ea2\u8461\u8404\u9152", + "\u610f\u5f0f\u6d53\u7f29\u5496\u5561", + "\u676f\u5b50", + "\u86cb\u9152", + "\u9ad8\u5c71", + "\u6ce1\u6ce1", + "\u60ac\u5d16", + "\u73ca\u745a\u7901", + "\u95f4\u6b47\u6cc9\uff1b\u95f4\u65ad\u55b7\u53d1\u7684\u6e29\u6cc9", + "\u6e56\u8fb9", + "\u5cac\u89d2\uff1b\u6df1\u5165\u6d77\u4e2d\u7684\u72ed\u957f\u9ad8\u5730", + "\u6c99\u6d32", + "\u6c99\u6ee9", + "\u5ce1\u8c37", + "\u706b\u5c71", + "\u68d2\u7403\u8fd0\u52a8\u5458", + "\u65b0\u90ce", + "\u6f5c\u6c34\u5458", + "\u6cb9\u83dc", + "\u96cf\u83ca", + "\u9ec4\u8272\u6753\u5170", + "\u7389\u7c73", + "\u6a61\u5b50", + "\u73ab\u7470\u679c", + "\u4e03\u53f6\u6811\u679c\u5b9e", + "\u73ca\u745a\u83cc", + "\u6728\u8033", + "\u9e7f\u82b1\u83cc", + "\u81ed\u89d2\u83c7", + "\u5730\u661f", + "\u591a\u53f6\u5947\u679c\u83cc", + "\u725b\u809d\u83cc", + "\u7389\u7c73\u68d2\u5b50", + "\u536b\u751f\u7eb8" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/cn_zeroshot_classification_templates.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/cn_zeroshot_classification_templates.json new file mode 100644 index 0000000000000000000000000000000000000000..532e0ca6309e645db6cbbc94be43c764664ca633 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/cn_zeroshot_classification_templates.json @@ -0,0 +1,84 @@ +{ + "imagenet1k": [ + "{c}\u7684\u7167\u7247\u3002", + "\u8d28\u91cf\u5dee\u7684{c}\u7684\u7167\u7247\u3002", + "\u8bb8\u591a{c}\u7684\u7167\u7247\u3002", + "{c}\u7684\u96d5\u5851\u3002", + "\u96be\u4ee5\u770b\u5230{c}\u7684\u7167\u7247\u3002", + "{c}\u7684\u4f4e\u5206\u8fa8\u7387\u7167\u7247\u3002", + "{c}\u7684\u6e32\u67d3\u3002", + "\u6d82\u9e26{c}\u3002", + "{c}\u7684\u7cdf\u7cd5\u7167\u7247\u3002", + "{c}\u7684\u88c1\u526a\u7167\u7247\u3002", + "{c}\u7684\u7eb9\u8eab\u3002", + "{c}\u7684\u523a\u7ee3\u7167\u7247\u3002", + "\u5f88\u96be\u770b\u5230{c}\u7684\u7167\u7247\u3002", + "{c}\u7684\u660e\u4eae\u7167\u7247\u3002", + "\u4e00\u5f20\u5e72\u51c0\u7684{c}\u7684\u7167\u7247\u3002", + "\u4e00\u5f20\u5305\u542b{c}\u7684\u7167\u7247\u3002", + "{c}\u7684\u6df1\u8272\u7167\u7247\u3002", + "{c}\u7684\u624b\u7ed8\u753b\u3002", + "\u6211\u7684{c}\u7684\u7167\u7247\u3002", + "\u4e0d\u81ea\u7136\u7684{c}\u7684\u7167\u7247\u3002", + "\u4e00\u5f20\u9177\u7684{c}\u7684\u7167\u7247\u3002", + "{c}\u7684\u7279\u5199\u7167\u7247\u3002", + "{c}\u7684\u9ed1\u767d\u7167\u7247\u3002", + "\u4e00\u5e45{c}\u7684\u753b\u3002", + "\u4e00\u5e45{c}\u7684\u7ed8\u753b\u3002", + "\u4e00\u5f20{c}\u7684\u50cf\u7d20\u7167\u7247\u3002", + "{c}\u7684\u96d5\u50cf\u3002", + "\u4e00\u5f20{c}\u7684\u660e\u4eae\u7167\u7247\u3002", + "{c}\u7684\u88c1\u526a\u7167\u7247\u3002", + "\u4eba\u9020\u7684{c}\u7684\u7167\u7247\u3002", + "\u4e00\u5f20\u5173\u4e8e{c}\u7684\u7167\u7247\u3002", + "\u635f\u574f\u7684{c}\u7684jpeg\u7167\u7247\u3002", + "{c}\u7684\u6a21\u7cca\u7167\u7247\u3002", + "{c}\u7684\u76f8\u7247\u3002", + "\u4e00\u5f20{c}\u7684\u597d\u7167\u7247\u3002", + "{c}\u7684\u6e32\u67d3\u7167\u3002", + "\u89c6\u9891\u6e38\u620f\u4e2d\u7684{c}\u3002", + "\u4e00\u5f20{c}\u7684\u7167\u7247\u3002", + "{c}\u7684\u6d82\u9e26\u3002", + "{c}\u7684\u8fd1\u8ddd\u79bb\u7167\u7247\u3002", + "{c}\u7684\u6298\u7eb8\u3002", + "{c}\u5728\u89c6\u9891\u6e38\u620f\u4e2d\u3002", + "{c}\u7684\u8349\u56fe\u3002", + "{c}\u7684\u6d82\u9e26\u7167\u3002", + "{c}\u7684\u6298\u7eb8\u5f62\u72b6\u3002", + "\u4f4e\u5206\u8fa8\u7387\u7684{c}\u7684\u7167\u7247\u3002", + "\u73a9\u5177{c}\u3002", + "{c}\u7684\u526f\u672c\u3002", + "{c}\u7684\u5e72\u51c0\u7684\u7167\u7247\u3002", + "\u4e00\u5f20\u5927{c}\u7684\u7167\u7247\u3002", + "{c}\u7684\u91cd\u73b0\u3002", + "\u4e00\u5f20\u6f02\u4eae\u7684{c}\u7684\u7167\u7247\u3002", + "\u4e00\u5f20\u5947\u602a\u7684{c}\u7684\u7167\u7247\u3002", + "\u6a21\u7cca\u7684{c}\u7684\u7167\u7247\u3002", + "\u5361\u901a{c}\u3002", + "{c}\u7684\u827a\u672f\u4f5c\u54c1\u3002", + "{c}\u7684\u7d20\u63cf\u3002", + "\u523a\u7ee3{c}\u3002", + "{c}\u7684\u50cf\u7d20\u7167\u3002", + "{c}\u7684\u62cd\u7167\u3002", + "{c}\u7684\u635f\u574f\u7684\u7167\u7247\u3002", + "\u9ad8\u8d28\u91cf\u7684{c}\u7684\u7167\u7247\u3002", + "\u6bdb\u7ed2\u73a9\u5177{c}\u3002", + "\u6f02\u4eae\u7684{c}\u7684\u7167\u7247\u3002", + "\u5c0f{c}\u7684\u7167\u7247\u3002", + "\u7167\u7247\u662f\u5947\u602a\u7684{c}\u3002", + "\u6f2b\u753b{c}\u3002", + "{c}\u7684\u827a\u672f\u7167\u3002", + "{c}\u7684\u56fe\u5f62\u3002", + "\u5927{c}\u7684\u7167\u7247\u3002", + "\u9ed1\u767d\u7684{c}\u7684\u7167\u7247\u3002", + "{c}\u6bdb\u7ed2\u73a9\u5177\u3002", + "\u4e00\u5f20{c}\u7684\u6df1\u8272\u7167\u7247\u3002", + "{c}\u7684\u6444\u5f71\u56fe\u3002", + "{c}\u7684\u6d82\u9e26\u7167\u3002", + "\u73a9\u5177\u5f62\u72b6\u7684{c}\u3002", + "\u62cd\u4e86{c}\u7684\u7167\u7247\u3002", + "\u9177\u9177\u7684{c}\u7684\u7167\u7247\u3002", + "\u7167\u7247\u91cc\u7684\u5c0f{c}\u3002", + "{c}\u7684\u523a\u9752\u3002" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/crossmodal3600.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/crossmodal3600.py new file mode 100644 index 0000000000000000000000000000000000000000..582d428d2e89304c0582ed834469e24335293f69 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/crossmodal3600.py @@ -0,0 +1,152 @@ +import codecs +import json +import os +from subprocess import call + +from PIL import Image +from torchvision.datasets import VisionDataset + +SUPPORTED_LANGUAGES = [ + "ar", + "bn", + "cs", + "da", + "de", + "el", + "en", + "es", + "fa", + "fi", + "fil", + "fr", + "he", + "hi", + "hr", + "hu", + "id", + "it", + "ja", + "ko", + "mi", + "nl", + "no", + "pl", + "pt", + "quz", + "ro", + "ru", + "sv", + "sw", + "te", + "th", + "tr", + "uk", + "vi", + "zh", +] + +CAPTIONS_DOWNLOAD_URL = "https://google.github.io/crossmodal-3600/web-data/captions.zip" +IMAGES_DOWNLOAD_URL = ( + "https://open-images-dataset.s3.amazonaws.com/crossmodal-3600/images.tgz" +) +OUTPUT_FILENAME_TEMPLATE = "crossmodal3600_captions-{}.json" + + +class Crossmodal3600(VisionDataset): + def __init__(self, root, ann_file, transform=None, target_transform=None): + super().__init__(root, transform=transform, target_transform=target_transform) + self.ann_file = os.path.expanduser(ann_file) + with codecs.open(ann_file, "r", encoding="utf-8") as fp: + data = json.load(fp) + self.data = [ + (img_path, txt) + for img_path, txt in zip(data["image_paths"], data["annotations"]) + ] + + def __getitem__(self, index): + img, captions = self.data[index] + + # Image + img = Image.open(img).convert("RGB") + if self.transform is not None: + img = self.transform(img) + + # Captions + target = [ + captions, + ] + if self.target_transform is not None: + target = self.target_transform(target) + + return img, target + + def __len__(self) -> int: + return len(self.data) + + +def _download_captions(out_path): + os.makedirs(out_path, exist_ok=True) + print("Downloading captions") + call(f"wget {CAPTIONS_DOWNLOAD_URL} -O captions.zip", shell=True) + call(f"unzip captions.zip -d {out_path}", shell=True) + call("rm captions.zip", shell=True) + + +def _download_images(out_path): + os.makedirs(out_path, exist_ok=True) + print("Downloading images") + call(f"wget {IMAGES_DOWNLOAD_URL} -O images.tgz", shell=True) + call(f"tar -xzf images.tgz -C {out_path}", shell=True) + call("rm images.tgz", shell=True) + + +def create_annotation_file(root, lang_code): + if lang_code not in SUPPORTED_LANGUAGES: + raise ValueError( + f"Language code {lang_code} not supported. Supported languages are {SUPPORTED_LANGUAGES}" + ) + data_dir = os.path.join(root, "xm3600") + images_dir = os.path.join(data_dir, "images") + if not os.path.exists(images_dir): + _download_images(images_dir) + captions_path = os.path.join(data_dir, "captions.jsonl") + if not os.path.exists(captions_path): + _download_captions(data_dir) + with open(captions_path, "r", encoding="utf-8") as f: + data = f.readlines() + data = [json.loads(line) for line in data] + + number_of_missing_images = 0 + valid_images, valid_annotations, valid_indicies = [], [], [] + for i, data_item in enumerate(data): + image_id = data_item["image/key"] + image_name = f"{image_id}.jpg" + image_path = os.path.join(images_dir, image_name) + if not os.path.exists(image_path): + print("Missing image file", image_name) + number_of_missing_images += 1 + continue + captions = data_item[lang_code]["caption"] + txt = captions[0] + + valid_images.append(image_path) + valid_annotations.append(txt) + valid_indicies.append(i) + + if number_of_missing_images > 0: + print(f"*** WARNING *** missing {number_of_missing_images} files.") + + with codecs.open( + os.path.join(root, OUTPUT_FILENAME_TEMPLATE.format(lang_code)), + "w", + encoding="utf-8", + ) as fp: + json.dump( + { + "image_paths": valid_images, + "annotations": valid_annotations, + "indicies": valid_indicies, + }, + fp, + ensure_ascii=False, + ) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/en_classnames.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/en_classnames.json new file mode 100644 index 0000000000000000000000000000000000000000..86de297547d0ec07b9b7ffe6345b5af4e433fc2e --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/en_classnames.json @@ -0,0 +1,1701 @@ +{ + "flowers": [ + "pink primrose", + "hard-leaved pocket orchid", + "canterbury bells", + "sweet pea", + "english marigold", + "tiger lily", + "moon orchid", + "bird of paradise", + "monkshood", + "globe thistle", + "snapdragon", + "colt's foot", + "king protea", + "spear thistle", + "yellow iris", + "globe flower", + "purple coneflower", + "peruvian lily", + "balloon flower", + "giant white arum lily", + "fire lily", + "pincushion flower", + "fritillary", + "red ginger", + "grape hyacinth", + "corn poppy", + "prince of wales feathers", + "stemless gentian", + "artichoke", + "sweet william", + "carnation", + "garden phlox", + "love in the mist", + "mexican aster", + "alpine sea holly", + "ruby-lipped cattleya", + "cape flower", + "great masterwort", + "siam tulip", + "lenten rose", + "barbeton daisy", + "daffodil", + "sword lily", + "poinsettia", + "bolero deep blue", + "wallflower", + "marigold", + "buttercup", + "oxeye daisy", + "common dandelion", + "petunia", + "wild pansy", + "primula", + "sunflower", + "pelargonium", + "bishop of llandaff", + "gaura", + "geranium", + "orange dahlia", + "pink and yellow dahlia", + "cautleya spicata", + "japanese anemone", + "black-eyed susan", + "silverbush", + "californian poppy", + "osteospermum", + "spring crocus", + "bearded iris", + "windflower", + "tree poppy", + "gazania", + "azalea", + "water lily", + "rose", + "thorn apple", + "morning glory", + "passion flower", + "lotus", + "toad lily", + "anthurium", + "frangipani", + "clematis", + "hibiscus", + "columbine", + "desert-rose", + "tree mallow", + "magnolia", + "cyclamen", + "watercress", + "canna lily", + "hippeastrum", + "bee balm", + "air plant", + "foxglove", + "bougainvillea", + "camellia", + "mallow", + "mexican petunia", + "bromelia", + "blanket flower", + "trumpet creeper", + "blackberry lily" + ], + "gtsrb": [ + "red and white circle 20 kph speed limit", + "red and white circle 30 kph speed limit", + "red and white circle 50 kph speed limit", + "red and white circle 60 kph speed limit", + "red and white circle 70 kph speed limit", + "red and white circle 80 kph speed limit", + "end / de-restriction of 80 kph speed limit", + "red and white circle 100 kph speed limit", + "red and white circle 120 kph speed limit", + "red and white circle red car and black car no passing", + "red and white circle red truck and black car no passing", + "red and white triangle road intersection warning", + "white and yellow diamond priority road", + "red and white upside down triangle yield right-of-way", + "stop", + "empty red and white circle", + "red and white circle no truck entry", + "red circle with white horizonal stripe no entry", + "red and white triangle with exclamation mark warning", + "red and white triangle with black left curve approaching warning", + "red and white triangle with black right curve approaching warning", + "red and white triangle with black double curve approaching warning", + "red and white triangle rough / bumpy road warning", + "red and white triangle car skidding / slipping warning", + "red and white triangle with merging / narrow lanes warning", + "red and white triangle with person digging / construction / road work warning", + "red and white triangle with traffic light approaching warning", + "red and white triangle with person walking warning", + "red and white triangle with child and person walking warning", + "red and white triangle with bicyle warning", + "red and white triangle with snowflake / ice warning", + "red and white triangle with deer warning", + "white circle with gray strike bar no speed limit", + "blue circle with white right turn arrow mandatory", + "blue circle with white left turn arrow mandatory", + "blue circle with white forward arrow mandatory", + "blue circle with white forward or right turn arrow mandatory", + "blue circle with white forward or left turn arrow mandatory", + "blue circle with white keep right arrow mandatory", + "blue circle with white keep left arrow mandatory", + "blue circle with white arrows indicating a traffic circle", + "white circle with gray strike bar indicating no passing for cars has ended", + "white circle with gray strike bar indicating no passing for trucks has ended" + ], + "country211": [ + "Andorra", + "United Arab Emirates", + "Afghanistan", + "Antigua and Barbuda", + "Anguilla", + "Albania", + "Armenia", + "Angola", + "Antarctica", + "Argentina", + "Austria", + "Australia", + "Aruba", + "Aland Islands", + "Azerbaijan", + "Bosnia and Herzegovina", + "Barbados", + "Bangladesh", + "Belgium", + "Burkina Faso", + "Bulgaria", + "Bahrain", + "Benin", + "Bermuda", + "Brunei Darussalam", + "Bolivia", + "Bonaire, Saint Eustatius and Saba", + "Brazil", + "Bahamas", + "Bhutan", + "Botswana", + "Belarus", + "Belize", + "Canada", + "DR Congo", + "Central African Republic", + "Switzerland", + "Cote d'Ivoire", + "Cook Islands", + "Chile", + "Cameroon", + "China", + "Colombia", + "Costa Rica", + "Cuba", + "Cabo Verde", + "Curacao", + "Cyprus", + "Czech Republic", + "Germany", + "Denmark", + "Dominica", + "Dominican Republic", + "Algeria", + "Ecuador", + "Estonia", + "Egypt", + "Spain", + "Ethiopia", + "Finland", + "Fiji", + "Falkland Islands", + "Faeroe Islands", + "France", + "Gabon", + "United Kingdom", + "Grenada", + "Georgia", + "French Guiana", + "Guernsey", + "Ghana", + "Gibraltar", + "Greenland", + "Gambia", + "Guadeloupe", + "Greece", + "South Georgia and South Sandwich Is.", + "Guatemala", + "Guam", + "Guyana", + "Hong Kong", + "Honduras", + "Croatia", + "Haiti", + "Hungary", + "Indonesia", + "Ireland", + "Israel", + "Isle of Man", + "India", + "Iraq", + "Iran", + "Iceland", + "Italy", + "Jersey", + "Jamaica", + "Jordan", + "Japan", + "Kenya", + "Kyrgyz Republic", + "Cambodia", + "St. Kitts and Nevis", + "North Korea", + "South Korea", + "Kuwait", + "Cayman Islands", + "Kazakhstan", + "Laos", + "Lebanon", + "St. Lucia", + "Liechtenstein", + "Sri Lanka", + "Liberia", + "Lithuania", + "Luxembourg", + "Latvia", + "Libya", + "Morocco", + "Monaco", + "Moldova", + "Montenegro", + "Saint-Martin", + "Madagascar", + "Macedonia", + "Mali", + "Myanmar", + "Mongolia", + "Macau", + "Martinique", + "Mauritania", + "Malta", + "Mauritius", + "Maldives", + "Malawi", + "Mexico", + "Malaysia", + "Mozambique", + "Namibia", + "New Caledonia", + "Nigeria", + "Nicaragua", + "Netherlands", + "Norway", + "Nepal", + "New Zealand", + "Oman", + "Panama", + "Peru", + "French Polynesia", + "Papua New Guinea", + "Philippines", + "Pakistan", + "Poland", + "Puerto Rico", + "Palestine", + "Portugal", + "Palau", + "Paraguay", + "Qatar", + "Reunion", + "Romania", + "Serbia", + "Russia", + "Rwanda", + "Saudi Arabia", + "Solomon Islands", + "Seychelles", + "Sudan", + "Sweden", + "Singapore", + "St. Helena", + "Slovenia", + "Svalbard and Jan Mayen Islands", + "Slovakia", + "Sierra Leone", + "San Marino", + "Senegal", + "Somalia", + "South Sudan", + "El Salvador", + "Sint Maarten", + "Syria", + "Eswatini", + "Togo", + "Thailand", + "Tajikistan", + "Timor-Leste", + "Turkmenistan", + "Tunisia", + "Tonga", + "Turkey", + "Trinidad and Tobago", + "Taiwan", + "Tanzania", + "Ukraine", + "Uganda", + "United States", + "Uruguay", + "Uzbekistan", + "Vatican", + "Venezuela", + "British Virgin Islands", + "United States Virgin Islands", + "Vietnam", + "Vanuatu", + "Samoa", + "Kosovo", + "Yemen", + "South Africa", + "Zambia", + "Zimbabwe" + ], + "eurosat": [ + "annual crop land", + "forest", + "brushland or shrubland", + "highway or road", + "industrial buildings or commercial buildings", + "pasture land", + "permanent crop land", + "residential buildings or homes or apartments", + "river", + "lake or sea" + ], + "fer2013": [ + "angry", + "disgusted", + "fearful", + "happy", + "neutral", + "sad", + "surprised" + ], + "caltech101": [ + "background", + "off-center face", + "centered face", + "leopard", + "motorbike", + "accordion", + "airplane", + "anchor", + "ant", + "barrel", + "bass", + "beaver", + "binocular", + "bonsai", + "brain", + "brontosaurus", + "buddha", + "butterfly", + "camera", + "cannon", + "side of a car", + "ceiling fan", + "cellphone", + "chair", + "chandelier", + "body of a cougar cat", + "face of a cougar cat", + "crab", + "crayfish", + "crocodile", + "head of a crocodile", + "cup", + "dalmatian", + "dollar bill", + "dolphin", + "dragonfly", + "electric guitar", + "elephant", + "emu", + "euphonium", + "ewer", + "ferry", + "flamingo", + "head of a flamingo", + "garfield", + "gerenuk", + "gramophone", + "grand piano", + "hawksbill", + "headphone", + "hedgehog", + "helicopter", + "ibis", + "inline skate", + "joshua tree", + "kangaroo", + "ketch", + "lamp", + "laptop", + "llama", + "lobster", + "lotus", + "mandolin", + "mayfly", + "menorah", + "metronome", + "minaret", + "nautilus", + "octopus", + "okapi", + "pagoda", + "panda", + "pigeon", + "pizza", + "platypus", + "pyramid", + "revolver", + "rhino", + "rooster", + "saxophone", + "schooner", + "scissors", + "scorpion", + "sea horse", + "snoopy (cartoon beagle)", + "soccer ball", + "stapler", + "starfish", + "stegosaurus", + "stop sign", + "strawberry", + "sunflower", + "tick", + "trilobite", + "umbrella", + "watch", + "water lilly", + "wheelchair", + "wild cat", + "windsor chair", + "wrench", + "yin and yang symbol" + ], + "caltech101_vtab": [ + "accordion", + "airplane", + "anchor", + "ant", + "background", + "barrel", + "bass", + "beaver", + "binocular", + "bonsai", + "brain", + "brontosaurus", + "buddha", + "butterfly", + "camera", + "cannon", + "side of a car", + "ceiling fan", + "cellphone", + "chair", + "chandelier", + "body of a cougar cat", + "face of a cougar cat", + "crab", + "crayfish", + "crocodile", + "head of a crocodile", + "cup", + "dalmatian", + "dollar bill", + "dolphin", + "dragonfly", + "electric guitar", + "elephant", + "emu", + "euphonium", + "ewer", + "off-center face", + "centered face", + "ferry", + "flamingo", + "head of a flamingo", + "garfield", + "gerenuk", + "gramophone", + "grand piano", + "hawksbill", + "headphone", + "hedgehog", + "helicopter", + "ibis", + "inline skate", + "joshua tree", + "kangaroo", + "ketch", + "lamp", + "laptop", + "leopard", + "llama", + "lobster", + "lotus", + "mandolin", + "mayfly", + "menorah", + "metronome", + "minaret", + "motorbike", + "nautilus", + "octopus", + "okapi", + "pagoda", + "panda", + "pigeon", + "pizza", + "platypus", + "pyramid", + "revolver", + "rhino", + "rooster", + "saxophone", + "schooner", + "scissors", + "scorpion", + "sea horse", + "snoopy (cartoon beagle)", + "soccer ball", + "stapler", + "starfish", + "stegosaurus", + "stop sign", + "strawberry", + "sunflower", + "tick", + "trilobite", + "umbrella", + "watch", + "water lilly", + "wheelchair", + "wild cat", + "windsor chair", + "wrench", + "yin and yang symbol" + ], + "imagenet1k": [ + "tench", + "goldfish", + "great white shark", + "tiger shark", + "hammerhead shark", + "electric ray", + "stingray", + "rooster", + "hen", + "ostrich", + "brambling", + "goldfinch", + "house finch", + "junco", + "indigo bunting", + "American robin", + "bulbul", + "jay", + "magpie", + "chickadee", + "American dipper", + "kite (bird of prey)", + "bald eagle", + "vulture", + "great grey owl", + "fire salamander", + "smooth newt", + "newt", + "spotted salamander", + "axolotl", + "American bullfrog", + "tree frog", + "tailed frog", + "loggerhead sea turtle", + "leatherback sea turtle", + "mud turtle", + "terrapin", + "box turtle", + "banded gecko", + "green iguana", + "Carolina anole", + "desert grassland whiptail lizard", + "agama", + "frilled-necked lizard", + "alligator lizard", + "Gila monster", + "European green lizard", + "chameleon", + "Komodo dragon", + "Nile crocodile", + "American alligator", + "triceratops", + "worm snake", + "ring-necked snake", + "eastern hog-nosed snake", + "smooth green snake", + "kingsnake", + "garter snake", + "water snake", + "vine snake", + "night snake", + "boa constrictor", + "African rock python", + "Indian cobra", + "green mamba", + "sea snake", + "Saharan horned viper", + "eastern diamondback rattlesnake", + "sidewinder rattlesnake", + "trilobite", + "harvestman", + "scorpion", + "yellow garden spider", + "barn spider", + "European garden spider", + "southern black widow", + "tarantula", + "wolf spider", + "tick", + "centipede", + "black grouse", + "ptarmigan", + "ruffed grouse", + "prairie grouse", + "peafowl", + "quail", + "partridge", + "african grey parrot", + "macaw", + "sulphur-crested cockatoo", + "lorikeet", + "coucal", + "bee eater", + "hornbill", + "hummingbird", + "jacamar", + "toucan", + "duck", + "red-breasted merganser", + "goose", + "black swan", + "tusker", + "echidna", + "platypus", + "wallaby", + "koala", + "wombat", + "jellyfish", + "sea anemone", + "brain coral", + "flatworm", + "nematode", + "conch", + "snail", + "slug", + "sea slug", + "chiton", + "chambered nautilus", + "Dungeness crab", + "rock crab", + "fiddler crab", + "red king crab", + "American lobster", + "spiny lobster", + "crayfish", + "hermit crab", + "isopod", + "white stork", + "black stork", + "spoonbill", + "flamingo", + "little blue heron", + "great egret", + "bittern bird", + "crane bird", + "limpkin", + "common gallinule", + "American coot", + "bustard", + "ruddy turnstone", + "dunlin", + "common redshank", + "dowitcher", + "oystercatcher", + "pelican", + "king penguin", + "albatross", + "grey whale", + "killer whale", + "dugong", + "sea lion", + "Chihuahua", + "Japanese Chin", + "Maltese", + "Pekingese", + "Shih Tzu", + "King Charles Spaniel", + "Papillon", + "toy terrier", + "Rhodesian Ridgeback", + "Afghan Hound", + "Basset Hound", + "Beagle", + "Bloodhound", + "Bluetick Coonhound", + "Black and Tan Coonhound", + "Treeing Walker Coonhound", + "English foxhound", + "Redbone Coonhound", + "borzoi", + "Irish Wolfhound", + "Italian Greyhound", + "Whippet", + "Ibizan Hound", + "Norwegian Elkhound", + "Otterhound", + "Saluki", + "Scottish Deerhound", + "Weimaraner", + "Staffordshire Bull Terrier", + "American Staffordshire Terrier", + "Bedlington Terrier", + "Border Terrier", + "Kerry Blue Terrier", + "Irish Terrier", + "Norfolk Terrier", + "Norwich Terrier", + "Yorkshire Terrier", + "Wire Fox Terrier", + "Lakeland Terrier", + "Sealyham Terrier", + "Airedale Terrier", + "Cairn Terrier", + "Australian Terrier", + "Dandie Dinmont Terrier", + "Boston Terrier", + "Miniature Schnauzer", + "Giant Schnauzer", + "Standard Schnauzer", + "Scottish Terrier", + "Tibetan Terrier", + "Australian Silky Terrier", + "Soft-coated Wheaten Terrier", + "West Highland White Terrier", + "Lhasa Apso", + "Flat-Coated Retriever", + "Curly-coated Retriever", + "Golden Retriever", + "Labrador Retriever", + "Chesapeake Bay Retriever", + "German Shorthaired Pointer", + "Vizsla", + "English Setter", + "Irish Setter", + "Gordon Setter", + "Brittany dog", + "Clumber Spaniel", + "English Springer Spaniel", + "Welsh Springer Spaniel", + "Cocker Spaniel", + "Sussex Spaniel", + "Irish Water Spaniel", + "Kuvasz", + "Schipperke", + "Groenendael dog", + "Malinois", + "Briard", + "Australian Kelpie", + "Komondor", + "Old English Sheepdog", + "Shetland Sheepdog", + "collie", + "Border Collie", + "Bouvier des Flandres dog", + "Rottweiler", + "German Shepherd Dog", + "Dobermann", + "Miniature Pinscher", + "Greater Swiss Mountain Dog", + "Bernese Mountain Dog", + "Appenzeller Sennenhund", + "Entlebucher Sennenhund", + "Boxer", + "Bullmastiff", + "Tibetan Mastiff", + "French Bulldog", + "Great Dane", + "St. Bernard", + "husky", + "Alaskan Malamute", + "Siberian Husky", + "Dalmatian", + "Affenpinscher", + "Basenji", + "pug", + "Leonberger", + "Newfoundland dog", + "Great Pyrenees dog", + "Samoyed", + "Pomeranian", + "Chow Chow", + "Keeshond", + "brussels griffon", + "Pembroke Welsh Corgi", + "Cardigan Welsh Corgi", + "Toy Poodle", + "Miniature Poodle", + "Standard Poodle", + "Mexican hairless dog (xoloitzcuintli)", + "grey wolf", + "Alaskan tundra wolf", + "red wolf or maned wolf", + "coyote", + "dingo", + "dhole", + "African wild dog", + "hyena", + "red fox", + "kit fox", + "Arctic fox", + "grey fox", + "tabby cat", + "tiger cat", + "Persian cat", + "Siamese cat", + "Egyptian Mau", + "cougar", + "lynx", + "leopard", + "snow leopard", + "jaguar", + "lion", + "tiger", + "cheetah", + "brown bear", + "American black bear", + "polar bear", + "sloth bear", + "mongoose", + "meerkat", + "tiger beetle", + "ladybug", + "ground beetle", + "longhorn beetle", + "leaf beetle", + "dung beetle", + "rhinoceros beetle", + "weevil", + "fly", + "bee", + "ant", + "grasshopper", + "cricket insect", + "stick insect", + "cockroach", + "praying mantis", + "cicada", + "leafhopper", + "lacewing", + "dragonfly", + "damselfly", + "red admiral butterfly", + "ringlet butterfly", + "monarch butterfly", + "small white butterfly", + "sulphur butterfly", + "gossamer-winged butterfly", + "starfish", + "sea urchin", + "sea cucumber", + "cottontail rabbit", + "hare", + "Angora rabbit", + "hamster", + "porcupine", + "fox squirrel", + "marmot", + "beaver", + "guinea pig", + "common sorrel horse", + "zebra", + "pig", + "wild boar", + "warthog", + "hippopotamus", + "ox", + "water buffalo", + "bison", + "ram (adult male sheep)", + "bighorn sheep", + "Alpine ibex", + "hartebeest", + "impala (antelope)", + "gazelle", + "arabian camel", + "llama", + "weasel", + "mink", + "European polecat", + "black-footed ferret", + "otter", + "skunk", + "badger", + "armadillo", + "three-toed sloth", + "orangutan", + "gorilla", + "chimpanzee", + "gibbon", + "siamang", + "guenon", + "patas monkey", + "baboon", + "macaque", + "langur", + "black-and-white colobus", + "proboscis monkey", + "marmoset", + "white-headed capuchin", + "howler monkey", + "titi monkey", + "Geoffroy's spider monkey", + "common squirrel monkey", + "ring-tailed lemur", + "indri", + "Asian elephant", + "African bush elephant", + "red panda", + "giant panda", + "snoek fish", + "eel", + "silver salmon", + "rock beauty fish", + "clownfish", + "sturgeon", + "gar fish", + "lionfish", + "pufferfish", + "abacus", + "abaya", + "academic gown", + "accordion", + "acoustic guitar", + "aircraft carrier", + "airliner", + "airship", + "altar", + "ambulance", + "amphibious vehicle", + "analog clock", + "apiary", + "apron", + "trash can", + "assault rifle", + "backpack", + "bakery", + "balance beam", + "balloon", + "ballpoint pen", + "Band-Aid", + "banjo", + "baluster / handrail", + "barbell", + "barber chair", + "barbershop", + "barn", + "barometer", + "barrel", + "wheelbarrow", + "baseball", + "basketball", + "bassinet", + "bassoon", + "swimming cap", + "bath towel", + "bathtub", + "station wagon", + "lighthouse", + "beaker", + "military hat (bearskin or shako)", + "beer bottle", + "beer glass", + "bell tower", + "baby bib", + "tandem bicycle", + "bikini", + "ring binder", + "binoculars", + "birdhouse", + "boathouse", + "bobsleigh", + "bolo tie", + "poke bonnet", + "bookcase", + "bookstore", + "bottle cap", + "hunting bow", + "bow tie", + "brass memorial plaque", + "bra", + "breakwater", + "breastplate", + "broom", + "bucket", + "buckle", + "bulletproof vest", + "high-speed train", + "butcher shop", + "taxicab", + "cauldron", + "candle", + "cannon", + "canoe", + "can opener", + "cardigan", + "car mirror", + "carousel", + "tool kit", + "cardboard box / carton", + "car wheel", + "automated teller machine", + "cassette", + "cassette player", + "castle", + "catamaran", + "CD player", + "cello", + "mobile phone", + "chain", + "chain-link fence", + "chain mail", + "chainsaw", + "storage chest", + "chiffonier", + "bell or wind chime", + "china cabinet", + "Christmas stocking", + "church", + "movie theater", + "cleaver", + "cliff dwelling", + "cloak", + "clogs", + "cocktail shaker", + "coffee mug", + "coffeemaker", + "spiral or coil", + "combination lock", + "computer keyboard", + "candy store", + "container ship", + "convertible", + "corkscrew", + "cornet", + "cowboy boot", + "cowboy hat", + "cradle", + "construction crane", + "crash helmet", + "crate", + "infant bed", + "Crock Pot", + "croquet ball", + "crutch", + "cuirass", + "dam", + "desk", + "desktop computer", + "rotary dial telephone", + "diaper", + "digital clock", + "digital watch", + "dining table", + "dishcloth", + "dishwasher", + "disc brake", + "dock", + "dog sled", + "dome", + "doormat", + "drilling rig", + "drum", + "drumstick", + "dumbbell", + "Dutch oven", + "electric fan", + "electric guitar", + "electric locomotive", + "entertainment center", + "envelope", + "espresso machine", + "face powder", + "feather boa", + "filing cabinet", + "fireboat", + "fire truck", + "fire screen", + "flagpole", + "flute", + "folding chair", + "football helmet", + "forklift", + "fountain", + "fountain pen", + "four-poster bed", + "freight car", + "French horn", + "frying pan", + "fur coat", + "garbage truck", + "gas mask or respirator", + "gas pump", + "goblet", + "go-kart", + "golf ball", + "golf cart", + "gondola", + "gong", + "gown", + "grand piano", + "greenhouse", + "radiator grille", + "grocery store", + "guillotine", + "hair clip", + "hair spray", + "half-track", + "hammer", + "hamper", + "hair dryer", + "hand-held computer", + "handkerchief", + "hard disk drive", + "harmonica", + "harp", + "combine harvester", + "hatchet", + "holster", + "home theater", + "honeycomb", + "hook", + "hoop skirt", + "gymnastic horizontal bar", + "horse-drawn vehicle", + "hourglass", + "iPod", + "clothes iron", + "carved pumpkin", + "jeans", + "jeep", + "T-shirt", + "jigsaw puzzle", + "rickshaw", + "joystick", + "kimono", + "knee pad", + "knot", + "lab coat", + "ladle", + "lampshade", + "laptop computer", + "lawn mower", + "lens cap", + "letter opener", + "library", + "lifeboat", + "lighter", + "limousine", + "ocean liner", + "lipstick", + "slip-on shoe", + "lotion", + "music speaker", + "loupe magnifying glass", + "sawmill", + "magnetic compass", + "messenger bag", + "mailbox", + "tights", + "one-piece bathing suit", + "manhole cover", + "maraca", + "marimba", + "mask", + "matchstick", + "maypole", + "maze", + "measuring cup", + "medicine cabinet", + "megalith", + "microphone", + "microwave oven", + "military uniform", + "milk can", + "minibus", + "miniskirt", + "minivan", + "missile", + "mitten", + "mixing bowl", + "mobile home", + "ford model t", + "modem", + "monastery", + "monitor", + "moped", + "mortar and pestle", + "graduation cap", + "mosque", + "mosquito net", + "vespa", + "mountain bike", + "tent", + "computer mouse", + "mousetrap", + "moving van", + "muzzle", + "metal nail", + "neck brace", + "necklace", + "baby pacifier", + "notebook computer", + "obelisk", + "oboe", + "ocarina", + "odometer", + "oil filter", + "pipe organ", + "oscilloscope", + "overskirt", + "bullock cart", + "oxygen mask", + "product packet / packaging", + "paddle", + "paddle wheel", + "padlock", + "paintbrush", + "pajamas", + "palace", + "pan flute", + "paper towel", + "parachute", + "parallel bars", + "park bench", + "parking meter", + "railroad car", + "patio", + "payphone", + "pedestal", + "pencil case", + "pencil sharpener", + "perfume", + "Petri dish", + "photocopier", + "plectrum", + "Pickelhaube", + "picket fence", + "pickup truck", + "pier", + "piggy bank", + "pill bottle", + "pillow", + "ping-pong ball", + "pinwheel", + "pirate ship", + "drink pitcher", + "block plane", + "planetarium", + "plastic bag", + "plate rack", + "farm plow", + "plunger", + "Polaroid camera", + "pole", + "police van", + "poncho", + "pool table", + "soda bottle", + "plant pot", + "potter's wheel", + "power drill", + "prayer rug", + "printer", + "prison", + "missile", + "projector", + "hockey puck", + "punching bag", + "purse", + "quill", + "quilt", + "race car", + "racket", + "radiator", + "radio", + "radio telescope", + "rain barrel", + "recreational vehicle", + "fishing casting reel", + "reflex camera", + "refrigerator", + "remote control", + "restaurant", + "revolver", + "rifle", + "rocking chair", + "rotisserie", + "eraser", + "rugby ball", + "ruler measuring stick", + "sneaker", + "safe", + "safety pin", + "salt shaker", + "sandal", + "sarong", + "saxophone", + "scabbard", + "weighing scale", + "school bus", + "schooner", + "scoreboard", + "CRT monitor", + "screw", + "screwdriver", + "seat belt", + "sewing machine", + "shield", + "shoe store", + "shoji screen / room divider", + "shopping basket", + "shopping cart", + "shovel", + "shower cap", + "shower curtain", + "ski", + "balaclava ski mask", + "sleeping bag", + "slide rule", + "sliding door", + "slot machine", + "snorkel", + "snowmobile", + "snowplow", + "soap dispenser", + "soccer ball", + "sock", + "solar thermal collector", + "sombrero", + "soup bowl", + "keyboard space bar", + "space heater", + "space shuttle", + "spatula", + "motorboat", + "spider web", + "spindle", + "sports car", + "spotlight", + "stage", + "steam locomotive", + "through arch bridge", + "steel drum", + "stethoscope", + "scarf", + "stone wall", + "stopwatch", + "stove", + "strainer", + "tram", + "stretcher", + "couch", + "stupa", + "submarine", + "suit", + "sundial", + "sunglasses", + "sunglasses", + "sunscreen", + "suspension bridge", + "mop", + "sweatshirt", + "swim trunks / shorts", + "swing", + "electrical switch", + "syringe", + "table lamp", + "tank", + "tape player", + "teapot", + "teddy bear", + "television", + "tennis ball", + "thatched roof", + "front curtain", + "thimble", + "threshing machine", + "throne", + "tile roof", + "toaster", + "tobacco shop", + "toilet seat", + "torch", + "totem pole", + "tow truck", + "toy store", + "tractor", + "semi-trailer truck", + "tray", + "trench coat", + "tricycle", + "trimaran", + "tripod", + "triumphal arch", + "trolleybus", + "trombone", + "hot tub", + "turnstile", + "typewriter keyboard", + "umbrella", + "unicycle", + "upright piano", + "vacuum cleaner", + "vase", + "vaulted or arched ceiling", + "velvet fabric", + "vending machine", + "vestment", + "viaduct", + "violin", + "volleyball", + "waffle iron", + "wall clock", + "wallet", + "wardrobe", + "military aircraft", + "sink", + "washing machine", + "water bottle", + "water jug", + "water tower", + "whiskey jug", + "whistle", + "hair wig", + "window screen", + "window shade", + "Windsor tie", + "wine bottle", + "airplane wing", + "wok", + "wooden spoon", + "wool", + "split-rail fence", + "shipwreck", + "sailboat", + "yurt", + "website", + "comic book", + "crossword", + "traffic or street sign", + "traffic light", + "dust jacket", + "menu", + "plate", + "guacamole", + "consomme", + "hot pot", + "trifle", + "ice cream", + "popsicle", + "baguette", + "bagel", + "pretzel", + "cheeseburger", + "hot dog", + "mashed potatoes", + "cabbage", + "broccoli", + "cauliflower", + "zucchini", + "spaghetti squash", + "acorn squash", + "butternut squash", + "cucumber", + "artichoke", + "bell pepper", + "cardoon", + "mushroom", + "Granny Smith apple", + "strawberry", + "orange", + "lemon", + "fig", + "pineapple", + "banana", + "jackfruit", + "cherimoya (custard apple)", + "pomegranate", + "hay", + "carbonara", + "chocolate syrup", + "dough", + "meatloaf", + "pizza", + "pot pie", + "burrito", + "red wine", + "espresso", + "tea cup", + "eggnog", + "mountain", + "bubble", + "cliff", + "coral reef", + "geyser", + "lakeshore", + "promontory", + "sandbar", + "beach", + "valley", + "volcano", + "baseball player", + "bridegroom", + "scuba diver", + "rapeseed", + "daisy", + "yellow lady's slipper", + "corn", + "acorn", + "rose hip", + "horse chestnut seed", + "coral fungus", + "agaric", + "gyromitra", + "stinkhorn mushroom", + "earth star fungus", + "hen of the woods mushroom", + "bolete", + "corn cob", + "toilet paper" + ], + "clevr_count_all": [ + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "ten" + ], + "clevr_closest_object_distance": [ + "very nearby", + "nearby", + "near", + "", + "distant", + "very distant" + ], + "mnist": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ], + "svhn": [ + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine" + ], + "kitti_closest_vehicle_distance": [ + "a photo i took of a car on my left or right side.", + "a photo i took with a car nearby.", + "a photo i took with a car in the distance.", + "a photo i took with no car." + ], + "dmlab": [ + "nearby apple/melon", + "far apple/melon", + "very far apple/melon", + "nearby lemon", + "far lemon", + "very far lemon" + ], + "pets": [ + "Abyssinian", + "American Bulldog", + "American Pit Bull Terrier", + "Basset Hound", + "Beagle", + "Bengal", + "Birman", + "Bombay", + "Boxer", + "British Shorthair", + "Chihuahua", + "Egyptian Mau", + "English Cocker Spaniel", + "English Setter", + "German Shorthaired", + "Great Pyrenees", + "Havanese", + "Japanese Chin", + "Keeshond", + "Leonberger", + "Maine Coon", + "Miniature Pinscher", + "Newfoundland", + "Persian", + "Pomeranian", + "Pug", + "Ragdoll", + "Russian Blue", + "Saint Bernard", + "Samoyed", + "Scottish Terrier", + "Shiba Inu", + "Siamese", + "Sphynx", + "Staffordshire Bull Terrier", + "Wheaten Terrier", + "Yorkshire Terrier" + ], + "pcam": [ + "lymph node", + "lymph node containing metastatic tumor tissue" + ], + "diabetic_retinopathy": [ + "no diabetic retinopathy", + "mild diabetic retinopathy", + "moderate diabetic retinopathy", + "severe diabetic retinopathy", + "proliferative diabetic retinopathy" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/en_zeroshot_classification_templates.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/en_zeroshot_classification_templates.json new file mode 100644 index 0000000000000000000000000000000000000000..5ff3b5e0bedf7c2e1c295069dc6a382cb0da5040 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/en_zeroshot_classification_templates.json @@ -0,0 +1,295 @@ +{ + "cifar10": [ + "a photo of a {c}.", + "a blurry photo of a {c}.", + "a black and white photo of a {c}.", + "a low contrast photo of a {c}.", + "a high contrast photo of a {c}.", + "a bad photo of a {c}.", + "a good photo of a {c}.", + "a photo of a small {c}.", + "a photo of a big {c}.", + "a photo of the {c}.", + "a blurry photo of the {c}.", + "a black and white photo of the {c}.", + "a low contrast photo of the {c}.", + "a high contrast photo of the {c}.", + "a bad photo of the {c}.", + "a good photo of the {c}.", + "a photo of the small {c}.", + "a photo of the big {c}." + ], + "cifar100": [ + "a photo of a {c}.", + "a blurry photo of a {c}.", + "a black and white photo of a {c}.", + "a low contrast photo of a {c}.", + "a high contrast photo of a {c}.", + "a bad photo of a {c}.", + "a good photo of a {c}.", + "a photo of a small {c}.", + "a photo of a big {c}.", + "a photo of the {c}.", + "a blurry photo of the {c}.", + "a black and white photo of the {c}.", + "a low contrast photo of the {c}.", + "a high contrast photo of the {c}.", + "a bad photo of the {c}.", + "a good photo of the {c}.", + "a photo of the small {c}.", + "a photo of the big {c}." + ], + "imagenet1k": [ + "a bad photo of a {c}.", + "a photo of many {c}.", + "a sculpture of a {c}.", + "a photo of the hard to see {c}.", + "a low resolution photo of the {c}.", + "a rendering of a {c}.", + "graffiti of a {c}.", + "a bad photo of the {c}.", + "a cropped photo of the {c}.", + "a tattoo of a {c}.", + "the embroidered {c}.", + "a photo of a hard to see {c}.", + "a bright photo of a {c}.", + "a photo of a clean {c}.", + "a photo of a dirty {c}.", + "a dark photo of the {c}.", + "a drawing of a {c}.", + "a photo of my {c}.", + "the plastic {c}.", + "a photo of the cool {c}.", + "a close-up photo of a {c}.", + "a black and white photo of the {c}.", + "a painting of the {c}.", + "a painting of a {c}.", + "a pixelated photo of the {c}.", + "a sculpture of the {c}.", + "a bright photo of the {c}.", + "a cropped photo of a {c}.", + "a plastic {c}.", + "a photo of the dirty {c}.", + "a jpeg corrupted photo of a {c}.", + "a blurry photo of the {c}.", + "a photo of the {c}.", + "a good photo of the {c}.", + "a rendering of the {c}.", + "a {c} in a video game.", + "a photo of one {c}.", + "a doodle of a {c}.", + "a close-up photo of the {c}.", + "a photo of a {c}.", + "the origami {c}.", + "the {c} in a video game.", + "a sketch of a {c}.", + "a doodle of the {c}.", + "a origami {c}.", + "a low resolution photo of a {c}.", + "the toy {c}.", + "a rendition of the {c}.", + "a photo of the clean {c}.", + "a photo of a large {c}.", + "a rendition of a {c}.", + "a photo of a nice {c}.", + "a photo of a weird {c}.", + "a blurry photo of a {c}.", + "a cartoon {c}.", + "art of a {c}.", + "a sketch of the {c}.", + "a embroidered {c}.", + "a pixelated photo of a {c}.", + "itap of the {c}.", + "a jpeg corrupted photo of the {c}.", + "a good photo of a {c}.", + "a plushie {c}.", + "a photo of the nice {c}.", + "a photo of the small {c}.", + "a photo of the weird {c}.", + "the cartoon {c}.", + "art of the {c}.", + "a drawing of the {c}.", + "a photo of the large {c}.", + "a black and white photo of a {c}.", + "the plushie {c}.", + "a dark photo of a {c}.", + "itap of a {c}.", + "graffiti of the {c}.", + "a toy {c}.", + "itap of my {c}.", + "a photo of a cool {c}.", + "a photo of a small {c}.", + "a tattoo of the {c}." + ], + "food101": [ + "a photo of {c}, a type of food." + ], + "sun397": [ + "a photo of a {c}.", + "a photo of the {c}." + ], + "cars": [ + "a photo of a {c}.", + "a photo of the {c}.", + "a photo of my {c}.", + "i love my {c}!", + "a photo of my dirty {c}.", + "a photo of my clean {c}.", + "a photo of my new {c}.", + "a photo of my old {c}." + ], + "fgvc_aircraft": [ + "a photo of a {c}, a type of aircraft.", + "a photo of the {c}, a type of aircraft." + ], + "dtd": [ + "a photo of a {c} texture.", + "a photo of a {c} pattern.", + "a photo of a {c} thing.", + "a photo of a {c} object.", + "a photo of the {c} texture.", + "a photo of the {c} pattern.", + "a photo of the {c} thing.", + "a photo of the {c} object." + ], + "pets": [ + "a photo of a {c}, a type of pet." + ], + "caltech101": [ + "a photo of a {c}.", + "a painting of a {c}.", + "a plastic {c}.", + "a sculpture of a {c}.", + "a sketch of a {c}.", + "a tattoo of a {c}.", + "a toy {c}.", + "a rendition of a {c}.", + "a embroidered {c}.", + "a cartoon {c}.", + "a {c} in a video game.", + "a plushie {c}.", + "a origami {c}.", + "art of a {c}.", + "graffiti of a {c}.", + "a drawing of a {c}.", + "a doodle of a {c}.", + "a photo of the {c}.", + "a painting of the {c}.", + "the plastic {c}.", + "a sculpture of the {c}.", + "a sketch of the {c}.", + "a tattoo of the {c}.", + "the toy {c}.", + "a rendition of the {c}.", + "the embroidered {c}.", + "the cartoon {c}.", + "the {c} in a video game.", + "the plushie {c}.", + "the origami {c}.", + "art of the {c}.", + "graffiti of the {c}.", + "a drawing of the {c}.", + "a doodle of the {c}." + ], + "flowers": [ + "a photo of a {c}, a type of flower." + ], + "mnist": [ + "a photo of the number: \"{c}\"." + ], + "stl10": [ + "a photo of a {c}.", + "a photo of the {c}." + ], + "eurosat": [ + "a centered satellite photo of {c}.", + "a centered satellite photo of a {c}.", + "a centered satellite photo of the {c}." + ], + "gtsrb": [ + "a zoomed in photo of a \"{c}\" traffic sign.", + "a centered photo of a \"{c}\" traffic sign.", + "a close up photo of a \"{c}\" traffic sign." + ], + "country211": [ + "a photo i took in {c}.", + "a photo i took while visiting {c}.", + "a photo from my home country of {c}.", + "a photo from my visit to {c}.", + "a photo showing the country of {c}." + ], + "renderedsst2": [ + "a {c} review of a movie." + ], + "voc2007": [ + "a photo of a {c}." + ], + "voc2007_multilabel": [ + "a photo of a {c}." + ], + "fer2013": [ + "a photo of a {c} looking face.", + "a photo of a face showing the emotion: {c}.", + "a photo of a face looking {c}.", + "a face that looks {c}.", + "they look {c}.", + "look at how {c} they are." + ], + "clevr_count_all": [ + "a picture of {c} objects" + ], + "clevr_closest_object_distance": [ + "{c} shapes." + ], + "pcam": [ + "a histopathology slide showing {c}", + "histopathology image of {c}" + ], + "svhn": [ + "a photo of the number {c} written on a sign", + "an outdoor house number {c}", + "the number {c} in the center of the image", + "an outdoor number {c} writte on a sign", + "an outdoor number {c}", + "a centered image of the number {c}" + ], + "resisc45": [ + "a sattelite image of {c}", + "an aerial view of {c}", + "a sattelite photo of {c}", + "{c} from above" + ], + "kitti_closest_vehicle_distance": [ + "{c}" + ], + "smallnorb_label_azimuth": [ + "an object rotated at {c}", + "something rotated at {c}", + "{c} rotation", + "something at a {c} angle" + ], + "smallnorb_label_elevation": [ + "an object rotated at {c}", + "something rotated at {c}", + "{c} rotation", + "something at a {c} angle" + ], + "dsprites_label_x_position": [ + "an object located at position {c}% on the horizontal axis" + ], + "dsprites_label_orientation": [ + "an object rotated at {c}", + "something rotated at {c}", + "{c} rotation", + "something at a {c} angle" + ], + "dmlab": [ + "{c}" + ], + "diabetic_retinopathy": [ + "a retinal image with {c}" + ], + "dummy": [ + "a photo of a {c}" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flickr.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flickr.py new file mode 100644 index 0000000000000000000000000000000000000000..6097537d9b0f542d7fbaa148ab45e8db0050536e --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flickr.py @@ -0,0 +1,62 @@ +""" +Adapted from https://github.com/pytorch/vision/blob/main/torchvision/datasets/flickr.py +Thanks to the authors of torchvision +""" +from collections import defaultdict +import glob +import os +from collections import defaultdict +from html.parser import HTMLParser +from typing import Any, Callable, Dict, List, Optional, Tuple + +from PIL import Image +from torchvision.datasets import VisionDataset + +class Flickr(VisionDataset): + + def __init__( + self, + root: str, + ann_file: str, + transform: Optional[Callable] = None, + target_transform: Optional[Callable] = None, + ) -> None: + super().__init__(root, transform=transform, target_transform=target_transform) + self.ann_file = os.path.expanduser(ann_file) + data = defaultdict(list) + with open(ann_file) as fd: + fd.readline() + for line in fd: + line = line.strip() + if line: + # some lines have comma in the caption, se we make sure we do the split correctly + img, caption = line.strip().split(".jpg,") + img = img + ".jpg" + data[img].append(caption) + self.data = list(data.items()) + + def __getitem__(self, index: int) -> Tuple[Any, Any]: + """ + Args: + index (int): Index + + Returns: + tuple: Tuple (image, target). target is a list of captions for the image. + """ + img, captions = self.data[index] + + # Image + img = Image.open(os.path.join(self.root, img)).convert("RGB") + if self.transform is not None: + img = self.transform(img) + + # Captions + target = captions + if self.target_transform is not None: + target = self.target_transform(target) + + return img, target + + + def __len__(self) -> int: + return len(self.data) \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flickr30k_200.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flickr30k_200.py new file mode 100644 index 0000000000000000000000000000000000000000..c603f0f2f48f596afa564eb1777bd38993c3529f --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flickr30k_200.py @@ -0,0 +1,118 @@ +import codecs +import json +import os +from subprocess import call + +import requests +from PIL import Image +from torchvision.datasets import VisionDataset + +from .flores_langs import flores_languages + +GITHUB_DATA_PATH = ( + "https://raw.githubusercontent.com/visheratin/nllb-clip/main/data/flickr30k-200/" +) +SUPPORTED_LANGUAGES = flores_languages + +IMAGE_INDEX_FILENAME = "filenames.txt" + +CAPTIONS_FILENAME_TEMPLATE = "{}.txt" +OUTPUT_FILENAME_TEMPLATE = "flickr30k_200-{}.json" + +IMAGES_DOWNLOAD_URL = "https://nllb-data.com/test/flickr30k/images.tar.gz" + + +class Flickr30k_200(VisionDataset): + def __init__(self, root, ann_file, transform=None, target_transform=None): + super().__init__(root, transform=transform, target_transform=target_transform) + self.ann_file = os.path.expanduser(ann_file) + with codecs.open(ann_file, "r", encoding="utf-8") as fp: + data = json.load(fp) + self.data = [ + (img_path, txt) + for img_path, txt in zip(data["image_paths"], data["annotations"]) + ] + + def __getitem__(self, index): + img, captions = self.data[index] + + # Image + img = Image.open(img).convert("RGB") + if self.transform is not None: + img = self.transform(img) + + # Captions + target = [ + captions, + ] + if self.target_transform is not None: + target = self.target_transform(target) + + return img, target + + def __len__(self) -> int: + return len(self.data) + + +def _get_lines(url): + response = requests.get(url, timeout=30) + return response.text.splitlines() + + +def _download_images(out_path): + os.makedirs(out_path, exist_ok=True) + print("Downloading images") + call(f"wget {IMAGES_DOWNLOAD_URL} -O images.tar.gz", shell=True) + call(f"tar -xzf images.tar.gz -C {out_path}", shell=True) + call("rm images.tar.gz", shell=True) + +def create_annotation_file(root, lang_code): + if lang_code not in SUPPORTED_LANGUAGES: + raise ValueError( + f"Language code {lang_code} not supported. Supported languages are {SUPPORTED_LANGUAGES}" + ) + data_dir = os.path.join(root, "flickr30k-200") + if not os.path.exists(data_dir): + _download_images(data_dir) + images_dir = os.path.join(root, "flickr30k-200", "images") + print("Downloading flickr30k-200 index file") + download_path = os.path.join(GITHUB_DATA_PATH, IMAGE_INDEX_FILENAME) + target_images = _get_lines(download_path) + + print("Downloading flickr30k-200 captions:", lang_code) + captions_path = GITHUB_DATA_PATH + download_path = os.path.join( + captions_path, CAPTIONS_FILENAME_TEMPLATE.format(lang_code) + ) + target_captions = _get_lines(download_path) + + number_of_missing_images = 0 + valid_images, valid_annotations, valid_indicies = [], [], [] + for i, (img, txt) in enumerate(zip(target_images, target_captions)): + image_path = os.path.join(images_dir, img) + if not os.path.exists(image_path): + print("Missing image file", img) + number_of_missing_images += 1 + continue + + valid_images.append(image_path) + valid_annotations.append(txt) + valid_indicies.append(i) + + if number_of_missing_images > 0: + print(f"*** WARNING *** missing {number_of_missing_images} files.") + + with codecs.open( + os.path.join(root, OUTPUT_FILENAME_TEMPLATE.format(lang_code)), + "w", + encoding="utf-8", + ) as fp: + json.dump( + { + "image_paths": valid_images, + "annotations": valid_annotations, + "indicies": valid_indicies, + }, + fp, + ensure_ascii=False, + ) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flores_langs.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flores_langs.py new file mode 100644 index 0000000000000000000000000000000000000000..928a3c1ab5ea3621485b3a0189529987850cf599 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/flores_langs.py @@ -0,0 +1,203 @@ +flores_languages = [ + "ace_Arab", + "ace_Latn", + "acm_Arab", + "acq_Arab", + "aeb_Arab", + "afr_Latn", + "ajp_Arab", + "aka_Latn", + "amh_Ethi", + "apc_Arab", + "arb_Arab", + "ars_Arab", + "ary_Arab", + "arz_Arab", + "asm_Beng", + "ast_Latn", + "awa_Deva", + "ayr_Latn", + "azb_Arab", + "azj_Latn", + "bak_Cyrl", + "bam_Latn", + "ban_Latn", + "bel_Cyrl", + "bem_Latn", + "ben_Beng", + "bho_Deva", + "bjn_Arab", + "bjn_Latn", + "bod_Tibt", + "bos_Latn", + "bug_Latn", + "bul_Cyrl", + "cat_Latn", + "ceb_Latn", + "ces_Latn", + "cjk_Latn", + "ckb_Arab", + "crh_Latn", + "cym_Latn", + "dan_Latn", + "deu_Latn", + "dik_Latn", + "dyu_Latn", + "dzo_Tibt", + "eng_Latn", + "ell_Grek", + "epo_Latn", + "est_Latn", + "eus_Latn", + "ewe_Latn", + "fao_Latn", + "fij_Latn", + "fin_Latn", + "fon_Latn", + "fra_Latn", + "fur_Latn", + "fuv_Latn", + "gla_Latn", + "gle_Latn", + "glg_Latn", + "grn_Latn", + "guj_Gujr", + "hat_Latn", + "hau_Latn", + "heb_Hebr", + "hin_Deva", + "hne_Deva", + "hrv_Latn", + "hun_Latn", + "hye_Armn", + "ibo_Latn", + "ilo_Latn", + "ind_Latn", + "isl_Latn", + "ita_Latn", + "jav_Latn", + "jpn_Jpan", + "kab_Latn", + "kac_Latn", + "kam_Latn", + "kan_Knda", + "kas_Arab", + "kas_Deva", + "kat_Geor", + "knc_Arab", + "knc_Latn", + "kaz_Cyrl", + "kbp_Latn", + "kea_Latn", + "khm_Khmr", + "kik_Latn", + "kin_Latn", + "kir_Cyrl", + "kmb_Latn", + "kmr_Latn", + "kon_Latn", + "kor_Hang", + "lao_Laoo", + "lij_Latn", + "lim_Latn", + "lin_Latn", + "lit_Latn", + "lmo_Latn", + "ltg_Latn", + "ltz_Latn", + "lua_Latn", + "lug_Latn", + "luo_Latn", + "lus_Latn", + "lvs_Latn", + "mag_Deva", + "mai_Deva", + "mal_Mlym", + "mar_Deva", + "min_Latn", + "mkd_Cyrl", + "plt_Latn", + "mlt_Latn", + "mni_Beng", + "khk_Cyrl", + "mos_Latn", + "mri_Latn", + "mya_Mymr", + "nld_Latn", + "nno_Latn", + "nob_Latn", + "npi_Deva", + "nso_Latn", + "nus_Latn", + "nya_Latn", + "oci_Latn", + "gaz_Latn", + "ory_Orya", + "pag_Latn", + "pan_Guru", + "pap_Latn", + "pes_Arab", + "pol_Latn", + "por_Latn", + "prs_Arab", + "pbt_Arab", + "quy_Latn", + "ron_Latn", + "run_Latn", + "rus_Cyrl", + "sag_Latn", + "san_Deva", + "scn_Latn", + "shn_Mymr", + "sin_Sinh", + "slk_Latn", + "slv_Latn", + "smo_Latn", + "sna_Latn", + "snd_Arab", + "som_Latn", + "sot_Latn", + "spa_Latn", + "als_Latn", + "srd_Latn", + "srp_Cyrl", + "ssw_Latn", + "sun_Latn", + "swe_Latn", + "swh_Latn", + "szl_Latn", + "tam_Taml", + "tat_Cyrl", + "tel_Telu", + "tgk_Cyrl", + "tgl_Latn", + "tha_Thai", + "tir_Ethi", + "taq_Latn", + "taq_Tfng", + "tpi_Latn", + "tsn_Latn", + "tso_Latn", + "tuk_Latn", + "tum_Latn", + "tur_Latn", + "twi_Latn", + "tzm_Tfng", + "uig_Arab", + "ukr_Cyrl", + "umb_Latn", + "urd_Arab", + "uzn_Latn", + "vec_Latn", + "vie_Latn", + "war_Latn", + "wol_Latn", + "xho_Latn", + "ydd_Hebr", + "yor_Latn", + "yue_Hant", + "zho_Hans", + "zho_Hant", + "zsm_Latn", + "zul_Latn", +] diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/imagenetv2.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/imagenetv2.py new file mode 100644 index 0000000000000000000000000000000000000000..83885f1d35149569db829541d5b1d701f0d3c324 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/imagenetv2.py @@ -0,0 +1,98 @@ +""" +Code from https://github.com/mlfoundations/wise-ft/blob/master/src/datasets/imagenetv2.py +Thanks to the authors of wise-ft +""" +import pathlib +import tarfile +import requests +import shutil + +from PIL import Image +from tqdm import tqdm +from torch.utils.data import Dataset, DataLoader +from torchvision.datasets import ImageFolder + +URLS = {"matched-frequency" : "https://imagenetv2public.s3-us-west-2.amazonaws.com/imagenetv2-matched-frequency.tar.gz", + "threshold-0.7" : "https://imagenetv2public.s3-us-west-2.amazonaws.com/imagenetv2-threshold0.7.tar.gz", + "top-images": "https://imagenetv2public.s3-us-west-2.amazonaws.com/imagenetv2-top-images.tar.gz", + "val": "https://imagenetv2public.s3-us-west-2.amazonaws.com/imagenet_validation.tar.gz"} + +FNAMES = {"matched-frequency" : "imagenetv2-matched-frequency-format-val", + "threshold-0.7" : "imagenetv2-threshold0.7-format-val", + "top-images": "imagenetv2-top-images-format-val", + "val": "imagenet_validation"} + + +V2_DATASET_SIZE = 10000 +VAL_DATASET_SIZE = 50000 + +class ImageNetValDataset(Dataset): + def __init__(self, transform=None, location="."): + self.dataset_root = pathlib.Path(f"{location}/imagenet_validation/") + self.tar_root = pathlib.Path(f"{location}/imagenet_validation.tar.gz") + self.fnames = list(self.dataset_root.glob("**/*.JPEG")) + self.transform = transform + if not self.dataset_root.exists() or len(self.fnames) != VAL_DATASET_SIZE: + if not self.tar_root.exists(): + print(f"Dataset imagenet-val not found on disk, downloading....") + response = requests.get(URLS["val"], stream=True) + total_size_in_bytes= int(response.headers.get('content-length', 0)) + block_size = 1024 #1 Kibibyte + progress_bar = tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True) + with open(self.tar_root, 'wb') as f: + for data in response.iter_content(block_size): + progress_bar.update(len(data)) + f.write(data) + progress_bar.close() + if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes: + assert False, f"Downloading from {URLS[variant]} failed" + print("Extracting....") + tarfile.open(self.tar_root).extractall(f"{location}") + shutil.move(f"{location}/{FNAMES['val']}", self.dataset_root) + + self.dataset = ImageFolder(self.dataset_root) + + def __len__(self): + return len(self.dataset) + + def __getitem__(self, i): + img, label = self.dataset[i] + if self.transform is not None: + img = self.transform(img) + return img, label + +class ImageNetV2Dataset(Dataset): + def __init__(self, variant="matched-frequency", transform=None, location="."): + self.dataset_root = pathlib.Path(f"{location}/ImageNetV2-{variant}/") + self.tar_root = pathlib.Path(f"{location}/ImageNetV2-{variant}.tar.gz") + self.fnames = list(self.dataset_root.glob("**/*.jpeg")) + self.transform = transform + assert variant in URLS, f"unknown V2 Variant: {variant}" + if not self.dataset_root.exists() or len(self.fnames) != V2_DATASET_SIZE: + if not self.tar_root.exists(): + print(f"Dataset {variant} not found on disk, downloading....") + response = requests.get(URLS[variant], stream=True) + total_size_in_bytes= int(response.headers.get('content-length', 0)) + block_size = 1024 #1 Kibibyte + progress_bar = tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True) + with open(self.tar_root, 'wb') as f: + for data in response.iter_content(block_size): + progress_bar.update(len(data)) + f.write(data) + progress_bar.close() + if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes: + assert False, f"Downloading from {URLS[variant]} failed" + print("Extracting....") + tarfile.open(self.tar_root).extractall(f"{location}") + shutil.move(f"{location}/{FNAMES[variant]}", self.dataset_root) + self.fnames = list(self.dataset_root.glob("**/*.jpeg")) + + + def __len__(self): + return len(self.fnames) + + def __getitem__(self, i): + img, label = Image.open(self.fnames[i]), int(self.fnames[i].parent.name) + if self.transform is not None: + img = self.transform(img) + return img, label \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/it_classnames.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/it_classnames.json new file mode 100644 index 0000000000000000000000000000000000000000..3d71c6bdf7a7c0205c34eb69a993454cf37fcf46 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/it_classnames.json @@ -0,0 +1,1004 @@ +{ + "imagenet1k": [ + "una tinca", + "un pesce rosso", + "un grande squalo bianco", + "uno squalo tigre", + "un pesce martello", + "un raggio elettrico", + "una pastinaca", + "un gallo", + "una gallina", + "uno struzzo", + "un rovo", + "un cardellino", + "un fringuello di casa", + "un giunco", + "uno zigolo indaco", + "un pettirosso", + "un bulbul", + "una ghiandaia", + "una gazza", + "una cinciallegra", + "un'ouzel d'acqua", + "un aquilone", + "un'aquila calva", + "un avvoltoio", + "un grande gufo grigio", + "una salamandra da fuoco europea", + "un tritone comune", + "a eft", + "una salamandra pezzata", + "un axolotl", + "una rana toro", + "una raganella", + "una rana con la coda", + "una testa di toro", + "una tartaruga di cuoio", + "una tartaruga di fango", + "una tartaruga", + "una tartaruga di scatola", + "un geco a bande", + "un'iguana comune", + "un camaleonte americano", + "una coda di frusta", + "a agama", + "una lucertola con le ali", + "una lucertola alligatore", + "un mostro di Gila", + "una lucertola verde", + "un camaleonte africano", + "un drago di Komodo", + "un coccodrillo africano", + "un alligatore americano", + "un triceratopo", + "un serpente di tuono", + "un serpente ringneck", + "un serpente hognose", + "un serpente verde", + "un serpente re", + "un serpente giarrettiera", + "un serpente d'acqua", + "un serpente a forma di vite", + "un serpente notturno", + "un boa constrictor", + "un pitone delle rocce", + "un cobra indiano", + "un mamba verde", + "un serpente di mare", + "una vipera cornuta", + "un diamondback", + "un sidewinder", + "un trilobite", + "un raccoglitore", + "uno scorpione", + "un ragno da giardino nero e oro", + "un ragno da fienile", + "un ragno del giardino", + "una vedova nera", + "una tarantola", + "un ragno lupo", + "un segno di spunta", + "un millepiedi", + "un fagiano di monte", + "pernice bianca", + "un gallo cedrone", + "un pollo della prateria", + "un pavone", + "una quaglia", + "una pernice", + "un grigio africano", + "un'ara", + "un cacatua dalla cresta sulfurea", + "un lorichetto", + "una coucal", + "un mangiatore di api", + "un bucerotide", + "un colibr\u00ec", + "un jacamar", + "un tucano", + "un drake", + "un merganser dal petto rosso", + "un'oca", + "un cigno nero", + "un tusker", + "un echidna", + "un ornitorinco", + "un wallaby", + "un koala", + "un vombato", + "una medusa", + "un anemone di mare", + "un corallo del cervello", + "un verme piatto", + "un nematode", + "uno strombo", + "una lumaca", + "una lumaca", + "una lumaca di mare", + "un chitone", + "un nautilus a camera", + "un granchio di Dungeness", + "un granchio di roccia", + "un granchio violinista", + "un granchio reale", + "un'aragosta americana", + "un'aragosta spinosa", + "un gambero di fiume", + "un paguro", + "un isopode", + "una cicogna bianca", + "una cicogna nera", + "una spatola", + "un fenicottero", + "un piccolo airone blu", + "una garzetta americana", + "un tarabuso", + "una gru", + "un moscerino", + "un gallinaccio europeo", + "una folaga americana", + "un'otarda", + "una pietra focaia rubiconda", + "un piovanello dal dorso rosso", + "una pettegola", + "una dowitcher", + "una beccaccia di mare", + "un pellicano", + "un pinguino reale", + "un albatros", + "una balena grigia", + "un'orca assassina", + "un dugongo", + "un leone marino", + "un chihuahua", + "uno spaniel giapponese", + "un cane maltese", + "un pechinese", + "uno Shih-Tzu", + "uno spaniel Blenheim", + "un papillon", + "un terrier giocattolo", + "un Rhodesian ridgeback", + "un segugio afgano", + "un bassotto", + "un beagle", + "un segugio", + "un bluetick", + "un coonhound nero e marrone", + "un segugio Walker", + "un foxhound inglese", + "un osso rosso", + "un borzoi", + "un cane lupo irlandese", + "un levriero italiano", + "un whippet", + "un segugio ibizenco", + "un elkhound norvegese", + "una lontra", + "un Saluki", + "un deerhound scozzese", + "un Weimaraner", + "uno Staffordshire bullterrier", + "un American Staffordshire terrier", + "un Bedlington terrier", + "un Border terrier", + "un Kerry blue terrier", + "un terrier irlandese", + "un Norfolk terrier", + "un Norwich terrier", + "uno Yorkshire terrier", + "un fox terrier a pelo corto", + "un Lakeland terrier", + "un Sealyham terrier", + "un Airedale", + "un tumulo", + "un terrier australiano", + "un Dandie Dinmont", + "un toro di Boston", + "uno schnauzer in miniatura", + "uno schnauzer gigante", + "uno schnauzer standard", + "un terrier scozzese", + "un terrier tibetano", + "un terrier di seta", + "un wheaten terrier a pelo morbido", + "un West Highland white terrier", + "a Lhasa", + "un flat-coated retriever", + "un retriever a pelo riccio", + "un golden retriever", + "un Labrador retriever", + "un Chesapeake Bay retriever", + "un pointer tedesco a pelo corto", + "un vizsla", + "un setter inglese", + "un setter irlandese", + "un setter Gordon", + "un Brittany spaniel", + "un idraulico", + "uno springer inglese", + "uno springer spaniel gallese", + "un cocker spaniel", + "uno spaniel del Sussex", + "uno spaniel d'acqua irlandese", + "un kuvasz", + "uno schipperke", + "una groenendael", + "un malinois", + "una briarda", + "un kelpie", + "un komondor", + "un vecchio cane da pastore inglese", + "un cane da pastore Shetland", + "un collie", + "un Border collie", + "un Bouvier des Flandres", + "un Rottweiler", + "un pastore tedesco", + "un dobermann", + "un pinscher in miniatura", + "un cane da montagna svizzero maggiore", + "un cane di montagna bernese", + "un Appenzeller", + "a EntleBucher", + "un pugile", + "un mastino toro", + "un mastino tibetano", + "un bulldog francese", + "un alano", + "un San Bernardo", + "un cane eschimese", + "un malamute", + "un Siberian husky", + "un dalmata", + "un affenpinscher", + "un basenji", + "un carlino", + "a Leonberg", + "un Terranova", + "un Grande Pireneo", + "un samoiedo", + "un Pomerania", + "un chow", + "un keeshond", + "un grifone di Brabancon", + "un Pembroke", + "un cardigan", + "un barboncino giocattolo", + "un barboncino in miniatura", + "un barboncino standard", + "un messicano senza capelli", + "un lupo di legno", + "un lupo bianco", + "un lupo rosso", + "un coyote", + "un dingo", + "un dhole", + "un cane da caccia africano", + "una iena", + "una volpe rossa", + "una volpe di kit", + "una volpe artica", + "una volpe grigia", + "un soriano", + "un gatto tigrato", + "un gatto persiano", + "un gatto siamese", + "un gatto egiziano", + "un puma", + "una lince", + "un leopardo", + "un leopardo delle nevi", + "un giaguaro", + "un leone", + "una tigre", + "un ghepardo", + "un orso bruno", + "un orso nero americano", + "un orso di ghiaccio", + "un orso bradipo", + "una mangusta", + "un suricato", + "uno scarabeo tigre", + "una coccinella", + "uno scarabeo di terra", + "uno scarabeo dalle lunghe corna", + "uno scarabeo delle foglie", + "uno scarabeo stercorario", + "uno scarabeo rinoceronte", + "un tonchio", + "una mosca", + "un'ape", + "una formica", + "una cavalletta", + "un grillo", + "un bastone da passeggio", + "uno scarafaggio", + "una mantide", + "una cicala", + "una cavalletta", + "un pizzo", + "una libellula", + "una damigella", + "un ammiraglio", + "un ricciolo", + "un monarca", + "una farfalla cavolo", + "una farfalla sulfurea", + "un licaenide", + "una stella marina", + "un riccio di mare", + "un cetriolo di mare", + "un coniglio di legno", + "una lepre", + "un angora", + "un criceto", + "un porcospino", + "uno scoiattolo volpe", + "una marmotta", + "un castoro", + "un porcellino d'India", + "un'acetosa", + "una zebra", + "un maiale", + "un cinghiale", + "un facocero", + "un ippopotamo", + "un bue", + "un bufalo d'acqua", + "un bisonte", + "ariete", + "un bighorn", + "uno stambecco", + "un alcefalo", + "un impala", + "una gazzella", + "un cammello arabo", + "un lama", + "una donnola", + "un visone", + "una puzzola", + "un furetto dai piedi neri", + "una lontra", + "una puzzola", + "un tasso", + "un armadillo", + "un bradipo a tre dita", + "un orango", + "un gorilla", + "uno scimpanz\u00e9", + "un gibbone", + "un siamang", + "un cercopiteco", + "un patas", + "un babbuino", + "un macaco", + "un langur", + "un colobo", + "una scimmia proboscide", + "uno uistit\u00ec", + "un cappuccino", + "una scimmia urlatrice", + "un titi", + "una scimmia ragno", + "una scimmia scoiattolo", + "un gatto del Madagascar", + "un indri", + "un elefante indiano", + "un elefante africano", + "un panda minore", + "un panda gigante", + "un barracuda", + "un'anguilla", + "un coho", + "una bellezza di roccia", + "un pesce anemone", + "uno storione", + "un capo d'abbigliamento", + "un pesce leone", + "un puffer", + "un abaco", + "un abaya", + "un abito accademico", + "una fisarmonica", + "una chitarra acustica", + "una portaerei", + "un aereo di linea", + "un dirigibile", + "un altare", + "un'ambulanza", + "un anfibio", + "un orologio analogico", + "un apiario", + "un grembiule", + "un frassino", + "un fucile d'assalto", + "uno zaino", + "un panificio", + "una trave di equilibrio", + "un pallone", + "una penna a sfera", + "un cerotto", + "un banjo", + "una balaustra", + "un bilanciere", + "una sedia da barbiere", + "un barbiere", + "un fienile", + "un barometro", + "un barile", + "un carretto", + "una palla da baseball", + "una pallacanestro", + "una culla", + "un fagotto", + "un berretto da bagno", + "un asciugamano da bagno", + "una vasca da bagno", + "un carro da spiaggia", + "un faro", + "un bicchiere", + "una pelle d'orso", + "una bottiglia di birra", + "un bicchiere di birra", + "un campanile", + "un bavaglino", + "una bicicletta costruita per due", + "un bikini", + "un raccoglitore", + "un binocolo", + "una casetta per uccelli", + "una rimessa per barche", + "un bob", + "una cravatta bolo", + "un cofano", + "una libreria", + "una libreria", + "un tappo di bottiglia", + "un arco", + "un papillon", + "un ottone", + "un reggiseno", + "un frangiflutti", + "una corazza", + "una scopa", + "un secchio", + "una fibbia", + "un giubbotto antiproiettile", + "un treno proiettile", + "una macelleria", + "un taxi", + "un calderone", + "una candela", + "un cannone", + "una canoa", + "un apriscatole", + "un cardigan", + "uno specchio per auto", + "una giostra", + "un kit da falegname", + "un cartone", + "una ruota di automobile", + "un bancomat", + "una cassetta", + "un lettore di cassette", + "un castello", + "un catamarano", + "un lettore CD", + "un violoncello", + "un telefono cellulare", + "una catena", + "una recinzione di rete metallica", + "una cotta di maglia", + "una motosega", + "un petto", + "una chiffoniera", + "una suoneria", + "una vetrina per porcellane", + "una calza di Natale", + "una chiesa", + "un cinema", + "una mannaia", + "una dimora sulla scogliera", + "un mantello", + "un intasamento", + "uno shaker da cocktail", + "una tazza da caff\u00e8", + "una caffettiera", + "una bobina", + "una serratura a combinazione", + "una tastiera di computer", + "una pasticceria", + "una nave container", + "una convertibile", + "un cavatappi", + "una cornetta", + "uno stivale da cowboy", + "un cappello da cowboy", + "una culla", + "una gru", + "un casco di protezione", + "una cassa", + "una culla", + "una pentola di coccio", + "una palla da croquet", + "una stampella", + "una corazza", + "una diga", + "una scrivania", + "un computer da tavolo", + "un telefono a selezione", + "un pannolino", + "un orologio digitale", + "un orologio digitale", + "un tavolo da pranzo", + "uno strofinaccio", + "una lavastoviglie", + "un freno a disco", + "un molo", + "una slitta trainata da cani", + "una cupola", + "uno zerbino", + "una piattaforma di perforazione", + "un tamburo", + "una bacchetta", + "un manubrio", + "un forno olandese", + "un ventilatore elettrico", + "una chitarra elettrica", + "una locomotiva elettrica", + "un centro di intrattenimento", + "una busta", + "una macchina per il caff\u00e8 espresso", + "una polvere per il viso", + "un boa di piume", + "un file", + "una barca antincendio", + "un'autopompa", + "uno schermo per il fuoco", + "un pennone", + "un flauto", + "una sedia pieghevole", + "un casco da calcio", + "un carrello elevatore", + "una fontana", + "una penna stilografica", + "un baldacchino", + "un vagone merci", + "un corno francese", + "una padella", + "una pelliccia", + "un camion della spazzatura", + "una maschera antigas", + "una pompa di benzina", + "un calice", + "un go-kart", + "una pallina da golf", + "un golfcart", + "una gondola", + "un gong", + "un abito", + "un pianoforte a coda", + "una serra", + "una griglia", + "un negozio di alimentari", + "una ghigliottina", + "uno scivolo per capelli", + "una lacca per capelli", + "una mezza traccia", + "un martello", + "un cesto regalo", + "un soffiatore a mano", + "un computer portatile", + "un fazzoletto", + "un disco rigido", + "un'armonica", + "un'arpa", + "una mietitrice", + "un'accetta", + "una fondina", + "un home theater", + "un nido d'ape", + "un gancio", + "una gonna a cerchio", + "una barra orizzontale", + "un carro di cavalli", + "una clessidra", + "un iPod", + "un ferro da stiro", + "una zucca", + "un jeans", + "una jeep", + "una maglia", + "un puzzle", + "a jinrikisha", + "un joystick", + "un kimono", + "una ginocchiera", + "un nodo", + "un camice da laboratorio", + "un mestolo", + "un paralume", + "un computer portatile", + "un tosaerba", + "un copriobiettivo", + "un tagliacarte", + "una biblioteca", + "una scialuppa di salvataggio", + "un accendino", + "una limousine", + "una fodera", + "un rossetto", + "un mocassino", + "una lozione", + "un altoparlante", + "una lente d'ingrandimento", + "una segheria", + "una bussola magnetica", + "una borsa della posta", + "una cassetta postale", + "un maillot", + "un maillot", + "un tombino", + "una maraca", + "una marimba", + "una maschera", + "un fiammifero", + "un palo di maggio", + "un labirinto", + "un misurino", + "una cassetta dei medicinali", + "un megalite", + "un microfono", + "un microonde", + "un'uniforme militare", + "una lattina di latte", + "un minibus", + "una minigonna", + "un minivan", + "un missile", + "un guanto", + "una ciotola di miscelazione", + "una casa mobile", + "un Modello T", + "un modem", + "un monastero", + "un monitor", + "un ciclomotore", + "un mortaio", + "una mortarboard", + "una moschea", + "una zanzariera", + "uno scooter", + "una bicicletta di montagna", + "una tenda di montagna", + "un topo", + "una trappola per topi", + "un furgone per traslochi", + "una museruola", + "un chiodo", + "un tutore per il collo", + "una collana", + "un capezzolo", + "un quaderno", + "un obelisco", + "un oboe", + "un'ocarina", + "un contachilometri", + "un filtro dell'olio", + "un organo", + "un oscilloscopio", + "una sopragonna", + "un carro da buoi", + "una maschera di ossigeno", + "un pacchetto", + "una pagaia", + "una ruota a pale", + "un lucchetto", + "un pennello", + "un pigiama", + "un palazzo", + "una panpipe", + "un tovagliolo di carta", + "un paracadute", + "una barra parallela", + "una panchina del parco", + "un parchimetro", + "un'autovettura", + "un patio", + "un telefono a pagamento", + "un piedistallo", + "una scatola di matite", + "un temperamatite", + "un profumo", + "una capsula di Petri", + "una fotocopiatrice", + "un grimaldello", + "un picconatore", + "una staccionata", + "un prelievo", + "un molo", + "un salvadanaio", + "una bottiglia di pillole", + "un cuscino", + "una pallina da ping-pong", + "una girandola", + "un pirata", + "un lanciatore", + "un aereo", + "un planetario", + "un sacchetto di plastica", + "un portapiatti", + "un aratro", + "uno stantuffo", + "una macchina fotografica Polaroid", + "un palo", + "un furgone della polizia", + "un poncho", + "un tavolo da biliardo", + "una bottiglia pop", + "una pentola", + "un tornio da vasaio", + "un trapano elettrico", + "un tappeto di preghiera", + "una stampante", + "una prigione", + "un proiettile", + "un proiettore", + "un disco", + "un sacco da boxe", + "una borsa", + "una penna d'oca", + "una trapunta", + "un corridore", + "una racchetta", + "un radiatore", + "una radio", + "un radiotelescopio", + "un barile per la pioggia", + "un veicolo ricreativo", + "una bobina", + "una macchina fotografica reflex", + "un frigorifero", + "un telecomando", + "un ristorante", + "un revolver", + "un fucile", + "una sedia a dondolo", + "un girarrosto", + "una gomma da cancellare", + "un pallone da rugby", + "una regola", + "una scarpa da corsa", + "una cassaforte", + "una spilla da balia", + "una saliera", + "un sandalo", + "un sarong", + "un sassofono", + "un fodero", + "una scala", + "uno scuolabus", + "una goletta", + "un tabellone segnapunti", + "uno schermo", + "una vite", + "un cacciavite", + "una cintura di sicurezza", + "una macchina da cucire", + "uno scudo", + "un negozio di scarpe", + "uno shoji", + "un cestino della spesa", + "un carrello della spesa", + "una pala", + "una cuffia da doccia", + "una tenda da doccia", + "uno sci", + "un passamontagna", + "un sacco a pelo", + "un regolo calcolatore", + "una porta scorrevole", + "una fessura", + "un boccaglio", + "una motoslitta", + "uno spazzaneve", + "un distributore di sapone", + "un pallone da calcio", + "un calzino", + "un piatto solare", + "un sombrero", + "una ciotola per la zuppa", + "una barra spaziatrice", + "una stufa per ambienti", + "una navetta spaziale", + "una spatola", + "un motoscafo", + "una ragnatela", + "un mandrino", + "un'auto sportiva", + "un riflettore", + "una fase", + "una locomotiva a vapore", + "un ponte ad arco in acciaio", + "un tamburo d'acciaio", + "uno stetoscopio", + "una stola", + "un muro di pietra", + "un cronometro", + "una stufa", + "un colino", + "un tram", + "una barella", + "un divano da studio", + "uno stupa", + "un sottomarino", + "un vestito", + "una meridiana", + "un occhiale da sole", + "occhiali da sole", + "una protezione solare", + "un ponte sospeso", + "un tampone", + "una felpa", + "un costume da bagno", + "un'altalena", + "un interruttore", + "una siringa", + "una lampada da tavolo", + "un carro armato", + "un lettore di nastri", + "una teiera", + "un orsacchiotto", + "una televisione", + "una palla da tennis", + "una paglia", + "un sipario teatrale", + "un ditale", + "una trebbiatrice", + "un trono", + "un tetto di tegole", + "un tostapane", + "un negozio di tabacco", + "un sedile del water", + "una torcia", + "un totem", + "un carro attrezzi", + "un negozio di giocattoli", + "un trattore", + "un camion con rimorchio", + "un vassoio", + "un trench", + "un triciclo", + "un trimarano", + "un treppiede", + "un arco di trionfo", + "un filobus", + "un trombone", + "una vasca da bagno", + "un tornello", + "una tastiera per macchina da scrivere", + "un ombrello", + "un monociclo", + "un montante", + "un vuoto", + "un vaso", + "una volta", + "un velluto", + "un distributore automatico", + "un paramento", + "un viadotto", + "un violino", + "una pallavolo", + "una piastra per cialde", + "un orologio da parete", + "un portafoglio", + "un armadio", + "un aereo da guerra", + "un lavandino", + "una rondella", + "una bottiglia d'acqua", + "una brocca d'acqua", + "una torre d'acqua", + "una brocca di whisky", + "un fischio", + "una parrucca", + "uno schermo per finestre", + "una tenda per finestre", + "una cravatta Windsor", + "una bottiglia di vino", + "un'ala", + "un wok", + "un cucchiaio di legno", + "una lana", + "un recinto di vermi", + "un relitto", + "uno yawl", + "una yurta", + "un sito web", + "un fumetto", + "un cruciverba", + "un cartello stradale", + "un semaforo", + "una giacca del libro", + "un menu", + "un piatto", + "un guacamole", + "un consomme", + "una pentola calda", + "un'inezia", + "un gelato", + "un ghiacciolo", + "una pagnotta francese", + "un bagel", + "un pretzel", + "un cheeseburger", + "un hotdog", + "un pur\u00e8 di patate", + "una testa di cavolo", + "un broccolo", + "un cavolfiore", + "una zucchina", + "una zucca per spaghetti", + "una zucca", + "una zucca butternut", + "un cetriolo", + "un carciofo", + "un peperone", + "un cardo", + "un fungo", + "una Granny Smith", + "una fragola", + "un'arancia", + "un limone", + "un fico", + "un ananas", + "una banana", + "un jackfruit", + "una mela custard", + "un melograno", + "un fieno", + "una carbonara", + "una salsa al cioccolato", + "un impasto", + "un polpettone", + "una pizza", + "una torta salata", + "un burrito", + "un vino rosso", + "un espresso", + "una tazza", + "uno zabaione", + "a alpe", + "una bolla", + "una scogliera", + "una barriera corallina", + "un geyser", + "un lago", + "un promontorio", + "un banco di sabbia", + "una riva del mare", + "una valle", + "un vulcano", + "un giocatore di pallone", + "uno sposo", + "un subacqueo", + "un seme di colza", + "una margherita", + "una pantofola gialla da donna", + "un mais", + "una ghianda", + "un'anca", + "un buckeye", + "un fungo corallino", + "un agarico", + "un gyromitra", + "una spina dorsale", + "una stella di terra", + "una gallina dei boschi", + "un boleto", + "un orecchio", + "una carta igienica" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/it_zeroshot_classification_templates.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/it_zeroshot_classification_templates.json new file mode 100644 index 0000000000000000000000000000000000000000..cf93a4e8ce7f01fb10f5276a5d6171eb3043de15 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/it_zeroshot_classification_templates.json @@ -0,0 +1,53 @@ +{ + "imagenet1k": [ + "una brutta foto di {c}", + "una scultura di {c}", + "una foto di {c} difficilmente visibile", + "una foto a bassa risoluzione di {c}", + "un rendering di {c}", + "graffiti di {c}", + "una pessima foto di {c}", + "una foto ritagliata di {c}", + "un tatuaggio di {c}", + "{c} ricamato", + "{c} ricamata", + "una foto luminosa di {c}", + "una foto di {c} pulito", + "una foto di {c} pulita", + "una foto di {c} sporco", + "una foto di {c} sporca", + "una foto di {c}\u00a0carino", + "una foto di {c} carina", + "una foto di {c} strano", + "una foto di {c} strana", + "una foto di {c} piccolo", + "una foto di {c} piccola", + "una foto di {c} largo", + "una foto di {c} larga", + "una foto di {c} grande", + "una foto scura di {c}", + "un disegno di {c}", + "{c} di plastica", + "una foto del {c} bella", + "una foto ravvicinata di {c}", + "una foto in bianco e nero di {c}", + "un dipinto di {c}", + "una foto sgranata di {c}", + "una foto ritagliata di {c}", + "una foto sfocata di {c}", + "una buona foto di {c}", + "una riproduzione di {c}", + "un rendering di {c}", + "{c} in un video gioco", + "uno scarabocchio di {c}", + "un origami di {c}", + "uno sketch di {c}", + "una bozza di {c}", + "una foto a bassa risoluzione di {c}", + "un giocattolo di {c}", + "una resa di {c}", + "{c} come cartone animato", + "un'opera di {c}", + "un peluche di {c}" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/jp_classnames.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/jp_classnames.json new file mode 100644 index 0000000000000000000000000000000000000000..a6b50787a6f0bf7b4fe8a5b5f8d741d9dc81465e --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/jp_classnames.json @@ -0,0 +1,1004 @@ +{ + "imagenet1k": [ + "\u30c6\u30f3\u30c1", + "\u91d1\u9b5a", + "\u30db\u30db\u30b8\u30ed\u30b6\u30e1", + "\u30a4\u30bf\u30c1\u30b6\u30e1", + "\u30cf\u30f3\u30de\u30fc\u30d8\u30c3\u30c9", + "\u30b7\u30d3\u30ec\u30a8\u30a4", + "\u30a2\u30ab\u30a8\u30a4", + "\u30b3\u30c3\u30af", + "\u3081\u3093\u3069\u308a", + "\u30c0\u30c1\u30e7\u30a6", + "\u30a2\u30c8\u30ea", + "\u30b4\u30b7\u30ad\u30d2\u30ef", + "\u30cf\u30a6\u30b9\u30d5\u30a3\u30f3\u30c1", + "\u30e6\u30ad\u30d2\u30e1\u30c9\u30ea", + "\u30a4\u30f3\u30c7\u30a3\u30b4\u30db\u30aa\u30b8\u30ed", + "\u30ed\u30d3\u30f3", + "\u30d6\u30eb\u30d6\u30eb", + "\u30ab\u30b1\u30b9", + "\u30ab\u30b5\u30b5\u30ae", + "\u56db\u5341\u96c0", + "\u6c34\u30af\u30ed\u30a6\u30bf\u30c9\u30ea", + "\u51e7", + "\u767d\u982d\u30ef\u30b7", + "\u30cf\u30b2\u30ef\u30b7", + "\u30ab\u30e9\u30d5\u30c8\u30d5\u30af\u30ed\u30a6", + "\u6b27\u5dde\u30d5\u30a1\u30a4\u30a2\u30b5\u30e9\u30de\u30f3\u30c0\u30fc", + "\u5171\u901a\u30a4\u30e2\u30ea", + "\u30a4\u30e2\u30ea", + "\u30b5\u30f3\u30b7\u30e7\u30a6\u30a6\u30aa\u3092\u767a\u898b", + "\u30a2\u30db\u30ed\u30fc\u30c8\u30eb", + "\u30a6\u30b7\u30ac\u30a8\u30eb", + "\u30a2\u30de\u30ac\u30a8\u30eb", + "\u3064\u304b\u308c\u305f\u30ab\u30a8\u30eb", + "\u3068\u3093\u3061\u304d", + "\u30aa\u30b5\u30ac\u30e1", + "\u9f08", + "\u30c6\u30e9\u30d4\u30f3", + "\u30cf\u30b3\u30ac\u30e1", + "\u7e1e\u6a21\u69d8\u306e\u30e4\u30e2\u30ea", + "\u5171\u901a\u30a4\u30b0\u30a2\u30ca", + "\u30a2\u30e1\u30ea\u30ab\u30f3\u30ab\u30e1\u30ec\u30aa\u30f3", + "\u30a6\u30a3\u30c3\u30da\u30a4\u30eb", + "\u30a2\u30ac\u30de\u30c8\u30ab\u30b2", + "\u30d5\u30ea\u30eb\u30c8\u30ab\u30b2", + "\u30a2\u30ea\u30b2\u30fc\u30bf\u30fc\u30c8\u30ab\u30b2", + "\u30a2\u30e1\u30ea\u30ab\u30c9\u30af\u30c8\u30ab\u30b2", + "\u7dd1\u306e\u30c8\u30ab\u30b2", + "\u30a2\u30d5\u30ea\u30ab\u306e\u30ab\u30e1\u30ec\u30aa\u30f3", + "\u30b3\u30e2\u30c9\u30c9\u30e9\u30b4\u30f3", + "\u30a2\u30d5\u30ea\u30ab\u306e\u30ef\u30cb", + "\u30a2\u30e1\u30ea\u30ab\u30ef\u30cb", + "\u30c8\u30ea\u30b1\u30e9\u30c8\u30d7\u30b9", + "\u96f7\u306e\u30d8\u30d3", + "\u30ea\u30f3\u30b0\u30cd\u30c3\u30af\u30b9\u30cd\u30fc\u30af", + "\u30db\u30fc\u30ce\u30fc\u30b9\u30d8\u30d3", + "\u7dd1\u306e\u30d8\u30d3", + "\u30ad\u30f3\u30b0\u30b9\u30cd\u30fc\u30af", + "\u30ac\u30fc\u30bf\u30fc\u30b9\u30cd\u30fc\u30af", + "\u6c34\u86c7", + "\u3064\u308b\u30d8\u30d3", + "\u591c\u306e\u30d8\u30d3", + "\u30dc\u30a2\u30fb\u30b3\u30f3\u30b9\u30c8\u30ea\u30af\u30bf\u30fc", + "\u30ed\u30c3\u30af\u30d1\u30a4\u30bd\u30f3", + "\u30a4\u30f3\u30c9\u30b3\u30d6\u30e9", + "\u30b0\u30ea\u30fc\u30f3\u30de\u30f3\u30d0", + "\u30a6\u30df\u30d8\u30d3", + "\u30c4\u30ce\u30af\u30b5\u30ea\u30d8\u30d3", + "\u30c0\u30a4\u30e4", + "\u30b5\u30a4\u30c9\u30ef\u30a4\u30f3\u30c0\u30fc", + "\u4e09\u8449\u866b", + "\u5208\u308a\u5165\u308c\u4f5c\u696d\u8005", + "\u30b5\u30bd\u30ea", + "\u9ed2\u3068\u91d1\u306e\u5ead\u30af\u30e2", + "\u7d0d\u5c4b\u30af\u30e2", + "\u5ead\u30af\u30e2", + "\u30af\u30ed\u30b4\u30b1\u30b0\u30e2", + "\u30bf\u30e9\u30f3\u30c1\u30e5\u30e9", + "\u30aa\u30aa\u30ab\u30df\u306e\u30af\u30e2", + "\u30c0\u30cb", + "\u767e\u8db3", + "\u30af\u30ed\u30e9\u30a4\u30c1\u30e7\u30a6", + "\u96f7\u9ce5", + "\u3072\u3060\u3048\u308a\u306e\u4ed8\u3044\u305f\u30e9\u30a4\u30c1\u30e7\u30a6", + "\u8349\u539f\u30c1\u30ad\u30f3", + "\u5b54\u96c0", + "\u30a6\u30ba\u30e9", + "\u30e4\u30de\u30a6\u30ba\u30e9", + "\u30a2\u30d5\u30ea\u30ab\u306e\u7070\u8272", + "\u30b3\u30f3\u30b4\u30a6\u30a4\u30f3\u30b3", + "\u786b\u9ec4\u30c8\u30ad\u30aa\u30a6\u30e0", + "\u30a4\u30f3\u30b3", + "\u30d0\u30f3\u30b1\u30f3", + "\u8702\u98df\u3079\u308b\u4eba", + "\u30b5\u30a4\u30c1\u30e7\u30a6", + "\u30cf\u30c1\u30c9\u30ea", + "\u9310\u5634", + "\u30aa\u30aa\u30cf\u30b7", + "\u30c9\u30ec\u30a4\u30af", + "\u8d64\u30d6\u30ec\u30b9\u30c8\u30a2\u30a4\u30b5\u5c5e\u306e\u30ac\u30e2", + "\u30ac\u30c1\u30e7\u30a6", + "\u9ed2\u3044\u767d\u9ce5", + "\u30bf\u30b9\u30ab\u30fc\u30d3\u30fc\u30eb", + "\u30cf\u30ea\u30e2\u30b0\u30e9", + "\u30ab\u30e2\u30ce\u30cf\u30b7", + "\u30ef\u30e9\u30d3\u30fc", + "\u30b3\u30a2\u30e9", + "\u30a6\u30a9\u30f3\u30d0\u30c3\u30c8", + "\u30af\u30e9\u30b2", + "\u30a4\u30bd\u30ae\u30f3\u30c1\u30e3\u30af", + "\u8133\u30b5\u30f3\u30b4", + "\u6241\u5f62\u52d5\u7269", + "\u7dda\u866b", + "\u5dfb\u304d\u8c9d", + "\u30ab\u30bf\u30c4\u30e0\u30ea", + "\u30ca\u30e1\u30af\u30b8", + "\u30a6\u30df\u30a6\u30b7", + "\u30ad\u30c8\u30f3", + "\u30aa\u30a6\u30e0\u30ac\u30a4", + "\u30a2\u30e1\u30ea\u30ab\u30a4\u30c1\u30e7\u30a6\u30ac\u30cb", + "\u5ca9\u30ab\u30cb", + "\u30b7\u30aa\u30de\u30cd\u30ad", + "\u30bf\u30e9\u30d0\u30ac\u30cb", + "\u30a2\u30e1\u30ea\u30ab\u30f3\u30ed\u30d6\u30b9\u30bf\u30fc", + "\u4f0a\u52e2\u30a8\u30d3", + "\u30b6\u30ea\u30ac\u30cb", + "\u30e4\u30c9\u30ab\u30ea", + "\u7b49\u811a\u985e", + "\u30b3\u30a6\u30ce\u30c8\u30ea", + "\u30ca\u30d9\u30b3\u30a6", + "\u30d8\u30e9\u30b5\u30ae", + "\u30d5\u30e9\u30df\u30f3\u30b4", + "\u5c0f\u3055\u306a\u9752\u3044\u30b5\u30ae", + "\u30a2\u30e1\u30ea\u30ab\u30f3\u767d\u9dfa", + "\u306b\u304c\u308a", + "\u30af\u30ec\u30fc\u30f3", + "\u30c4\u30eb\u30e2\u30c9\u30ad\u79d1\u306e\u9ce5", + "\u30e8\u30fc\u30ed\u30d4\u30a2\u30f3\u6c34\u9ce5", + "\u30a2\u30e1\u30ea\u30ab\u30aa\u30aa\u30d0\u30f3", + "\u30ce\u30ac\u30f3", + "\u30ad\u30e7\u30a6\u30b8\u30e7\u30b7\u30ae", + "\u8d64\u62c5\u4fdd\u30b7\u30ae", + "\u30a2\u30ab\u30a2\u30b7\u30b7\u30ae", + "\u30aa\u30aa\u30cf\u30b7\u30b7\u30ae", + "\u30df\u30e4\u30b3\u30c9\u30ea", + "\u30da\u30ea\u30ab\u30f3", + "\u30ad\u30f3\u30b0\u30da\u30f3\u30ae\u30f3", + "\u30a2\u30eb\u30d0\u30c8\u30ed\u30b9", + "\u30b3\u30af\u30af\u30b8\u30e9", + "\u30b7\u30e3\u30c1", + "\u30b8\u30e5\u30b4\u30f3", + "\u30a2\u30b7\u30ab", + "\u30c1\u30ef\u30ef", + "\u72c6", + "\u30de\u30eb\u30c1\u30fc\u30ba\u72ac", + "\u72c6", + "\u30b7\u30fc\u30ba\u30fc\u3001\u30b7\u30fc\u30ba\u30fc", + "\u30d6\u30ec\u30ca\u30e0\u30b9\u30d1\u30cb\u30a8\u30eb", + "\u30d1\u30d4\u30e8\u30f3", + "\u30c8\u30a4\u30c6\u30ea\u30a2", + "\u30ed\u30fc\u30c7\u30b7\u30a2\u30f3\u30fb\u30ea\u30c3\u30b8\u30d0\u30c3\u30af", + "\u30a2\u30d5\u30ac\u30f3\u30cf\u30a6\u30f3\u30c9", + "\u30d0\u30bb\u30c3\u30c8\u72ac", + "\u30d3\u30fc\u30b0\u30eb", + "\u30d6\u30e9\u30c3\u30c9\u30cf\u30a6\u30f3\u30c9", + "\u30d6\u30eb\u30fc\u30c6\u30a3\u30c3\u30af", + "\u9ed2\u3068\u9ec4\u8910\u8272\u306e\u731f\u72ac", + "\u30a6\u30a9\u30fc\u30ab\u30fc\u30cf\u30a6\u30f3\u30c9", + "\u30a4\u30f3\u30b0\u30ea\u30c3\u30b7\u30e5\u30d5\u30a9\u30c3\u30af\u30b9\u30cf\u30a6\u30f3\u30c9", + "\u30ec\u30c3\u30c9\u30dc\u30fc\u30f3", + "\u30dc\u30eb\u30be\u30a4", + "\u30a2\u30a4\u30ea\u30c3\u30b7\u30e5\u30fb\u30a6\u30eb\u30d5\u30cf\u30a6\u30f3\u30c9", + "\u30a4\u30bf\u30ea\u30a2\u30f3\u30b0\u30ec\u30fc\u30cf\u30a6\u30f3\u30c9", + "\u30a6\u30a3\u30da\u30c3\u30c8", + "\u30a4\u30d3\u30b5\u30cf\u30a6\u30f3\u30c9", + "\u30ce\u30eb\u30a6\u30a7\u30fc\u30a8\u30eb\u30af\u30cf\u30a6\u30f3\u30c9", + "\u30aa\u30c3\u30bf\u30fc\u30cf\u30a6\u30f3\u30c9", + "\u30b5\u30eb\u30fc\u30ad", + "\u30b9\u30b3\u30c6\u30a3\u30c3\u30b7\u30e5\u30fb\u30c7\u30a3\u30a2\u30cf\u30a6\u30f3\u30c9", + "\u30ef\u30a4\u30de\u30e9\u30ca\u30fc", + "\u30b9\u30bf\u30d5\u30a9\u30fc\u30c9\u30b7\u30e3\u30fc\u30d6\u30eb\u30c6\u30ea\u30a2", + "\u30a2\u30e1\u30ea\u30ab\u30f3\u30fb\u30b9\u30bf\u30c3\u30d5\u30a9\u30fc\u30c9\u30b7\u30e3\u30fc\u30fb\u30c6\u30ea\u30a2", + "\u30d9\u30c9\u30ea\u30f3\u30c8\u30f3\u30c6\u30ea\u30a2", + "\u30dc\u30fc\u30c0\u30fc\u30c6\u30ea\u30a2", + "\u30b1\u30ea\u30fc\u30d6\u30eb\u30fc\u30c6\u30ea\u30a2", + "\u30a2\u30a4\u30ea\u30c3\u30b7\u30e5\u30c6\u30ea\u30a2", + "\u30ce\u30fc\u30d5\u30a9\u30fc\u30af\u30c6\u30ea\u30a2", + "\u30ce\u30fc\u30ea\u30c3\u30c1\u30fb\u30c6\u30ea\u30a2", + "\u30e8\u30fc\u30af\u30b7\u30e3\u30fc\u30c6\u30ea\u30a2", + "\u30ef\u30a4\u30e4\u30fc\u30d8\u30a2\u30fc\u30fb\u30d5\u30a9\u30c3\u30af\u30b9\u30c6\u30ea\u30a2", + "\u30ec\u30fc\u30af\u30e9\u30f3\u30c9\u30c6\u30ea\u30a2", + "\u30b7\u30fc\u30ea\u30fc\u30cf\u30e0\u30c6\u30ea\u30a2", + "\u30a8\u30a2\u30c7\u30fc\u30eb", + "\u30b1\u30eb\u30f3", + "\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2\u30c6\u30ea\u30a2", + "\u30c0\u30f3\u30c7\u30a3\u30c7\u30a3\u30f3\u30e2\u30f3\u30c8\u30c6\u30ea\u30a2", + "\u30dc\u30b9\u30c8\u30f3\u30d6\u30eb", + "\u30df\u30cb\u30c1\u30e5\u30a2\u30b7\u30e5\u30ca\u30a6\u30b6\u30fc", + "\u30b8\u30e3\u30a4\u30a2\u30f3\u30c8\u30b7\u30e5\u30ca\u30a6\u30b6\u30fc", + "\u30b9\u30bf\u30f3\u30c0\u30fc\u30c9\u30b7\u30e5\u30ca\u30a6\u30b6\u30fc", + "\u30b9\u30b3\u30c3\u30c1\u30c6\u30ea\u30a2", + "\u30c1\u30d9\u30bf\u30f3\u30c6\u30ea\u30a2", + "\u30b7\u30eb\u30ad\u30fc\u30c6\u30ea\u30a2", + "\u30bd\u30d5\u30c8\u30b3\u30fc\u30c6\u30c3\u30c9\u30fb\u30a6\u30a3\u30fc\u30c8\u30f3\u30fb\u30c6\u30ea\u30a2", + "\u30a6\u30a7\u30b9\u30c8\u30cf\u30a4\u30e9\u30f3\u30c9\u30db\u30ef\u30a4\u30c8\u30c6\u30ea\u30a2", + "\u30e9\u30b5", + "\u30d5\u30e9\u30c3\u30c8\u30b3\u30fc\u30c6\u30c3\u30c9\u30fb\u30ec\u30c8\u30ea\u30fc\u30d0\u30fc", + "\u30ab\u30fc\u30ea\u30fc\u30b3\u30fc\u30c6\u30a3\u30f3\u30b0\u3055\u308c\u305f\u30ec\u30c8\u30ea\u30fc\u30d0\u30fc", + "\u30b4\u30fc\u30eb\u30c7\u30f3\u30ec\u30c8\u30ea\u30d0\u30fc", + "\u30e9\u30d6\u30e9\u30c9\u30eb\u30fb\u30ec\u30c8\u30ea\u30fc\u30d0\u30fc\u72ac", + "\u30c1\u30a7\u30b5\u30d4\u30fc\u30af\u6e7e\u30ec\u30c8\u30ea\u30fc\u30d0\u30fc", + "\u30b8\u30e3\u30fc\u30de\u30f3\u30fb\u30b7\u30e7\u30fc\u30c8\u30d8\u30a2\u30fb\u30dd\u30a4\u30f3\u30bf", + "\u30d3\u30ba\u30e9", + "\u30a4\u30f3\u30b0\u30ea\u30c3\u30b7\u30e5\u30bb\u30c3\u30bf\u30fc", + "\u30a2\u30a4\u30ea\u30c3\u30b7\u30e5\u30bb\u30c3\u30bf\u30fc", + "\u30b4\u30fc\u30c9\u30f3\u30bb\u30c3\u30bf\u30fc", + "\u30d6\u30ea\u30bf\u30cb\u30fc\u30b9\u30d1\u30cb\u30a8\u30eb", + "\u30af\u30e9\u30f3\u30d0\u30fc", + "\u30a4\u30f3\u30b0\u30ea\u30c3\u30b7\u30e5\u30b9\u30d7\u30ea\u30f3\u30ac\u30fc", + "\u30a6\u30a7\u30eb\u30b7\u30e5\u30b9\u30d7\u30ea\u30f3\u30ac\u30fc\u30b9\u30d1\u30cb\u30a8\u30eb", + "\u30b3\u30c3\u30ab\u30fc\u30b9\u30d1\u30cb\u30a8\u30eb", + "\u30b5\u30bb\u30c3\u30af\u30b9\u30b9\u30d1\u30cb\u30a8\u30eb", + "\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u306e\u30a6\u30a9\u30fc\u30bf\u30fc\u30b9\u30d1\u30cb\u30a8\u30eb", + "\u30af\u30d0\u30fc\u30b9\u72ac", + "\u30b9\u30ad\u30c3\u30d1\u30fc\u30ad\u30fc", + "\u30d9\u30eb\u30b8\u30a2\u30f3\u30fb\u30b7\u30a7\u30d1\u30fc\u30c9\u30fb\u30c9\u30c3\u30b0\u30fb\u30b0\u30ed\u30fc\u30cd\u30f3\u30c0\u30fc\u30eb", + "\u30de\u30ea\u30ce\u30a2", + "\u30d6\u30ea\u30a2\u30fc\u30eb", + "\u30b1\u30eb\u30d4\u30fc", + "\u30b3\u30e2\u30f3\u30c9\u30fc\u30eb", + "\u30aa\u30fc\u30eb\u30c9\u30a4\u30f3\u30b0\u30ea\u30c3\u30b7\u30e5\u30b7\u30fc\u30d7\u30c9\u30c3\u30b0", + "\u30b7\u30a7\u30c8\u30e9\u30f3\u30c9\u30b7\u30fc\u30d7\u30c9\u30c3\u30b0", + "\u30b3\u30ea\u30fc", + "\u30dc\u30fc\u30c0\u30fc\u30b3\u30ea\u30fc", + "\u30d6\u30fc\u30f4\u30a3\u30a8\u30fb\u30c7\u30fb\u30d5\u30e9\u30f3\u30c9\u30eb", + "\u30ed\u30c3\u30c8\u30ef\u30a4\u30e9\u30fc", + "\u30b8\u30e3\u30fc\u30de\u30f3\u30b7\u30a7\u30d1\u30fc\u30c9", + "\u30c9\u30fc\u30d9\u30eb\u30de\u30f3\u72ac", + "\u30df\u30cb\u30c1\u30e5\u30a2\u30d4\u30f3\u30b7\u30e3\u30fc", + "\u30b0\u30ec\u30fc\u30bf\u30fc\u30b9\u30a4\u30b9\u30de\u30a6\u30f3\u30c6\u30f3\u30c9\u30c3\u30b0", + "\u30d0\u30fc\u30cd\u30fc\u30ba\u30de\u30a6\u30f3\u30c6\u30f3\u30c9\u30c3\u30b0", + "\u30a2\u30c3\u30da\u30f3\u30c4\u30a7\u30eb", + "\u30a8\u30f3\u30c8\u30ec\u30d6\u30c3\u30b7\u30e3\u30fc", + "\u30dc\u30af\u30b5\u30fc", + "\u30d6\u30eb\u30de\u30b9\u30c1\u30d5", + "\u30c1\u30d9\u30c3\u30c8\u30de\u30b9\u30c1\u30d5", + "\u30d5\u30ec\u30f3\u30c1\u30d6\u30eb\u30c9\u30c3\u30b0", + "\u30b0\u30ec\u30fc\u30c8\u30c7\u30fc\u30f3", + "\u30bb\u30f3\u30c8\u30d0\u30fc\u30ca\u30fc\u30c9", + "\u30a8\u30b9\u30ad\u30e2\u30fc\u72ac", + "\u30de\u30e9\u30df\u30e5\u30fc\u30c8", + "\u30b7\u30d9\u30ea\u30a2\u30f3\u30cf\u30b9\u30ad\u30fc", + "\u30c0\u30eb\u30e1\u30b7\u30a2\u30f3", + "\u30a2\u30fc\u30d5\u30a7\u30f3\u30d4\u30f3\u30b7\u30e3\u30fc", + "\u30d0\u30bb\u30f3\u30b8\u30fc", + "\u30d1\u30b0", + "\u30ec\u30aa\u30f3\u30d0\u30fc\u30b0", + "\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u5cf6", + "\u30b0\u30ec\u30fc\u30c8\u30d4\u30ec\u30cb\u30fc\u30ba", + "\u30b5\u30e2\u30a8\u30c9", + "\u30dd\u30e1\u30e9\u30cb\u30a2\u30f3", + "\u30c1\u30e3\u30a6", + "\u30ad\u30fc\u30b9\u30db\u30f3\u30c9", + "\u30d6\u30e9\u30d0\u30f3\u30bd\u30f3\u30b0\u30ea\u30d5\u30a9\u30f3", + "\u30da\u30f3\u30d6\u30ed\u30fc\u30af", + "\u30ab\u30fc\u30c7\u30a3\u30ac\u30f3", + "\u30c8\u30a4\u30d7\u30fc\u30c9\u30eb", + "\u30df\u30cb\u30c1\u30e5\u30a2\u30d7\u30fc\u30c9\u30eb", + "\u30b9\u30bf\u30f3\u30c0\u30fc\u30c9\u30d7\u30fc\u30c9\u30eb", + "\u30e1\u30ad\u30b7\u30ab\u30f3\u30fb\u30d8\u30a2\u30fc\u30ec\u30b9", + "\u30b7\u30f3\u30ea\u30f3\u30aa\u30aa\u30ab\u30df", + "\u767d\u3044\u30aa\u30aa\u30ab\u30df", + "\u30ec\u30c3\u30c9\u30a6\u30eb\u30d5", + "\u30b3\u30e8\u30fc\u30c6", + "\u30c7\u30a3\u30f3\u30b4", + "\u30c9\u30fc\u30eb", + "\u30ea\u30ab\u30aa\u30f3", + "\u30cf\u30a4\u30a8\u30ca", + "\u30a2\u30ab\u30ae\u30c4\u30cd", + "\u30ad\u30c3\u30c8\u30ad\u30c4\u30cd", + "\u30db\u30c3\u30ad\u30e7\u30af\u30ae\u30c4\u30cd", + "\u7070\u8272\u306e\u30ad\u30c4\u30cd", + "\u30bf\u30d3\u30fc", + "\u864e\u732b", + "\u30da\u30eb\u30b7\u30e3\u732b", + "\u30b7\u30e3\u30e0\u732b", + "\u30a8\u30b8\u30d7\u30c8\u306e\u732b", + "\u30af\u30fc\u30ac\u30fc", + "\u30aa\u30aa\u30e4\u30de\u30cd\u30b3", + "\u30d2\u30e7\u30a6", + "\u30e6\u30ad\u30d2\u30e7\u30a6", + "\u30b8\u30e3\u30ac\u30fc", + "\u30e9\u30a4\u30aa\u30f3", + "\u864e", + "\u30c1\u30fc\u30bf\u30fc", + "\u30d2\u30b0\u30de", + "\u30a2\u30e1\u30ea\u30ab\u30af\u30ed\u30af\u30de", + "\u6c37\u306e\u30af\u30de", + "\u30ca\u30de\u30b1\u30b0\u30de", + "\u30de\u30f3\u30b0\u30fc\u30b9", + "\u30df\u30fc\u30a2\u30ad\u30e3\u30c3\u30c8", + "\u30cf\u30f3\u30df\u30e7\u30a6", + "\u3066\u3093\u3068\u3046\u866b", + "\u30b0\u30e9\u30f3\u30c9\u30d3\u30fc\u30c8\u30eb", + "\u30ab\u30df\u30ad\u30ea\u30e0\u30b7", + "\u30cf\u30e0\u30b7", + "\u30d5\u30f3\u30b3\u30ed\u30ac\u30b7", + "\u30b5\u30a4\u30cf\u30e0\u30b7", + "\u30be\u30a6\u30e0\u30b7", + "\u30cf\u30a8", + "\u8702", + "\u87fb", + "\u30d0\u30c3\u30bf", + "\u30af\u30ea\u30b1\u30c3\u30c8", + "\u6756", + "\u30b4\u30ad\u30d6\u30ea", + "\u30ab\u30de\u30ad\u30ea", + "\u8749", + "\u30e8\u30b3\u30d0\u30a4", + "\u30af\u30b5\u30ab\u30b2\u30ed\u30a6", + "\u30c8\u30f3\u30dc", + "\u30a4\u30c8\u30c8\u30f3\u30dc", + "\u63d0\u7763", + "\u30ea\u30f3\u30b0\u30ec\u30c3\u30c8", + "\u541b\u4e3b", + "\u30e2\u30f3\u30b7\u30ed\u30c1\u30e7\u30a6", + "\u786b\u9ec4\u8776", + "\u30b7\u30b8\u30df\u30c1\u30e7\u30a6", + "\u30d2\u30c8\u30c7", + "\u3046\u306b", + "\u30ca\u30de\u30b3", + "\u6728\u306e\u30a6\u30b5\u30ae", + "\u91ce\u30a6\u30b5\u30ae", + "\u30a2\u30f3\u30b4\u30e9", + "\u30cf\u30e0\u30b9\u30bf\u30fc", + "\u30e4\u30de\u30a2\u30e9\u30b7", + "\u30ad\u30c4\u30cd\u30ea\u30b9", + "\u30de\u30fc\u30e2\u30c3\u30c8", + "\u30d3\u30fc\u30d0\u30fc", + "\u30e2\u30eb\u30e2\u30c3\u30c8", + "\u6817\u8272", + "\u30b7\u30de\u30a6\u30de", + "\u8c5a", + "\u30a4\u30ce\u30b7\u30b7", + "\u30a4\u30dc\u30a4\u30ce\u30b7\u30b7", + "\u30ab\u30d0", + "\u96c4\u725b", + "\u6c34\u725b", + "\u30d0\u30a4\u30bd\u30f3", + "\u30e9\u30e0", + "\u30d3\u30c3\u30b0\u30db\u30fc\u30f3", + "\u30a2\u30a4\u30d9\u30c3\u30af\u30b9", + "\u30cf\u30fc\u30c6\u30d3\u30fc\u30b9\u30c8", + "\u30a4\u30f3\u30d1\u30e9", + "\u30ac\u30bc\u30eb", + "\u30a2\u30e9\u30d3\u30a2\u30e9\u30af\u30c0", + "\u30e9\u30de", + "\u30a4\u30bf\u30c1", + "\u30df\u30f3\u30af", + "\u30b1\u30ca\u30ac\u30a4\u30bf\u30c1", + "\u30af\u30ed\u30a2\u30b7\u30a4\u30bf\u30c1", + "\u30ab\u30ef\u30a6\u30bd", + "\u30b9\u30ab\u30f3\u30af", + "\u72f8", + "\u30a2\u30eb\u30de\u30b8\u30ed", + "\u30df\u30e6\u30d3\u30ca\u30de\u30b1\u30e2\u30ce", + "\u30aa\u30e9\u30f3\u30a6\u30fc\u30bf\u30f3", + "\u30b4\u30ea\u30e9", + "\u30c1\u30f3\u30d1\u30f3\u30b8\u30fc", + "\u30c6\u30ca\u30ac\u30b6\u30eb", + "\u30d5\u30af\u30ed\u30c6\u30ca\u30ac\u30b6\u30eb", + "\u30aa\u30ca\u30ac\u30b6\u30eb", + "\u30d1\u30bf\u30b9", + "\u30d2\u30d2", + "\u30de\u30ab\u30af", + "\u30e4\u30bb\u30b6\u30eb", + "\u30b3\u30ed\u30d6\u30b9\u5c5e", + "\u30c6\u30f3\u30b0\u30b6\u30eb", + "\u30de\u30fc\u30e2\u30bb\u30c3\u30c8", + "\u30aa\u30de\u30ad\u30b6\u30eb", + "\u30db\u30a8\u30b6\u30eb", + "\u30c6\u30a3\u30c6\u30a3", + "\u30af\u30e2\u30b6\u30eb", + "\u30ea\u30b9\u30b6\u30eb", + "\u30de\u30c0\u30ac\u30b9\u30ab\u30eb\u732b", + "\u30a4\u30f3\u30c9\u30ea", + "\u30a4\u30f3\u30c9\u30be\u30a6", + "\u30a2\u30d5\u30ea\u30ab\u30be\u30a6", + "\u30ec\u30c3\u30b5\u30fc\u30d1\u30f3\u30c0", + "\u30b8\u30e3\u30a4\u30a2\u30f3\u30c8\u30d1\u30f3\u30c0", + "\u30d0\u30e9\u30af\u30fc\u30bf", + "\u30a6\u30ca\u30ae", + "\u30ae\u30f3\u30b6\u30b1", + "\u5ca9\u306e\u7f8e\u3057\u3055", + "\u30af\u30de\u30ce\u30df", + "\u30c1\u30e7\u30a6\u30b6\u30e1", + "\u30ac\u30fc", + "\u30df\u30ce\u30ab\u30b5\u30b4", + "\u30d5\u30b0", + "\u305d\u308d\u3070\u3093", + "\u30a2\u30d0\u30e4", + "\u30a2\u30ab\u30c7\u30df\u30c3\u30af\u30ac\u30a6\u30f3", + "\u30a2\u30b3\u30fc\u30c7\u30a3\u30aa\u30f3", + "\u30a2\u30b3\u30fc\u30b9\u30c6\u30a3\u30c3\u30af\u30ae\u30bf\u30fc", + "\u7a7a\u6bcd", + "\u65c5\u5ba2\u6a5f", + "\u98db\u884c\u8239", + "\u796d\u58c7", + "\u6551\u6025\u8eca", + "\u4e21\u751f\u985e", + "\u30a2\u30ca\u30ed\u30b0\u6642\u8a08", + "\u990a\u8702\u5834", + "\u30a8\u30d7\u30ed\u30f3", + "\u3054\u307f\u5165\u308c", + "\u30a2\u30b5\u30eb\u30c8\u30e9\u30a4\u30d5\u30eb", + "\u30d0\u30c3\u30af\u30d1\u30c3\u30af", + "\u30d9\u30fc\u30ab\u30ea\u30fc", + "\u5e73\u5747\u53f0", + "\u30d0\u30eb\u30fc\u30f3", + "\u30dc\u30fc\u30eb\u30da\u30f3", + "\u30d0\u30f3\u30c9\u30a8\u30a4\u30c9", + "\u30d0\u30f3\u30b8\u30e7\u30fc", + "\u30d0\u30cb\u30b9\u30bf\u30fc", + "\u30d0\u30fc\u30d9\u30eb", + "\u7406\u9aea\u5e97\u306e\u6905\u5b50", + "\u7406\u9aea\u5e97", + "\u7d0d\u5c4b", + "\u30d0\u30ed\u30e1\u30fc\u30bf\u30fc", + "\u30d0\u30ec\u30eb", + "\u30d0\u30ed\u30fc", + "\u91ce\u7403", + "\u30d0\u30b9\u30b1\u30c3\u30c8\u30dc\u30fc\u30eb", + "\u30d0\u30b7\u30cd\u30c3\u30c8", + "\u30d5\u30a1\u30b4\u30c3\u30c8", + "\u6c34\u6cf3\u5e3d", + "\u30d0\u30b9\u30bf\u30aa\u30eb", + "\u30d0\u30b9\u30bf\u30d6", + "\u30d3\u30fc\u30c1\u30ef\u30b4\u30f3", + "\u30d3\u30fc\u30b3\u30f3", + "\u30d3\u30fc\u30ab\u30fc", + "\u30d9\u30a2\u30b9\u30ad\u30f3", + "\u30d3\u30fc\u30eb\u74f6", + "\u30d3\u30fc\u30eb\u30b0\u30e9\u30b9", + "\u30d9\u30eb\u30b3\u30fc\u30c8", + "\u30d3\u30d6", + "\u81ea\u8ee2\u8eca", + "\u30d3\u30ad\u30cb", + "\u30d0\u30a4\u30f3\u30c0\u30fc", + "\u53cc\u773c\u93e1", + "\u5de3\u7bb1", + "\u30dc\u30fc\u30c8\u30cf\u30a6\u30b9", + "\u30dc\u30d6\u30b9\u30ec\u30fc", + "\u30eb\u30fc\u30d7\u30bf\u30a4", + "\u30dc\u30f3\u30cd\u30c3\u30c8", + "\u672c\u68da", + "\u66f8\u5e97", + "\u74f6\u306e\u30ad\u30e3\u30c3\u30d7", + "\u5f13", + "\u3061\u3087\u3046\u30cd\u30af\u30bf\u30a4", + "\u771f\u936e", + "\u30d6\u30e9\u30b8\u30e3\u30fc", + "\u9632\u6ce2\u5824", + "\u80f8\u5f53\u3066", + "\u307b\u3046\u304d", + "\u30d0\u30b1\u30c4", + "\u30d0\u30c3\u30af\u30eb", + "\u9632\u5f3e\u30c1\u30e7\u30c3\u30ad", + "\u65b0\u5e79\u7dda", + "\u7cbe\u8089\u5e97", + "\u30bf\u30af\u30b7\u30fc", + "\u5927\u91dc", + "\u30ad\u30e3\u30f3\u30c9\u30eb", + "\u5927\u7832", + "\u30ab\u30cc\u30fc", + "\u7f36\u5207\u308a", + "\u30ab\u30fc\u30c7\u30a3\u30ac\u30f3", + "\u8eca\u306e\u30df\u30e9\u30fc", + "\u56de\u8ee2\u6728\u99ac", + "\u5927\u5de5\u306e\u30ad\u30c3\u30c8", + "\u30ab\u30fc\u30c8\u30f3", + "\u8eca\u306e\u30db\u30a4\u30fc\u30eb", + "\u73fe\u91d1\u81ea\u52d5\u9810\u3051\u6255\u3044\u6a5f", + "\u30ab\u30bb\u30c3\u30c8", + "\u30ab\u30bb\u30c3\u30c8\u30fb\u30d7\u30ec\u30fc\u30e4\u30fc", + "\u57ce", + "\u30ab\u30bf\u30de\u30e9\u30f3", + "CD\u30d7\u30ec\u30fc\u30e4\u30fc", + "\u30c1\u30a7\u30ed", + "\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3", + "\u9396", + "\u30c1\u30a7\u30fc\u30f3\u30ea\u30f3\u30af\u30d5\u30a7\u30f3\u30b9", + "\u30c1\u30a7\u30fc\u30f3\u30e1\u30fc\u30eb", + "\u30c1\u30a7\u30fc\u30f3\u30bd\u30fc", + "\u80f8", + "\u30b7\u30d5\u30a9\u30cb\u30a2", + "\u30c1\u30e3\u30a4\u30e0", + "\u4e2d\u56fd\u30ad\u30e3\u30d3\u30cd\u30c3\u30c8", + "\u30af\u30ea\u30b9\u30de\u30b9\u306e\u9774\u4e0b", + "\u6559\u4f1a", + "\u6620\u753b", + "\u30af\u30ea\u30fc\u30d0\u30fc", + "\u5d16\u306e\u4f4f\u5c45", + "\u30de\u30f3\u30c8", + "\u30af\u30ed\u30c3\u30b0", + "\u30ab\u30af\u30c6\u30eb\u30b7\u30a7\u30fc\u30ab\u30fc", + "\u30b3\u30fc\u30d2\u30fc\u30de\u30b0", + "\u30b3\u30fc\u30d2\u30fc\u30dd\u30c3\u30c8", + "\u30b3\u30a4\u30eb", + "\u30c0\u30a4\u30e4\u30eb\u9320", + "\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u306e\u30ad\u30fc\u30dc\u30fc\u30c9", + "\u88fd\u83d3", + "\u30b3\u30f3\u30c6\u30ca\u8239", + "\u30b3\u30f3\u30d0\u30fc\u30c1\u30d6\u30eb", + "\u30b3\u30fc\u30af\u30b9\u30af\u30ea\u30e5\u30fc", + "\u30b3\u30eb\u30cd\u30c3\u30c8", + "\u30ab\u30a6\u30dc\u30fc\u30a4\u30d6\u30fc\u30c4", + "\u30ab\u30a6\u30dc\u30fc\u30a4\u30cf\u30c3\u30c8", + "\u30af\u30ec\u30fc\u30c9\u30eb", + "\u30af\u30ec\u30fc\u30f3", + "\u30af\u30e9\u30c3\u30b7\u30e5\u30d8\u30eb\u30e1\u30c3\u30c8", + "\u6728\u7bb1", + "\u30d9\u30d3\u30fc\u30d9\u30c3\u30c9", + "\u30af\u30ed\u30fc\u30af\u30dd\u30c3\u30c8", + "\u30af\u30ed\u30b1\u30c3\u30c8\u30dc\u30fc\u30eb", + "\u677e\u8449\u6756", + "\u80f8\u5f53\u3066", + "\u30c0\u30e0", + "\u673a", + "\u30c7\u30b9\u30af\u30c8\u30c3\u30d7\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc", + "\u30c0\u30a4\u30e4\u30eb\u96fb\u8a71", + "\u304a\u3080\u3064", + "\u30c7\u30b8\u30bf\u30eb\u6642\u8a08", + "\u30c7\u30b8\u30bf\u30eb\u8155\u6642\u8a08", + "\u30c0\u30a4\u30cb\u30f3\u30b0\u30c6\u30fc\u30d6\u30eb", + "\u610f\u6c17\u5730\u306a\u3057", + "\u98df\u5668\u6d17\u3044\u6a5f", + "\u30c7\u30a3\u30b9\u30af\u30d6\u30ec\u30fc\u30ad", + "\u30c9\u30c3\u30af", + "\u72ac\u305e\u308a", + "\u30c9\u30fc\u30e0", + "\u7384\u95a2\u30de\u30c3\u30c8", + "\u6398\u524a\u57fa\u5730", + "\u30c9\u30e9\u30e0", + "\u30c9\u30e9\u30e0\u30b9\u30c6\u30a3\u30c3\u30af", + "\u30c0\u30f3\u30d9\u30eb", + "\u30c0\u30c3\u30c1\u30aa\u30fc\u30d6\u30f3", + "\u6247\u98a8\u6a5f", + "\u30a8\u30ec\u30ad\u30ae\u30bf\u30fc", + "\u96fb\u6c17\u6a5f\u95a2\u8eca", + "\u5a2f\u697d\u65bd\u8a2d", + "\u5c01\u7b52", + "\u30a8\u30b9\u30d7\u30ec\u30c3\u30bd\u30de\u30b7\u30fc\u30f3", + "\u30d5\u30a7\u30fc\u30b9\u30d1\u30a6\u30c0\u30fc", + "\u30d5\u30a7\u30b6\u30fc\u30dc\u30a2", + "\u30d5\u30a1\u30a4\u30eb", + "\u6d88\u9632\u8247", + "\u6d88\u9632\u8eca", + "\u30d5\u30a1\u30a4\u30a2\u30fc\u30b9\u30af\u30ea\u30fc\u30f3", + "\u65d7\u7aff", + "\u30d5\u30eb\u30fc\u30c8", + "\u6298\u308a\u7573\u307f\u5f0f\u6905\u5b50", + "\u30d5\u30c3\u30c8\u30dc\u30fc\u30eb\u30d8\u30eb\u30e1\u30c3\u30c8", + "\u30d5\u30a9\u30fc\u30af\u30ea\u30d5\u30c8", + "\u5674\u6c34", + "\u4e07\u5e74\u7b46", + "\u56db\u67f1", + "\u8ca8\u8eca", + "\u30d5\u30ec\u30f3\u30c1\u30db\u30eb\u30f3", + "\u30d5\u30e9\u30a4\u30d1\u30f3", + "\u6bdb\u76ae\u306e\u30b3\u30fc\u30c8", + "\u3054\u307f\u53ce\u96c6\u8eca", + "\u30ac\u30b9\u30de\u30b9\u30af", + "\u30ac\u30bd\u30ea\u30f3\u30dd\u30f3\u30d7", + "\u30b4\u30d6\u30ec\u30c3\u30c8", + "\u30b4\u30fc\u30ab\u30fc\u30c8", + "\u30b4\u30eb\u30d5\u30dc\u30fc\u30eb", + "\u30b4\u30eb\u30d5\u30ab\u30fc\u30c8", + "\u30b4\u30f3\u30c9\u30e9", + "\u30b4\u30f3\u30b0", + "\u30ac\u30a6\u30f3", + "\u30b0\u30e9\u30f3\u30c9\u30d4\u30a2\u30ce", + "\u6e29\u5ba4", + "\u30b0\u30ea\u30eb", + "\u98df\u6599\u54c1\u5e97", + "\u30ae\u30ed\u30c1\u30f3", + "\u30d8\u30a2\u30b9\u30e9\u30a4\u30c9", + "\u30d8\u30a2\u30b9\u30d7\u30ec\u30fc", + "\u534a\u30c8\u30e9\u30c3\u30af", + "\u30cf\u30f3\u30de\u30fc", + "\u59a8\u3052\u307e\u3059", + "\u30cf\u30f3\u30c9\u30d6\u30ed\u30ef\u30fc", + "\u30bf\u30d6\u30ec\u30c3\u30c8", + "\u30cf\u30f3\u30ab\u30c1", + "\u30cf\u30fc\u30c9\u30c7\u30a3\u30b9\u30af", + "\u30cf\u30fc\u30e2\u30cb\u30ab", + "\u30cf\u30fc\u30d7", + "\u30cf\u30fc\u30d9\u30b9\u30bf", + "\u65a7", + "\u30db\u30eb\u30b9\u30bf\u30fc", + "\u30db\u30fc\u30e0\u30b7\u30a2\u30bf\u30fc", + "\u30cf\u30cb\u30ab\u30e0", + "\u30d5\u30c3\u30af", + "\u30d5\u30fc\u30d7\u30b9\u30ab\u30fc\u30c8", + "\u6c34\u5e73\u30d0\u30fc", + "\u99ac\u8eca", + "\u7802\u6642\u8a08", + "\u30a2\u30a4\u30d5\u30a9\u30fc\u30f3", + "\u9244", + "\u30b8\u30e3\u30c3\u30af\u30aa\u30fc\u30e9\u30f3\u30bf\u30f3", + "\u30b8\u30fc\u30f3\u30ba", + "\u30b8\u30fc\u30d7", + "\u30b8\u30e3\u30fc\u30b8\u30fc", + "\u30b8\u30b0\u30bd\u30fc\u30d1\u30ba\u30eb", + "\u4eba\u529b\u8eca", + "\u30b8\u30e7\u30a4\u30b9\u30c6\u30a3\u30c3\u30af", + "\u7740\u7269", + "\u819d\u30d1\u30c3\u30c9", + "\u7d50\u3073\u76ee", + "\u767d\u8863", + "\u3072\u3057\u3083\u304f", + "\u30e9\u30f3\u30d7\u306e\u304b\u3055", + "\u30ce\u30fc\u30c8\u30d1\u30bd\u30b3\u30f3", + "\u829d\u5208\u308a\u6a5f", + "\u30ec\u30f3\u30ba\u30ad\u30e3\u30c3\u30d7", + "\u30ec\u30bf\u30fc\u30aa\u30fc\u30d7\u30ca\u30fc", + "\u30e9\u30a4\u30d6\u30e9\u30ea", + "\u6551\u547d\u30dc\u30fc\u30c8", + "\u30e9\u30a4\u30bf\u30fc", + "\u30ea\u30e0\u30b8\u30f3", + "\u30e9\u30a4\u30ca\u30fc", + "\u53e3\u7d05", + "\u30ed\u30fc\u30d5\u30a1\u30fc", + "\u30ed\u30fc\u30b7\u30e7\u30f3", + "\u30b9\u30d4\u30fc\u30ab\u30fc", + "\u30eb\u30fc\u30da", + "\u88fd\u6750\u6240", + "\u78c1\u6c17\u30b3\u30f3\u30d1\u30b9", + "\u90f5\u888b", + "\u30e1\u30fc\u30eb\u30dc\u30c3\u30af\u30b9", + "\u30de\u30a4\u30e8", + "\u30de\u30a4\u30e8", + "\u30de\u30f3\u30db\u30fc\u30eb\u306e\u84cb", + "\u30de\u30e9\u30ab\u30b9", + "\u30de\u30ea\u30f3\u30d0", + "\u30de\u30b9\u30af", + "\u30de\u30c3\u30c1\u68d2", + "\u30e1\u30a4\u30dd\u30fc\u30eb", + "\u8ff7\u8def", + "\u8a08\u91cf\u30ab\u30c3\u30d7", + "\u85ac\u7bb1", + "\u5de8\u77f3", + "\u30de\u30a4\u30af", + "\u30de\u30a4\u30af\u30ed\u6ce2", + "\u8ecd\u670d", + "\u30df\u30eb\u30af\u7f36", + "\u30df\u30cb\u30d0\u30b9", + "\u30df\u30cb\u30b9\u30ab\u30fc\u30c8", + "\u30df\u30cb\u30d0\u30f3", + "\u30df\u30b5\u30a4\u30eb", + "\u30df\u30c8\u30f3", + "\u30df\u30ad\u30b7\u30f3\u30b0\u30dc\u30a6\u30eb", + "\u79fb\u52d5\u4f4f\u5b85", + "\u30e2\u30c7\u30ebT", + "\u30e2\u30c7\u30e0", + "\u4fee\u9053\u9662", + "\u30e2\u30cb\u30bf\u30fc", + "\u30e2\u30da\u30c3\u30c8", + "\u30e2\u30eb\u30bf\u30eb", + "\u30e2\u30eb\u30bf\u30eb\u30dc\u30fc\u30c9", + "\u30e2\u30b9\u30af", + "\u868a\u5e33", + "\u30b9\u30af\u30fc\u30bf\u30fc", + "\u30de\u30a6\u30f3\u30c6\u30f3\u30d0\u30a4\u30af", + "\u5c71\u306e\u30c6\u30f3\u30c8", + "\u30de\u30a6\u30b9", + "\u30cd\u30ba\u30df\u6355\u308a", + "\u5f15\u3063\u8d8a\u3057\u30c8\u30e9\u30c3\u30af", + "\u9283\u53e3", + "\u30cd\u30a4\u30eb", + "\u30cd\u30c3\u30af\u30d6\u30ec\u30fc\u30b9", + "\u30cd\u30c3\u30af\u30ec\u30b9", + "\u4e73\u9996", + "\u30ce\u30fc\u30c8", + "\u30aa\u30d9\u30ea\u30b9\u30af", + "\u30aa\u30fc\u30dc\u30a8", + "\u30aa\u30ab\u30ea\u30ca", + "\u30aa\u30c9\u30e1\u30fc\u30bf\u30fc", + "\u30aa\u30a4\u30eb\u30d5\u30a3\u30eb\u30bf\u30fc", + "\u5668\u5b98", + "\u30aa\u30b7\u30ed\u30b9\u30b3\u30fc\u30d7", + "\u30aa\u30fc\u30d0\u30fc\u30b9\u30ab\u30fc\u30c8", + "\u725b\u8eca", + "\u9178\u7d20\u30de\u30b9\u30af", + "\u30d1\u30b1\u30c3\u30c8", + "\u30d1\u30c9\u30eb", + "\u30d1\u30c9\u30eb\u30db\u30a4\u30fc\u30eb", + "\u5357\u4eac\u9320", + "\u7d75\u7b46", + "\u30d1\u30b8\u30e3\u30de", + "\u5bae\u6bbf", + "\u30d1\u30f3\u30d1\u30a4\u30d7", + "\u30da\u30fc\u30d1\u30fc\u30bf\u30aa\u30eb", + "\u30d1\u30e9\u30b7\u30e5\u30fc\u30c8", + "\u5e73\u884c\u68d2", + "\u516c\u5712\u306e\u30d9\u30f3\u30c1", + "\u30d1\u30fc\u30ad\u30f3\u30b0\u30e1\u30fc\u30bf\u30fc", + "\u4e57\u7528\u8eca", + "\u30d1\u30c6\u30a3\u30aa", + "\u6709\u6599\u96fb\u8a71", + "\u53f0\u5ea7", + "\u7b46\u7bb1", + "\u925b\u7b46\u524a\u308a", + "\u9999\u6c34", + "\u30da\u30c8\u30ea\u76bf", + "\u30b3\u30d4\u30fc\u6a5f", + "\u9078\u3076", + "\u30b9\u30d1\u30a4\u30af\u4ed8\u304d\u9244\u304b\u3076\u3068", + "\u676d\u67f5", + "\u62fe\u3046", + "\u685f\u6a4b", + "\u8caf\u91d1\u7bb1", + "\u9320\u5264\u74f6", + "\u6795", + "\u30d4\u30f3\u30dd\u30f3\u7403", + "\u98a8\u8eca", + "\u6d77\u8cca", + "\u30d4\u30c3\u30c1\u30e3\u30fc", + "\u98db\u884c\u6a5f", + "\u30d7\u30e9\u30cd\u30bf\u30ea\u30a6\u30e0", + "\u30d3\u30cb\u30fc\u30eb\u888b", + "\u76bf\u7acb\u3066", + "\u30d7\u30e9\u30a6", + "\u30d7\u30e9\u30f3\u30b8\u30e3\u30fc", + "\u30dd\u30e9\u30ed\u30a4\u30c9\u30ab\u30e1\u30e9", + "\u30dd\u30fc\u30eb", + "\u8b66\u5bdf\u8eca", + "\u30dd\u30f3\u30c1\u30e7", + "\u30d3\u30ea\u30e4\u30fc\u30c9\u53f0", + "\u30dd\u30c3\u30d7\u30fb\u30dc\u30c8\u30eb", + "\u30dd\u30c3\u30c8", + "\u308d\u304f\u308d", + "\u30d1\u30ef\u30fc\u30c9\u30ea\u30eb", + "\u793c\u62dd\u7528\u6577\u7269", + "\u30d7\u30ea\u30f3\u30bf", + "\u5211\u52d9\u6240", + "\u767a\u5c04\u4f53", + "\u30d7\u30ed\u30b8\u30a7\u30af\u30bf\u30fc", + "\u30d1\u30c3\u30af", + "\u30b5\u30f3\u30c9\u30d0\u30c3\u30b0", + "\u8ca1\u5e03", + "\u30af\u30a4\u30eb", + "\u30ad\u30eb\u30c8", + "\u30ec\u30fc\u30b5\u30fc", + "\u30e9\u30b1\u30c3\u30c8", + "\u30e9\u30b8\u30a8\u30fc\u30bf\u30fc", + "\u7121\u7dda", + "\u96fb\u6ce2\u671b\u9060\u93e1", + "\u5929\u6c34\u6876", + "RV\u8eca", + "\u30ea\u30fc\u30eb", + "\u30ec\u30d5\u30ec\u30c3\u30af\u30b9\u30ab\u30e1\u30e9", + "\u51b7\u8535\u5eab", + "\u30ea\u30e2\u30b3\u30f3", + "\u30ec\u30b9\u30c8\u30e9\u30f3", + "\u30ea\u30dc\u30eb\u30d0\u30fc", + "\u30e9\u30a4\u30d5\u30eb", + "\u30ed\u30c3\u30ad\u30f3\u30b0\u30c1\u30a7\u30a2", + "\u713c\u8089\u6599\u7406\u5e97", + "\u6d88\u3057\u30b4\u30e0", + "\u30e9\u30b0\u30d3\u30fc\u30dc\u30fc\u30eb", + "\u30eb\u30fc\u30eb", + "\u30e9\u30f3\u30cb\u30f3\u30b0\u30b7\u30e5\u30fc\u30ba", + "\u5b89\u5168", + "\u5b89\u5168\u30d4\u30f3", + "\u5869\u306e\u5165\u308c\u7269", + "\u30b5\u30f3\u30c0\u30eb", + "\u30b5\u30ed\u30f3", + "\u30b5\u30c3\u30af\u30b9", + "\u9798", + "\u898f\u6a21", + "\u30b9\u30af\u30fc\u30eb\u30d0\u30b9", + "\u30b9\u30af\u30fc\u30ca\u30fc", + "\u30b9\u30b3\u30a2\u30dc\u30fc\u30c9", + "\u753b\u9762", + "\u30b9\u30af\u30ea\u30e5\u30fc", + "\u30c9\u30e9\u30a4\u30d0\u30fc", + "\u30b7\u30fc\u30c8\u30d9\u30eb\u30c8", + "\u30df\u30b7\u30f3", + "\u30b7\u30fc\u30eb\u30c9", + "\u9774\u5c4b", + "\u969c\u5b50", + "\u8cb7\u3044\u7269\u304b\u3054", + "\u30b7\u30e7\u30c3\u30d4\u30f3\u30b0\u30ab\u30fc\u30c8", + "\u30b7\u30e3\u30d9\u30eb", + "\u30b7\u30e3\u30ef\u30fc\u30ad\u30e3\u30c3\u30d7", + "\u30b7\u30e3\u30ef\u30fc\u30ab\u30fc\u30c6\u30f3", + "\u30b9\u30ad\u30fc", + "\u30b9\u30ad\u30fc\u30de\u30b9\u30af", + "\u5bdd\u888b", + "\u8a08\u7b97\u5c3a", + "\u5f15\u304d\u6238", + "\u30b9\u30ed\u30c3\u30c8", + "\u30b9\u30ce\u30fc\u30b1\u30eb", + "\u30b9\u30ce\u30fc\u30e2\u30fc\u30d3\u30eb", + "\u9664\u96ea\u6a5f", + "\u30bd\u30fc\u30d7\u30c7\u30a3\u30b9\u30da\u30f3\u30b5\u30fc", + "\u30b5\u30c3\u30ab\u30fc\u30dc\u30fc\u30eb", + "\u9774\u4e0b", + "\u592a\u967d\u306e\u76bf", + "\u30bd\u30f3\u30d6\u30ec\u30ed", + "\u30b9\u30fc\u30d7\u76bf", + "\u30b9\u30da\u30fc\u30b9\u30ad\u30fc", + "\u30b9\u30da\u30fc\u30b9\u30d2\u30fc\u30bf\u30fc", + "\u30b9\u30da\u30fc\u30b9\u30b7\u30e3\u30c8\u30eb", + "\u3078\u3089", + "\u30b9\u30d4\u30fc\u30c9\u30dc\u30fc\u30c8", + "\u30af\u30e2\u306e\u5de3", + "\u30b9\u30d4\u30f3\u30c9\u30eb", + "\u30b9\u30dd\u30fc\u30c4\u30ab\u30fc", + "\u30b9\u30dd\u30c3\u30c8\u30e9\u30a4\u30c8", + "\u30b9\u30c6\u30fc\u30b8", + "\u84b8\u6c17\u6a5f\u95a2\u8eca", + "\u92fc\u30a2\u30fc\u30c1\u6a4b", + "\u30b9\u30c1\u30fc\u30eb\u30c9\u30e9\u30e0", + "\u8074\u8a3a\u5668", + "\u30b9\u30c8\u30fc\u30eb", + "\u77f3\u57a3", + "\u30b9\u30c8\u30c3\u30d7\u30a6\u30a9\u30c3\u30c1", + "\u30ec\u30f3\u30b8", + "\u30b9\u30c8\u30ec\u30fc\u30ca\u30fc", + "\u8def\u9762\u96fb\u8eca", + "\u30b9\u30c8\u30ec\u30c3\u30c1\u30e3\u30fc", + "\u30b9\u30bf\u30b8\u30aa\u30bd\u30d5\u30a1", + "\u4ecf\u820e\u5229\u5854", + "\u6f5c\u6c34\u8266", + "\u30b9\u30fc\u30c4", + "\u65e5\u6642\u8a08", + "\u30b5\u30f3\u30b0\u30e9\u30b9", + "\u30b5\u30f3\u30b0\u30e9\u30b9", + "\u65e5\u713c\u3051\u6b62\u3081\u5264", + "\u3064\u308a\u6a4b", + "\u7dbf\u68d2", + "\u30c8\u30ec\u30fc\u30ca\u30fc", + "\u6d77\u30d1\u30f3", + "\u30b9\u30a4\u30f3\u30b0", + "\u30b9\u30a4\u30c3\u30c1", + "\u6ce8\u5c04\u5668", + "\u96fb\u6c17\u30b9\u30bf\u30f3\u30c9", + "\u30bf\u30f3\u30af", + "\u30c6\u30fc\u30d7\u30d7\u30ec\u30fc\u30e4\u30fc", + "\u30c6\u30a3\u30fc\u30dd\u30c3\u30c8", + "\u30c6\u30c7\u30a3", + "\u30c6\u30ec\u30d3", + "\u30c6\u30cb\u30b9\u30dc\u30fc\u30eb", + "\u30b5\u30c3\u30c1", + "\u5287\u5834\u306e\u30ab\u30fc\u30c6\u30f3", + "\u6307\u306c\u304d", + "\u8131\u7a40\u6a5f", + "\u738b\u4f4d", + "\u74e6\u5c4b\u6839", + "\u30c8\u30fc\u30b9\u30bf\u30fc", + "\u30bf\u30d0\u30b3\u5c4b", + "\u4fbf\u5ea7", + "\u30c8\u30fc\u30c1", + "\u30c8\u30fc\u30c6\u30e0\u30dd\u30fc\u30eb", + "\u30ec\u30c3\u30ab\u30fc\u8eca", + "\u73a9\u5177\u5c4b", + "\u30c8\u30e9\u30af\u30bf\u30fc", + "\u30c8\u30ec\u30fc\u30e9\u30fc\u30c8\u30e9\u30c3\u30af", + "\u30c8\u30ec\u30a4", + "\u30c8\u30ec\u30f3\u30c1\u30b3\u30fc\u30c8", + "\u4e09\u8f2a\u8eca", + "\u4e09\u80f4\u8239", + "\u4e09\u811a", + "\u51f1\u65cb\u9580", + "\u30c8\u30ed\u30ea\u30fc\u30d0\u30b9", + "\u30c8\u30ed\u30f3\u30dc\u30fc\u30f3", + "\u30d0\u30b9\u30bf\u30d6", + "\u56de\u8ee2\u30c9\u30a2", + "\u30bf\u30a4\u30d7\u30e9\u30a4\u30bf\u30fc\u306e\u30ad\u30fc\u30dc\u30fc\u30c9", + "\u5098", + "\u4e00\u8f2a\u8eca", + "\u76f4\u7acb", + "\u771f\u7a7a", + "\u82b1\u74f6", + "\u30dc\u30fc\u30eb\u30c8", + "\u30d9\u30eb\u30d9\u30c3\u30c8", + "\u81ea\u52d5\u8ca9\u58f2\u6a5f", + "\u796d\u670d", + "\u9ad8\u67b6\u6a4b", + "\u30d0\u30a4\u30aa\u30ea\u30f3", + "\u30d0\u30ec\u30fc\u30dc\u30fc\u30eb", + "\u30ef\u30c3\u30d5\u30eb\u713c\u304d\u578b", + "\u58c1\u6642\u8a08", + "\u8ca1\u5e03", + "\u30ef\u30fc\u30c9\u30ed\u30fc\u30d6", + "\u6226\u95d8\u6a5f", + "\u6d17\u9762\u5668", + "\u30ef\u30c3\u30b7\u30e3\u30fc", + "\u6c34\u7b52", + "\u6c34\u5dee\u3057", + "\u7d66\u6c34\u5854", + "\u30a6\u30a4\u30b9\u30ad\u30fc\u30b8\u30e3\u30b0", + "\u30db\u30a4\u30c3\u30b9\u30eb", + "\u304b\u3064\u3089", + "\u7a93\u7db2\u6238", + "\u30d6\u30e9\u30a4\u30f3\u30c9", + "\u30a6\u30a3\u30f3\u30b6\u30fc\u30cd\u30af\u30bf\u30a4", + "\u30ef\u30a4\u30f3\u30dc\u30c8\u30eb", + "\u7ffc", + "\u4e2d\u83ef\u934b", + "\u6728\u88fd\u30b9\u30d7\u30fc\u30f3", + "\u30a6\u30fc\u30eb", + "\u30ef\u30fc\u30e0\u30d5\u30a7\u30f3\u30b9", + "\u96e3\u7834\u8239", + "\u30e8\u30fc\u30eb", + "\u30d1\u30aa", + "\u30b5\u30a4\u30c8", + "\u30b3\u30df\u30c3\u30af\u30d6\u30c3\u30af", + "\u30af\u30ed\u30b9\u30ef\u30fc\u30c9\u30d1\u30ba\u30eb", + "\u9053\u8def\u6a19\u8b58", + "\u4ea4\u901a\u4fe1\u53f7\u706f", + "\u30d6\u30c3\u30af\u30ab\u30d0\u30fc", + "\u30e1\u30cb\u30e5\u30fc", + "\u30d7\u30ec\u30fc\u30c8", + "\u30b0\u30a2\u30ab\u30e2\u30fc\u30ec", + "\u30b3\u30f3\u30bd\u30e1", + "\u30db\u30c3\u30c8\u30dd\u30c3\u30c8", + "\u30d1\u30d5\u30a7", + "\u30a2\u30a4\u30b9\u30af\u30ea\u30fc\u30e0", + "\u30a2\u30a4\u30b9\u30ad\u30e3\u30f3\u30c7\u30a3\u30fc", + "\u30d5\u30e9\u30f3\u30b9\u30d1\u30f3", + "\u30d9\u30fc\u30b0\u30eb", + "\u30d7\u30ec\u30c3\u30c4\u30a7\u30eb", + "\u30c1\u30fc\u30ba\u30d0\u30fc\u30ac\u30fc", + "\u30db\u30c3\u30c8\u30c9\u30c3\u30b0", + "\u30de\u30c3\u30b7\u30e5\u30dd\u30c6\u30c8", + "\u30ad\u30e3\u30d9\u30c4", + "\u30d6\u30ed\u30c3\u30b3\u30ea\u30fc", + "\u30ab\u30ea\u30d5\u30e9\u30ef\u30fc", + "\u30ba\u30c3\u30ad\u30fc\u30cb", + "\u305d\u3046\u3081\u3093\u304b\u307c\u3061\u3083", + "\u30c9\u30f3\u30b0\u30ea\u304b\u307c\u3061\u3083", + "\u30ab\u30dc\u30c1\u30e3", + "\u30ad\u30e5\u30a6\u30ea", + "\u30a2\u30fc\u30c6\u30a3\u30c1\u30e7\u30fc\u30af", + "\u30d4\u30fc\u30de\u30f3", + "\u30ab\u30eb\u30c9\u30f3", + "\u30ad\u30ce\u30b3", + "\u30ea\u30f3\u30b4", + "\u30a4\u30c1\u30b4", + "\u30aa\u30ec\u30f3\u30b8", + "\u30ec\u30e2\u30f3", + "\u30a4\u30c1\u30b8\u30af", + "\u30d1\u30a4\u30ca\u30c3\u30d7\u30eb", + "\u30d0\u30ca\u30ca", + "\u30d1\u30e9\u30df\u30c4", + "\u30ab\u30b9\u30bf\u30fc\u30c9\u30a2\u30c3\u30d7\u30eb", + "\u30b6\u30af\u30ed", + "\u5e72\u3057\u8349", + "\u30ab\u30eb\u30dc\u30ca\u30fc\u30e9", + "\u30c1\u30e7\u30b3\u30ec\u30fc\u30c8\u30bd\u30fc\u30b9", + "\u30d1\u30f3\u751f\u5730", + "\u30df\u30fc\u30c8\u30ed\u30fc\u30d5", + "\u30d4\u30b6", + "\u30dd\u30c3\u30c8\u30d1\u30a4", + "\u30d6\u30ea\u30c8\u30fc", + "\u8d64\u30ef\u30a4\u30f3", + "\u30a8\u30b9\u30d7\u30ec\u30c3\u30bd", + "\u30ab\u30c3\u30d7", + "\u30a8\u30c3\u30b0\u30ce\u30c3\u30b0", + "\u30a2\u30eb\u30d7\u30b9", + "\u30d0\u30d6\u30eb", + "\u5d16", + "\u30b5\u30f3\u30b4\u7901", + "\u9593\u6b20\u6cc9", + "\u6e56\u7554", + "\u5cac", + "\u7802\u5dde", + "\u6d77\u5cb8", + "\u8c37", + "\u706b\u5c71", + "\u91ce\u7403\u9078\u624b", + "\u65b0\u90ce", + "\u30b9\u30ad\u30e5\u30fc\u30d0\u30c0\u30a4\u30d0\u30fc", + "\u83dc\u7a2e", + "\u30c7\u30a4\u30b8\u30fc", + "\u862d", + "\u30c8\u30a6\u30e2\u30ed\u30b3\u30b7", + "\u30c9\u30f3\u30b0\u30ea", + "\u30d2\u30c3\u30d7", + "\u30c8\u30c1\u30ce\u30ad", + "\u30b5\u30f3\u30b4\u83cc", + "\u30cf\u30e9\u30bf\u30b1", + "\u30b7\u30e3\u30b0\u30de\u30a2\u30df\u30ac\u30b5\u30bf\u30b1", + "\u30b9\u30c3\u30dd\u30f3\u30bf\u30b1", + "\u30cf\u30e9\u30bf\u30b1", + "\u821e\u8338", + "\u304d\u306e\u3053", + "\u8033", + "\u30c8\u30a4\u30ec\u30c3\u30c8\u30da\u30fc\u30d1\u30fc" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/jp_zeroshot_classification_templates.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/jp_zeroshot_classification_templates.json new file mode 100644 index 0000000000000000000000000000000000000000..1c9db9ccb90a33b0991e48cd9030a7fab1bac199 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/jp_zeroshot_classification_templates.json @@ -0,0 +1,41 @@ +{ + "imagenet1k": [ + "{c}\u306e\u60aa\u3044\u5199\u771f", + "\u591a\u304f\u306e{c}\u306e\u5199\u771f", + "{c}\u306e\u5f6b\u523b", + "\u898b\u3065\u3089\u3044{c}\u306e\u5199\u771f", + "{c}\u306e\u4f4e\u89e3\u50cf\u5ea6\u5199\u771f", + "{c}\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0", + "{c}\u306e\u843d\u66f8\u304d", + "{c}\u306e\u30c8\u30ea\u30df\u30f3\u30b0\u5199\u771f", + "{c}\u306e\u30bf\u30c8\u30a5\u30fc", + "\u523a\u7e4d\u3055\u308c\u305f{c}", + "{c}\u306e\u660e\u308b\u3044\u5199\u771f", + "\u304d\u308c\u3044\u306a{c}\u306e\u5199\u771f", + "\u6c5a\u308c\u305f{c}\u306e\u5199\u771f", + "{c}\u306e\u6697\u3044\u5199\u771f", + "{c}\u306e\u7d75", + "\u79c1\u306e{c}\u306e\u5199\u771f", + "\u30d7\u30e9\u30b9\u30c1\u30c3\u30af\u88fd\u306e{c}", + "\u304b\u3063\u3053\u3044\u3044{c}\u306e\u5199\u771f", + "{c}\u306e\u30af\u30ed\u30fc\u30ba\u30a2\u30c3\u30d7\u5199\u771f", + "{c}\u306e\u767d\u9ed2\u5199\u771f", + "{c}\u306e\u30d4\u30af\u30bb\u30eb\u5199\u771f", + "jpeg\u3067\u52a0\u5de5\u3057\u305f{c}\u306e\u5199\u771f", + "{c}\u306e\u307c\u3084\u3051\u305f\u5199\u771f", + "{c}\u306e\u5199\u771f", + "{c}\u306e\u826f\u3044\u5199\u771f", + "\u30b2\u30fc\u30e0\u306b\u767b\u5834\u3059\u308b{c}", + "\u6298\u308a\u7d19\u3067\u4f5c\u3063\u305f{c}", + "{c}\u306e\u30b9\u30b1\u30c3\u30c1", + "\u304a\u3082\u3061\u3083\u306e{c}", + "{c}\u306e\u6f14\u51fa", + "\u5927\u304d\u306a{c}\u306e\u5199\u771f", + "\u7d20\u6575\u306a{c}\u306e\u5199\u771f", + "\u5947\u5999\u306a{c}\u306e\u5199\u771f", + "\u6f2b\u753b\u306e{c}", + "{c}\u306e\u82b8\u8853", + "{c}\u306e\u306c\u3044\u3050\u308b\u307f", + "\u5c0f\u3055\u306a{c}\u306e\u5199\u771f" + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/kitti.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/kitti.py new file mode 100644 index 0000000000000000000000000000000000000000..f56e3b04c77233500d2b35c663021a62c0530c7b --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/kitti.py @@ -0,0 +1,209 @@ +# coding=utf-8 +# Copyright 2019 Google LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Implements Kitti data class.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import task_adaptation.data.base as base +from task_adaptation.registry import Registry +import tensorflow.compat.v1 as tf +import tensorflow_datasets as tfds + + +def _count_all_pp(x): + """Count all objects.""" + # Count distribution (thresholded at 15): + + label = tf.math.minimum(tf.size(x["objects"]["type"]) - 1, 8) + return {"image": x["image"], "label": label} + + +def _count_vehicles_pp(x): + """Counting vehicles.""" + # Label distribution: + + vehicles = tf.where(x["objects"]["type"] < 3) # Car, Van, Truck. + # Cap at 3. + label = tf.math.minimum(tf.size(vehicles), 3) + return {"image": x["image"], "label": label} + + +def _count_left_pp(x): + """Count objects on the left hand side of the camera.""" + # Count distribution (thresholded at 15): + + # Location feature contains (x, y, z) in meters w.r.t. the camera. + objects_on_left = tf.where(x["objects"]["location"][:, 0] < 0) + label = tf.math.minimum(tf.size(objects_on_left), 8) + return {"image": x["image"], "label": label} + + +def _count_far_pp(x): + """Counts objects far from the camera.""" + # Threshold removes ~half of the objects. + # Count distribution (thresholded at 15): + + # Location feature contains (x, y, z) in meters w.r.t. the camera. + distant_objects = tf.where(x["objects"]["location"][:, 2] >= 25) + label = tf.math.minimum(tf.size(distant_objects), 8) + return {"image": x["image"], "label": label} + + +def _count_near_pp(x): + """Counts objects close to the camera.""" + # Threshold removes ~half of the objects. + # Count distribution: + + # Location feature contains (x, y, z) in meters w.r.t. the camera. + close_objects = tf.where(x["objects"]["location"][:, 2] < 25) + label = tf.math.minimum(tf.size(close_objects), 8) + return {"image": x["image"], "label": label} + + +def _closest_object_distance_pp(x): + """Predict the distance to the closest object.""" + # Label distribution: + + # Location feature contains (x, y, z) in meters w.r.t. the camera. + dist = tf.reduce_min(x["objects"]["location"][:, 2]) + thrs = np.array([-100, 5.6, 8.4, 13.4, 23.4]) + label = tf.reduce_max(tf.where((thrs - dist) < 0)) + return {"image": x["image"], "label": label} + + +def _closest_vehicle_distance_pp(x): + """Predict the distance to the closest vehicle.""" + # Label distribution: + + # Location feature contains (x, y, z) in meters w.r.t. the camera. + vehicles = tf.where(x["objects"]["type"] < 3) # Car, Van, Truck. + vehicle_z = tf.gather(params=x["objects"]["location"][:, 2], indices=vehicles) + vehicle_z = tf.concat([vehicle_z, tf.constant([[1000.0]])], axis=0) + dist = tf.reduce_min(vehicle_z) + # Results in a uniform distribution over three distances, plus one class for + # "no vehicle". + thrs = np.array([-100.0, 8.0, 20.0, 999.0]) + label = tf.reduce_max(tf.where((thrs - dist) < 0)) + return {"image": x["image"], "label": label} + + +def _closest_object_x_location_pp(x): + """Predict the absolute x position of the closest object.""" + # Label distribution: + + # Location feature contains (x, y, z) in meters w.r.t. the camera. + idx = tf.math.argmin(x["objects"]["location"][:, 2]) + xloc = x["objects"]["location"][idx, 0] + thrs = np.array([-100, -6.4, -3.5, 0.0, 3.3, 23.9]) + label = tf.reduce_max(tf.where((thrs - xloc) < 0)) + return {"image": x["image"], "label": label} + + +_TASK_DICT = { + "count_all": { + "preprocess_fn": _count_all_pp, + "num_classes": 16, + }, + "count_left": { + "preprocess_fn": _count_left_pp, + "num_classes": 16, + }, + "count_far": { + "preprocess_fn": _count_far_pp, + "num_classes": 16, + }, + "count_near": { + "preprocess_fn": _count_near_pp, + "num_classes": 16, + }, + "closest_object_distance": { + "preprocess_fn": _closest_object_distance_pp, + "num_classes": 5, + }, + "closest_object_x_location": { + "preprocess_fn": _closest_object_x_location_pp, + "num_classes": 5, + }, + "count_vehicles": { + "preprocess_fn": _count_vehicles_pp, + "num_classes": 4, + }, + "closest_vehicle_distance": { + "preprocess_fn": _closest_vehicle_distance_pp, + "num_classes": 4, + }, +} + + +@Registry.register("data.kitti", "class") +class KittiData(base.ImageTfdsData): + """Provides Kitti dataset. + + Six tasks are supported: + 1. Count the number of objects. + 2. Count the number of objects on the left hand side of the camera. + 3. Count the number of objects in the foreground. + 4. Count the number of objects in the background. + 5. Predict the distance of the closest object. + 6. Predict the x-location (w.r.t. the camera) of the closest object. + """ + + def __init__(self, task, data_dir=None): + + if task not in _TASK_DICT: + raise ValueError("Unknown task: %s" % task) + + dataset_builder = tfds.builder("kitti:3.3.0", data_dir=data_dir) + dataset_builder.download_and_prepare() + + tfds_splits = { + "train": "train", + "val": "validation", + "trainval": "train+validation", + "test": "test", + "train800": "train[:800]", + "val200": "validation[:200]", + "train800val200": "train[:800]+validation[:200]", + } + + # Example counts are retrieved from the tensorflow dataset info. + train_count = dataset_builder.info.splits[tfds.Split.TRAIN].num_examples + val_count = dataset_builder.info.splits[tfds.Split.VALIDATION].num_examples + test_count = dataset_builder.info.splits[tfds.Split.TEST].num_examples + # Creates a dict with example counts for each split. + num_samples_splits = { + "train": train_count, + "val": val_count, + "trainval": train_count + val_count, + "test": test_count, + "train800": 800, + "val200": 200, + "train800val200": 1000, + } + + task = _TASK_DICT[task] + base_preprocess_fn = task["preprocess_fn"] + super(KittiData, self).__init__( + dataset_builder=dataset_builder, + tfds_splits=tfds_splits, + num_samples_splits=num_samples_splits, + num_preprocessing_threads=400, + shuffle_buffer_size=10000, + base_preprocess_fn=base_preprocess_fn, + num_classes=task["num_classes"]) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/multilingual_mscoco.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/multilingual_mscoco.py new file mode 100644 index 0000000000000000000000000000000000000000..167257c4b307a92ba7546e232b36480c05a6910a --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/multilingual_mscoco.py @@ -0,0 +1,119 @@ +import codecs +import json +import os +from subprocess import call + +import requests +from PIL import Image +from torchvision.datasets import VisionDataset + +GITHUB_DATA_PATH = "https://raw.githubusercontent.com/adobe-research/Cross-lingual-Test-Dataset-XTD10/main/XTD10/" +GITHUB_DATA_PATH_DE_FR = "https://raw.githubusercontent.com/adobe-research/Cross-lingual-Test-Dataset-XTD10/main/MIC/" +GITHUB_DATA_PATH_JP = "https://raw.githubusercontent.com/adobe-research/Cross-lingual-Test-Dataset-XTD10/main/STAIR/" +SUPPORTED_LANGUAGES = ["es", "it", "ko", "pl", "ru", "tr", "zh", "en", "de", "fr", "jp"] + +IMAGE_INDEX_FILENAME = "test_image_names.txt" + +CAPTIONS_FILENAME_TEMPLATE = "test_1kcaptions_{}.txt" +OUTPUT_FILENAME_TEMPLATE = "multilingual_mscoco_captions-{}.json" + +IMAGES_DOWNLOAD_URL = "https://nllb-data.com/test/xtd10/images.tar.gz" + + +class Multilingual_MSCOCO(VisionDataset): + def __init__(self, root, ann_file, transform=None, target_transform=None): + super().__init__(root, transform=transform, target_transform=target_transform) + self.ann_file = os.path.expanduser(ann_file) + with codecs.open(ann_file, "r", encoding="utf-8") as fp: + data = json.load(fp) + self.data = [ + (img_path, txt) + for img_path, txt in zip(data["image_paths"], data["annotations"]) + ] + + def __getitem__(self, index): + img, captions = self.data[index] + + # Image + img = Image.open(img).convert("RGB") + if self.transform is not None: + img = self.transform(img) + + # Captions + target = [ + captions, + ] + if self.target_transform is not None: + target = self.target_transform(target) + + return img, target + + def __len__(self) -> int: + return len(self.data) + + +def _get_lines(url): + response = requests.get(url, timeout=30) + return response.text.splitlines() + + +def _download_images(out_path): + os.makedirs(out_path, exist_ok=True) + print("Downloading images") + call(f"wget {IMAGES_DOWNLOAD_URL} -O images.tar.gz", shell=True) + call(f"tar -xzf images.tar.gz -C {out_path}", shell=True) + call("rm images.tar.gz", shell=True) + + +def create_annotation_file(root, lang_code): + if lang_code not in SUPPORTED_LANGUAGES: + raise ValueError( + f"Language code {lang_code} not supported. Supported languages are {SUPPORTED_LANGUAGES}" + ) + data_dir = os.path.join(root, "multilingual_mscoco") + if not os.path.exists(data_dir): + _download_images(data_dir) + images_dir = os.path.join(data_dir, "images") + print("Downloading multilingual_ms_coco index file") + download_path = os.path.join(GITHUB_DATA_PATH, IMAGE_INDEX_FILENAME) + target_images = _get_lines(download_path) + + print("Downloading multilingual_ms_coco captions:", lang_code) + captions_path = GITHUB_DATA_PATH + if lang_code in ["de", "fr"]: + captions_path = GITHUB_DATA_PATH_DE_FR + elif lang_code == "jp": + captions_path = GITHUB_DATA_PATH_JP + download_path = os.path.join( + captions_path, CAPTIONS_FILENAME_TEMPLATE.format(lang_code) + ) + target_captions = _get_lines(download_path) + + number_of_missing_images = 0 + valid_images, valid_annotations, valid_indicies = [], [], [] + for i, (img, txt) in enumerate(zip(target_images, target_captions)): + image_path = os.path.join(images_dir, img) + if not os.path.exists(image_path): + print("Missing image file", img) + number_of_missing_images += 1 + continue + + valid_images.append(image_path) + valid_annotations.append(txt) + valid_indicies.append(i) + + if number_of_missing_images > 0: + print(f"*** WARNING *** missing {number_of_missing_images} files.") + + with codecs.open( + os.path.join(root, OUTPUT_FILENAME_TEMPLATE.format(lang_code)), "w", encoding="utf-8" + ) as fp: + json.dump( + { + "image_paths": valid_images, + "annotations": valid_annotations, + "indicies": valid_indicies, + }, + fp, + ensure_ascii=False, + ) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/nllb_dist13b_prompts.json b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/nllb_dist13b_prompts.json new file mode 100644 index 0000000000000000000000000000000000000000..fd6709bc283afc3195773bd1d55226a1c68369a7 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/nllb_dist13b_prompts.json @@ -0,0 +1,7382 @@ +{ + "JA": [ + " {} 悪い写真", + " {} 沢山の写真", + "彫刻の\" {} \"", + "難易度が高い {} の写真です", + "低解像度写真で {} .", + "翻訳する {} ", + "グラフィティの\" {} ", + " {} の写真が悪い", + " {} のカットされた写真です.", + "刺青の\" {} \"", + "刺された {} .", + " {} 画像は見えない ", + " {} の明るい写真", + "清潔な {} の写真です.", + " {} 汚れた写真", + " {} の暗い写真", + " {} の図", + "写真は私の {} ", + "プラスチック {} ", + " {} 酷い写真", + " {} の近距離写真です", + " {} の黒白写真です", + "絵画の\" {} \"", + "絵画の\" {} \"", + " {} のピクセル化された写真", + "彫刻の\" {} \"", + " {} の明るい写真です.", + " {} のカットされた写真です", + "プラスチック {} ", + " {} 汚れた の写真", + " {} の jpeg 画像が破損したものです", + " {} のぼやけた写真", + "写真は,その {} .", + " {} のいい写真", + " {} の表示", + " {} ビデオゲームで", + "写真は1 {} ", + " {} の絵を描いた", + " {} の近距離写真", + "画像は {} ", + "オリガミの {} ", + "ビデオゲームで {}", + " {} のスケッチ", + " {} のドードルです", + "オリガミ {}", + "低解像度写真で {} .", + "玩具を {}", + "翻訳する {} ", + "清潔な写真です {} ", + "大きい {} の写真です", + "翻訳する {} ", + " {} 素敵な写真", + " {} 変な写真", + " {} のぼやけた写真", + "漫画の {} ", + "芸術の {} ", + " {} のスケッチ", + "刺された {} .", + " {} のピクセル化された写真", + " {} の itap を表示する", + " {} の jpeg 画像が破損したものです", + " {} 素敵な写真", + "毛布の靴を {}", + " {} 素敵な写真", + "細い {} の写真です", + " {} 変な写真", + "漫画の {} ", + "芸術の {} ", + " {} の図", + "大きい {} の写真", + " {} の黒白写真です", + "毛布の {} ", + " {} の暗い写真", + " {} の itap を表示する.", + " {} のグラフィティ", + "玩具じゃない {}", + "のを {}", + " {} 酷い写真", + "画像は小さな {} の写真です", + "刺青の\" {} \"" + ], + "OM": [ + "suuraa nama {} ta'e tokkoof ta'u.", + "Suuraa namoota hedduu {} .", + "fakkii {} .", + "suuraa {} isa ijaan hin mul'anne.", + "Suuraa {} sadarkaa murtaa'ina xiqqaa qabu.", + "a {} hiikuun.", + "Graafitii {} .", + "suuraa {} gadhee ta'e.", + "suuraa {} irraa murame.", + "tattoo of a {} .", + " {} kan marameefi", + "suuraa {} isa ijaan hin mul'anne.", + "suuraa ifa ta'e {} .", + "suuraa {} qulqulluu ta'e.", + "suuraa nama xuraa'aa {} .", + "suuraa dukkanaa {} .", + "suura {} .", + "suuraa {} koo", + " {} pilaastikii", + "suuraa nama gaarii {} .", + "suuraa {} fagoo ta'e.", + "suuraa gurraachafi adii {} .", + "fakkii {} .", + "fakkii {} .", + "suuraa {} pikselee ta'e.", + "fakkii {} .", + "suuraa ifa {} .", + "suuraa {} tokko daangesse.", + " {} pilaastikii.", + "suuraa nama xuraa'aa {} .", + "suuraa jpeg {} irraa manca'e.", + "suuraa {} laafaa.", + "suuraa {} .", + "suuraa gaarii {} .", + " {} kan ta'e.", + " {} tapha viidiyoo keessatti.", + "suuraa tokko {} .", + "a doodle of a {} .", + "suuraa {} fagoo ta'e.", + "suuraa {} .", + "Orijamiin {} .", + " {} tapha viidiyoo keessatti.", + "suura {} .", + " {} kan jedhuuf.", + "Origamii {} .", + "suuraa {} sadarkaa murtaa'ina xiqqaa qabu.", + "tapha {} .", + " {} kan ta'e.", + "suuraa qulqullina {} .", + "suuraa {} guddaa.", + " {} kan ta'e.", + "suuraa nama gaarii {} .", + "suuraa nama adda taʼeefi {} ", + "suuraa {} laafaa.", + "suuraa suuraa {} .", + " {} ", + " {} kan ta'e mallattoo.", + " {} kan maramee", + "suuraa {} pikselee ta'e.", + " {} keessaa", + "suuraa jpeg {} irraa manca'e.", + "suuraa gaarii {} .", + "a plushie {} .", + "suuraa nama gaarii {} .", + "suuraa xiqqoo {} .", + "suuraa nama adda taʼeefi {} ", + "suuraa suuraa {} .", + " {} ", + "suura {} .", + "suuraa {} guddaa.", + "suuraa gurraachafi adii {} .", + " {} kan uffata uffatu.", + "suuraa dukkanaa {} .", + "a {} taap", + "Graafitii {} .", + "tapha taphachuu {} .", + " {} kan ta'e", + "suuraa nama gaarii {} .", + "suuraa xiqqoo {} .", + "tattoo of the {} ." + ], + "DE": [ + "ein schlechtes Foto von einem {} .", + "Ein Foto von vielen {} .", + "eine Skulptur von {} .", + "ein Foto des schwer zu sehen {} .", + "ein Foto mit geringer Auflösung des {} .", + "eine Wiedergabe von {} .", + "Graffiti von einem {} .", + "ein schlechtes Foto des {} .", + "ein beschnittenes Foto des {} .", + "Ein Tattoo eines {} .", + "Die gebräucherte {} .", + "Ein Foto von einem schwer zu sehen {} .", + "ein helles Foto von einem {} .", + "ein Foto eines sauberen {} .", + "Ein Foto von einem schmutzigen {} .", + "Ein dunkles Foto von der {} .", + "eine Zeichnung von {} .", + "Ein Foto von meinem {} .", + "Die Plastik {} .", + "Ein Foto von dem coolen {} .", + "ein Nahaufnahmefoto von {} .", + "ein Schwarz-Weiß-Foto des {} .", + "ein Bild des {} .", + "ein Bild von {} .", + "ein pixelliertes Foto des {} .", + "eine Skulptur des {} .", + "ein helles Foto des {} .", + "ein beschnittenes Foto von {} .", + "Ein Kunststoff {} .", + "Ein Foto von dem schmutzigen {} .", + "ein verfälschtes Foto von {} .", + "ein verschwommenes Foto des {} .", + "ein Foto des {} .", + "ein gutes Foto des {} .", + "eine Wiedergabe des {} .", + "Ein {} in einem Videospiel.", + "ein Foto von einem {} .", + "Ein Doodle von einem {} .", + "ein Nahaufnahmefoto des {} .", + "ein Foto von einem {} .", + "Das Origami. {}", + "Das {} in einem Videospiel.", + "eine Skizze eines {} .", + "Ein Doodle des {} .", + "Ein Origami. {}", + "ein Foto mit geringer Auflösung von {} .", + "Das Spielzeug. {}", + "eine Wiedergabe des {} .", + "ein Foto des sauberen {} .", + "ein Foto eines großen {} .", + "eine Wiedergabe von {} .", + "Ein Foto von einem netten {} .", + "Ein Foto von einem seltsamen {} .", + "ein verschwommenes Foto von einem {} .", + "Eine Zeichentrickfilm {} .", + "Art einer {} .", + "eine Skizze des {} .", + "Ein gebräuchertes {} .", + "ein pixelliertes Foto von {} .", + "Ich habe das {} .", + "ein verfälschtes Foto des {} .", + "ein gutes Foto von einem {} .", + "Ein Plüschsch. {}", + "Ein Foto von dem netten {} .", + "ein Foto des kleinen {} .", + "Ein Foto von dem seltsamen {} .", + "Die Zeichentrickfilm {} .", + "Die Kunst der {} .", + "eine Zeichnung des {} .", + "ein Foto des großen {} .", + "ein schwarz-weißes Foto von {} .", + "Die Plüsch- {} .", + "Ein dunkles Foto von einem {} .", + "Ein Teil von {} .", + "Graffiti der {} .", + "Ein Spielzeug. {}", + "Ich habe einen Schlüssel. {}", + "Ein Foto von einem coolen {} .", + "ein Foto eines kleinen {} .", + "Ein Tattoo des {} ." + ], + "OR": [ + " {} ଗୋଟିଏ ଖରାପ ଫଟୋ", + "ଅନେକ {} ର ଫଟୋ ।", + "ଏକ ମୂର୍ତ୍ତି {} ।", + "ଦୃଶ୍ୟମାନ ହେବା କଷ୍ଟକର {} ର ଏକ ଫଟୋ ।", + " {} ର ଏକ ନିମ୍ନ ସଂକଳ୍ପନା ଫୋଟୋ", + " {} ର ଏକ ରିଡର ।", + "ଏକ {} ର ଗ୍ରାଫିଟି ।", + "ଗୋଟିଏ ଖରାପ ଫଟୋ {} .", + " {} ର ଏକ କଟାଯାଇଥିବା ଫଟୋ ।", + "ଏକ ଟାଟୁ {} .", + "କଢା ହୋଇଥିବା {} .", + "ଗୋଟିଏ ଫଟୋ ଯାହା ଦେଖିବା କଷ୍ଟକର {} .", + "ଏକ ଉଜ୍ଜ୍ୱଳ ଫଟୋ {} .", + "ଏକ ସଫା {} ର ଫଟୋ ।", + "ଏକ ଅଶ୍ଳୀଳ {} ର ଫଟୋ ।", + " {} ର ଏକ ଅନ୍ଧକାର ଫଟୋ ।", + " {} ର ଏକ ଚିତ୍ର ।", + "ମୋ {} ର ଏକ ଫଟୋ ।", + "ପ୍ଲାଷ୍ଟିକ {} .", + "ଏକ ସୁନ୍ଦର {} ର ଫଟୋ ।", + " {} ର ଏକ କ୍ଲୋଜ-ଅପ୍ ଫଟୋ", + " {} ର ଏକ କଳାଧଳା ଫଟୋ ।", + " {} ର ଏକ ଚିତ୍ର", + "ଏକ ଚିତ୍ରକଳା {} .", + " {} ର ଏକ ପିକ୍ସେଲ ଫଟୋ", + "ଏକ ମୂର୍ତ୍ତି {} ର", + " {} ର ଏକ ଉଜ୍ଜ୍ୱଳ ଫଟୋ ।", + " {} ର ଏକ କଟାଯାଇଥିବା ଫଟୋ", + "ପ୍ଲାଷ୍ଟିକ {} .", + " {} ଗୋଟିଏ ଫଟୋ ।", + " {} ର ଏକ jpeg ନଷ୍ଟ ହୋଇଥିବା ଫଟୋ", + " {} ର ଏକ ଅସ୍ପଷ୍ଟ ଫଟୋ ।", + " {} ର ଏକ ଫଟୋ ।", + " {} ର ଏକ ଭଲ ଫଟୋ ।", + " {} ର ଏକ ରିଡର ।", + "ଏକ ଭିଡିଓ ଗେମ୍ ରେ ଏକ {} ।", + "ଗୋଟିଏ {} ର ଫଟୋ ।", + "ଏକ ଡିଡଲ୍ {} .", + " {} ର ଏକ କ୍ଲୋଜ-ଅପ୍ ଫଟୋ ।", + "ଏକ {} ର ଫଟୋ ।", + "ଓରିଗାମି {} ।", + "ଏକ ଭିଡିଓ ଗେମ୍ ରେ ଥିବା ଏକ {} ।", + " {} ର ଏକ ଚିତ୍ର", + " {} ର ଏକ ଡୁଡଲ୍ ।", + "ଏକ ଓରିଗାମି {} .", + " {} ର ଏକ ନିମ୍ନ ସଂକଳ୍ପନା ଫୋଟୋ", + "ଖେଳନା {} .", + " {} ର ଏକ ଅନୁବାଦ", + "ସଫା {} ର ଏକ ଫଟୋ ।", + "ଏକ ବଡ଼ {} ର ଫଟୋ ।", + " {} ର ଏକ ଅନୁବାଦ", + "ଏକ ସୁନ୍ଦର {} ର ଫଟୋ ।", + "ଏକ ଅଜବ {} ର ଫଟୋ", + " {} ର ଏକ ଅସ୍ପଷ୍ଟ ଫଟୋ", + "ଏକ କାର୍ଟୁନ {} .", + "କୌଶଳ ଅନୁସାରେ ଏକ {} ।", + " {} ର ଏକ ଚିତ୍ର", + "ଏକ ସୂତା କଢା {} .", + " {} ର ଏକ ପିକ୍ସେଲିତ ଫଟୋ", + " {} ର ଇଟାପ", + " {} ର ଏକ jpeg ନଷ୍ଟ ହୋଇଥିବା ଫଟୋ", + " {} ଗୋଟିଏ ଭଲ ଫଟୋ", + "ଏକ ପ୍ଲୁସି {} .", + "ସୁନ୍ଦର {} ର ଏକ ଫଟୋ", + "ଛୋଟ {} ର ଏକ ଫଟୋ ।", + "ଏକ ଫଟୋ ଅଜବ {} ର ।", + "କାର୍ଟୁନ {} .", + "କଳା ଧାରା {}", + " {} ର ଏକ ଚିତ୍ର ।", + "ବଡ଼ {} ର ଏକ ଫଟୋ ।", + "ଏକ {} ର କଳା ଧଳା ଫଟୋ", + "ପ୍ଲୁସି {} ।", + "ଏକ {} ର ଏକ ଅନ୍ଧକାର ଫଟୋ ।", + "ଏକ {} ର ଇଟାପ", + " {} ର ଗ୍ରାଫିଟି", + "ଏକ ଖେଳନା {} .", + "ମୋ {} ର ଇଟାପ ।", + "ଏକ ସୁନ୍ଦର ଫଟୋ । {}", + "ଗୋଟିଏ ଛୋଟ {} ର ଫଟୋ ।", + " {} ର ଏକ ଟାଟୁ ।" + ], + "MK": [ + "лоша фотографија на {} .", + "Фотографија на многу жени. {}", + "скулптура на {} .", + "фотографија на тешко да се види {} .", + "фотографија со ниска резолуција на {} .", + "превршување на {} .", + "Графити на една {} .", + "лоша фотографија на {} .", + "намалена фотографија на {} .", + "Тетоважа на {} .", + "извитканата {} .", + "Фотографија на тешко видлива {} .", + "светла фотографија на {} .", + "фотографија на чиста {} .", + "Фотографија на нечиста {} .", + "темна фотографија на {} .", + "цртеж на {} .", + "Фотографија на мојата {} .", + "Пластикот {} .", + "Фотографија на кулот {} .", + "блиска фотографија на {} .", + "црно-бела фотографија на {} .", + "слика на {} .", + "слика на {} .", + "пикселирана фотографија на {} .", + "Скулптура на {} .", + "светла фотографија на {} .", + "намалена фотографија на {} .", + "пластична {} .", + "Фотографија на \"Пискав {} \".", + "jpeg оштетена фотографија на {} .", + "Нејасна фотографија на {} .", + "фотографија на {} .", + "добра фотографија на {} .", + "превршување на {} .", + " {} во видео игра.", + "фотографија на еден {} .", + " {} ", + "блиска фотографија на {} .", + "фотографија на {} .", + "Оригамиот {} .", + " {} во видео игра.", + "скица на {} .", + "цртеж на {} .", + "Оригами. {}", + "фотографија со ниска резолуција на {} .", + "играчката. {}", + "превод на {} .", + "фотографија на чистиот {} .", + "фотографија на голема {} .", + "превод на {} .", + "Фотографија од убава {} .", + "Фотографија на чуден {} .", + "Нејасна фотографија на {} .", + "цртана {} .", + "Уметноста на {} .", + "скица на {} .", + "избркано {} .", + "пикселирана фотографија на {} .", + "Итап на {} .", + "jpeg оштетена фотографија на {} .", + "добра фотографија на {} .", + "Плушок. {}", + "Фотографија на убавиот {} .", + "фотографија на малото {} .", + "Фотографија на чудниот {} .", + "анимацијата {} .", + "на уметноста на {} .", + "цртеж на {} .", + "фотографија на големиот {} .", + "црно-бела фотографија на {} .", + "Плушокот. {}", + "темна фотографија на {} .", + "Итап од {} .", + "Графити на {} .", + "играчка. {}", + "-Да, тоа е мојата {} .", + "Фотографија на кул {} .", + "фотографија на мал {} .", + "тетоважа на {} ." + ], + "ET": [ + " {} Halb pilt ", + "Paljude {} foto.", + " {} ", + "raske nägemisega {} foto.", + " {} madala resolutsiooniga foto.", + "a {} tõlgendamine.", + " {} graffiti.", + " {} halva foto.", + " {} lõigatud foto.", + "tätoveeringu {} .", + "Kroonitud {} .", + "Pilt raske näha {} .", + " {} heled foto.", + "puhta {} foto.", + "Päris räpane foto. {}", + " {} pimeda foto.", + " {} joonistus.", + "foto mu {} .", + "Plastist {} .", + "Pilt sellest lahedast {} .", + "Lähenemisfoto {} .", + "mustvalge foto {} .", + " {} maali.", + "maalid {} .", + "pikseldatud foto {} .", + " {} ", + " {} heled foto.", + "lõikatud foto {} .", + "plastist {} .", + "Päris {} ", + "Jpeg-i rikkunud foto {} .", + " {} -i hägune foto.", + "foto {} .", + "Hea foto {} .", + " {} tõlgendamine.", + " {} videomängus.", + "ühe {} foto.", + " {} karitseldamine.", + " {} lähivõtt.", + "foto {} .", + "Origami {} .", + " {} videomängus.", + " {} joonistus.", + " {} karikate.", + "Origami {} .", + " {} madala resolutsiooniga foto.", + " {} mänguasi.", + " {} tõlgendus.", + "puhta {} foto.", + "suurte {} foto.", + " {} tõlgendamine.", + "Foto kena {} .", + "Foto kummalisest {} .", + "Unustatud foto {} .", + " {} sarjakat.", + " {} kunsti.", + " {} joonistus.", + "süstitud {} .", + "pikseldatud foto {} .", + " {} i osa.", + "Jpeg-i rikkunud foto {} .", + "Hea pilt {} .", + "Plüssika. {}", + "Pildil kena {} .", + "väike {} foto.", + "Pilt kummalisest {} .", + " {} sarjakat.", + " {} kunsti.", + " {} joonistus.", + "suurte {} foto.", + "mustvalge foto {} .", + "Plüssika. {}", + " {} pimedast fotost.", + "a {} ", + " {} graffiti.", + "Mänguasi. {}", + "- Minu {} .", + " {} foto lahedast ", + "väike {} pilt.", + "tätoveeringu {} ." + ], + "LV": [ + "slikta fotogrāfija no {} .", + "daudzas fotogrāfijas {} .", + "skulptūra no {} .", + "foto no grūti redzama {} .", + " {} foto ar zemu izšķirtspēju.", + "a {} izvēršana.", + "grafiti par {} .", + "slikta fotogrāfija no {} .", + "izkropļota fotogrāfija no {} .", + "tatuēšana ar {} .", + "uzvilkta {} .", + "foto no grūti redzama {} .", + "skaidra fotogrāfija par {} .", + "fotogrāfija no tīrām {} .", + "fotogrāfija no netīrā {} .", + "tumša fotogrāfija no {} .", + "a {} zīmējums.", + "Fotogrāfija no manas {} .", + "plastmasas {} .", + "fotogrāfija no forša {} .", + " {} nobliedzis.", + "melna un balta fotogrāfija par {} .", + " {} attēls.", + " {} attēls.", + " {} pixelētu fotogrāfiju.", + " {} skulptūra.", + "skaidra fotogrāfija par {} .", + "izkropļotā fotogrāfija no {} .", + "plastmasas {} .", + "fotogrāfija no netīrā {} .", + "jpeg bojāta fotogrāfija {} .", + " {} tumšs attēls.", + " {} fotogrāfija.", + "laba fotogrāfija no {} .", + " {} attēla izvēršana.", + " {} videospēlē.", + "fotogrāfija no viena {} .", + "uzrakstīts {} .", + " {} augšupfotogrāfija.", + "fotogrāfija no {} .", + "origami {} .", + " {} videospēlē.", + " {} skats.", + " {} zīmējums.", + "origami {} .", + " {} foto ar zemu izšķirtspēju.", + "rotaļlietas {} .", + " {} ", + "fotogrāfija no tīrās {} .", + "liela {} .", + "a {} izteiksme.", + "Foto no skaistas {} .", + "fotogrāfija no dīvaina {} .", + "nešķīstošs fotogrāfija {} .", + "mūziķiem {} .", + " {} ", + " {} skats.", + "uzvilktā {} .", + "pixelētu fotogrāfiju no {} .", + " {} ", + "jpeg bojāta fotogrāfija par {} .", + "laba fotogrāfija no {} .", + "plūša. {}", + "fotogrāfija no skaista {} .", + "fotogrāfija no mazā {} .", + "fotogrāfija no dīvaina {} .", + "mūziķiem {} .", + " {} ", + " {} attēls.", + "lielās {} fotogrāfija.", + "melna un balta fotogrāfija par {} .", + "plūša. {}", + "tumša fotogrāfija no {} .", + "a {} ", + "grafiti no {} .", + " {} lļdzdzdzdzļba.", + "manā {} .", + "fotogrāfija no forša {} .", + "neliela {} .", + " {} tatuēšana." + ], + "KU": [ + "وێنەیەکی خراپ لە {} ", + "وێنەیەکی زۆر {} .", + "پەیکەرێکی {} ", + "وێنەیەک لە سەخت بینینی {} ", + "وێنەیەکی کەمی ڕوونی {} .", + "ڕێنواردەکردنی {} .", + "گرافیتی لە {} ", + "وێنەیەکی خراپ لە {} ", + "وێنەیەکی بڕاو لە {} .", + "تاتۆیەک لە {} ", + " {} بەرگی بەردراو", + "وێنەی {} ێکی سەخت بۆ بینین.", + "وێنەیەکی گەش لە {} .", + "وێنەی {} ێکی پاک.", + "وێنەی {} کەسێکی پیسە", + "وێنەیەکی تاریک لە {} .", + "وێنەیەکی {} .", + "وێنەیەک لە {} م", + "پلاستیکەکە {} .", + "وێنەیەک لە {} ", + "وێنەی نزیک لە {} .", + "وێنەیەکی ڕەش و سپی لە {} .", + "وێنەیەکی {} .", + "وێنەیەکی {} .", + "وێنەی پیکسڵکراو لە {} .", + "پەیکەری {} .", + "وێنەیەکی ڕوون لە {} .", + "وێنەی بڕاو لە {} .", + "لە پلاستیک {} .", + "وێنەیەک لە {} گڵاو", + "وێنەیەکی تێکچوو لە jpeg لە {} .", + "وێنەیەکی ناڕوون لە {} .", + "وێنەیەک لە {} .", + "وێنەیەکی باش لە {} .", + "ڕێنواردەکردنی {} .", + " {} لە یاریەکی ڤیدیۆیی.", + "وێنەی یەک {} ", + "داڕێژەیەکی {} ", + "وێنەی نزیک لە {} .", + "وێنەی {} .", + " {} ئۆریگامی", + " {} لە یاریەکی ڤیدیۆیی.", + "نەخشەی {} .", + "داڕێژەیەک لە {} .", + "ئۆریگامی {}", + "وێنەیەکی ڕوونی کەم لە {} .", + "یاریەکە {} .", + "دەرهێنانی {} .", + "وێنەیەکی پاک {}", + "وێنەی {} گەورەیەک", + "دەرهێنانی {} .", + "وێنەی {} یەکێکی جوان", + "وێنەی {} ", + "وێنەیەکی ناڕوون لە {} .", + "کاریکاتێرێک {} .", + "هونەری {} ", + "نەخشەی {} .", + " {} بەرگیلێکراو", + "وێنەی پیکسڵکراو لە {} .", + "لە {} .", + "وێنەیەکی تێکچوو لە jpeg لە {} .", + "وێنەیەکی باش لە {} ", + " {} پڵشەیەک", + "وێنەیەک لە {} خۆزگە جوانەکە", + "وێنەیەکی {} بچووکەکە", + "وێنەیەکی {} ویژگە سەیرە", + "کاریکاتێرەکە {} .", + "هونەری {} ", + "وێنەیەکی {} .", + "وێنەی {} گەورەکە", + "وێنەیەکی ڕەش و سپی لە {} .", + " {} پڵشەی", + "وێنەیەکی تاریک لە {} .", + "ئیتاپ لە {} .", + "گرافیتی لە {} .", + "یارییەک {}", + " {} ", + "وێنەی {} کۆڵێک", + "وێنەی {} بچووک", + "تاتۆی {} ." + ], + "RU": [ + "Плохая фотография {} .", + "фото многих {} .", + "скульптура {} .", + "фото трудновидимого {} .", + "фото с низким разрешением {} .", + "перевод {} .", + "Граффити из {} .", + "Плохая фотография {} .", + "обрезка фотографии {} .", + "татуировка \" {} \".", + "вышитый {} .", + "Фото сложно увидеть {} .", + "яркая фотография с {} .", + "фото чистой {} .", + "Фотографию грязной {} .", + "темная фотография {} .", + "рисунок с {} .", + "Фотографию моего {} .", + "пластиковый {} .", + "фото крутого {} .", + "фото сближения с {} .", + "черно-белая фотография с {} .", + "Картина с {} .", + "Картина с {} .", + "пикселированная фотография {} .", + "скульптура {} .", + "яркое фото с {} .", + "обрезка фотографии {} .", + "пластиковый {} .", + "Фотографию грязного {} .", + "поврежденная фотография jpeg {} .", + "Нечеткое фото {} .", + "фотографию {} .", + "хорошая фотография {} .", + "перевод {} .", + " {} в видеоигре.", + "фотографию одного из {} .", + "рисунок из {} .", + "фото сближения с {} .", + "фотографию {} .", + "Оригами {} .", + " {} в видеоигре.", + "эскиз {} .", + "рисунок из {} .", + "Оригами {} .", + "фото с низким разрешением {} .", + " {} игрушку.", + "представление {} .", + "фотографию чистой {} .", + "фото большой {} .", + "представление {} .", + "Фотографию хорошего {} .", + "Фото странного {} ", + "Нечеткое фото {} .", + "мультфильм {} .", + "в соответствии со статьей {} .", + "эскиз {} .", + "вышитый {} .", + "пикселированная фотография {} .", + "Итап {} .", + "поврежденная фотография jpeg {} .", + "Хорошая фотография {} .", + "плюшевый {} .", + "фото хорошего {} .", + "фото маленькой {} .", + "Фото странного {} .", + "Мультфильм {} .", + "Искусство {} .", + "рисунок {} .", + "фото большого {} .", + "черно-белая фотография с {} .", + "плюшевый {} .", + "темная фотография с {} .", + "Итап из {} .", + "Граффити из {} .", + " {} игрушка.", + "Итап моего {} .", + "Фотографию крутой {} .", + "фото маленького {} .", + "татуировка \" {} \"." + ], + "FR": [ + "Une mauvaise photo d'un {} .", + "Une photo de beaucoup de {} .", + "une sculpture d'un {} .", + "une photo du {} difficile à voir.", + "une photo de basse résolution de la {} .", + "une représentation de {} .", + "Des graffitis de {} .", + "une mauvaise photo du {} .", + "une photo recadrée de la {} .", + "Un tatouage de \" {} \".", + "le {} brodé.", + "une photo d'un {} difficile à voir.", + "une photo lumineuse d'un {} .", + "une photo d'un {} propre.", + "Une photo d'un sale {} .", + "une photo sombre de la {} .", + "un dessin de {} .", + "Une photo de mon {} .", + "le plastique {} .", + "une photo du cool {} .", + "une photo de gros plan d'une {} .", + "une photo en noir et blanc de la {} .", + "une peinture de la {} .", + "une peinture de {} .", + "une photo pixellisée de la {} .", + "une sculpture de la {} .", + "une photo lumineuse de la {} .", + "une photo recadrée d'un {} .", + "Un {} en plastique.", + "Une photo du sale {} .", + "une photo corrompu de {} .", + "une photo floue de la {} .", + "une photo de la {} .", + "une bonne photo du {} .", + "une représentation de {} .", + "Un {} dans un jeu vidéo.", + "une photo d'un {} .", + "un doodle de un {} .", + "une photo de gros plan de la {} .", + "une photo d'un {} .", + "Le origami. {}", + "Le {} dans un jeu vidéo.", + "une esquisse d'une {} .", + "une taquinerie de la {} .", + "Un origami. {}", + "une photo à basse résolution d'un {} .", + "Le jouet. {}", + "une représentation de {} .", + "une photo du {} propre.", + "une photo d'un grand {} .", + "une représentation de {} .", + "une photo d'un joli {} .", + "Une photo d'un drôle de {} .", + "une photo floue d'un {} .", + "une bande dessinée. {}", + "au point a {} .", + "une esquisse de la {} .", + "une {} brodée.", + "une photo pixellisée d'un {} .", + "l'étape de la {} .", + "une photo jpeg corrompue du {} .", + "une bonne photo d'un {} .", + "Une peluche. {}", + "Une photo du joli {} .", + "une photo de la petite {} .", + "Une photo de la drôle de {} .", + "le dessin animé {} .", + "L'art du {} .", + "un dessin de la {} .", + "une photo de la grande {} .", + "une photo en noir et blanc d'un {} .", + "Le plushie {} .", + "une photo sombre d'un {} .", + "le nombre de points de {} .", + "Des graffitis du {} .", + "Un jouet. {}", + "Je suis désolé. {}", + "Une photo d'un cool {} .", + "une photo d'un petit {} .", + "un tatouage du {} ." + ], + "EO": [ + "malbona foto de {} .", + "foto de multaj {} .", + "la skulptaĵo de {} .", + "foto de la malfacile videbla {} .", + "foto de la {} .", + "la rezulto de {} .", + "Grafitio de la {} .", + "malbona foto de la {} .", + "tranĉita foto de la {} .", + "la tatuo de la {} .", + "la broditan {} .", + "foto de malfacile videbla {} .", + "brila foto de {} .", + "foto de pura {} .", + "foto de malpura {} .", + "malluma foto de la {} .", + "desegnaĵo de {} .", + "foto de mia {} .", + "la plasta {} .", + "Foto de la mojosa {} .", + "proksima foto de {} .", + "nigrablanka foto de la {} .", + "bildo de la {} .", + "bildo de {} .", + "piksita foto de la {} .", + "la skulptaĵo de la {} .", + "brila foto de la {} .", + "tranĉita foto de {} .", + "plasta {} .", + "foto de la malpuraj {} .", + "jpeg difektita foto de {} .", + "malklara foto de la {} .", + "foto de la {} .", + "bona foto de la {} .", + "la rezulto de la {} .", + " {} en videoludo.", + "foto de unu {} .", + "la skrapiĝo de {} .", + "proksima foto de la {} .", + "foto de {} .", + "la origami {} .", + "la {} en videoludo.", + "skizo de {} .", + "la karikaturo de la {} .", + "Origamio. {}", + "foto de malalta rezolucio de {} .", + "la ludilon. {}", + "la interpreto de la {} .", + "foto de la pura {} .", + "foto de granda {} .", + "la interpreto de {} .", + "foto de bela {} .", + "foto de stranga {} .", + "malklara foto de {} .", + "bildstrio {} .", + "art of a {} .", + "skizo de la {} .", + "bordita {} .", + "piksita foto de {} .", + "la {} .", + "jpeg difektita foto de la {} .", + "Bona foto pri {} .", + "Pluŝa ĉemizo. {}", + "foto de la bela {} .", + "foto de la malgranda {} .", + "foto de la stranga {} .", + "la bildstrio {} .", + "la art de la {} .", + "desegnaĵo de la {} .", + "foto de la granda {} .", + "nigrablanka foto de {} .", + "la pluŝan {} .", + "malluma foto de {} .", + "la nombro da {} .", + "Grafitio de la {} .", + "ludilo. {}", + "Mi ne povas... {}", + "Foto de mojosa {} .", + "foto de malgranda {} .", + "tatuo de la {} ." + ], + "GD": [ + "droch dealbh de {} .", + "dealbh de iomadh {} .", + "dealbh de {} .", + "dealbh den rud a tha doirbh fhaicinn {} .", + "dealbh ìosal de {} .", + "a 'toirt seachad {} .", + "graffiti de {} .", + "droch dealbh den {} .", + "dealbh gearraichte den {} .", + "tatù de {} .", + "an {} bròide.", + "dealbh de dhroch fhaicinn {} .", + "dealbh soilleir de {} .", + "dealbh de shealbh glan {} .", + "dealbh de dhroch {} .", + "dealbh dorcha den {} .", + "dealbhan de {} .", + "dealbh de mo {} .", + "an plastaig {} .", + "dealbh den cool {} .", + "dealbh faisg air làimh de {} .", + "dealbh dubh is geal den {} .", + "dealbh den {} .", + "dealbh de {} .", + "dealbh piogsailte den {} .", + "dealbh den {} .", + "dealbh soilleir den {} .", + "dealbh gearraichte de {} .", + "plastaig {} .", + "dealbh den salach {} .", + "dealbh jpeg truaillte de {} .", + "dealbh mì-chliùiteach den {} .", + "dealbh den {} .", + "dealbh math den {} .", + "a 'crìochnachadh an {} .", + " {} ann an geama bhidio.", + "dealbh de aon {} .", + "a 'chraoladh de {} .", + "dealbh faisg air làimh den {} .", + "dealbh de {} .", + "an origami {} .", + "an {} ann an geama bhidio.", + "dealbh de {} .", + "a 'chraobhadh de {} .", + "origami {} .", + "dealbh ìosal rùn de {} .", + "an cluiche {} .", + "a 'dèanamh a-mach an {} .", + "dealbh den glan {} .", + "dealbh de {} mòr.", + "a 'dèanamh a {} .", + "dealbh de nice {} .", + "dealbh de {} aotrom.", + "dealbh mì-chliùiteach de {} .", + "cartoon {} .", + "earbsa {} .", + "dealbh de {} .", + " {} air a chraoladh.", + "dealbh piogsailte de {} .", + "a's ann an {} .", + "dealbh jpeg truaillte den {} .", + "dealbh math de {} .", + "a plushie {} .", + "dealbh den nice {} .", + "dealbh den bheag {} .", + "dealbh den {} aisteach.", + "an cartùn {} .", + "ealain an {} .", + "dealbhadh den {} .", + "dealbh den {} mòr.", + "dealbh dubh is geal de {} .", + "an plushie {} .", + "dealbh dorcha de {} .", + "a' cho-dhùnadh a {} .", + "graffiti an {} .", + "cluiche {} .", + "Tha mi a 'dèanamh mo {} .", + "dealbh de cool {} .", + "dealbh de {} beag.", + "tatù de {} ." + ], + "AF": [ + "'n slegte foto van 'n {} .", + "'n foto van baie {} .", + "'n beeld van 'n {} .", + "'n foto van die moeilik om te sien {} .", + "'n lae resolusie foto van die {} .", + "'n weergawe van 'n {} .", + "graffiti van 'n {} .", + "'n slegte foto van die {} .", + "'n geknip foto van die {} .", + "'n tatoeëermerk van 'n {} .", + "die borduurde {} .", + "'n foto van 'n moeilik om te sien {} .", + "'n helder foto van 'n {} .", + "'n foto van 'n skoon {} .", + "'n foto van 'n vuil {} .", + "'n donker foto van die {} .", + "'n tekening van 'n {} .", + "'n foto van my {} .", + "die plastiek {} .", + "'n foto van die koel {} .", + "'n groot-up foto van 'n {} .", + "'n swart en wit foto van die {} .", + "'n skildery van die {} .", + "'n skildery van 'n {} .", + "'n gepixel foto van die {} .", + "'n beeld van die {} .", + "'n helder foto van die {} .", + "'n geknip foto van 'n {} .", + "'n plastiek {} .", + "'n foto van die vuil {} .", + "'n jpeg beskadigde foto van 'n {} .", + "'n vaag foto van die {} .", + "'n foto van die {} .", + "'n goeie foto van die {} .", + "'n weergawe van die {} .", + "'n {} in 'n videospeletjie.", + "'n foto van een {} .", + "'n doodle van 'n {} .", + "'n groot-up foto van die {} .", + "'n foto van 'n {} .", + "die origami {} .", + "die {} in 'n videospeletjie.", + "'n skets van 'n {} .", + "'n doodle van die {} .", + "'n origami {} .", + "'n lae resolusie foto van 'n {} .", + "die speelding {} .", + "'n weergawe van die {} .", + "'n foto van die skoon {} .", + "'n foto van 'n groot {} .", + "'n weergawe van 'n {} .", + "'n foto van 'n lekker {} .", + "'n foto van 'n vreemde {} .", + "'n vaag foto van 'n {} .", + "'n spotprent {} .", + "die kuns van 'n {} .", + "'n skets van die {} .", + "'n borduurde {} .", + "'n gepixel foto van 'n {} .", + "die aanwysings van die {} .", + "'n jpeg beskadigde foto van die {} .", + "'n goeie foto van 'n {} .", + "'n pluisie {} .", + "'n foto van die oulike {} .", + "'n foto van die klein {} .", + "'n foto van die vreemde {} .", + "die spotprent {} .", + "die artikel van die {} .", + "'n tekening van die {} .", + "'n foto van die groot {} .", + "'n swart en wit foto van 'n {} .", + "die pluisie {} .", + "'n donker foto van 'n {} .", + "die aanwysings van 'n {} .", + "graffiti van die {} .", + "'n speelding {} .", + "van my {} .", + "'n foto van 'n cool {} .", + "'n foto van 'n klein {} .", + "'n tatoeëermerk van die {} ." + ], + "ID": [ + "foto yang buruk dari {} .", + "foto dari banyak {} .", + "patung dari {} .", + "Foto dari yang sulit dilihat {} .", + "foto resolusi rendah dari {} .", + "sebuah rendering dari {} .", + "Grafiti dari {} .", + "foto yang buruk dari {} .", + "foto yang dipotong dari {} .", + "Tato dari {} .", + "yang diukir {} .", + "Foto dari sulit untuk melihat {} .", + "Foto yang terang dari sebuah {} .", + "Foto dari sebuah {} bersih.", + "Foto {} kotor.", + "Foto gelap dari {} .", + "gambar dari {} .", + "foto {} ku.", + "plastik {} .", + "foto yang keren {} .", + "foto dekat dari {} .", + "Foto hitam putih dari {} .", + "sebuah lukisan dari {} .", + "sebuah lukisan dari {} .", + "foto piksel dari {} .", + "patung dari {} .", + "Foto terang dari {} .", + "foto yang dipotong dari {} .", + "plastik {} .", + "Foto dari kotor {} .", + "Foto jpeg rusak dari {} .", + "Foto kabur dari {} .", + "foto dari {} .", + "foto yang bagus dari {} .", + "sebuah rendering dari {} .", + " {} dalam video game.", + "Foto dari satu {} .", + "sebuah doodle dari {} .", + "foto dekat dari {} .", + "foto dari {} .", + "Origami {} .", + " {} dalam video game.", + "sketsa dari {} .", + "sebuah doodle dari {} .", + "origami {} .", + "foto resolusi rendah dari {} .", + "mainan {} .", + "sebuah rendering dari {} .", + "foto dari bersih {} .", + "Foto dari sebuah {} besar.", + "sebuah rendering dari {} .", + "foto {} yang bagus.", + "Foto dari {} aneh.", + "Foto kabur dari sebuah {} .", + "sebuah kartun {} .", + "Art of a {} .", + "sketsa dari {} .", + "sebuah {} bordir.", + "foto pixelated dari {} .", + "Itup dari {} .", + "foto jpeg rusak dari {} .", + "foto yang bagus dari {} .", + "Plüschie {} .", + "Foto dari Nice {} .", + "Foto dari kecil {} .", + "Foto dari aneh {} .", + "kartun {} .", + "Art of the {} .", + "gambar dari {} .", + "foto dari besar {} .", + "Foto hitam putih dari {} .", + "Plummy {} .", + "Foto gelap dari {} .", + "Itup dari {} .", + "Grafiti dari {} .", + "mainan {} .", + " {} ", + "foto {} keren.", + "Foto dari kecil {} .", + "Tato dari {} ." + ], + "SV": [ + "Ett dåligt foto av en {} .", + "Ett foto av många {} .", + "en skulptur av en {} .", + "Ett foto av det svårsynta {} .", + "ett foto med låg upplösning av {} .", + "en återgivning av {} .", + "Graffiti av en {} .", + "Ett dåligt foto av din {} .", + "ett klippt foto av {} .", + "En tatuering av en {} .", + "Den broderade {} .", + "Ett foto av en svår att se {} .", + "ett ljusfoto av en {} .", + "Ett foto av en ren {} .", + "Ett foto av en smutsig {} .", + "ett mörkt foto av {} .", + "En ritning av {} .", + "Ett foto av min {} .", + "- Den där plast {} .", + "Ett foto av den coola {} .", + "ett närbildsskift av en {} .", + "ett svartvitt foto av {} .", + "En målning av {} .", + "En målning av en {} .", + "ett pixelfotografi av {} .", + "En skulptur av den {} .", + "ett ljusfoto av {} .", + "ett klippt foto av en {} .", + "en plast {} .", + "Ett foto av den smutsiga {} .", + "ett skadat foto av en {} .", + "ett suddigt foto av {} .", + "ett foto av {} .", + "Ett bra foto av {} .", + "en återgivning av {} .", + "En {} i ett videospel.", + "Ett foto av en {} .", + "En doodle av en {} .", + "ett närbildsskift av {} .", + "ett foto av en {} .", + "Origamin. {}", + " {} i ett videospel.", + "En skiss av en {} .", + "En doodle av {} .", + "Ett origami. {}", + "ett foto med låg upplösning av en {} .", + "- Det är leksaken. {}", + "en återgivning av {} .", + "Ett foto av den rena {} .", + "Ett foto av en stor {} .", + "en återgivning av {} .", + "Ett foto av en fin {} .", + "Ett foto av en konstig {} .", + "ett suddigt foto av en {} .", + "En tecknad serie. {}", + "Art of a {} .", + "En skiss av {} .", + "en broderad {} .", + "ett pixelfotografi av en {} .", + "Itap av {} .", + "ett skadat foto av {} .", + "Ett bra foto av en {} .", + "En plushie. {}", + "Ett foto av den fina {} .", + "Ett foto av den lilla {} .", + "Ett foto av den konstiga {} .", + "Den tecknade {} .", + "Artikel 1 i förordning (EG) nr 73/2009 {}", + "En ritning av {} .", + "Ett foto av den stora {} .", + "ett svartvitt foto av en {} .", + "- Den plushie. {}", + "ett mörkt foto av en {} .", + "Itap av a {} .", + "Graffiti på {} .", + "En leksak. {}", + "- Det är min {} .", + "Ett foto av en cool {} .", + "Ett foto av en liten {} .", + "En tatuering av {} ." + ], + "BG": [ + "лоша снимка на един {} .", + "Снимка на много {} .", + "скулптура на {} .", + "снимка на трудно виждания {} .", + "снимка с ниска резолюция на {} .", + "превръщане на {} .", + "Графити на {} .", + "лоша снимка на {} .", + "изрязана снимка на {} .", + "татуировка на {} .", + "с бродирана {} .", + "Снимка на трудно виждане на {} .", + "ярка снимка на {} .", + "снимка на чист {} .", + "Снимка на мръсна жена. {}", + "тъмна снимка на {} .", + "чертеж на {} .", + "Снимка на моята {} .", + "Пластмасата {} .", + "снимка на готиния {} .", + "снимка отблизо на {} .", + "черно-бяла снимка на {} .", + "картина на {} .", + "картина на {} .", + "пикселирана снимка на {} .", + "скулптура на {} .", + "ярка снимка на {} .", + "изрязана снимка на {} .", + "Пластмасова {} .", + "Снимка на мръсния {} .", + "jpeg повредена снимка на {} .", + "размазана снимка на {} .", + "снимка на {} .", + "добра снимка на {} .", + "превръщане на {} .", + " {} в видео игра.", + "снимка на един {} .", + " {} .", + "снимка отблизо на {} .", + "снимка на {} .", + "Оригами. {}", + " {} в видео игра.", + "скица на {} .", + "рисунка на {} .", + "Оригами. {}", + "снимка с ниска резолюция на {} .", + "играчката. {}", + "превръщане на {} .", + "снимка на чистия {} .", + "снимка на голяма {} .", + "превръщане на {} .", + "Снимка на хубава жена. {}", + "Снимка на странна {} .", + "размазана снимка на {} .", + "анимационна картина. {}", + "Art of a {} .", + "скица на {} .", + "с бродирана {} .", + "пикселирана снимка на {} .", + "Итап на {} .", + "jpeg повредена снимка на {} .", + "Една добра снимка на един {} .", + "Плюшово. {}", + "Снимка на хубавата {} .", + "снимка на малката {} .", + "Снимка на странната {} .", + "анимационната {} .", + "Изкуството на {} .", + "чертеж на {} .", + "снимка на голямата {} .", + "черно-бяла снимка на {} .", + "Плюшовата. {}", + "тъмна снимка на {} .", + "Итап от {} .", + "Графити на {} .", + "Играчка. {}", + "- Да, но... {}", + "Снимка на готин {} .", + "Снимка на малка {} .", + "татуировка на {} ." + ], + "PS": [ + "د {} یوه بد عکس.", + "د ډېرو {} عکسونه.", + "د يوې {} مجسمه.", + "د سخت لیدلو وړ {} عکس.", + "د {} د ټیټې حل عکس.", + "د {} د ښودلو.", + "د يوې {} ګرافيتي.", + "د {} یوه بد عکس.", + "د {} د کټ شوي عکس.", + "د يوې {} ټاټو.", + "د کښتو شوي {} .", + "د یو سخت لیدل شوي {} عکس.", + "د {} یو روښانه عکس.", + "د پاکې {} عکس.", + "د يوې ننگي {} انځور.", + "د {} د تور عکس.", + "د {} د يو رسم.", + "زما د {} یو عکس.", + "د پلاستيک {} .", + "د ښکلي {} عکس.", + "د {} د نږدې عکس.", + "د {} یو تور او سپین عکس.", + "د {} د انځور.", + "د {} د انځور.", + "د {} د پکسل شوي عکس.", + "د {} مجسمه.", + "د {} یو روښانه عکس.", + "د {} د يوې کټ شوي عکس.", + "د پلاستيک {} .", + "د هغه د بدمرغه {} عکس.", + "د {} د يوې خرابې شوې تصوير jpeg.", + "د {} د يوې مبهمې انځور.", + "د {} یو عکس.", + "د {} یو ښه عکس.", + "د {} د وړاندې کولو.", + "په یوه ویډیو لوبې کې. {}", + "د يو {} عکس.", + "د يوې {} ډوډل.", + "د {} د نږدې عکس.", + "د يو {} عکس.", + "د اوګامي {} .", + "په ويډيوي لوبو کې د {} ", + "د {} د رسم.", + "د {} د ډوډل.", + "د اوګامي {} ", + "د {} د ټیټې حل عکس.", + "د لوبو {} .", + "د {} د يو rendering.", + "د پاکې {} عکس.", + "د لوی {} عکس.", + "د {} د يوې بڼې د وړاندې کولو.", + "د ښکلي {} ", + "د يوې عجيبې {} انځور", + "د يوې {} يوې مبهمې انځور.", + "د کارتون {} ", + "د {} د هنر په توګه.", + "د {} د رسم.", + "د کښته شوي {} .", + "د {} د پکسل شوي عکس.", + "د {} د ټاپ.", + "د {} د يوې خرابې شوې تصوير jpeg.", + "د {} یو ښه عکس.", + "د پټو په شان. {}", + "د ښکلي {} عکس.", + "د کوچني {} عکس.", + "د عجیبې {} انځور.", + "د کارتون {} .", + "د {} د هنر په اساس.", + "د {} د رسم.", + "د لوی {} عکس.", + "د {} د تور او سپین عکس.", + "د پټو {} .", + "د {} د یو تور عکس.", + "د {} د ټاپ.", + "د {} د ګرافیتي.", + "د لوبو یوه ټوټه. {}", + "زما د {} د ډلې.", + "د يوې ښکلې {} انځور.", + "د کوچنۍ {} عکس.", + "د {} ټایټ." + ], + "SI": [ + " {} නරක ඡායාරූපයක්.", + " {} ගොඩක් පින්තූර.", + " {} ", + "පෙනීම දුර්වල {} ", + " {} වල අඩු විභේදන ඡායාරූපයක්.", + " {} වල පරිවර්තනය.", + " {} ග් රැෆිටි එකක්.", + " {} එකේ නරක පින්තූරයක්.", + " {} වල කප්පාදු කරන ලද ඡායාරූපයක්.", + " {} පච්චයක්.", + "කැටයම් කරන ලද {} .", + "පෙනෙන තරමට දුෂ්කර {} ", + " {} කියන එකක දීප්තිමත් ඡායාරූපයක්.", + "පිරිසිදු {} එකක් ඡායාරූපයක්.", + " {} අපිරිසිදු ", + " {} හිස් ඡායාරූපයක්.", + " {} අකුරක චිත් රයක්.", + "මගේ {} එකේ පින්තුරයක්.", + "ප්ලාස්ටික් {} ", + "සිසිල් {} ඡායාරූපයක්.", + " {} කින් සමීප ඡායාරූපයක්.", + " {} ගේ කළු සුදු ඡායාරූපයක්.", + " {} හි චිත් රයක්.", + " {} රූපයක්", + " {} වල පික්සෙල් කරන ලද ඡායාරූපයක්.", + "මුවහත් කර ඇති {} ", + " {} හි දීප්තිමත් ඡායාරූපයක්.", + " {} එකේ කප්පාදු කරපු ඡායාරූපයක්.", + "ප්ලාස්ටික් {} එකක්.", + " {} Dirty එකේ පින්තුරයක්.", + " {} වල jpeg දූෂිත ඡායාරූපයක්.", + " {} වල අඳුරු ඡායාරූපයක්.", + " {} ගේ ඡායාරූපයක්.", + " {} එකේ හොඳ පින්තූරයක්.", + " {} වල පරිවර්තනයක්.", + "වීඩියෝ ගේම් එකක. {}", + "එකක ඡායාරූපයක්. {}", + " {} ", + " {} ගේ සමීප ඡායාරූපයක්.", + " {} හි ඡායාරූපයක්.", + "ඔරිගාමි එක. {}", + "වීඩියෝ ගේම් එකක. {}", + " {} ක සිතුවමක්.", + " {} හි ඩූඩ්ල් එකක්.", + "ඔරිගාමි එකක්. {}", + "අඩු විභේදන ඡායාරූපයක් {} .", + "සෙල්ලම් බඩුවක්. {}", + " {} හි පරිවර්තනයක්.", + "පිරිසිදු {} ඡායාරූපයක්.", + "විශාල {} එකක් ඡායාරූපයක්.", + " {} අංකය නිරූපණය කිරීමක්.", + "ලස්සන {} එකක් ගැන පින්තූරයක්.", + "අමුතුම {} ", + " {} ", + "කාටූන් එකක්. {}", + " {} කලාව.", + " {} වල සැලැස්මක්.", + "කැටයම් කරන ලද {} .", + " {} වල පික්සෙල් කරන ලද ඡායාරූපයක්.", + " {} හි අගය", + " {} වල jpeg දූෂිත ඡායාරූපයක්.", + " {} හොඳ ඡායාරූපයක්.", + "පීච් එකක්. {}", + "ලස්සන {} එකේ පින්තුරයක්.", + "කුඩා {} වල ඡායාරූපයක්.", + "අමුතු {} එකේ පින්තූරයක්.", + " {} කාටූන් එක.", + "කලාපයේ {} .", + " {} අංකයේ චිත් රයක්.", + "ලොකු {} එකේ පින්තූරයක්.", + " {} ගේ කළු සුදු ඡායාරූපයක්.", + "පීච් එක. {}", + " {} අඳුරු ඡායාරූපයක්.", + " {} හි ඉටාප්.", + " {} ග් රැෆිටි වල", + "සෙල්ලම් බඩුවක්. {}", + "මගේ {} එක.", + "සිසිල් කෙනෙක්ගේ පින්තූරයක්. {}", + "කුඩා {} ක ඡායාරූපයක්.", + " {} පච්චයක්." + ], + "FI": [ + "huono kuva {} :stä.", + "Valokuvaus monista {} .", + "Kuvaus on {} .", + "Kuva vaikeasti nähtävästä {} .", + " {} :n matalavalokuva.", + " {} -kortin tulkinta.", + "Graffiti, jossa on {} .", + "Huono kuva {} .", + " {} :n leikattu kuva.", + "Tatuointi {} .", + "Romaistu {} .", + "Kuva vaikeasti nähtävästä {} .", + "Valkoinen kuva {} :sta.", + "Kuva puhtaasta {} .", + "Kuvan likaisesta {} .", + "tumma kuva {} .", + "piirretty {} .", + "Kuvan minun {} .", + "Muovinen {} .", + "Kuvaa siisteästä {} .", + "lähikuva {} .", + "mustavalkoinen kuva {} .", + "kuvaus {} .", + "kuvaus {} .", + "pixelisoitu kuva {} .", + "Kuvaus {} .", + "kirkkaat kuvat {} .", + "leikattu kuva {} .", + "Muovinen {} .", + "Kuvaa likaisesta {} .", + "Jpeg-kuva, jossa on {} .", + "hämärä kuva {} :sta.", + "kuvaa {} .", + "Hyvä kuva {} .", + " {} :n tulostus.", + " {} videopeliin.", + "kuva yhdestä {} .", + " {} -kirjoitus.", + "lähikuva {} .", + "kuvaa {} .", + "Origami {} .", + " {} videopeliin.", + "luettelo {} .", + "Kuvio on {} .", + "origami {} .", + "Vähämääräinen kuva {} :sta.", + "leikkikone. {}", + " {} -muodonmuoto.", + "Kuva puhtaasta {} .", + "Valokuva suuresta {} .", + " {} -muoto.", + "Kuvan mukavasta {} ", + "Kuvan oudosta {} ", + "-Hävyttä kuvaa. {}", + "-Tämä on piirretty. {}", + "luetteloon sisältyvässä taudissa {}", + "luettelo {} .", + "tikitetty {} .", + "pixelisoitu kuva {} .", + " {} :n taap.", + "Jpeg-kuva {} .", + "Hyvä kuva {} :sta.", + "- Pluusiko? {}", + "Kuvaa siitä mukavasta {} .", + "Pienen {} kuvan.", + "Kuvaa oudosta {} .", + "Elokuvan {} .", + "Taiteen {} .", + " {} -piirustuksen piirustus.", + "Valokuva suuresta {} .", + "mustavalkoinen kuva {} .", + "- Se on pelkkä pörrö. {}", + "tumma kuva {} :sta.", + "a {} .", + "Graffitiä. {}", + "- Ei, ei, ei, ei. Se on lelu. {}", + "- Se on minun {} -ni.", + "Kuvaa siisteästä {} .", + "Pienen {} kuvan.", + "Tatuointi {} ." + ], + "MR": [ + "एक {} चे वाईट फोटो.", + "अनेक {} . चे छायाचित्र", + "एक मूर्ती {} .", + "दिसणे कठीण {} चे छायाचित्र.", + " {} चे कमी रिझोल्यूशनचे छायाचित्र", + " {} चे प्रतिपादन", + "एका {} ची ग्राफिटी.", + " {} चे वाईट फोटो.", + " {} चे कापलेले फोटो.", + "एक {} ची गोंदण.", + "कढ़ाई केलेले {} .", + "एक कठीण दिसणारा {} .", + " {} चे चमकदार फोटो.", + "एका स्वच्छ {} .", + "एक गलिच्छ {} चे फोटो.", + " {} चे अंधुक छायाचित्र.", + " {} चे रेखाचित्र", + "माझ्या {} चे एक फोटो.", + "प्लास्टिक {} .", + "मस्त {} चे छायाचित्र.", + " {} चे क्लोज-अप फोटो", + " {} चे काळे-पांढरे छायाचित्र", + " {} चे चित्र", + " {} चे चित्र", + " {} चे पिक्सेल केलेले फोटो.", + " {} ची मूर्ती", + " {} चे एक चमकदार फोटो.", + " {} चे कापलेले फोटो", + "प्लास्टिक {} .", + "एक फोटो आहे गंदा {} .", + " {} चे jpeg भ्रष्ट फोटो", + " {} चे धुंधले छायाचित्र.", + " {} चे छायाचित्र", + " {} चे एक चांगले छायाचित्र.", + " {} चे प्रतिपादन", + "व्हिडिओ गेममध्ये {} ", + "एका {} चे छायाचित्र.", + "एक {} ची चिमटा.", + " {} चे क्लोज-अप फोटो.", + " {} चे छायाचित्र", + "ओरिगामी {} .", + "व्हिडिओ गेममधील {} ", + " {} ची रेखाटन", + " {} ची एक चिमटा.", + "ओरिगामी {} .", + " {} चे कमी रिझोल्यूशनचे छायाचित्र", + "खेळणी {} .", + " {} चे प्रतिपादन", + "स्वच्छ {} चे छायाचित्र.", + "मोठ्या {} .", + " {} ची प्रतिपादन", + "एका छान {} च्या फोटो.", + "एका विचित्र {} ", + " {} चे धुंधले छायाचित्र", + "एक कार्टून {} .", + " {} याच्या अंतर्गत.", + " {} ची रेखाटन", + "कढ़ाई केलेले {} .", + " {} चे पिक्सेल केलेले फोटो", + " {} च्या आयटॅप", + " {} चे jpeg भ्रष्ट फोटो.", + "एखाद्या {} चे चांगले छायाचित्र.", + "एक प्लश {} .", + "छान {} चे एक फोटो.", + "छोट्या {} . चे छायाचित्र", + "विचित्र {} चे छायाचित्र.", + "कार्टून {} .", + " {} या कलम अंतर्गत.", + " {} चे रेखाचित्र", + "मोठ्या {} चे छायाचित्र", + " {} चे काळे-पांढरे छायाचित्र", + "पुष्पगुच्छ {} .", + " {} चे गडद छायाचित्र", + "अ {} चे इटाप", + " {} या ग्रॅफिटी.", + "एक खेळणी {} .", + "माझ्या {} .", + "एका मस्त {} च्या फोटो.", + "एका छोट्या {} .", + " {} ची गोंदण" + ], + "TH": [ + "รูปภาพไม่ดีของ {} ", + "รูปภาพของหลายๆ {} ", + "รูปปั้นของตัวเลข {} .", + "รูปภาพของ {} ที่มองไม่เห็น", + "รูปภาพความละเอียดต่ําของ {} .", + "การแสดงของ {} .", + "กราฟฟิตี้ของ A {} .", + "รูปภาพไม่ดีของ {} ", + "รูปภาพที่ตัดของ {} .", + "รอยสักของ {} ", + " {} ที่มีเครื่องขีด", + "รูปภาพของ {} ยากที่จะเห็น", + "รูปภาพสว่างของ {} .", + "รูปภาพของ {} สะอาด", + "รูปภาพของ {} ", + "รูปภาพที่มืดของ {} .", + "การวาดของ {} .", + "รูปภาพของ {} ฉัน", + "พลาสติก {} .", + "รูปภาพของความเย็น {} .", + "รูปภาพใกล้ๆของ {} .", + "รูปภาพสีดําและขาวของ {} .", + "ภาพวาดของ {} .", + "ภาพวาดของ {} .", + "รูปภาพที่มีพิกเซลของ {} .", + "รูปปั้นของ {} .", + "รูปภาพสว่างของ {} .", + "รูปภาพที่ตัดของ {} .", + "พลาสติก {} .", + "รูปภาพของ {} โสกขี้ขลาด", + "รูปภาพ jpeg ที่เสียหายของ {} .", + "รูปภาพที่ไม่ชัดเจนของ {} .", + "รูปภาพของ {} .", + "รูปภาพดีๆของ {} ", + "การแสดงของ {} .", + " {} ในเกมวีดีโอ", + "รูปภาพของ 1 {} ", + "การวาดลักษณะของ {} ", + "รูปภาพใกล้ๆของ {} .", + "รูปภาพของ {} .", + " {} ออริกามิ", + " {} ในเกมวีดีโอ", + "สกิ๊ตของ {} .", + "การวาดลักษณะของ {} .", + " {} ออริกามิ", + "รูปภาพความละเอียดต่ําของ {} .", + "ของเล่น {}", + "การแสดงของ {} .", + "รูปภาพของ {} สะอาด", + "รูปภาพของ {} ใหญ่", + "การแสดงของ {} .", + "รูปภาพของ {} ", + "รูปภาพของ {} ", + "รูปภาพที่ไม่ชัดเจนของ {} .", + "การ์ตูน {} ", + "การใช้งานของ {} .", + "สกิ๊ตของ {} .", + " {} ", + "รูปภาพที่มีพิกเซลของ {} .", + "itap ของ {} .", + "รูปภาพ jpeg ที่เสียหายของ {} .", + "รูปภาพดีๆของ {} ", + " {} เสื้อผ้าขนม", + "รูปภาพของ {} ", + "รูปภาพของตัวเล็ก {} .", + "รูปภาพของ {} ", + "การ์ตูน {} .", + "ตามความเป็นมาของ {} .", + "การวาดของ {} .", + "รูปภาพของ {} ตัวใหญ่", + "รูปภาพสีดําและขาวของ {} .", + " {} เสื้อผ้าขนม", + "รูปภาพสีดําของ {} .", + "อิทาปของ {} .", + "กราฟฟิตี้ของ {} .", + " {} ของเล่น", + " {} ", + "รูปภาพของ {} ", + "รูปภาพของ {} เล็กๆ", + "รอยสักของ {} ." + ], + "KK": [ + " {} деген адамның нашар суреті.", + "көптеген {} суреттерін.", + "бір {} мүсінін.", + "Көріспейтін {} суреті.", + " {} белгісінің төмен ажыратушылымы бар фотосуреті.", + "a {} дегенді қайталау.", + " {} граффитилері.", + " {} -нің нашар суреті.", + " {} кескінінің кесілген суреті.", + "бір {} татуировкасы.", + "өрнектелген {} .", + "Көрінетін қиын {} суреті.", + " {} -нің жарқын суреті.", + "таза {} суреті.", + "ескірген {} суреті.", + " {} -тің қараңғы фотосуреті.", + " {} сызбасы.", + "менің {} фотосуретім.", + "пластик {} .", + "салқын {} суреті.", + " {} дегеннің жақын фотосуреті.", + " {} -тің қара-ақ фотосуреті.", + " {} кескіні", + " {} кескіні", + " {} пікселденген суреті.", + " {} мүсінін.", + " {} -тің жарқын суреті.", + " {} дегеннің кесілген суреті.", + "пластикалық {} .", + "кірпіксіз {} суреті.", + " {} дегеннің jpeg-де бүлінген суреті.", + " {} белгісінің тұмшаланған суреті.", + " {} фотосуреті.", + " {} -дің жақсы суреті.", + " {} дегеннің қайталануы.", + "видеоойынның {} түрінде.", + "бір {} суреті.", + " {} деген суретті сызу.", + " {} -тің жақын фотосуреті.", + " {} суреті.", + "Оригами {} .", + "видеоойынның {} .", + " {} сызбасы.", + " {} деген жазу.", + "Оригами {} .", + " {} белгісінің төмен ажыратушылымы бар фотосуреті.", + "ойыншықты {} .", + " {} дегеннің қайталануы.", + "таза {} суреті.", + "үлкен {} фотосуреті.", + "a {} дегеннің қайталануы.", + " {} жақсы сурет.", + "бір қызық {} суреті.", + "бір {} суреті тұмшаланған.", + "мультфильмді {} .", + "А {} пәнінің", + " {} сызбасы.", + "өрнектелген {} .", + " {} пікселденген суреті.", + " {} дың itap.", + " {} файлының jpeg-де бүлінген суреті.", + " {} дегеннің жақсы суреті.", + "плюшеткасы {}", + "Жақсы {} суреті.", + "кішкентай {} фотосуреті.", + "ерекше {} суреті.", + "мультфильмді {} .", + "өнеркәсібі бойынша {} .", + " {} сызбасы.", + "үлкен {} фотосуреті.", + " {} белгісінің ақ-қара суреті.", + "плюшеткасы {} .", + " {} -нің қара түсті суреті.", + "a {} дың itap.", + " {} граффитилері.", + "ойыншық {} .", + "Менің {} дегенім.", + " {} бір керемет сурет.", + "кішкентай {} фотосуреті.", + " {} деген тату." + ], + "FA": [ + "عکس بد از یک {} .", + " {} عکس از خیلی ها", + "مجسمه ای از یک {} ", + "عکس از مشکل دیدن {} .", + "عکس با وضوح پایین از {} .", + "یک نمایش از {} .", + "گرافيتي هاي يک {} ", + "عکس بد از {} ", + "عکس برش داده شده از {} .", + "خالکوبی از یک {} ", + " {} ", + "عکس از یک مشکل برای دیدن {} .", + "عکس روشن از یک {} .", + "عکس یک {} تمیز.", + "عکس يه {} گنده", + "عکس تیره از {} ", + "یک نقشه از {} .", + "عکس از {} ", + "پلاستیک {} .", + " {} عکس از اون مرد باحال", + "عکس نزدیک از یک {} .", + "عکس سیاه و سفید از {} .", + "یک نقاشی از {} .", + "یک نقاشی از {} .", + "عکس پیکسل شده از {} .", + "مجسمه ای از {} .", + "عکس روشن از {} .", + "عکس برش داده شده از یک {} .", + "یک {} پلاستیکی.", + "عکس از {} ", + "یک عکس خراب شده از یک {} ", + "عکس مبهم از {} ", + "عکس از {} ", + "یک عکس خوب از {} .", + "یک نمایش از {} .", + " {} در یک بازی ویدئویی", + "عکس از یک {} ", + "یک نقاشی از یک {} .", + "عکس نزدیک از {} .", + "عکس از یک {} .", + " {} اوریگامی ", + " {} در یک بازی ویدیویی", + "یک طرح از {} .", + "یک نقاشی از {} ", + " {} . يک اوريگامي", + "عکس با وضوح پایین از {} .", + " {} اسباب بازي", + "یک ترجمه از {} .", + "عکس از {} پاک", + "عکس یک {} بزرگ.", + "یک ترجمه از {} .", + "عکس يه {} ", + "عکس يه {} عکس عجيب", + "عکس مبهم از یک {} ", + " {} یک کارتون", + "هنر از {} .", + "یک طرح از {} .", + "یک {} بر روی آن طراوت شده است.", + "عکس پیکسل شده از {} .", + "در مورد {} .", + "يه عکس خراب شده از {} .", + "یک عکس خوب از یک {} .", + " {} ", + "عکس از {} ", + "عکس از یک {} کوچک.", + "عکس از {} عجیب", + "کارتون {} ", + "هنر این {} .", + "یک نقشه از {} .", + "عکس از یک {} بزرگ.", + "یک عکس سیاه و سفید از یک {} .", + " {} ", + "عکس تیره ای از یک {} .", + "در مورد a {} .", + "گرافيتي هاي در {} ", + " {} يه اسباب بازي", + " {} از دستم", + "عکس يه {} عکس باحال", + "عکس یک {} کوچک.", + "خالکوبی از {} " + ], + "UR": [ + "ایک {} کی ایک بری تصویر.", + "بہت سے {} کی ایک تصویر.", + "ایک مجسمہ {} .", + "مشکل سے دیکھنے {} کی ایک تصویر.", + " {} کی کم قرارداد تصویر", + " {} کا ایک رینڈرنگ", + "ایک {} کی گرافٹی.", + " {} کی ایک بری تصویر.", + " {} کی ایک کاٹا تصویر.", + "ایک ٹیٹو {} .", + "کڑھائی {} .", + "ایک مشکل سے دیکھنے {} کی تصویر.", + "ایک {} کی روشن تصویر.", + "ایک صاف {} کی تصویر.", + "ایک گندی تصویر {} .", + " {} کی ایک سیاہ تصویر.", + " {} کی ایک ڈرائنگ.", + "میری تصویر {} .", + "پلاسٹک {} .", + "ٹھنڈی {} کی ایک تصویر.", + " {} کی ایک قریبی تصویر.", + " {} کی ایک سیاہ اور سفید تصویر.", + " {} کی ایک پینٹنگ.", + "ایک {} کی پینٹنگ.", + " {} کی ایک پکسل تصویر.", + " {} کا مجسمہ", + " {} کی ایک روشن تصویر.", + " {} کی ایک کاٹا تصویر.", + "ایک پلاسٹک {} .", + "گندی تصویر {} .", + " {} کی ایک jpeg خراب تصویر.", + " {} کی ایک دھندلی تصویر.", + " {} کی ایک تصویر.", + " {} کی ایک اچھی تصویر.", + " {} کی ایک رینڈرنگ.", + "ایک ویڈیو گیم میں {} .", + "ایک تصویر {} .", + "ایک ڈراڈل ایک {} .", + " {} کی ایک قریبی تصویر.", + "ایک تصویر {} .", + "اوریگامی {} .", + " {} ایک ویڈیو گیم میں.", + " {} کا خاکہ", + " {} کی ایک doodle.", + "ایک اوریگامی {} .", + " {} کی کم قرارداد تصویر", + "کھلونا {} .", + " {} کی ایک پیشکش.", + "صاف {} کی ایک تصویر.", + "ایک بڑی {} کی تصویر.", + " {} کی ایک ریڈریشن.", + "ایک اچھی تصویر {} .", + "ایک عجیب {} کی تصویر.", + " {} کی ایک دھندلی تصویر.", + "ایک کارٹون {} .", + "فن کے {} .", + " {} کا خاکہ", + "ایک کڑھائی {} .", + " {} کی ایک پکسل تصویر.", + " {} کے iap.", + " {} کی ایک jpeg خراب تصویر.", + "ایک اچھی تصویر {} .", + "ایک پلس {} .", + "ایک تصویر کی اچھی {} .", + "چھوٹے {} کی ایک تصویر.", + "عجیب {} کی ایک تصویر.", + "کارٹون {} .", + "فن کے مطابق {} .", + " {} کی ایک ڈرائنگ.", + "بڑی {} کی ایک تصویر.", + "ایک {} کی سیاہ اور سفید تصویر.", + "پلاشی {} ۔", + " {} کی ایک سیاہ تصویر.", + " {} کی ایک قسم", + " {} کی گرافٹی.", + "ایک کھلونا {} .", + "میرے {} کی itap.", + "ایک ٹھنڈی تصویر {} .", + "ایک چھوٹی سی تصویر {} .", + " {} کا ایک ٹیٹو" + ], + "SK": [ + "Zlá fotka {} .", + "Fotka mnohých {} .", + "socha s {} .", + "Fotografia ťažko viditeľného {} .", + "fotka {} s nízkym rozlíšením.", + "prevod {} .", + "Graffiti z {} .", + "Zlá fotka z {} .", + "vystrihnutá fotografia {} .", + "tetovanie {} .", + "vyšívaný {} .", + "Fotka ťažko viditeľného {} .", + "jasná fotka {} .", + "fotku čistého {} .", + "fotku špinavého {} .", + "tmavá fotografia {} .", + "výkres {} .", + "Fotku môjho {} .", + "plast {} .", + "fotku cool {} .", + "blízka fotografia {} .", + "čiernobiely obrázok {} .", + "obraz {} .", + "obraz {} .", + "pixelačná fotografia {} .", + "socha {} .", + "svetlá fotografia {} .", + "vystrihnutá fotografia {} .", + "plastový {} .", + "Fotka špinavého {} .", + "Jpeg poškodená fotografia {} .", + "rozmazané fotky {} .", + "fotku {} .", + "Dobrú fotku {} .", + "prevod {} .", + " {} v video hre.", + "fotku jedného {} .", + "kreslenie {} .", + "blízka fotografia {} .", + "fotku {} .", + "origami {} .", + " {} v video hre.", + "náčrt {} .", + "Črtnutie {} .", + "origami {} .", + "fotka {} s nízkym rozlíšením.", + "hračku. {}", + "výklad {} .", + "fotku čistého {} .", + "fotku veľkého {} .", + "výklad {} .", + "Fotka pekného {} .", + "Fotka zvláštneho {} .", + "rozmazané fotky {} .", + "kreslený film {} .", + "Art of a {} .", + "náčrt {} .", + "vyšívaný {} .", + "pixelačná fotografia {} .", + "Itap {} .", + "Jpeg poškodená fotografia {} .", + "Dobrú fotku {} .", + "plushie {} .", + "Fotka pekného {} .", + "Fotka malého {} .", + "Fotka toho divného {} .", + "kreslený film {} .", + "umenie {} .", + "výkres {} .", + "fotku veľkého {} .", + "čiernobiely obrázok {} .", + "Plüšie {} .", + "tmavá fotka {} .", + "a {} .", + "Graffiti z {} .", + "Hračku. {}", + "- To je moja {} .", + "fotku cool {} .", + "Fotka malého {} .", + "tetovanie {} ." + ], + "CY": [ + "llun gwael o {} .", + "llun o lawer {} .", + "cerflun o {} .", + "llun o'r anodd i'w weld {} .", + "llun datrysiad isel o'r {} .", + "darlunio {} .", + "graffiti o {} .", + "llun gwael o'r {} .", + "llun wedi'i dorri o'r {} .", + "tatŵ o {} .", + "y {} brodedig.", + "llun o'r anodd i weld {} .", + "llun golau o {} .", + "llun o {} glân.", + "llun o {} swnllyd.", + "llun tywyll o'r {} .", + "darlun o {} .", + "llun o fy {} .", + "y plastig {} .", + "llun o'r c cool {} .", + "llun agos o {} .", + "llun du a gwyn o'r {} .", + "paentio y {} .", + "paentio {} .", + "llun picselaedig o'r {} .", + "cerflun o'r {} .", + "llun golau o'r {} .", + "llun wedi'i dorri o {} .", + " {} . plastig.", + "llun o'r dirty {} .", + "llun difetha o {} .", + "llun dwl o'r {} .", + "llun o'r {} .", + "llun da o'r {} .", + "darlunio y {} .", + " {} mewn gêm fideo.", + "llun o un {} .", + "y cwrwll o {} .", + "llun agos o'r {} .", + "llun o {} .", + "y origami {} .", + "y {} mewn gêm fideo.", + "disgrifiad o {} .", + "y ddwbl o'r {} .", + "origami {} .", + "llun datrysiad isel o {} .", + "y dolen {} .", + "darlunio y {} .", + "llun o'r glân {} .", + "llun o {} mawr.", + "darlunio {} .", + "llun o {} da.", + "llun o {} rhyfedd.", + "llun dwl o {} .", + "cartŵn {} .", + "ystâd o {} .", + "disgrifiad o {} .", + " {} wedi'i brofi.", + "llun picselaedig o {} .", + "ystadegau o'r {} .", + "llun difetha o'r {} .", + "llun da o {} .", + "yn plushie {} .", + "llun o'r {} da.", + "llun o'r {} . bach.", + "llun o'r {} rhyfedd.", + "y cartŵn {} .", + "y celf y {} ", + "darlun o {} .", + "llun o'r {} mawr.", + "llun du a gwyn o {} .", + "y plushie {} .", + "llun tywyll o {} .", + "ystâd o {} .", + "graffiti o'r {} .", + "chwaraeon {} .", + "yn fy {} .", + "llun o {} da.", + "llun o {} bach.", + "tatŵ o'r {} ." + ], + "AR": [ + "صورة سيئة من {} .", + "صورة للعديد من الـ {} .", + "تمثال لـ {} ", + "صورة من الصعب رؤيتها {} .", + "صورة بقرار منخفض من الـ {} .", + "إعادة صياغة {} .", + "جرافيتي من {} .", + "صورة سيئة من {} .", + "صورة مقصورة لـ {} .", + "وشم من {} .", + " {} الملصق", + "صورة من صعب رؤيتها {}", + "صورة مشرقة لـ {} .", + "صورة لـ {} نظيفة.", + "صورة لـ {} قذرة", + "صورة مظلمة من {} .", + "رسم لـ {} .", + "صورة لـ {} ", + "البلاستيك {} .", + "صورة من الـ {} الرائع.", + "صورة مقربة من {} .", + "صورة بالأبيض والأسود لـ {} .", + "لوحة من {} .", + "لوحة من {} .", + "صورة مُصوّرة من {} .", + "تمثال لـ {} .", + "صورة مشرقة من الـ {} .", + "صورة مقصورة لـ {} .", + " {} .", + "صورة لـ {} القذر", + "صورة متلفة من {} .", + "صورة غامضة من {} .", + "صورة للـ {} .", + "صورة جيدة من {} .", + "إعادة عرض {} .", + " {} في لعبة فيديو.", + "صورة واحدة من الـ {} .", + "رسم لـ {} .", + "صورة مقربة من {} .", + "صورة لـ {} .", + " {} الأوريغامي ", + " {} في لعبة فيديو.", + "رسم لـ {} .", + "رسم لـ {} .", + " {} أوريغامي", + "صورة بقرار منخفض لـ {} .", + "اللعبة {}", + "إعادة صياغة {} .", + "صورة للـ {} النظيفة.", + "صورة لـ {} الكبيرة", + "إعادة صياغة {} .", + "صورة لطيفة {}", + "صورة لشخص غريب {}", + "صورة غامضة لـ {} .", + " {} كرتون ", + "فن الـ {} .", + "رسم لـ {} .", + " {} مطرز", + "صورة مُصوّرة من {} .", + "من {} .", + "صورة متلفة من {} .", + "صورة جيدة لـ {} .", + " {} ", + "صورة لطيفة {}", + "صورة للـ {} الصغيرة", + "صورة من {} الغريبة.", + "الرسوم المتحركة {} .", + "فن الـ {} .", + "رسم لـ {} .", + "صورة للـ {} الكبيرة", + "صورة بالأبيض والأسود لـ {} .", + " {} ", + "صورة مظلمة لـ {} .", + "إطاب من {} .", + "جرافيتي من {} .", + "لعبة {}", + "إصبع من {} .", + "صورة لطيفة {}", + "صورة لـ {} الصغيرة", + "وشم للـ {} ." + ], + "PL": [ + "złe zdjęcie {} .", + "zdjęcie wielu {} .", + "rzeźba z {} .", + "zdjęcie twardego widocznika {} .", + "zdjęcie z niską rozdzielczością {} .", + "odwzorowanie {} .", + "graffiti z {} .", + "złe zdjęcie {} .", + "zdjęcie wycięte z {} .", + "tatuaż {} .", + "wyświetlony {} .", + "zdjęcie twardego {} .", + "Jasne zdjęcie {} .", + "zdjęcie czystego {} .", + "zdjęcie brudnej {} .", + "ciemne zdjęcie {} .", + "rysunek {} .", + "zdjęcie mojego {} .", + "Plastikowy {} .", + "zdjęcie cool {} .", + "zdjęcie z bliska {} .", + "czarno-białe zdjęcie {} .", + "obraz {} .", + "obraz {} .", + "zdjęcie z pikselem {} .", + "rzeźba {} .", + "Jasne zdjęcie {} .", + "zdjęcie wycięte z {} .", + "plastikowy {} .", + "zdjęcie brudnej {} .", + "uszkodzone zdjęcie jpeg z {} .", + "rozmyte zdjęcie {} .", + "zdjęcie {} .", + "Dobry zdjęcie {} .", + "odwzorowanie {} .", + " {} w grze wideo.", + "zdjęcie jednego {} .", + " {} .", + "zdjęcie z bliska {} .", + "zdjęcie {} .", + "Origami. {}", + " {} w grze wideo.", + "szkic {} .", + "rysunek {} .", + "Origami. {}", + "zdjęcie z niską rozdzielczością {} .", + " {} zabawka.", + "odwzorowanie {} .", + "zdjęcie czystego {} .", + "zdjęcie dużego {} .", + "odwzorowanie {} .", + "Zdjęcie miłego {} .", + "zdjęcie dziwnego {} .", + "rozmyte zdjęcie {} .", + " {} kreskówka.", + "Sztuka {} .", + "szkic {} .", + "wyświetlony {} .", + "zdjęcie z pikselem {} .", + "w przypadku {} .", + "uszkodzone zdjęcie jpeg z {} .", + "Dobry zdjęcie {} .", + "Płaszczasty. {}", + "Zdjęcie miłego {} .", + "zdjęcie małego {} .", + "zdjęcie dziwnego {} .", + " {} kreskówki.", + "Sztuka {} .", + "rysunek {} .", + "zdjęcie dużego {} .", + "czarno-białe zdjęcie {} .", + "Płaszczany. {}", + "ciemne zdjęcie {} .", + "w przypadku {} .", + "Graffiti z {} .", + " {} zabawka.", + "- Nie, nie, nie. {}", + "zdjęcie fajnej {} .", + "zdjęcie małego {} .", + "tatuaż z {} ." + ], + "HI": [ + "एक खराब तस्वीर {} .", + "कई {} की एक तस्वीर।", + "एक मूर्तिकला {} .", + "मुश्किल से देखने {} की एक तस्वीर।", + " {} की निम्न संकल्प वाली तस्वीर", + "a {} का प्रतिपादन", + "एक {} की भित्तिचित्र।", + " {} की एक बुरी तस्वीर।", + " {} की एक कटौती की गई तस्वीर", + "एक टैटू {} .", + "कढ़ाई {} .", + "एक कठिन देखने के लिए {} की तस्वीर।", + "एक {} की एक उज्ज्वल तस्वीर।", + "एक स्वच्छ {} की तस्वीर।", + "एक गंदे की तस्वीर {} .", + " {} की एक अंधेरी तस्वीर।", + " {} का चित्रण", + "मेरे {} की एक तस्वीर.", + "प्लास्टिक {} .", + "कूल {} की एक तस्वीर।", + " {} का एक क्लोज-अप फोटो", + " {} की एक काली और सफेद तस्वीर।", + " {} की एक पेंटिंग।", + "एक चित्र {} .", + " {} की पिक्सेल फोटो", + " {} की एक मूर्तिकला।", + " {} की एक उज्ज्वल तस्वीर।", + " {} की एक कटौती की गई तस्वीर", + "प्लास्टिक {} .", + "एक तस्वीर की गंदी {} .", + " {} का एक jpeg दूषित फोटो।", + " {} की धुंधली तस्वीर।", + " {} की एक तस्वीर।", + " {} की एक अच्छी तस्वीर।", + " {} का प्रतिपादन", + "एक वीडियो गेम में {} ", + "एक की तस्वीर {} .", + "एक डूडल की एक {} .", + " {} का एक क्लोज-अप फोटो।", + "एक {} की तस्वीर", + "ओरिगेमी {} .", + "एक वीडियो गेम में {} ", + " {} का एक स्केच", + " {} का एक डूडल।", + "एक ओरिगेमी {} .", + " {} की निम्न संकल्प वाली तस्वीर", + "खिलौना {} .", + " {} का प्रतिपादन", + "स्वच्छ {} की एक तस्वीर।", + "एक बड़ी {} की तस्वीर।", + " {} का प्रतिपादन", + "एक सुंदर {} की तस्वीर।", + "एक अजीब {} की तस्वीर।", + " {} की धुंधली तस्वीर", + "एक कार्टून {} .", + "कला का एक {} .", + " {} का एक स्केच", + "कढ़ाई वाला {} .", + " {} की पिक्सेल फोटो", + " {} का इटाप", + " {} का एक jpeg क्षतिग्रस्त फोटो।", + "एक अच्छा फोटो {} .", + "एक प्लश {} .", + "एक तस्वीर की सुंदर {} .", + "छोटे {} की एक तस्वीर।", + "अजीब {} की एक तस्वीर।", + "कार्टून {} .", + "कला के अनुसार {} .", + " {} का चित्रण", + "बड़े {} की एक तस्वीर।", + "एक {} की एक काली और सफेद तस्वीर।", + "प्लश {} .", + "एक {} की एक अंधेरी तस्वीर।", + "a {} का इटाप", + " {} की भित्तिचित्र।", + "एक खिलौना {} .", + "मेरे {} का इटाप।", + "एक कूल {} की तस्वीर।", + "एक छोटे {} की तस्वीर।", + " {} का एक टैटू।" + ], + "TL": [ + "isang masamang larawan ng isang {} .", + "isang larawan ng maraming {} .", + "isang eskultura ng {} .", + "isang larawan ng mahirap makita {} .", + "isang mababang resolusyon na larawan ng {} .", + "isang rendering ng {} .", + "mga graffiti ng {} .", + "isang masamang larawan ng {} .", + "isang na-crop na larawan ng {} .", + "isang tattoo ng {} .", + "ang naka-brodyo {} .", + "isang larawan ng isang mahirap makita {} .", + "isang maliwanag na larawan ng {} .", + "isang larawan ng isang malinis na {} .", + "isang larawan ng isang marumi {} .", + "isang madilim na larawan ng {} .", + "isang guhit ng {} .", + "isang larawan ng aking {} .", + "ang plastik {} .", + "isang larawan ng cool {} .", + "isang close-up na larawan ng {} .", + "isang itim at puting larawan ng {} .", + "isang larawan ng {} .", + "isang larawan ng {} .", + "isang pixel na larawan ng {} .", + "isang eskultura ng {} .", + "isang maliwanag na larawan ng {} .", + "isang na-crop na larawan ng {} .", + "isang plastik {} .", + "isang larawan ng marumi {} .", + "isang jpeg na nasira na larawan ng {} .", + "isang di-malibog na larawan ng {} .", + "isang larawan ng {} .", + "isang magandang larawan ng {} .", + "isang rendering ng {} .", + "isang {} sa isang laro sa video.", + "isang larawan ng isa {} .", + "isang doodle ng isang {} .", + "isang close-up na larawan ng {} .", + "isang larawan ng {} .", + "ang origami {} .", + "ang {} sa isang video game.", + "isang larawan ng {} .", + "isang doodle ng {} .", + "isang origami {} .", + "isang mababang resolusyon na larawan ng {} .", + "ang laruan {} .", + "isang pagbibigay ng {} .", + "isang larawan ng malinis {} .", + "isang larawan ng isang malaking {} .", + "isang pagpapaliwanag ng {} .", + "isang larawan ng isang magandang {} .", + "isang larawan ng isang kakaibang {} .", + "isang di-malibog na larawan ng {} .", + "isang kartun {} .", + "sa art ng {} .", + "isang larawan ng {} .", + "isang naka-brodyo {} .", + "isang pixel na larawan ng {} .", + "ang itap ng {} .", + "isang jpeg na nasira na larawan ng {} .", + "isang magandang larawan ng isang {} .", + "isang plushie {} .", + "isang larawan ng magandang {} .", + "isang larawan ng maliit na {} .", + "isang larawan ng kakaiba {} .", + "ang kartun {} .", + "ang art ng {} .", + "isang guhit ng {} .", + "isang larawan ng malaking {} .", + "isang itim at puting larawan ng {} .", + "ang plushie {} .", + "isang madilim na larawan ng {} .", + "ang itap ng {} .", + "mga graffiti ng {} .", + "isang laruan {} .", + "ang aking {} .", + "isang larawan ng isang cool {} .", + "isang larawan ng isang maliit na {} .", + "isang tattoo ng {} ." + ], + "AZ": [ + "bir {} pis fotoşəkil.", + "bir çox {} fotoşəkil.", + "bir heykəltəraşlıq {} .", + "Görünməyən {} şəklində fotoşəkil.", + " {} -in aşağı qətnamə fotoşəkli.", + " {} -nin tərcüməsi.", + "bir {} qrafiti.", + " {} -nin pis bir fotoşəkili.", + " {} -nin kəsilmiş bir fotoşəkli.", + "bir {} döyməsi.", + "Çırpılmış {} .", + "Görünməyən bir {} şəkli.", + "bir {} parlaq bir fotoşəkil.", + "təmiz bir {} şəkli.", + "çirkin bir {} şəkli.", + " {} -nin qaranlıq bir fotoşəkili.", + " {} rəsmində.", + "Mənim \" {} \"imdən bir şəkil.", + "plastik {} .", + "əla {} şəkli.", + " {} -nin yaxın şəkli.", + " {} -nin qara və ağ şəkli.", + " {} rəsm.", + " {} rəsm.", + " {} -nin pikselləşdirilmiş bir fotoşəkli.", + " {} -nin heykəli.", + " {} -nin parlaq bir fotoşəkli.", + " {} -nin kəsilmiş bir fotoşəkli.", + "plastik {} .", + "çirkin {} şəkli.", + " {} -nin zədələnmiş bir jpeg fotoşəkili.", + " {} -nin bulanıq bir fotoşəkli.", + " {} -nin fotoşəkli.", + " {} yaxşı bir şəkil.", + " {} -nin tərcüməsi.", + " {} bir video oyunda.", + "bir {} fotoşəkil.", + "bir {} bir doodle.", + " {} -nin yaxın şəkli.", + "bir fotoşəkil {} .", + "origami {} .", + "video oyununun {} .", + " {} -nin bir eskizi.", + " {} bir doodle.", + "bir origami {} .", + " {} -nin aşağı qətnamə fotoşəkli.", + "Oyuncaq {} .", + " {} -nin tərcüməsi.", + "təmiz {} . bir foto", + "böyük bir {} şəkli.", + " {} -nin tərcüməsi.", + "gözəl bir {} fotoşəkil.", + "qəribə bir {} şəkli.", + "bir {} -nin bulanıq bir fotoşəkli.", + "bir cizgi filmi {} .", + " {} sənətinə görə.", + " {} -nin bir eskizi.", + "bir tikilmiş {} .", + " {} -nin pikselləşdirilmiş fotoşəkli.", + " {} ədədinin tərkibi.", + " {} -nin zədələnmiş bir jpeg fotoşəkli.", + "bir {} yaxşı bir fotoşəkil.", + "bir paltar. {}", + "gözəl {} şəkli.", + "kiçik {} şəkli.", + "qəribə {} bir foto.", + "cizgi film {} .", + " {} sənətinə aiddir.", + " {} rəsmidir.", + "böyük {} bir foto.", + "bir {} siyah-ağ fotoşəkil.", + "Plüş {} .", + "bir {} qaranlıq foto.", + "a {} ədədində.", + " {} qrafiti.", + " {} bir oyuncaq.", + "Mənim {} .", + "əla bir {} şəkli.", + "kiçik bir {} şəkli.", + " {} dövməsi." + ], + "PT": [ + "Uma má foto de um {} .", + "Uma foto de muitos {} .", + "uma escultura de um {} .", + "Uma foto do difícil de ver {} .", + "uma foto de baixa resolução do {} .", + "uma representação de {} .", + "Graffiti de um {} .", + "Uma má foto do {} .", + "uma foto cortada do {} .", + "Uma tatuagem de um {} .", + "O bordado {} .", + "Uma foto de um difícil de ver {} .", + "uma foto brilhante de um {} .", + "uma foto de um {} limpo.", + "Uma foto de uma mulher suja. {}", + "uma foto escura do {} .", + "um desenho de {} .", + "Uma foto da minha \" {} \".", + "O plástico {} .", + "uma foto do cool {} .", + "uma foto de close-up de um {} .", + "uma foto em preto e branco do {} .", + "uma pintura do {} .", + "uma pintura de um {} .", + "uma foto pixelada do {} .", + "uma escultura do {} .", + "uma foto brilhante do {} .", + "uma foto cortada de um {} .", + "um plástico {} .", + "Uma foto do \"Dirty {} \".", + "uma foto corrompida de um jpeg de {} .", + "uma foto turva do {} .", + "uma foto do {} .", + "Uma boa foto do {} .", + "uma representação do {} .", + "Um {} num jogo de vídeo.", + "uma foto de um {} .", + "Um rabisco de um {} .", + "uma foto de perto do {} .", + "uma foto de um {} .", + "O origami. {}", + "O {} num jogo de vídeo.", + "Um esboço de um {} .", + "Um rabisco do {} .", + "Um origami. {}", + "uma foto de baixa resolução de {} .", + "O brinquedo. {}", + "uma representação do {} .", + "uma foto do limpo {} .", + "uma foto de uma grande {} .", + "uma representação de {} .", + "Uma foto de uma bela {} .", + "Uma foto de um estranho. {}", + "uma foto embaçada de um {} .", + "Um desenho animado. {}", + "Art. 1o - O direito de um {} .", + "um esboço do {} .", + "uma {} bordada.", + "uma foto pixelada de um {} .", + "Itap do {} .", + "uma foto corrompida do jpeg do {} .", + "Uma boa foto de um {} .", + "Um peluche. {}", + "Uma foto do bom {} .", + "uma foto da pequena {} .", + "Uma foto do estranho {} .", + "O desenho animado. {}", + "Art. 1 {} ", + "um desenho do {} .", + "uma foto da grande {} .", + "uma foto em preto e branco de um {} .", + "O peluche. {}", + "uma foto escura de um {} .", + "Itap de um {} .", + "Graffiti do {} .", + "Um brinquedo. {}", + "- Não, não. {}", + "Uma foto de uma pessoa fixe. {}", + "uma foto de um pequeno {} .", + "Uma tatuagem do {} ." + ], + "UG": [ + " {} نىڭ ناچار سۈرىتى.", + "كۆپ ساندىكى سۈرەت {} ", + "بىر {} نىڭ ھەيكىلى", + "كۆرۈش قىيىن بولغان {} نىڭ سۈرىتى", + " {} نىڭ تۆۋەن رېزۇلۇسىيەلىك سۈرىتى.", + " {} نىڭ بىر نۇسخىسى", + "ئۇ (چوڭلۇقىدىن) ئىنسانلارنىڭ (كۆزلىرىگە يىراق مۇساپىلەردىن) كۆرۈنۈپ تۇرىدۇ {}", + " {} نىڭ ناچار سۈرىتى.", + " {} نىڭ قىسقارتىلغان سۈرىتى.", + ".بۇ بولسا بىر س {}", + "ئۇ (چوڭلۇقىدىن) ئىنسانلارنىڭ (كۆزلىرىگە يىراق مۇساپىلەردىن) كۆرۈنۈپ تۇرىدۇ {}", + "كۆرۈشكە تەس بولغان رەسىم {} .", + " {} نىڭ پارلاق رەسىمى", + "پاكىز بىر {} نىڭ سۈرىتى.", + "ئۇنىڭ ئۈستىگە (سۈيى تاتلىق بولۇپ) ئۇنىڭدىنمۇ يېقىنراق نەرسە بار {}", + " {} نىڭ قاراڭغۇ كۆرۈنۈشى", + " {} نىڭ سىزىقى", + "مېنىڭ سۈرىتىمنى ئالغىن {}", + ".بۇ يەردىكى لايىھە {}", + "سۈزۈك نۇسخىنىڭ سۈرەتىنى ئالايلى. {}", + " {} نىڭ يېقىن كۆرۈنۈش سۈرىتى", + " {} نىڭ قارا-ئاق رەڭلىك سۈرىتى", + " {} نىڭ رەسىملىرى", + " {} نىڭ رەسىملىرى", + " {} نىڭ پىكسىللانغان سۈرىتى.", + " {} نىڭ ھەيكىلى", + " {} نىڭ پارلاق رەسىمى", + " {} نىڭ قىسقارتىلغان سۈرىتى", + "بىر پارچە پلاستىك {} .", + "ئۇنىڭ سۈرەتلىرىنى {}", + " {} نىڭ jpeg بۇزۇلغان سۈرىتى.", + " {} نىڭ بىر سۈرىتى غايىپ.", + " {} نىڭ سۈرىتى", + " {} نىڭ ياخشى سۈرىتى.", + " {} نىڭ بىر نۇسخىسى", + "فىلىمدىكى بىر كۆرۈنۈش. {}", + "بىر پارچە رەسىم {}", + ".بۇ بىر سىگنالنىڭ سىغىمى {}", + " {} نىڭ يېقىن سۈرەتىنى", + " {} نىڭ سۈرىتى", + ".ئۇيغۇرچە ئويۇن {}", + "فىلىمدىكى \" {} \".", + " {} نىڭ بىر كۆرۈنۈشى", + ".ئۇيغۇرچە {} ", + ".ئورىگامى {}", + " {} نىڭ تۆۋەن رېزۇلۇسىيەلىك سۈرىتى.", + "ئويۇنچۇق {} .", + " {} نىڭ بىر نۇسخىسى.", + "پاكىز {} نىڭ سۈرىتى", + "چوڭ {} نىڭ سۈرىتى", + " {} نىڭ بىر نۇسخىسى", + ".ئەرلەرنىڭ رەسىمىكەن {}", + ".بىر پارچە غەلىتە رەسىم {}", + "a {} نىڭ بىر خىل غايىپ رەسىمى", + ".بىر پارچە كارتون فىلىم {}", + " {} نىڭ سانى", + " {} نىڭ بىر كۆرۈنۈشى", + "ئۇ (چوڭلۇقى 70 سانلىق مېتىرلىق) {}", + " {} نىڭ پىكسىللانغان سۈرىتى.", + " {} نىڭ ئىتاپى", + " {} نىڭ jpeg بۇزۇلغان سۈرىتى.", + " {} نىڭ ياخشى سۈرىتى.", + "ئۇ (چوڭلۇقىدىن) ئىنسانلارنىڭ (كۆزلىرىگە يىراق مۇساپىلەردىن) كۆرۈنۈپ تۇرىدۇ {}", + ".بىر پارچە گۈزەل سۈرەت {}", + "كىچىككىنە {} نىڭ سۈرىتى", + "سۈرىتى.ئادەمنىڭ ئىشەنگۈسى كەلمەيدىغان ئىش {}", + ".بۇ فىلىمنىڭ چۇشەندۇرلۇشى {}", + " {} ماددىنىڭ", + " {} نىڭ سىزىقى", + "چوڭ {} نىڭ سۈرىتى", + " {} نىڭ قارا-ئاق رەڭلىك سۈرىتى", + "(ئۇ) سىياھ بېلىقنىڭ شەكلىدۇر {}", + " {} نىڭ قاراڭغۇ رەسىمى.", + " {} نىڭ ئىتاپى", + "ئۇ يەردىكى كاتتا رەسىم {}", + "ئۇيۇنچۇق {}", + "مېنىڭ قەدىمكى زامانلىرىمدا {}", + ".ئەرلەرنىڭ رەسىمى، ئەلۋەتتە {}", + "كىچىككىنە {} نىڭ سۈرىتى", + " {} نىڭ تاتۇئىسى." + ], + "TE": [ + "ఒక {} యొక్క చెడు ఫోటో.", + "అనేక {} యొక్క ఫోటో.", + "ఒక {} శిల్పం.", + "ఒక ఫోటో కష్టం చూడటానికి {} .", + " {} యొక్క తక్కువ రిజల్యూషన్ ఫోటో.", + " {} యొక్క ఒక పునఃపరిమాణం.", + "ఒక {} . యొక్క గ్రాఫిటీ.", + " {} యొక్క ఒక చెడు ఫోటో.", + " {} యొక్క కత్తిరించిన ఫోటో.", + "ఒక పచ్చబొట్టు ఒక {} .", + "ఎంబ్రాయిడరీ {} .", + "ఒక ఫోటో చూడటానికి కష్టం {} .", + "ఒక {} యొక్క ప్రకాశవంతమైన ఫోటో.", + "ఒక శుభ్రమైన {} .", + "ఒక మురికి {} యొక్క ఫోటో.", + " {} యొక్క ఒక చీకటి ఫోటో.", + "ఒక {} యొక్క డ్రాయింగ్.", + "నా {} . ఒక ఫోటో.", + "ప్లాస్టిక్ {} .", + "ఒక ఫోటో చల్లని {} .", + "ఒక {} యొక్క క్లోజ్-అప్ ఫోటో.", + " {} యొక్క ఒక నలుపు మరియు తెలుపు ఫోటో.", + " {} యొక్క చిత్రాన్ని.", + "ఒక {} యొక్క చిత్రాన్ని.", + " {} యొక్క పిక్సెల్ ఫోటో.", + " {} యొక్క శిల్పం.", + " {} యొక్క ఒక ప్రకాశవంతమైన ఫోటో.", + " {} యొక్క కత్తిరించిన ఫోటో.", + "ఒక ప్లాస్టిక్ {} .", + "ఒక ఫోటో మురికి {} .", + " {} యొక్క jpeg దెబ్బతిన్న ఫోటో.", + " {} యొక్క అస్పష్టమైన ఫోటో.", + " {} యొక్క ఒక ఫోటో.", + "ఒక మంచి ఫోటో {} .", + " {} యొక్క ఒక రెండరింగ్.", + "ఒక వీడియో గేమ్ లో {} .", + "ఒక ఫోటో {} .", + "ఒక డూడుల్ ఒక {} .", + " {} యొక్క క్లోజ్-అప్ ఫోటో.", + "ఒక {} . యొక్క ఫోటో.", + "ఒరిగామి {} .", + " {} ఒక వీడియో గేమ్ లో.", + "ఒక {} యొక్క ఒక స్కెచ్.", + "ఒక డూడుల్ యొక్క {} .", + "ఒక ఒరిగామి {} .", + " {} యొక్క తక్కువ రిజల్యూషన్ ఫోటో.", + "బొమ్మ {} .", + " {} యొక్క ఒక పునర్నిర్మాణం.", + "శుభ్రమైన {} యొక్క ఫోటో.", + "ఒక పెద్ద {} యొక్క ఫోటో.", + "ఒక {} యొక్క ఒక పునర్నిర్మాణం.", + "ఒక nice {} యొక్క ఫోటో.", + "ఒక వింత {} యొక్క ఫోటో.", + "ఒక {} యొక్క ఒక అస్పష్టమైన ఫోటో.", + "ఒక కార్టూన్ {} .", + "ఆర్ట్ ఆఫ్ ఎ {} .", + " {} యొక్క ఒక స్కెచ్.", + "ఒక ఎంబ్రాయిడరీ {} .", + " {} యొక్క పిక్సెల్ ఫోటో.", + " {} యొక్క ఇటాప్.", + " {} యొక్క jpeg దెబ్బతిన్న ఫోటో.", + "ఒక మంచి ఫోటో {} .", + "ఒక ప్లష్ {} .", + "nice {} యొక్క ఒక ఫోటో.", + "చిన్న {} . యొక్క ఫోటో.", + "ఒక ఫోటో వింత {} .", + "కార్టూన్ {} .", + "కళ యొక్క {} .", + " {} యొక్క ఒక డ్రాయింగ్.", + "పెద్ద {} యొక్క ఫోటో.", + "ఒక {} యొక్క ఒక నలుపు మరియు తెలుపు ఫోటో.", + "పుష్పం {} .", + "ఒక {} యొక్క ఒక చీకటి ఫోటో.", + "a {} యొక్క ఇటాప్.", + " {} యొక్క గ్రాఫిటీలు.", + "ఒక బొమ్మ {} .", + "నా {} . యొక్క itap.", + "ఒక చల్లని {} . ఒక ఫోటో.", + "ఒక చిన్న {} యొక్క ఫోటో.", + " {} యొక్క ఒక పచ్చబొట్టు." + ], + "PA": [ + "ਇੱਕ {} ਦੀ ਇੱਕ ਬੁਰੀ ਫੋਟੋ", + "ਬਹੁਤ ਸਾਰੇ {} . ਦੀ ਇੱਕ ਫੋਟੋ", + "ਇੱਕ {} ਦੀ ਮੂਰਤੀ।", + " {} ਨੂੰ ਵੇਖਣ ਲਈ ਮੁਸ਼ਕਲ ਦੀ ਇੱਕ ਫੋਟੋ.", + " {} ਦੀ ਇੱਕ ਘੱਟ ਰੈਜ਼ੋਲੂਸ਼ਨ ਫੋਟੋ", + " {} ਦਾ ਇੱਕ ਰੈਂਡਰਿੰਗ।", + "ਇੱਕ {} . ਦੀ ਗ੍ਰਾਫਿਟੀ", + " {} ਦੀ ਇੱਕ ਬੁਰੀ ਫੋਟੋ", + " {} ਦੀ ਇੱਕ ਕੱਟੀ ਹੋਈ ਫੋਟੋ", + "ਇੱਕ {} ਦਾ ਟੈਟੂ", + "ਬਰੋਡ ਕੀਤੇ {} .", + "ਇੱਕ ਮੁਸ਼ਕਲ ਨਾਲ ਵੇਖਣ {} .", + "ਇੱਕ {} . ਦੀ ਇੱਕ ਚਮਕਦਾਰ ਫੋਟੋ", + "ਇੱਕ ਸਾਫ਼ {} . ਦੀ ਫੋਟੋ", + "ਇੱਕ ਗੰਦੇ {} ਦੀ ਫੋਟੋ.", + " {} ਦੀ ਇੱਕ ਹਨੇਰੇ ਫੋਟੋ", + " {} ਦਾ ਇੱਕ ਡਰਾਇੰਗ", + "ਮੇਰੇ {} ਦੀ ਇੱਕ ਫੋਟੋ.", + "ਪਲਾਸਟਿਕ {} .", + "ਇੱਕ ਫੋਟੋ ਦੇ ਠੰਡਾ {} .", + "ਇੱਕ {} ਦੀ ਇੱਕ ਨੇੜਲੀ ਫੋਟੋ", + " {} ਦੀ ਇੱਕ ਕਾਲਾ ਅਤੇ ਚਿੱਟਾ ਫੋਟੋ।", + " {} ਦੀ ਇੱਕ ਪੇਂਟਿੰਗ।", + "ਇੱਕ {} ਦੀ ਇੱਕ ਪੇਂਟਿੰਗ।", + " {} ਦੀ ਪਿਕਸਲ ਫੋਟੋ", + " {} ਦੀ ਇੱਕ ਮੂਰਤੀ।", + " {} ਦੀ ਇੱਕ ਚਮਕਦਾਰ ਫੋਟੋ।", + "ਇੱਕ {} ਦੀ ਕੱਟੀ ਹੋਈ ਫੋਟੋ", + "ਇੱਕ ਪਲਾਸਟਿਕ {} .", + "ਇੱਕ ਗੰਦੇ {} ਦੀ ਫੋਟੋ.", + "ਇੱਕ {} ਦੀ ਇੱਕ jpeg ਖਰਾਬ ਫੋਟੋ", + " {} ਦੀ ਇੱਕ ਧੁੰਦਲੀ ਫੋਟੋ।", + " {} ਦੀ ਇੱਕ ਫੋਟੋ।", + " {} ਦੀ ਇੱਕ ਚੰਗੀ ਫੋਟੋ।", + " {} ਦਾ ਇੱਕ ਰੈਂਡਰਿੰਗ।", + "ਇੱਕ ਵੀਡੀਓ ਗੇਮ ਵਿੱਚ ਇੱਕ {} ", + "ਇੱਕ {} ਦੀ ਇੱਕ ਫੋਟੋ।", + "ਇੱਕ ਡ੍ਰੌਡਲ {} .", + " {} ਦੀ ਇੱਕ ਨੇੜਲੀ ਤਸਵੀਰ।", + "ਇੱਕ {} . ਦੀ ਫੋਟੋ", + "ਓਰੀਗਾਮੀ {} .", + "ਇੱਕ ਵੀਡੀਓ ਗੇਮ ਵਿੱਚ {} ", + " {} ਦਾ ਇੱਕ ਸਕੈਚ।", + " {} ਦਾ ਇੱਕ ਡਰਾਇਲ।", + "ਇੱਕ ਓਰੀਗਾਮੀ {} .", + "ਇੱਕ {} ਦੀ ਇੱਕ ਘੱਟ ਰੈਜ਼ੋਲੂਸ਼ਨ ਫੋਟੋ", + "ਖਿਡੌਣਾ {} .", + " {} ਦੀ ਇੱਕ ਰੀਡਿਰਸ਼ਨ", + "ਸਾਫ਼ {} ਦੀ ਇੱਕ ਫੋਟੋ।", + "ਇੱਕ ਵੱਡੇ {} . ਦੀ ਫੋਟੋ", + " {} ਦੀ ਇੱਕ ਰੈਂਡਰਿੰਗ", + "ਇੱਕ ਚੰਗੇ {} ਦੀ ਇੱਕ ਫੋਟੋ.", + "ਇੱਕ ਅਜੀਬ {} ਦੀ ਇੱਕ ਫੋਟੋ.", + "ਇੱਕ {} ਦੀ ਇੱਕ ਧੁੰਦਲੀ ਫੋਟੋ।", + "ਇੱਕ ਕਾਰਟੂਨ {} .", + "ਕਲਾ ਦੀ ਇੱਕ {} .", + " {} ਦਾ ਇੱਕ ਸਕੈਚ।", + "ਇੱਕ ਬਰੋਡ ਕੀਤਾ {} .", + " {} ਦੀ ਇੱਕ ਪਿਕਸਲ ਫੋਟੋ", + " {} ਦੀ ਆਈਟੈਪ", + " {} ਦੀ ਇੱਕ jpeg ਖਰਾਬ ਫੋਟੋ", + "ਇੱਕ {} . ਦੀ ਇੱਕ ਚੰਗੀ ਫੋਟੋ", + "ਇੱਕ ਪਲੱਸਤਰ {} .", + "ਚੰਗੇ {} ਦੀ ਇੱਕ ਫੋਟੋ.", + "ਛੋਟੇ {} . ਦੀ ਇੱਕ ਫੋਟੋ", + "ਅਜੀਬ {} ਦੀ ਇੱਕ ਫੋਟੋ.", + "ਕਾਰਟੂਨ {} .", + "ਕਲਾ ਦੇ {} .", + " {} ਦਾ ਇੱਕ ਡਰਾਇੰਗ", + "ਵੱਡੇ {} . ਦੀ ਇੱਕ ਫੋਟੋ", + "ਇੱਕ {} ਦੀ ਇੱਕ ਕਾਲਾ ਅਤੇ ਚਿੱਟਾ ਫੋਟੋ।", + "ਪਲੀਸ਼ੀ {} .", + "ਇੱਕ {} ਦੀ ਇੱਕ ਹਨੇਰੇ ਫੋਟੋ", + "a {} ਦੀ ਆਈਟੈਪ", + " {} ਦੀ ਗਰਾਫਿਟੀ।", + "ਇੱਕ ਖਿਡੌਣਾ {} .", + "ਮੇਰੇ {} .", + "ਇੱਕ ਠੰਡਾ {} . ਦੀ ਫੋਟੋ", + "ਇੱਕ ਛੋਟੇ {} . ਦੀ ਫੋਟੋ", + " {} ਦਾ ਟੈਟੂ।" + ], + "EU": [ + "Argazki txar bat. {}", + " {} argazki bat askori.", + " {} ", + " {} Zaila da ikustearen argazkia. ", + "Argazki bat, bereizmen txikiko argazkia. {}", + "\" {} \"ren errenderizazioa.", + " {} graffiti bat.", + " {} argazki txar bat.", + " {} -ren argazki moztua.", + " {} tatuaje bat.", + " {} bordatua.", + " {} Zaila da ikustea ", + " {} argazki distiratsu bat.", + "Argazki bat garbi. {}", + " {} argazki zikin bat.", + " {} ", + "\" {} \"ren marrazkia.", + "Nire argazkia. {}", + "Plastikozko {} ", + " {} argazki bat.", + " {} ", + " {} ", + " {} margo bat da.", + " {} margo bat.", + "Argazki pixelatu bat {} .", + " {} ", + " {} argazki distiratsu bat.", + " {} baten argazki moztua.", + "Plastikozko {} bat.", + " {} Zikinaren argazkia.", + " {} ", + " {} ren argazki lausotu bat.", + " {} argazki bat.", + " {} argazki on bat.", + " {} ren errepresentazioa.", + " {} bideo joko batean.", + "Bateko argazkia. {}", + " {} marrazki bat.", + " {} -ren argazki bat.", + " {} argazki bat.", + "Origamia egiten. {}", + " {} bideo joko batean.", + " {} baten zirriborroa.", + " {} -ren marrazkia.", + "Origami bat. {}", + "Argazki bat, bereizmen gutxiko, {} .", + "Jostailuarekin. {}", + " {} ren errepresentazioa.", + "Argazki bat garbi. {}", + " {} ", + "\" {} \"ren errepresentazioa.", + "Argazki polit bat. {}", + " {} arraro baten argazkia.", + " {} ", + "Marrazki biziduna. {}", + "Art of a {} .", + " {} ren zirriborroa.", + " {} bordatua.", + " {} baten argazki pixelatua.", + " {} aren atzean.", + " {} ", + "Argazki on bat. {}", + "-Peluxezkoak. {}", + " {} argazki bat.", + " {} txikiaren argazkia.", + " {} arraroaren argazkia.", + "Marrazki biziduna. {}", + " {} artearen artearen ", + " {} marrazkia.", + " {} ", + " {} ", + "Peluxezkoak. {}", + " {} argazki ilun bat.", + " {} bat da.", + " {} graffitiaren ", + "Jostailu bat. {}", + "Nire {} aren bila.", + " {} argazki bat.", + " {} txiki baten argazkia.", + " {} tatuaje bat." + ], + "NO": [ + "et dårlig bilde av en {} .", + "et bilde av mange {} .", + "en skulptur av en {} .", + "et bilde av den vanskelige å se {} .", + "et lavoppløst bilde av {} .", + "en gjengivelse av {} .", + "graffiti av en {} .", + "et dårlig bilde av {} .", + "et beskjåret bilde av {} .", + "en tatovering av en {} .", + "den broderte {} .", + "et bilde av en vanskelig å se {} .", + "et lys bilde av en {} .", + "et bilde av en ren {} .", + "et bilde av en skitten {} .", + "et mørkt bilde av {} .", + "en tegning av {} .", + "et bilde av min {} .", + "Plastikken {} .", + "et bilde av den kule {} .", + "et nærbilde av en {} .", + "et svart-hvitt bilde av {} .", + "et maleri av {} .", + "et maleri av en {} .", + "et pikslet bilde av {} .", + "en skulptur av {} .", + "et lys bilde av {} .", + "et beskjørt bilde av en {} .", + "en plast {} .", + "et bilde av den skitne {} .", + "et jpeg skadet bilde av en {} .", + "et uklart bilde av {} .", + "et bilde av {} .", + "et godt bilde av {} .", + "en gjengivelse av {} .", + "en {} i et videospill.", + "et bilde av en {} .", + "en karusell av en {} .", + "et nærbilde av {} .", + "et bilde av en {} .", + "origami {} .", + "Den {} i et videospill.", + "en skisse av en {} .", + "en karusell av {} .", + "et origami {} .", + "et lavoppløst bilde av en {} .", + "leketøyet {} .", + "en gjengivelse av {} .", + "et bilde av den rene {} .", + "et bilde av en stor {} .", + "en gjengivelse av {} .", + "et bilde av en fin {} .", + "et bilde av en merkelig {} .", + "et uklart bilde av en {} .", + "en tegneserie {} .", + "art of a {} .", + "en skisse av {} .", + "en broderet {} .", + "et pikslet bilde av en {} .", + "Itap av {} .", + "et jpeg skadet bilde av {} .", + "et godt bilde av en {} .", + "en plushie {} .", + "et bilde av den fine {} .", + "et bilde av den lille {} .", + "et bilde av den rare {} .", + "tegneserien {} .", + "art av {} .", + "en tegning av {} .", + "et bilde av den store {} .", + "et svart-hvitt bilde av en {} .", + "plushie {} .", + "et mørkt bilde av en {} .", + "en type {} .", + "graffiti av {} .", + "et leketøy {} .", + "Det er min {} .", + "et bilde av en kul {} .", + "et bilde av en liten {} .", + "en tatovering av {} ." + ], + "MG": [ + "sary ratsy iray momba ny {} .", + "Sarin'ny maro {} .", + "sary sokitra misy {} .", + "Sarin'ny sarotra hita {} .", + "sary ambany ny {} .", + "famerenana ny {} .", + "soratra soratra amin'ny {} .", + "sary ratsy momba ny {} .", + "sary voahidy amin'ny {} .", + "tatoazy misy {} .", + "ilay {} voahangona.", + "Sarin'ny sarotra hita {} .", + "sary mamirapiratra misy {} .", + "sary iray misy ny madio {} .", + "sary misy {} maharikoriko.", + "sary maizina momba ny {} .", + "ny sary misy ny {} .", + "Sarin'ny {} .", + "ny plastika {} .", + "sary iray momba ilay cool {} .", + "sary akaiky ny {} .", + "sary mainty sy fotsy momba ny {} .", + "sary hosodoko ny {} .", + "sary hosodoko misy {} .", + "sary misy piksela amin'ny {} .", + "sary sokitra ny {} .", + "sary mamirapiratra momba ny {} .", + "sary voahidy amin'ny {} .", + "plastika {} .", + "sary iray momba ilay maloto {} .", + "sary jpeg simba amin'ny {} .", + "sary manjavozavo momba ny {} .", + "sary iray amin'ny {} .", + "sary tsara ny {} .", + "famerenana ny {} .", + " {} ao amin'ny lalao video.", + "sary iray {} .", + "ny soratra soratra amin'ny {} .", + "sary akaiky ny {} .", + "sary misy {} .", + "ny origami {} .", + "ny {} ao amin'ny lalao video.", + "ny sarin'ny {} .", + "ny soratra manoratsoritra ny {} .", + "ny origami {} .", + "sary ambany famaritana ny {} .", + "ilay kilalao {} .", + "famerenana ny {} .", + "sary iray momba ny madio {} .", + "sary misy {} lehibe.", + "ny famerenana ny {} .", + "sary iray mahafinaritra {} .", + "sary misy {} hafahafa.", + "sary manjavozavo momba ny {} .", + "sarimiaina {} .", + "ny art of a {} .", + "ny sarin'ny {} .", + "ny {} voahangona.", + "sary misy piksela amin'ny {} .", + "ny {} .", + "sary jpeg simba amin'ny {} .", + "sary tsara misy {} .", + " {} iray plushie.", + "sary iray an'ilay tsara tarehy {} .", + "sary iray amin'ny {} kely.", + "sary iray momba ilay {} hafahafa.", + "ilay sariitatra {} .", + "ny fahaizan'ny {} .", + "ny sary {} .", + "sary iray amin'ny {} lehibe.", + "sary mainty sy fotsy misy {} .", + "ny plushie {} .", + "sary mainty misy {} .", + "ny isan'ny {} .", + "soratra soratra amin'ny {} .", + "kilalao iray {} .", + "ny tsindrin'ny {} .", + "Sary iray mahafinaritra {} .", + "sary misy {} kely.", + "tatoazy misy ny {} ." + ], + "KO": [ + " {} 의 나쁜 사진.", + "많은 사진 {} ", + " {} 의 조각상", + "보기 힘든 {} 의 사진.", + " {} 의 저해상도 사진", + " {} 의 표현입니다.", + " {} 의 그래피티.", + " {} 의 나쁜 사진.", + " {} 의 자르면 사진", + "문신인 {} ", + "수직한 {} .", + "보기 힘든 {} 의 사진입니다.", + " {} 의 밝은 사진.", + "깨끗한 {} 의 사진입니다.", + " {} 더러운 사진", + " {} 의 어두운 사진.", + "도면으로 표시된 {} ", + "제 사진 {}", + "플라스틱 {} ", + "멋진 {} 의 사진입니다.", + " {} 의 클로즈업 사진", + " {} 의 흑백 사진.", + " {} 의 그림", + "그림의 {} ", + " {} 의 픽셀화 사진", + " {} 의 조각상", + " {} 의 밝은 사진.", + " {} 의 자르면 사진", + "플라스틱 {} ", + "더러운 {} 의 사진.", + "jpeg로 손상된 {} 의 사진입니다.", + " {} 의 흐릿한 사진", + " {} 의 사진.", + " {} 의 좋은 사진", + " {} 의 표현", + "비디오 게임에서 {} ", + "한 {} 의 사진입니다.", + " {} 의 문구.", + " {} 의 클로즈업 사진", + " {} 의 사진입니다.", + "오리그미 {}", + "비디오 게임에서의 {} ", + " {} 의 스케치.", + " {} 의 문양을 그려보겠습니다.", + "오리가미 {}", + " {} 의 저해상도 사진", + "장난감 {} ", + " {} 의 표현입니다.", + "깨끗한 {} 의 사진.", + "큰 {} 의 사진입니다.", + " {} 의 표현입니다.", + " {} 좋은 사진 ", + "이상한 {} 의 사진", + " {} 의 흐릿한 사진입니다.", + "만화 {} ", + "미술의 {} .", + " {} 의 스케치", + "수직한 {} .", + " {} 의 픽셀화 사진", + " {} 의 이타프", + " {} 의 jpeg 손상된 사진", + " {} 좋은 사진", + " {} 이 ", + "멋진 {} 의 사진.", + "작은 {} 의 사진입니다.", + "이상한 {} 의 사진입니다.", + "만화 {} .", + "예술의 {} .", + " {} 의 도면", + "큰 {} 의 사진", + " {} 의 흑백 사진입니다.", + "이 {} ", + " {} 의 어두운 사진입니다.", + "a의 itap {} .", + " {} 의 그래피티.", + "장난감이야 {}", + "내 {} 의 일부분입니다.", + "멋진 사진 {}", + "작은 {} 의 사진입니다.", + " {} 의 문신" + ], + "NE": [ + "एक खराब फोटो को {} .", + "धेरै {} को एक फोटो।", + "एक {} को मूर्तिकला।", + "देख्न कठिन {} को फोटो।", + " {} को कम रिजोलुसनको फोटो।", + "a को प्रतिपादन {} .", + "एक {} को ग्राफिटी।", + "एक खराब फोटो को {} .", + " {} को एक क्रप गरिएको फोटो।", + "एक {} को एक ट्याटु।", + "कढ़ाई {} .", + "एक कठिन देखिने {} को फोटो।", + "एक {} को उज्ज्वल फोटो।", + "एउटा सफा {} को फोटो।", + "एक फोहोर {} को फोटो।", + " {} को एक अँध्यारो फोटो।", + " {} को रेखाचित्र।", + "मेरो {} को फोटो।", + "प्लास्टिक {} .", + "कूल {} को फोटो।", + " {} को एक क्लोज-अप फोटो।", + " {} को कालो र सेतो फोटो।", + " {} को चित्रकला।", + "एक चित्रको {} .", + " {} को एक पिक्सेल फोटो।", + " {} को मूर्तिकला।", + " {} को एक उज्यालो फोटो।", + "एक {} को एक cropped फोटो।", + "प्लास्टिक {} .", + "एक फोहोर {} को फोटो।", + "एक {} को jpeg बिग्रेको फोटो।", + " {} को धुमिल फोटो।", + " {} को फोटो।", + "एक राम्रो फोटो को {} .", + " {} को प्रतिपादन।", + "एक {} भिडियो खेल मा।", + "एउटा {} को फोटो।", + "एक चिटिक्कको {} .", + " {} को एक क्लोज-अप फोटो।", + "एक {} को फोटो।", + "ओरिगामी {} .", + "भिडियो गेममा {} ", + " {} को स्केच।", + "एक डूडल को {} .", + "ओरिगामी {} .", + " {} को कम रिजोलुसनको फोटो", + "खेलौना {} .", + " {} को प्रतिपादन।", + "स्वच्छ {} को फोटो।", + "ठूलो {} को फोटो।", + "a को प्रतिपादन {} .", + "एक राम्रो {} को फोटो।", + "एक अनौठो {} को फोटो।", + " {} को धुमिल फोटो।", + "कार्टून {} .", + "कलाको {} .", + " {} को स्केच।", + "कढ़ाई {} .", + "एक {} को एक पिक्सेल फोटो।", + " {} को इटाप", + " {} को एक jpeg बिग्रेको फोटो।", + "एक राम्रो फोटो को {} .", + "एक प्लश {} .", + "राम्रो {} को फोटो।", + "सानो {} को फोटो।", + "एक तस्वीर को अजीब {} .", + "कार्टून {} .", + "कलाको {} .", + " {} को रेखाचित्र।", + "ठूलो {} को फोटो।", + "एक {} को कालो र सेतो फोटो।", + "यो लुगाको {} ।", + "एक {} को एक गाढा फोटो।", + "a {} को इटाप", + " {} को ग्राफिटी।", + "एक खेलौना {} .", + "मेरो {} को इटाप।", + "एक कूल {} को फोटो।", + "एउटा सानो {} को फोटो।", + " {} को एक ट्याटु।" + ], + "MY": [ + " {} ရဲ့ ဆိုးဝါးတဲ့ ဓာတ်ပုံပါ။", + "များစွာသော {} ၏ ဓာတ်ပုံတစ်ခု။", + " {} ရဲ့ ပန်းပုတစ်ချပ်ပါ။", + "မြင်ရခက်တဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ အနိမ့်ဆုံးအမြင်ဓာတ်ပုံပါ။", + " {} ကို ပြန်ညွှန်းခြင်း", + " {} ရဲ့ ဂရပ်ဖီ။", + " {} ရဲ့ ဆိုးဝါးတဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ ဖြတ်တောက်ထားတဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ တက်တူးပါ။", + "ချယ်ထားတဲ့ {} .", + "မြင်ဖို့ခက်တဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ တောက်ပတဲ့ ဓာတ်ပုံပါ။", + "သန့်ရှင်းတဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + "ညစ်ပတ်တဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ အမှောင်ဓာတ်ပုံပါ။", + " {} ရဲ့ ပုံဆွဲမှုပါ။", + "ကျွန်တော့ရဲ့ ဓာတ်ပုံတစ်ပုံပါ။ {}", + "ပလပ်စတစ် {} .", + "cool {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ နီးစပ်တဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ အဖြူအမည်းဓာတ်ပုံပါ။", + " {} ရဲ့ ပန်းချီကားပါ။", + " {} ရဲ့ ပန်းချီကားပါ။", + " {} ရဲ့ pixelated ဓာတ်ပုံပါ။", + " {} ရဲ့ ပန်းပုတစ်ခုပါ။", + " {} ရဲ့ တောက်ပတဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ ဖြတ်တောက်ထားတဲ့ ဓာတ်ပုံပါ။", + "ပလပ်စတစ် {} .", + "ညစ်ပတ်တဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ၏ jpeg ပျက်စီးသော ဓာတ်ပုံ။", + " {} ရဲ့ မှုန်ဝါးနေတဲ့ ဓာတ်ပုံပါ။", + " {} ၏ ဓာတ်ပုံတစ်ခု။", + " {} ရဲ့ ဓာတ်ပုံကောင်းတစ်ခု။", + " {} ကို ပြန်ညွှန်းခြင်း", + "ဗီဒီယိုဂိမ်းထဲက {} တစ်ခုပါ။", + "တစ်ပုံက {} .", + " {} ဆိုတဲ့ doodle ကိုပါ။", + " {} ရဲ့ နီးစပ်တဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ ဓာတ်ပုံပါ။", + "အိုရီဂါမီ {}", + "ဗီဒီယိုဂိမ်းထဲက {} ", + " {} ရဲ့ ပုံကြမ်းပါ။", + " {} ရဲ့ doodle ကိုပါ။", + "origami {} . ကို", + " {} ရဲ့ အနိမ့်ဆုံးသတ်မှတ်ချက် ဓာတ်ပုံပါ။", + "ကစားစရာ {} .", + " {} ကို ပြန်ဆိုခြင်း", + "သန့်ရှင်းတဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + "ကြီးမားတဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ကို ပြန်ဆိုခြင်း", + "လှပတဲ့ {} ", + "ထူးဆန်းတဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ မှုန်ဝါးနေတဲ့ ဓာတ်ပုံပါ။", + "ကာတွန်းကားတစ်ကားပါ။ {}", + " {} ၏ အနုပညာ။", + " {} ရဲ့ ပုံကြမ်းပါ။", + "ချိုးထားတဲ့ {} .", + " {} ရဲ့ pixelated ဓာတ်ပုံပါ။", + " {} ၏ အပိုင်း", + " {} ရဲ့ jpeg ပျက်စီးနေတဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ ကောင်းမွန်တဲ့ ဓာတ်ပုံပါ။", + "ပလတ်စတစ် {} ", + "လှပတဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + "သေးငယ်တဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + "ထူးဆန်းတဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + "ကာတွန်းကား {} .", + "အထက်ပါ {} အတိုင်း", + " {} ရဲ့ ပုံဆွဲမှုတစ်ခု", + "ကြီးမားတဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ အဖြူအမည်းဓာတ်ပုံပါ။", + "ပလတ်စတစ် {} ", + " {} ရဲ့ အမှောင်ဓာတ်ပုံပါ။", + "a {} ၏ အတိုင်းအတာ", + " {} ရဲ့ ဂရပ်ဖီ။", + "ကစားစရာပါ။ {}", + "my {} ကို ရိုက်ပါ။", + "အေးဆေးတဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + "သေးငယ်တဲ့ {} ရဲ့ ဓာတ်ပုံပါ။", + " {} ရဲ့ တက်တူးပါ။" + ], + "SO": [ + "sawir xun oo ah {} .", + "sawir badan oo ka mid ah {} .", + "waa farshaxan ka sameysan {} .", + "sawirka qofka aan la arki karin {} .", + "sawirka {} oo leh xaraf hoose.", + "wax ka beddelidda {} .", + "qormooyinka lagu qoro ee {} .", + "sawir xun oo ka mid ah {} .", + "sawirka la gooyey ee {} .", + "tattoo ah oo leh {} .", + "oo leh {} oo la xardhay.", + "sawirka qof aan la arki karin. {}", + "sawir cad oo ah {} .", + "sawirka {} oo nadiif ah.", + "sawirka {} ", + "sawir mugdi ah oo {} .", + "sawirka {} .", + "sawir aan ku leeyahay {} ", + "Baaskiilka {} .", + "sawirka qabowga {} .", + "sawirka ugu dhow ee {} .", + "sawir madow iyo caddaan ah oo {} .", + "sawirka {} .", + "sawirka {} .", + "sawirka pixelated ee {} .", + "farshaxanka {} .", + "sawir cad oo ka mid ah {} .", + "sawirka la gooyey ee {} .", + " {} caag ah", + "sawirka {} qofka wasakhda ah.", + "sawir jpeg ah oo waxyeelo ku yimid {} .", + "sawir aan cadayn oo ku saabsan {} .", + "sawirka {} .", + "sawir wanaagsan oo ka mid ah {} .", + "wax ka beddelidda {} .", + " {} ciyaar fiidiyoow ah.", + "sawirka mid ka mid ah {} .", + "qoraal yar oo ku saabsan {} .", + "sawirka ugu dhow ee {} .", + "sawirka {} .", + "iyo caanaha (Origami). {}", + " {} ciyaarta fiidiyowga.", + "sawirka {} .", + "qoraal ku qoran {} .", + "waa qaab origami ah. {}", + "sawirka xarafka hoose ee {} .", + "alaabta lagu ciyaaro {} .", + "waa qaab lagu soo bandhigo {} .", + "sawirka nadiifinta {} .", + "sawirka sawir weyn oo {} .", + "waa qaab lagu soo bandhigo {} .", + "sawir sawir ah oo ah qof qurux badan. {}", + "sawir sawir ah oo ah {} ", + "sawir aan cadayn oo ah {} .", + "sawirada sawirada ah. {}", + "sida ku cad farshaxanka {} .", + "sawirka {} .", + "oo leh {} oo la xardhay.", + "sawirka pixelated ee {} .", + "tirada {} .", + "sawirka jpeg ee {} .", + "sawir wanaagsan oo ah {} .", + " {} waa dharka dharka lagu qurxiyo.", + "sawirka ninka wanaagsan ee {} ", + "sawirka {} yar.", + "sawirka {} ", + "sawirada sawirada ah {} .", + "sida ku cad farsamada {} .", + "sawirka {} .", + "sawirka {} weyn.", + "sawir madow iyo caddaan ah oo {} .", + " {} waxa uu yahay mid la isku qurxiyo.", + "sawir mugdi ah oo ah {} .", + "lakabka {} .", + "qoraallada lagu qoray {} .", + "waa ciyaartoy. {}", + "waa in aan ku dhaqaaqo. {}", + "sawir qaab qabow ah. {}", + "sawirka sawir yar oo {} .", + "tattoo ah oo ah {} ." + ], + "MN": [ + " {} -ийн муу зураг.", + "Олон хүний гэрэл зургийг {} ", + " {} -ийн зургийг.", + "Хил тод харагдахгүй байгаа {} -ийн зураг.", + " {} -ийн бага нарийвчилсан гэрэл зураг", + " {} -ийн хувилбар.", + " {} -ийн граффити.", + " {} -ийн муу зураг.", + " {} -ийн зургийг буулган авсан", + " {} гэсэн үсэг зурсан.", + "Зурагтай {} .", + "Сүрэл зураг нь харагдахад хэцүү {} .", + " {} -ийн гэрэлт гэрэл зураг.", + "цэвэр {} зургийг", + " {} .", + " {} -ийн хар зургийг.", + " {} зургийг.", + "Миний {} зургийг.", + "пластик {} .", + "гоё {} зургийг.", + " {} -ийн нарийвчилсан зураг.", + " {} -ийн хар цагаан зураг.", + " {} -ийн зургийг", + " {} зургийг", + " {} -ийн пикселлэгдсэн зураг", + " {} -ийн зургийг.", + " {} -ийн гэрэлт гэрэл зураг.", + " {} -ийн зургийг цэгцлэнэ.", + "пластик {} .", + " {} ", + "jpeg-ээр эвдэрсэн {} зургийг.", + " {} -ийн үл тод зураг.", + " {} -ийн зураг", + " {} -ийн сайн зураг.", + " {} -ийн хувилбар", + "видео тоглоомын нэг {} ", + "нэг {} -ийн зураг.", + " {} гэсэн дүрслэл.", + " {} -ийн нарийвчилсан зураг", + " {} -ийн зураг.", + "Оригами {} ", + "Видео тоглоомын {} ", + " {} -ийн зураг", + " {} -ийн дүрслэл.", + "Оригами {} ", + " {} -ийн бага нарийвчилсан гэрэл зураг", + " {} тоглоом.", + " {} -ийн хувилбар", + "цэвэр {} зургийг.", + "том хэмжээний {} зургийг.", + " {} -ийн хувилбар.", + " {} сайхан зургийг.", + " {} ", + " {} -ийн үл тод зураг.", + "хүүхэлдэйн кино {} .", + "a {} -ийн урлаг", + " {} -ийн зураг", + "бэхлэгдсэн {} .", + " {} -ийн пикселлэгдсэн зураг", + " {} -ийн тойм", + " {} -ийн jpeg гэмтсэн зураг.", + " {} -ийн сайн зураг.", + " {} ", + "Сайхан {} ", + "жижиг {} зургийг.", + " {} ", + "хүүхэлдэйн кино {} .", + "урлаг нь {} .", + " {} цэгт зургийг", + "том {} зургийг.", + " {} -ийн хар цагаан зураг.", + " {} ", + " {} -ийн хар зургийг.", + "a {} -ийн итап", + " {} -ийн граффити.", + " {} тоглоом.", + "Миний \" {} \"-г", + " {} ", + "жижиг {} зургийг.", + " {} гэсэн үсэг зурсан байна." + ], + "SL": [ + "slaba slika {} .", + "Sliko mnogih {} .", + "kiparstvo črke {} .", + "Fotografija težko vidnega {} .", + "fotografijo z nizko ločljivostjo {} .", + "prikaz {} .", + "grafitija v {} .", + "slaba slika {} .", + "obrezana fotografija {} .", + "tetovaža {} .", + "izklesani {} .", + "Fotografija težko vidnega {} .", + "svetla fotografija {} .", + "fotografijo čistega {} .", + "Fotografijo umazanega {} .", + "temno fotografijo {} .", + "risba {} .", + "Fotografijo mojega {} .", + "plastično {} .", + "Fotografijo kul {} .", + "fotografijo {} v bližini.", + "črno-belo fotografijo {} .", + "slika {} .", + "slika {} .", + "slikovnega prikaza {} .", + "kiparstvo {} .", + "svetla fotografija {} .", + "obrezana fotografija {} .", + "plastično {} .", + "Fotografijo umazanega {} .", + "JPEG poškodovana slika {} .", + "zamegljeno sliko {} .", + "fotografijo {} .", + "Dobro sliko {} .", + "prikaz {} .", + " {} v video igri.", + "fotografijo enega od {} .", + "Črkanje v {} .", + "fotografijo {} v bližini.", + "fotografijo {} .", + "Origami. {}", + " {} v video igri.", + "skico črke {} .", + "Črkanje v {} .", + "origami. {}", + "fotografija z nizko ločljivostjo {} .", + "igračo. {}", + "izvod {} .", + "fotografijo čistega {} .", + "fotografijo velikega {} .", + "izvod {} .", + "Fotografijo lepega {} .", + "Sliko čudnega {} .", + "zamegljeno sliko črke {} .", + "risan film. {}", + "obliko {} .", + "skico {} .", + "izklesano {} .", + "slikovnega prikaza {} .", + "izhod iz {} .", + "JPEG poškodovana slika {} .", + "Dobro sliko {} .", + "-Pluška. {}", + "Fotografijo lepega {} .", + "Fotografijo majhnega {} .", + "Fotografijo čudnega {} .", + " {} animirani .", + "Umetnost {} .", + "risba {} .", + "fotografijo velikega {} .", + "črno-belo fotografijo {} .", + "Pluška. {}", + "temna fotografija {} .", + "izhod iz a {} .", + "grafiti v {} .", + "igračo. {}", + "-Prav. {}", + "Fotografijo kul {} .", + "Fotografija majhnega {} .", + "tetovaža {} ." + ], + "TA": [ + "ஒரு {} ஒரு மோசமான புகைப்படம்.", + "பல புகைப்படங்கள் {} .", + "ஒரு சிலை {} .", + " {} பார்க்க கடினமாக ஒரு புகைப்படம்.", + " {} இன் குறைந்த தெளிவுத்திறன் கொண்ட புகைப்படம்.", + " {} இன் ஒரு பதிப்பு.", + "ஒரு {} .", + " {} ஒரு மோசமான புகைப்படம்.", + " {} இன் ஒரு வெட்டப்பட்ட புகைப்படம்.", + "ஒரு {} என்ற பச்சை குத்தல்.", + "கம்பீரப்படுத்தப்பட்ட {} .", + "ஒரு கடினமாக பார்க்க {} .", + "ஒரு {} ஒரு பிரகாசமான புகைப்படம்.", + "ஒரு சுத்தமான {} .", + "ஒரு அழுக்கு {} புகைப்படம்.", + " {} ஒரு இருண்ட புகைப்படம்.", + " {} என்ற வரைபடத்தை", + "என் புகைப்படம் {} .", + "பிளாஸ்டிக் {} .", + "ஒரு புகைப்படம் குளிர் {} .", + " {} இன் ஒரு நெருங்கிய புகைப்படம்.", + " {} இன் கருப்பு வெள்ளை புகைப்படம்.", + " {} இன் ஓவியம்.", + " {} என்ற ஓவியம்.", + " {} இன் பிக்சல் செய்யப்பட்ட புகைப்படம்.", + " {} என்ற சிற்பத்தை", + " {} ஒரு பிரகாசமான புகைப்படம்.", + " {} இன் ஒரு வெட்டப்பட்ட புகைப்படம்.", + "ஒரு பிளாஸ்டிக் {} .", + "ஒரு புகைப்படம் அழுக்கு {} .", + " {} இன் jpeg சேதமடைந்த புகைப்படம்.", + " {} இன் ஒரு தெளிவற்ற புகைப்படம்.", + " {} இன் புகைப்படம்.", + " {} ஒரு நல்ல புகைப்படம்.", + " {} இன் ஒரு பதிப்பு.", + "ஒரு வீடியோ கேமில் {} ", + "ஒரு புகைப்படம் {} .", + "ஒரு {} என்ற எழுத்துரு.", + " {} இன் ஒரு நெருங்கிய புகைப்படம்.", + "ஒரு {} .", + "ஓரிகமி {} .", + " {} ஒரு வீடியோ விளையாட்டில்.", + " {} இன் ஒரு வரைபடம்.", + " {} ஒரு doodle.", + "ஒரு ஓரிகமி {} .", + " {} இன் குறைந்த தெளிவுத்திறன் கொண்ட புகைப்படம்.", + "பொம்மை {} .", + " {} இன் ஒரு பதிப்பு.", + "சுத்தமான {} ஒரு புகைப்படம்.", + "ஒரு பெரிய {} புகைப்படம்.", + " {} இன் ஒரு பதிப்பு.", + "ஒரு அழகான புகைப்படம் {} .", + "ஒரு விசித்திரமான {} புகைப்படம்.", + " {} இன் ஒரு தெளிவற்ற புகைப்படம்.", + "ஒரு கார்ட்டூன் {} .", + "கலை {} .", + " {} இன் ஒரு வரைபடம்.", + "ஒரு பொறிக்கப்பட்ட {} .", + " {} இன் பிக்சல் செய்யப்பட்ட புகைப்படம்.", + " {} இன் itap.", + " {} இன் jpeg சேதமடைந்த புகைப்படம்.", + "ஒரு நல்ல புகைப்படம் {} .", + "ஒரு துணி {} .", + "அழகான {} . ஒரு புகைப்படம்.", + "சிறிய {} இன் புகைப்படம்.", + "ஒரு புகைப்படம் விசித்திரமான {} .", + "கார்ட்டூன் {} .", + "கலை {} .", + " {} இன் வரைபடம்.", + "பெரிய {} இன் புகைப்படம்.", + " {} ஒரு கருப்பு வெள்ளை புகைப்படம்.", + "புருஷி {} .", + " {} ஒரு இருண்ட புகைப்படம்.", + "a {} இன் itap.", + " {} இன் கிராஃபிட்டி.", + "ஒரு பொம்மை {} .", + "என் {} .", + "ஒரு குளிர் {} . ஒரு புகைப்படம்.", + "ஒரு சிறிய {} .", + " {} இன் ஒரு பச்சை." + ], + "SU": [ + "gambar anu goréng tina {} .", + "poto loba {} .", + "patung hiji {} .", + "poto nu teu pati katempo {} .", + "poto résolusi handap tina {} .", + "hiji rendering tina {} .", + "grafiti tina {} .", + "gambar anu goréng tina {} .", + "poto nu dicutat tina {} .", + "tato hiji {} .", + "nu diukir {} .", + "poto hiji hésé ningali {} .", + "gambar anu caang tina {} .", + "poto hiji {} anu bersih.", + "gambar hiji {} kotor.", + "poto poék tina {} .", + "gambar tina {} .", + "gambar kuring {} .", + "nu plastik {} .", + "gambar tina cool {} .", + "poto anu gedé tina {} .", + "poto hideung bodas tina {} .", + "hiji lukisan tina {} .", + "hiji lukisan tina {} .", + "poto pixelated tina {} .", + "patung tina {} .", + "gambar anu caang tina {} .", + "poto nu dicutat tina {} .", + "hiji {} . plastik.", + "gambar tina kotor {} .", + "gambar jpeg anu rusak tina {} .", + "gambar anu kabur tina {} .", + "poto tina {} .", + "gambar nu alus tina {} .", + "hiji rendering tina {} .", + " {} dina hiji video game.", + "hiji poto hiji {} .", + "hiji doodle tina {} .", + "poto deukeut tina {} .", + "gambar hiji {} .", + "nu origami {} .", + " {} dina hiji video game.", + "sketsa hiji {} .", + "hiji doodle tina {} .", + "hiji origami {} .", + "poto résolusi handap tina {} .", + "kaulinan {} .", + "hiji rendering tina {} .", + "poto tina anu bersih {} .", + "poto hiji {} badag.", + "hiji rendering tina {} .", + "gambar hiji nice {} .", + "gambar hiji aneh {} .", + "gambar anu kabur tina {} .", + "hiji kartun {} .", + "art of a {} .", + "sketsa tina {} .", + "hiji {} anu diukir.", + "poto anu di pikselkeun tina {} .", + "ngiluan {} .", + "gambar jpeg anu rusak tina {} .", + "gambar anu alus tina {} .", + "hiji plushie {} .", + "gambar nu nice {} .", + "poto tina leutik {} .", + "gambar tina aneh {} .", + "kartun {} .", + "art. {} .", + "gambar tina {} .", + "poto tina {} gedé.", + "poto hideung bodas tina {} .", + "nu plushie {} .", + "poto poék tina {} .", + "itap tina a {} .", + "grafiti tina {} .", + "hiji cocooan {} .", + " {} abdi.", + "gambar hiji cool {} .", + "poto hiji leutik {} .", + "tato tina {} ." + ], + "BN": [ + "একটি খারাপ ছবি {} .", + "অনেকের ছবি। {}", + "একটি {} এর ভাস্কর্য।", + "একটি ছবির কঠিন দেখতে {} .", + " {} এর একটি নিম্ন রেজোলিউশনের ছবি।", + "একটি {} এর রেন্ডারিং।", + "একটি {} এর গ্রাফিতি।", + "একটি খারাপ ছবি {} .", + " {} এর একটি ক্রপ করা ছবি।", + "একটি ট্যাটু {} .", + "রেশম করা {} .", + "একটি ছবির একটি কঠিন দেখতে {} .", + "একটি উজ্জ্বল ছবি {} .", + "একটি পরিষ্কার {} এর ছবি।", + "একটা নোংরা {} ছবি।", + " {} এর একটি অন্ধকার ছবি।", + "একটি {} এর অঙ্কন।", + "আমার {} এর ছবি।", + "প্লাস্টিক {} .", + "শীতল {} এর একটি ছবি।", + "একটি {} এর একটি ক্লোজ-আপ ছবি।", + " {} এর কালো এবং সাদা ছবি।", + " {} এর একটি ছবি।", + "একটি {} এর একটি ছবি।", + " {} এর পিক্সেলযুক্ত ছবি।", + "একটি ভাস্কর্য {} .", + " {} এর একটি উজ্জ্বল ছবি।", + "একটি {} এর একটি ক্রপড ছবি।", + "প্লাস্টিকের {} .", + " {} ", + "একটি {} এর একটি jpeg দূষিত ছবি।", + " {} এর একটি অস্পষ্ট ছবি।", + " {} এর একটি ছবি।", + "একটি ভাল ছবি {} .", + " {} এর একটি রেন্ডারিং।", + "একটি ভিডিও গেম মধ্যে {} ।", + "একটি {} ছবি।", + "একটি কার্ডল একটি {} .", + " {} এর একটি ক্লোজ-আপ ছবি।", + "একটি ছবি {} .", + "অরিগামি {} .", + "ভিডিও গেম এর {} ", + "একটি {} এর স্কেচ।", + "একটি কার্ডল {} .", + "একটা অরিগামি {} .", + "একটি {} এর একটি নিম্ন রেজোলিউশনের ছবি।", + "খেলনা {} .", + " {} এর একটি রেন্ডারিং।", + "পরিষ্কার {} এর একটি ছবি।", + "একটি বড় {} ছবি।", + "একটি {} এর একটি অনুবাদ।", + " {} একটি সুন্দর ছবি.", + "একটা অদ্ভুত {} ", + "একটি {} এর একটি অস্পষ্ট ছবি।", + "একটি অ্যানিমেশন {} .", + "শিল্পের একটি {} .", + " {} এর স্কেচ।", + "একটি সূচিকর্ম {} .", + "একটি {} এর পিক্সেলযুক্ত ছবি।", + " {} এর আইটেপ", + " {} এর একটি jpeg দূষিত ছবি।", + "একটি ভাল ছবি {} .", + "একটি প্লাশী {} .", + "সুন্দর {} এর একটি ছবি।", + "ছোট্ট {} এর ছবি।", + "অদ্ভুত {} এর ছবি।", + "অ্যানিমেশন {} .", + "শিল্পের {} .", + " {} এর একটি অঙ্কন।", + "বড় {} এর একটি ছবি।", + "একটি {} এর কালো এবং সাদা ছবি।", + "প্লিউসি {} .", + "একটি {} এর একটি অন্ধকার ছবি।", + "a {} এর আইটেপ", + " {} এর গ্রাফিতি।", + "একটি খেলনা {} ", + "আমার {} এর ইটাপ.", + " {} একটি শীতল ছবি.", + "একটি ছোট {} এর ছবি।", + "একটি ট্যাটু {} ." + ], + "CS": [ + "Špatná fotka {} .", + "Fotka mnoha {} .", + "socha s {} .", + "fotografie těžko viditelného {} .", + "snížené rozlišení {} .", + "přeložení {} .", + "Graffiti z {} .", + "špatná fotka {} .", + "vyřezaná fotografie {} .", + "tetování {} .", + "vyšívané {} .", + "Fotografie těžko viditelného {} .", + "jasná fotka {} .", + "fotografie čistého {} .", + "Fotku špinavého {} .", + "tmavá fotografie {} .", + "kresba {} .", + "Fotku mého {} .", + "Plastový {} .", + "Fotku toho cool {} .", + "blízká fotografie {} .", + "Černobílá fotografie {} .", + "obraz {} .", + "obraz {} .", + "fotku s pixelací {} .", + "socha {} .", + "jasnou fotku {} .", + "vyřezaná fotka {} .", + "plastový {} .", + "Fotku špinavého {} .", + "Jpeg poškozený obrázek {} .", + "rozmazané snímky {} .", + "fotografie {} .", + "Dobrou fotku {} .", + "Přeložení {} .", + " {} v videohře.", + "Fotografie jednoho {} .", + "- Čmárnutí {} .", + "blízká fotografie {} .", + "fotku {} .", + "Origami {} .", + " {} v videohře.", + "náčrt {} .", + "Čmárek z {} .", + "origami. {}", + "snížené rozlišení {} .", + "Hračku. {}", + "Překlad {} .", + "Fotografie čistého {} .", + "Fotografie velkého {} .", + "výtvarné znění {} .", + "fotku pěkného {} .", + "Fotku divného {} .", + "rozmazané snímky {} .", + " {} kreslený .", + " {} .", + "náčrt {} .", + "vyšívaný {} .", + "fotku s pixelací {} .", + "Itap z {} .", + "Jpeg poškozený obrázek {} .", + "Dobrou fotku {} .", + "Plušák. {}", + "fotku toho pěkného {} .", + "Fotografie malého {} .", + "Fotku toho divného {} .", + " {} kreslené .", + " {} .", + "kresba {} .", + "Fotografie velkého {} .", + "Černobílá fotografie {} .", + "Plušák. {}", + "tmavá fotografie {} .", + "a {} .", + "Graffiti z {} .", + "Hračku. {}", + "- To je moje. {}", + "fotku cool {} .", + "Fotografie malého {} .", + "tetování {} ." + ], + "SD": [ + "هڪ خراب تصوير جي {} .", + "گھڻن جي تصوير {} .", + "هڪ مجسمو {} .", + "هڪ تصوير جي ڏکي ڏسڻ {} .", + " {} جي هڪ گهٽ قرارداد تصوير.", + " {} جي هڪ rendering.", + "هڪ {} جي graffiti.", + "هڪ خراب تصوير جي {} .", + " {} جي هڪ cropped تصوير.", + "هڪ ٽتوٽ {} .", + "ڪَٽيل {} .", + "هڪ تصوير جي هڪ ڏکيو ڏسڻ {} .", + "هڪ روشن تصوير {} .", + "هڪ صاف {} جي تصوير.", + "هڪ گندي {} جي تصوير.", + " {} جي هڪ اونداهي تصوير.", + "هڪ {} جي هڪ ڊرائنگ.", + "منهنجي {} جي تصوير", + "پلاسٽڪ {} .", + "هڪ تصوير جي ٿڌو {} .", + "هڪ {} جي هڪ قريبي-پاسيرو تصوير.", + " {} جي هڪ ڪاري ۽ اڇو تصوير.", + " {} جي هڪ تصوير.", + "هڪ {} جي هڪ تصوير.", + " {} جي هڪ pixelled تصوير.", + " {} جي مجسمي.", + "هڪ روشن تصوير {} .", + "هڪ {} جي هڪ cropped تصوير.", + "هڪ پلاسٽڪ {} .", + "ھڪ تصوير گندي {} .", + "هڪ {} جي هڪ jpeg خراب تصوير.", + " {} جي هڪ خراب تصوير.", + " {} جي هڪ تصوير.", + "هڪ سٺي تصوير جي {} .", + " {} جي هڪ rendering.", + "هڪ وڊيو راند ۾ {} .", + "هڪ تصوير هڪ {} .", + "هڪ ڊاڊل جي {} .", + " {} جي هڪ قريبي-پاسيرو تصوير.", + "هڪ تصوير {} .", + "اوگامي {} .", + " {} هڪ وڊيو راند ۾.", + " {} جي هڪ خاڪو.", + "هڪ ڊاڊل {} .", + "هڪ اوگامي {} .", + " {} جي هڪ گهٽ قرارداد تصوير.", + " {} رانديڪا.", + " {} جي هڪ rendering.", + "صاف {} جي هڪ تصوير.", + "وڏي {} جي هڪ تصوير.", + " {} جي هڪ rendering.", + "هڪ خوبصورت تصوير {} .", + "هڪ عجيب {} جي تصوير.", + "هڪ {} جي هڪ blurry تصوير.", + "ھڪ ڪارٽون {} .", + "فن جي {} .", + " {} جي هڪ خاڪو.", + "هڪ سُرڪيل {} .", + "هڪ {} جي هڪ pixellated تصوير.", + " {} جي itap.", + " {} جي هڪ خراب jpeg تصوير.", + "هڪ سٺي تصوير جي {} .", + "هڪ پلس {} .", + "هڪ تصوير جي سٺي {} .", + "ننڍي {} . جي هڪ تصوير.", + "هڪ تصوير جي عجيب {} .", + "ڪارٽون {} .", + "فن جي {} .", + " {} جي هڪ ڊرائنگ.", + "وڏي {} جي هڪ تصوير.", + "هڪ ڪارو ۽ اڇو تصوير {} .", + "پلسسي {} .", + "هڪ {} جي هڪ اونداهي تصوير.", + " {} جي هڪ itap.", + "گرافٽي جي {} .", + "ھڪ رانديڪو {} .", + "منهنجي {} . جي itap.", + "ھڪ ٿڌي {} جي تصوير.", + "هڪ ننڍي {} . جي تصوير", + "هڪ ٽتو {} ." + ], + "CA": [ + "una fotò dolenta d'un {} .", + "una foto de molts {} .", + "una escultura d'un {} .", + "una foto de la difícil de veure {} .", + "una foto de baixa resolució del {} .", + "una representació de {} .", + "graffiti d'un {} .", + "una mala foto del {} .", + "una foto recortada de la {} .", + "un tatuatge d'un {} .", + "la bordada {} .", + "una foto d'un difícil de veure {} .", + "una foto brillant d'una {} .", + "una foto d'un net {} .", + "una foto d'un {} .", + "una foto fosca de la {} .", + "un dibuix de {} .", + "una foto de la meva {} .", + "el plàstic {} .", + "una foto de la cool {} .", + "una foto de prop d'una {} .", + "una foto en blanc i negre de la {} .", + "una pintura de la {} .", + "una pintura de {} .", + "una foto pixelada de la {} .", + "una escultura de la {} .", + "una foto brillant de la {} .", + "una foto recortada d'una {} .", + "un {} .", + "una foto del {} brut.", + "Una foto jpeg corrompuda d'una {} .", + "una foto borrosa de la {} .", + "una foto de la {} .", + "una bona foto del {} .", + "una representació de la {} .", + "un {} en un videojoc.", + "una foto d'una {} .", + "un dibuix d'un {} .", + "una foto de prop de la {} .", + "una foto d'una {} .", + "l'origami {} .", + "el {} en un videojoc.", + "un esbòs de {} .", + "un dibuix de la {} .", + "un origami {} .", + "una foto de baixa resolució d'una {} .", + "el joguet {} .", + "una interpretació de la {} .", + "una foto de la netesa {} .", + "una foto d'una gran {} .", + "una interpretació de {} .", + "Una foto d'una bona {} .", + "una foto d'un {} estrany.", + "una foto borrosa d'una {} .", + "un dibuix animat. {}", + "l'art d'un {} .", + "un esbòs de la {} .", + "Un {} bordat.", + "una foto pixelada d'una {} .", + "la part de la {} .", + "una foto jpeg corrompuda de la {} .", + "una bona foto d'un {} .", + "un plushie {} .", + "una foto del bonic {} .", + "una foto de la petita {} .", + "Una foto de l'estrany {} .", + "el dibuix animat {} .", + "art de la {} .", + "un dibuix de la {} .", + "una foto de la gran {} .", + "una foto en blanc i negre d'una {} .", + "el plushie {} .", + "una foto fosca d'una {} .", + "itap de {} .", + "graffiti de la {} .", + " {} una joguina.", + "de la meva {} .", + "una foto d'un bonic {} .", + "una foto d'una petita {} .", + "un tatuatge de la {} ." + ], + "KM": [ + "រូបថតមិនល្អរបស់ {} .", + "រូបថតជាច្រើន {} .", + "រូបចម្លាក់នៃ {} .", + "រូបថតនៃ {} ដែលពិបាកមើល", + "រូបថតកម្រិតទាបនៃ {} .", + "ការបកប្រែនៃ {} .", + "ការសរសេររូបគំនូររបស់ {} ", + "រូបថតមិនល្អនៃ {} .", + "រូបថតកាត់នៃ {} .", + "ក្បាលតំណៃនៃ {} .", + " {} ដែលមានចងក្រង។", + "រូបថតនៃ {} ដែលពិបាកមើល", + "រូបថតដ៏ស្រស់ស្អាតនៃ {} .", + "រូបថតរបស់ {} ដែលស្អាត។", + "រូបថតរបស់មនុស្សអាក្រក់ {} ", + "រូបថតខ្មៅនៃ {} .", + "ការគូររូបនៃ {} .", + "រូបថតរបស់ខ្ញុំ {} ", + " {} កែវពណ៌", + "រូបថតនៃ cool {} .", + "រូបថតជិតមួយនៃ {} .", + "រូបថតខ្មៅ និងពណ៌សនៃ {} .", + "គំនូរនៃ {} .", + "គំនូរនៃ {} .", + "រូបថត pixelated នៃ {} .", + "រូបចម្លាក់នៃ {} .", + "រូបថតដ៏ស្រស់ស្អាតនៃ {} .", + "រូបថតកាត់នៃ {} .", + " {} កែវពណ៌", + "រូបថតរបស់ {} ។", + "រូបថត jpeg ដែលខូចខាតនៃ {} .", + "រូបថតដែលមិនច្បាស់នៃ {} .", + "រូបថតនៃ {} .", + "រូបថតល្អមួយនៃ {} .", + "ការបកប្រែនៃ {} .", + " {} ក្នុងហ្គេមវីដេអូ។", + "រូបថតមួយរបស់ {} .", + "ការកត់សម្គាល់នៃ {} .", + "រូបថតជិតរបស់ {} .", + "រូបថតរបស់ {} .", + "ការបង្កើតអ័រគីមី {} ", + " {} ក្នុងហ្គេមវីដេអូ។", + "ការគូររូបភាពនៃ {} .", + "ការកត់សម្គាល់នៃ {} .", + "អូរីហ្គាមី {} ", + "រូបថតកម្រិតទាបនៃ {} .", + "កម្សាន្ត {} .", + "ការបកប្រែនៃ {} .", + "រូបថតរបស់សុទ្ធសាធ {} .", + "រូបថតនៃ {} ធំៗ", + "ការបកប្រែនៃ {} .", + "រូបថតនៃ {} ល្អ។", + "រូបថតរបស់ {} ", + "រូបថតដែលមិនច្បាស់នៃ {} .", + "ការថតរូបសិចស៊ី {} .", + "ការប្រើប្រាស់នៃ {} .", + "ការគូររូបភាពនៃ {} .", + " {} ដែលមានចងក្រង", + "រូបថត pixelated របស់ {} .", + "itap នៃ {} .", + "រូបថត jpeg ដែលខូចខាតនៃ {} .", + "រូបថតល្អមួយនៃ {} .", + "ក្បាលពណ៌ស {} ", + "រូបថតនៃ {} ។", + "រូបថតរបស់ {} តូចៗ", + "រូបថតរបស់ {} ។", + "ការថតរូបសិចស៊ី {} .", + "នៃ {} .", + "ការគូររូបនៃ {} .", + "រូបថតនៃ {} ធំៗ", + "រូបថតខ្មៅ និងពណ៌សនៃ {} .", + "ក្បាលពណ៌ស {} ", + "រូបថតខ្មៅនៃ {} .", + "itap នៃ {} .", + "ការសរសេររូបគំនូររបស់ {} .", + "ជាកម្សាន្ត {} ។", + "របស់ខ្ញុំ {} .", + "រូបថតរបស់ {} ។", + "រូបថតនៃ {} តូចៗ", + "ការតាក់តែងនៃ {} ." + ], + "ES": [ + "Una mala foto de un {} .", + "Una foto de muchos {} .", + "una escultura de una {} .", + "una foto de la difícil de ver {} .", + "una foto de baja resolución de la {} .", + "una representación de {} .", + "Graffiti de un {} .", + "Una mala foto del {} .", + "una foto recortada de la {} .", + "un tatuaje de un {} .", + "el bordado {} .", + "Una foto de un difícil de ver {} .", + "una foto brillante de una {} .", + "una foto de un limpio {} .", + "Una foto de una mujer sucia. {}", + "una foto oscura de la {} .", + "un dibujo de {} .", + "Una foto de mi {} .", + "el plástico {} .", + "Una foto de la fresca {} .", + "una foto de primer plano de una {} .", + "una foto en blanco y negro de la {} .", + "una pintura de la {} .", + "una pintura de una {} .", + "una foto pixelada de la {} .", + "una escultura de la {} .", + "una foto brillante de la {} .", + "una foto recortada de un {} .", + "un {} de plástico.", + "Una foto de la sucia {} .", + "Una foto dañada de un jpeg de {} .", + "una foto borrosa de la {} .", + "una foto de la {} .", + "una buena foto del {} .", + "una representación de la {} .", + "Un {} en un videojuego.", + "una foto de uno de los {} .", + "un garabato de un {} .", + "una foto de primer plano de la {} .", + "una foto de un {} .", + "El origami {} .", + "el {} en un videojuego.", + "un boceto de una {} .", + "un garabato del {} .", + "Un origami {} .", + "una foto de baja resolución de un {} .", + "el juguete. {}", + "una representación de la {} .", + "una foto de la limpieza {} .", + "una foto de una gran {} .", + "una representación de {} .", + "Una foto de un buen {} .", + "Una foto de un extraño {} .", + "una foto borrosa de una {} .", + "Un dibujo animado {} .", + "el artículo de un {} .", + "un boceto de la {} .", + "un {} bordado.", + "una foto pixelada de una {} .", + "el número de la {} .", + "Una foto jpeg dañada de la {} .", + "una buena foto de un {} .", + "Un peluche. {}", + "Una foto de la buena {} .", + "una foto de la pequeña {} .", + "Una foto de la extraña {} .", + "el dibujo animado {} .", + "el arte de la {} .", + "un dibujo de la {} .", + "una foto de la gran {} .", + "una foto en blanco y negro de un {} .", + "el peluche. {}", + "una foto oscura de un {} .", + "el número de un {} .", + "graffiti de la {} .", + "Un juguete. {}", + "¿Qué es lo que me pasa? {}", + "Una foto de un cool {} .", + "una foto de una pequeña {} .", + "un tatuaje de la {} ." + ], + "HY": [ + "վատ լուսանկար է {} .", + "շատերի լուսանկարները {} :", + "կաթիլը {} .", + "տեսանելի չէ {} -ի լուսանկարը:", + " {} -ի ցածր լուծարման լուսանկար:", + " {} -ի փոխակերպումը:", + " {} -ի գրաֆիտները:", + "վատ լուսանկար է {} .", + " {} -ի կտրված լուսանկար:", + "դաջվածք, որը կազմված է {} :", + "շերտավորված {} .", + "դժվար է տեսնել {} -ի լուսանկարը:", + " {} -ի պայծառ լուսանկար:", + "մաքուր {} -ի լուսանկար:", + "կեղտոտ {} ի լուսանկար:", + " {} -ի մութ լուսանկարը:", + " {} -ի գծապատկեր", + "իմ {} լուսանկարը:", + "պլաստիկ {} .", + "սառը {} լուսանկար:", + " {} -ի մոտավոր լուսանկար:", + " {} -ի սեւ ու սպիտակ լուսանկար:", + " {} -ի նկարը:", + " {} նկարը:", + " {} -ի պիքսելացված լուսանկար:", + " {} -ի քանդակ:", + " {} -ի պայծառ լուսանկար:", + " {} -ի կտրված լուսանկար:", + "պլաստիկ {} .", + "կեղտոտ {} լուսանկար:", + "jpeg կոռումպացված լուսանկար {} .", + " {} -ի մթմած լուսանկար:", + " {} -ի լուսանկար:", + "լավ լուսանկար է {} .", + " {} -ի վերարտադրությունը:", + " {} տեսախաղում:", + "մեկի լուսանկարը {} .", + "կատակով {} .", + " {} -ի մոտավոր լուսանկար:", + " {} -ի լուսանկար:", + "Օրիգամի {} :", + " {} տեսախաղում:", + " {} -ի շերտավորումը:", + " {} -ի կատակախաղը:", + "օրիգամի {} .", + " {} -ի ցածր լուծարման լուսանկար:", + "խաղալիք {} .", + " {} -ի կատարումը:", + "մաքուր {} -ի լուսանկար:", + "մեծ {} -ի լուսանկար:", + " {} -ի կատարումը:", + "գեղեցիկ {} ", + "տարօրինակ {} -ի լուսանկար:", + " {} -ի ամուր լուսանկար:", + "մուլտֆիլմ {} .", + "արվեստի {} .", + " {} -ի շերտավորումը:", + "շերտավորված {} .", + " {} -ի պիքսելացված լուսանկար:", + " {} -ի կոդը", + " {} -ի jpeg կոռումպացված լուսանկար:", + "լավ լուսանկար է {} .", + "մի փափուկ {} .", + "գեղեցիկ {} լուսանկարը:", + "փոքր {} -ի լուսանկար:", + "տարօրինակ {} -ի լուսանկարը:", + "մուլտֆիլմը {} .", + " {} -ի արվեստի բնույթը:", + " {} -ի գծապատկեր:", + "մեծ {} -ի լուսանկար:", + " {} -ի սեւ ու սպիտակ լուսանկար:", + "փետուրի {} .", + " {} -ի մութ լուսանկարը:", + "a {} -ի կատակը", + "Գրաֆիտի {} .", + "խաղալիք {} .", + "իմ {} .", + "մի լուսանկար մի հիանալի {} .", + "փոքր {} -ի լուսանկար:", + " {} -ի դաջվածք:" + ], + "YI": [ + "אַ שלעכטע פֿאָטאָ פֿון אַ {} .", + "אַ פֿאָטאָ פֿון אַ סך {} .", + "אַ סקולפּטור פֿון אַ {} .", + "אַ פאָטאָ פֿון די שווער צו זען {} .", + "אַ נידעריק האַכלאָטע פאָטאָ פון די {} .", + "אַ רעדערינג פון אַ {} .", + "גראַפיטי פון אַ {} .", + "אַ שלעכט פאָטאָ פון די {} .", + "אַ צעטרעטן בילד פון די {} .", + "אַ טאַטו פֿון אַ {} .", + "די באַקוועמלטע {} .", + "אַ פאָטאָ פֿון אַ שווער צו זען {} .", + "אַ העלע פֿאָטאָ פֿון אַ {} .", + "אַ פאָטאָ פֿון אַ ריין {} .", + "אַ בילד פֿון אַ פֿולן {} .", + "אַ טונקל פאָטאָ פון די {} .", + "אַ צייכענונג פון אַ {} .", + "אַ פֿאָטאָ פֿון מײַן {} .", + "די פּלאַסטיק {} .", + "אַ פֿאָטאָ פֿון דער קילער {} .", + "אַ קלאָוז-אַראָפּ פאָטאָ פֿון אַ {} .", + "אַ שוואַרץ און ווייַס פאָטאָ פון די {} .", + "אַ מאָלצעטאָ פֿון די {} .", + "אַ מאָלצעטאָ פֿון אַ {} .", + "אַ פּיקסעלאַטעד פאָטאָ פון די {} .", + "אַ סקולפּטור פֿון דער {} .", + "אַ העלע פאָטאָ פֿון די {} .", + "אַ צעטרעטענע פֿאָטאָ פֿון אַ {} .", + "אַ פּלאַסטיק {} .", + "אַ פֿאָטאָ פֿון דער פֿולער {} .", + "אַ דזשפּעג פאַרדאָרבן פאָטאָ פון אַ {} .", + "אַ פֿאַרשווארענע פֿאָטאָ פֿון דער {} .", + "אַ פאָטאָ פֿון דער {} .", + "אַ גוט פאָטאָ פֿון דער {} .", + "אַ איבערזעצונג פון די {} .", + "אַ {} אין אַ ווידעא שפּיל.", + "אַ פֿאָטאָ פֿון איין {} .", + "אַ קאַרטל פֿון אַ {} .", + "אַ קלאָוז-אַראָפּ פאָטאָ פון די {} .", + "אַ פאָטאָ פֿון אַ {} .", + "די אָריגאַמי {} .", + "די {} אין אַ ווידעא שפּיל.", + "אַ סקיטש פון אַ {} .", + "אַ קאַרטל פֿון דער {} .", + "אַ אָריגאַמי. {}", + "אַ נידעריק אָפּשטימונג פאָטאָ פון אַ {} .", + " {} די צאַצקע.", + "אַ איבערזעצונג פון די {} .", + "אַ פאָטאָ פֿון דער ריין {} .", + "אַ פֿאָטאָ פֿון אַ גרויסער {} .", + "אַ איבערזעצונג פון אַ {} .", + "אַ בילד פֿון אַ שיינע {} .", + "אַ בילד פֿון אַ מאָדנע {} .", + "אַ פֿאַרשווארענע בילד פֿון אַ {} .", + "אַ קאַרטון {} .", + "די פעלד פון אַ {} .", + "אַ סקיטש פון די {} .", + "אַ בראָודערד {} .", + "אַ פּיקסעלאַטעד פאָטאָ פון אַ {} .", + "יטאַפּ פון די {} .", + "אַ דזשפּעג פאַרדאָרבן פאָטאָ פון די {} .", + "אַ גוטע פֿאָטאָ פֿון אַ {} .", + "אַ פּלושיי. {}", + "אַ פֿאָטאָ פֿון דער שיינעם {} .", + "אַ פֿאָטאָ פֿון דעם קליינעם {} .", + "אַ בילד פֿון דעם מאָדנע {} .", + "די קאַרטון {} .", + "די קונסט פון די {} .", + "אַ צייכענונג פון די {} .", + "אַ פאָטאָ פֿון דעם גרויסן {} .", + "אַ שוואַרץ און ווייַס פאָטאָ פון אַ {} .", + "די פּלושיי {} .", + "אַ טונקל בילד פֿון אַ {} .", + "אַ פּיטאַפ פון אַ {} .", + "גראַפיטי פון די {} .", + "אַ צאַצקע. {}", + "יטאַפּ פון מיין {} .", + "אַ בילד פֿון אַ קילע {} .", + "אַ פֿאָטאָ פֿון אַ קליין {} .", + "אַ טאַטו פון די {} ." + ], + "ZH": [ + "沒有一個照片. {}", + "許多 {} 的照片.", + "像是一個 {} .", + "難以看到的照片 {} .", + "顯示出 {} 的低分辨率照片.", + "翻譯一個 {} .", + "塗鴉是一種 {} ", + "沒有一個照片. {}", + "截圖的照片是這個 {} .", + "這是一種\" {} \"紋身.", + "這裡有花. {}", + "照片裡很難看到 {} .", + "照片裡有許多 {} ", + "清潔的照片. {}", + "這張照片是一個的 {} ", + "黑色照片的 {} .", + "圖片中的 {} .", + "這是我 {} 的照片.", + "這種塑膠 {} ", + "照片裡有個酷的 {} ", + "照片是一個 {} 的近距離照片.", + "黑白照片中的 {} .", + "這裡是一個圖案, {}", + "畫了一幅 {} .", + "顯示 {} 的像素相片.", + "這裡是一個雕塑. {}", + "照片裡有許多 {} ", + "截圖的照片是一個 {} .", + "塑料的 {} .", + "照片裡有的 {} ", + "這裡是一個 jpeg 破壞的 {} 照片.", + "照片裡沒有 {} .", + "照片中的 {} .", + "沒有任何關於我們的消息. {}", + "翻譯的 {} .", + "影片中的 {} .", + "照片中的一個 {} .", + "這是一種\" {} \"的涂.", + "這張照片是 {} 的近距離照片.", + "照片中的一個 {} .", + "這裡是原創的. {}", + "影片裡的 {} .", + "圖片中的圖片是一個 {} .", + "這裡是一個刺的 {} ", + "這裡是一個草. {}", + "低分辨率照片中的 {} .", + "這種玩具是 {}", + "這就是 {} 的翻譯.", + "清潔的照片 {} .", + "照片是一個大小的 {} .", + "這就是一個 {} 的表現.", + "這張照片是一個很好的 {} ", + "這張照片是一個怪怪的 {} ", + "這裡是一個模糊的照片, {}", + "這裡是一個漫畫 {} .", + "藝術的一個 {} .", + "圖片中的圖片. {}", + "花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花花 {}", + "像素化照片中的 {} .", + "沒有任何證據顯示, {}", + "這裡是一個 jpeg 破壞的 {} 照片.", + "這裡有許多人喜歡, {}", + "還有更多的. {}", + "這張照片是很可愛的 {} .", + "這裡是一個小小的 {} 的照片.", + "這張照片是怪怪的 {} .", + "這部動漫片 {} .", + "藝術的 {} .", + "圖為 {} .", + "這裡是一個大小的 {} .", + "黑白照片中的一個 {} .", + "這種情形是非常有趣的. {}", + "這張照片是一個黑色的 {} ", + "沒有任何證據顯示, {}", + "沒有任何關於我們的消息. {}", + "這是一款玩具. {}", + "這就是我的 {} ", + "照片裡有個很酷的 {} .", + "這裡是一個小小的 {} 的照片.", + "這是一張 {} 的紋身." + ], + "JV": [ + "foto sing ora apik saka {} .", + "foto saka akèh {} .", + "patung saka {} .", + "foto sing angel dideleng {} .", + "foto resolusi sing kurang saka {} .", + "a rendering of {} .", + "grafiti saka {} .", + "foto sing ora apik saka {} .", + "foto sing diiris saka {} .", + "tato saka {} .", + "sing diukir {} .", + "foto sing angel dideleng {} .", + "foto sing cerah saka {} .", + "foto saka {} sing resik.", + "foto saka {} reged.", + "foto peteng saka {} .", + "gambar saka {} .", + "foto saka aku {} .", + "plastik {} .", + "foto saka cool {} .", + "gambar cedhak saka {} .", + "foto ireng lan putih saka {} .", + "lukisan saka {} .", + "lukisan saka {} .", + "foto piksel saka {} .", + "patung saka {} .", + "foto padhang saka {} .", + "foto sing diiris saka {} .", + "plastik {} .", + "foto saka kotor {} .", + "foto jpeg sing rusak saka {} .", + "foto sing kabur saka {} .", + "foto saka {} .", + "foto sing apik saka {} .", + "a rendering saka {} .", + " {} ing video game.", + "foto siji {} .", + "gambar gambar saka {} .", + "gambar cedhak {} .", + "foto saka {} .", + "origami {} .", + "ing {} ing video game.", + "sketsa saka {} .", + "gambar gambar saka {} .", + "origami {} .", + "foto resolusi sing kurang saka {} .", + "dolanané {} .", + "a rendering saka {} .", + "foto saka resik {} .", + "foto saka {} gedhe.", + "a rendering of a {} .", + "foto saka {} sing apik.", + "foto wong aneh {} .", + "foto sing kabur saka {} .", + "kartun {} .", + "art of a {} .", + "sketsa saka {} .", + " {} sing diukir.", + "foto piksel saka {} .", + "ing {} .", + "foto jpeg sing rusak saka {} .", + "foto sing apik saka {} .", + "siji plushie {} .", + "foto saka nice {} .", + "foto saka {} cilik.", + "foto saka aneh {} .", + "kartun {} .", + "Art of the {} .", + "gambar saka {} .", + "foto saka {} gedhe.", + "foto ireng lan putih saka {} .", + "sing plushie {} .", + "foto peteng saka {} .", + "ing a {} .", + "grafiti saka {} .", + "dolanan {} .", + "ing {} .", + "foto saka {} sing keren.", + "foto saka {} cilik.", + "tato saka {} ." + ], + "IT": [ + "una cattiva foto di un {} .", + "Una foto di molti {} .", + "una scultura di un {} .", + "una foto del difficile da vedere {} .", + "una foto a bassa risoluzione del {} .", + "una traduzione di {} .", + "graffiti di un {} .", + "una cattiva foto del {} .", + "una foto tagliata della {} .", + "un tatuaggio di un {} .", + "il punto ricamato {} .", + "una foto di un difficile da vedere {} .", + "una foto brillante di una {} .", + "una foto di un {} pulito.", + "Una foto di una {} sporca.", + "una foto scura della {} .", + "un disegno di {} .", + "Una foto del mio {} .", + "la plastica {} .", + "una foto del cool {} .", + "una foto ravvicinata di una {} .", + "una foto in bianco e nero del {} .", + "un dipinto della {} .", + "un dipinto di una {} .", + "una foto pixelata del {} .", + "una scultura della {} .", + "una foto luminosa della {} .", + "una foto tagliata di una {} .", + "un {} .", + "Una foto del dirty {} .", + "una foto corrotta di un {} .", + "una foto sfocata della {} .", + "una foto del {} .", + "una buona foto del {} .", + "una traduzione del {} .", + "un {} in un videogioco.", + "una foto di uno dei {} .", + "un doodle di un {} .", + "una foto ravvicinata della {} .", + "una foto di un {} .", + "l' origami {} .", + "il {} in un videogioco.", + "uno schizzo di {} .", + "un doodle del {} .", + "Un origami. {}", + "una foto a bassa risoluzione di {} .", + " {} il giocattolo. ", + "una traduzione del {} .", + "una foto del pulito {} .", + "una foto di una grande {} .", + "una rappresentazione di {} .", + "Una foto di una bella {} .", + "Una foto di una strana {} .", + "una foto sfocata di una {} .", + " {} Un cartone animato.", + "l'arte di un {} .", + "uno schizzo della {} .", + "un {} ricamato.", + "una foto pixelata di un {} .", + "il numero di unità di {} .", + "una foto corrotta di jpeg del {} .", + "una buona foto di un {} .", + " {} un peluche.", + "Una foto del bel {} .", + "una foto della piccola {} .", + "Una foto della strana {} .", + " {} Il cartone animato.", + "l'arte del {} .", + "un disegno di {} .", + "una foto della grande {} .", + "una foto in bianco e nero di una {} .", + "Il peluche. {}", + "una foto scura di una {} .", + "il numero di a {} .", + "graffiti del {} .", + " {} Un giocattolo. ", + "- Il mio {} .", + "Una foto di un cool {} .", + "una foto di un piccolo {} .", + "un tatuaggio del {} ." + ], + "TR": [ + " {} ", + " {} bir çok fotoğraf.", + "Bir {} heykel.", + "Görmek zor olan {} 'nin bir fotoğrafı.", + " {} 'nin düşük çözünürlüklü bir fotoğrafı.", + " {} 'in bir gösterimi.", + "Bir {} 'nin grafiti.", + " {} ", + " {} 'nin kesilmiş bir fotoğrafı.", + " {} dövmesi.", + "Çizilmiş {} .", + "Görülmesi zor bir {} fotoğrafı.", + "Bir {} 'nin parlak bir fotoğrafı.", + "Temiz bir {} fotoğrafı.", + " {} Kirli bir fotoğrafı.", + " {} 'nin koyu bir fotoğrafı.", + " {} çizimi.", + " {} ", + "Plastik {} .", + " {} havalı bir fotoğraf.", + "Bir {} 'nin yakın çekim fotoğrafı.", + " {} 'nin siyah beyaz fotoğrafı.", + " {} için bir tablo.", + "Bir {} resim.", + " {} 'nin piksellenmiş bir fotoğrafı.", + " {} Bir heykel ", + " {} 'nin parlak bir fotoğrafı.", + "Bir {} 'nin kesilmiş bir fotoğrafı.", + "Plastik bir {} .", + " {} Kirli bir fotoğraf.", + " {} 'nin jpeg bozuk fotoğrafı.", + " {} 'nin bulanık bir fotoğrafı.", + " {} 'nin bir fotoğrafı.", + " {} ", + " {} 'nin bir gösterimi.", + " {} bir video oyununda.", + "Birinin fotoğrafı. {}", + " {} çizgisi.", + " {} 'nin yakın çekim fotoğrafı.", + "Bir {} fotoğrafı.", + "origami {} .", + "Bir video oyununun {} .", + " {} 'nin bir taslağı.", + " {} ", + "origami {} .", + " {} 'in düşük çözünürlüklü bir fotoğrafı.", + "Oyuncak {} .", + " {} 'nin bir gösterimi.", + "Temiz {} bir fotoğraf.", + "Büyük bir {} fotoğrafı.", + " {} 'nin bir gösterimi.", + "Güzel bir {} fotoğrafı.", + " {} garip bir fotoğraf.", + "Bir {} 'nin bulanık bir fotoğrafı.", + " {} bir çizgi film.", + "Art of a {} .", + " {} 'nin bir taslağı.", + "Çizilmiş bir {} .", + " {} 'nin piksellenmiş bir fotoğrafı.", + " {} 'nin ip.", + " {} 'nin bozulmuş bir jpeg fotoğrafı.", + " {} ", + "Bir tüylü {} .", + "Güzel {} ", + "Küçük bir {} fotoğrafı.", + "Garip {} 'nin fotoğrafı.", + "Karikatür {} .", + "Art of the {} .", + " {} çizimi.", + "Büyük bir {} fotoğrafı.", + "Bir {} 'nin siyah beyaz fotoğrafı.", + "Plüşe {} .", + "Bir {} 'nin koyu bir fotoğrafı.", + "Bir {} .", + " {} grafiti de var.", + " {} bir oyuncak.", + " {} ", + " {} bir fotoğrafı.", + "Küçük bir {} fotoğrafı.", + " {} bir dövme." + ], + "KY": [ + " {} деген сүрөттүн начар сүрөтү.", + "Көптөгөн сүрөттөр {} .", + "а {} скульптурасы.", + "Көрүнбөгөн сүрөттүн сүрөтү {} .", + " {} белгисинин төмөн чечилишиндеги сүрөтү.", + " {} дегенди көрсөтүү.", + " {} деген граффити.", + " {} сүрөттүн начар сүрөтү.", + " {} сүрөтүнүн кыскартылган сүрөтү.", + "бир {} деген татуировка.", + "чиймеленген {} .", + "Көрүнбөгөн {} сүрөтү.", + " {} сүрөтүнүн жаркыраган сүрөтү.", + "таза {} сүрөтү.", + "кир {} сүрөтү.", + " {} сүрөтүнүн караңгы сүрөтү.", + " {} сүрөтү.", + "менин {} сүрөтүм.", + "пластикалык {} .", + "сонун {} сүрөтү.", + " {} сүрөтүнүн жакынкы сүрөтү.", + " {} белгисинин ак-кара сүрөтү.", + " {} сүрөтү.", + " {} сүрөтү.", + " {} сүрөтүнүн пикселденген сүрөтү.", + "скульптурасы {} .", + " {} сүрөтүнүн ачык сүрөтү.", + " {} сүрөтүнүн кыскартылган сүрөтү.", + "пластикалык {} .", + "кирди чачкан {} сүрөтү.", + " {} деген сүрөттүн jpeg форматындагы бузулуусу.", + " {} сүрөтүнүн тунук эмес сүрөтү.", + " {} сүрөтү.", + " {} менен жакшы сүрөткө түшүр.", + " {} дегенди көрсөтүү.", + " {} видеооюнда.", + "бир сүрөттү {} .", + "бир {} деген сүрөт.", + " {} сүрөтүнүн жакынкы сүрөтү.", + " {} сүрөтү.", + "оригами {} .", + "видеооюндагы {} ", + " {} белгисинин скетчиси.", + " {} деген сөздүн сызыгын.", + "оригами {} .", + " {} сүрөтүнүн төмөнкү чечилиши", + "оюнчук {} .", + " {} дегенди кайталоо.", + "таза {} сүрөтү.", + "чоң {} сүрөтү.", + " {} дегенди кайталоо.", + "жакшы {} сүрөтү.", + "бир кызыктуу {} сүрөт.", + " {} сүрөтүнүн тунук эмес сүрөтү.", + "мультфильм {} .", + "а {} ченемдеринде көрсөтүлгөн.", + " {} белгисинин скетчиси.", + "чиймеленген {} .", + " {} сүрөтүнүн пикселденген сүрөтү.", + " {} өлчөмүнүн аталышы", + " {} деген сүрөттүн jpeg сүрөтү бузулуп калган.", + " {} деген сүрөт.", + "бир түстүү {} .", + "жакшы {} сүрөтү.", + "кичинекей {} сүрөтү.", + "кызыктуу {} сүрөтү.", + "мультфильмди {} .", + " {} деген сөздүн мазмуну.", + " {} белгисинин чиймеси.", + "чоң {} сүрөтү.", + " {} сүрөтүнүн кара-ак сүрөтү.", + "көйнөкчөн. {}", + " {} деген сүрөт.", + " {} өлчөмүндөгү", + " {} деген граффитилер.", + "оюнчук {} .", + "Менин ичимдеги \" {} \" деген сөздүн мааниси", + "бир сонун {} сүрөтү.", + "кичинекей {} сүрөтү.", + " {} деген сүрөт." + ], + "IS": [ + "Slæmt mynd af A {} .", + "mynd af mörgum {} .", + "skúlptúra af {} .", + "Mynd af þeim sem er erfitt að sjá {} .", + "mynd með lágri upplausn af {} .", + "A-greining á {} .", + "Graffiti af {} .", + "slæma mynd af {} .", + "skorið mynd af {} .", + "húðflúr af {} .", + "Broderað {} .", + "mynd af erfitt að sjá {} .", + "bjart mynd af {} .", + "mynd af hreinu {} .", + "mynd af skítugum {} .", + "dökk mynd af {} .", + "teikning á {} .", + "mynd af {} -inu mínu.", + "plastinn {} .", + "mynd af flottum {} .", + "Stuttmynd af {} .", + "Svart-hvít mynd af {} .", + "Mynd af {} .", + "málverk af {} .", + "mynd af {} .", + "skúlptúra af {} .", + "bjart mynd af {} .", + "skorið mynd af {} .", + "plast {} .", + "mynd af skítugum {} .", + "Jpeg skemmd mynd af {} .", + "Dularfull mynd af {} .", + "mynd af {} .", + "Góð mynd af {} .", + "A endurgerð af {} .", + " {} í tölvuleik.", + "mynd af einum {} .", + "Skírteini af {} .", + "Stuttmynd af {} .", + "mynd af {} .", + "Ég er ađ vinna í origami. {}", + "The {} í tölvuleik.", + "skissur af {} .", + "Skírteini af {} .", + "Ég er ađ vinna í origami. {}", + "mynd með lágri upplausn af {} .", + "Leikföngin. {}", + "afrit af {} .", + "mynd af hreinu {} .", + "mynd af stórri {} .", + "A-greining á {} .", + "mynd af fallegri {} .", + "mynd af skrítnu {} .", + "óskýr mynd af {} .", + "teiknimynd. {}", + "aðferð í {} .", + "skissur af {} .", + "Broderað {} .", + "mynd af {} .", + "Ítáp af {} .", + "Jpeg skemmd mynd af {} .", + "Gķđ mynd af A {} .", + "- Ég er međ plúsí. {}", + "mynd af fallegu {} .", + "mynd af litlu {} .", + "mynd af skrítnu {} .", + "teiknimyndin. {}", + "aðildarríkis {} .", + "teikning af {} .", + "mynd af stóru {} .", + "Svart-hvít mynd af {} .", + "Ūessi plúsí. {}", + "dökk mynd af {} .", + "Ítáp af {} .", + "Graffiti af {} .", + "Leikfang. {}", + "Ítáp af {} -inu mínu.", + "mynd af flottum {} .", + "mynd af litlum {} .", + "húðflúr á {} ." + ], + "GU": [ + "એક ખરાબ ફોટો {} .", + "ઘણા બધા {} .", + "એક શિલ્પ {} .", + " {} ને જોવાનું મુશ્કેલ છે.", + " {} ની નીચી રીઝોલ્યુશન ફોટો", + " {} નું પ્રસ્તુતિ", + "એક {} . ની ગ્રેફિટી", + " {} ની ખરાબ ફોટો.", + " {} ની કટ ફોટો.", + "એક {} નું ટેટૂ.", + "કાસ્ટ કરેલ {} .", + "એક ફોટો જોવાનું મુશ્કેલ {} .", + " {} ની તેજસ્વી ફોટો.", + "એક સ્વચ્છ {} . ની ફોટો", + "એક ગંદા {} ની ફોટો.", + " {} ની એક શ્યામ ફોટો.", + " {} નું ચિત્ર.", + "મારા {} એક ફોટો.", + "પ્લાસ્ટિક {} .", + "ઠંડી {} ની એક ફોટો.", + " {} ના ક્લોઝ-અપ ફોટો", + " {} ની કાળા અને સફેદ ફોટો.", + " {} ની પેઇન્ટિંગ", + " {} ની પેઇન્ટિંગ", + " {} ની પિક્સેલાઇઝ્ડ ફોટો.", + " {} ની શિલ્પ", + " {} ની તેજસ્વી ફોટો.", + " {} ના કાપી ફોટો.", + "પ્લાસ્ટિક {} .", + "ગંદા {} ની એક ફોટો.", + " {} ના jpeg ક્ષતિગ્રસ્ત ફોટો.", + " {} ની ઝાંખી ફોટો.", + " {} ની એક ફોટો.", + " {} ની સારી ફોટો.", + " {} નું રેન્ડરિંગ", + "વિડીયો ગેમમાં {} ", + "એક ફોટો {} .", + "એક ડૂડલ {} .", + " {} ના ક્લોઝ-અપ ફોટો.", + " {} ની એક ફોટો.", + "ઓરિગામી {} .", + "વિડીયો ગેમમાં {} ", + " {} ની એક સ્કેચ.", + " {} ની ડૂડલ.", + "એક ઓરિગામી {} .", + " {} ની નીચી રીઝોલ્યુશન ફોટો", + "રમકડું {} .", + " {} નું પ્રસ્તુતિ", + "સ્વચ્છ {} ની એક ફોટો.", + "એક મોટી {} . ની ફોટો", + " {} નું પ્રસ્તુતિ", + "એક સરસ {} ની તસવીર.", + "એક વિચિત્ર {} ની ફોટો.", + " {} ની ઝાંખી ફોટો.", + "એક કાર્ટૂન {} .", + "કલાના {} .", + " {} ની એક સ્કેચ.", + "એક ભરતકામ {} .", + " {} ની પિક્સેલાઇઝ્ડ ફોટો", + " {} ના પાનાં", + " {} ના jpeg ક્ષતિગ્રસ્ત ફોટો.", + "એક સારા ફોટો {} .", + "એક પ્લશિ {} .", + "સરસ {} ની એક ફોટો.", + "નાના {} . ની એક ફોટો", + "વિચિત્ર {} ની એક ફોટો.", + "કાર્ટૂન {} .", + "કલાના {} .", + " {} નું ચિત્ર", + "મોટા {} . ની એક ફોટો", + " {} ની કાળા અને સફેદ ફોટો.", + "ધુમ્મસ {} .", + " {} ની એક ઘાટા ફોટો.", + " {} ના ઇટાપ", + " {} ની ગ્રેફિટી.", + "એક રમકડું {} .", + "મારા {} .", + "એક ઠંડી {} . ની ફોટો", + "એક નાના {} . ની ફોટો", + " {} નું ટેટૂ." + ], + "MS": [ + "gambar yang buruk dari {} .", + "gambar banyak {} .", + "patung dari {} .", + "gambar yang sukar dilihat {} .", + "gambar resolusi rendah {} .", + "penyampaian {} .", + "Grafiti dari {} .", + "gambar yang buruk dari {} .", + "gambar yang dipotong dari {} .", + "Tato dengan {} .", + "yang dicincang {} .", + "gambar yang sukar dilihat {} .", + "gambar terang {} .", + "gambar yang bersih {} .", + "gambar {} kotor.", + "gambar gelap dari {} .", + "lukisan {} .", + "gambar {} ku.", + "plastik {} .", + "gambar yang sejuk {} .", + "gambar dekat dari {} .", + "gambar hitam dan putih {} .", + "lukisan {} .", + "lukisan {} .", + "gambar piksel {} .", + "patung {} .", + "gambar terang {} .", + "gambar yang dipotong dari {} .", + "plastik {} .", + "gambar {} kotor.", + "gambar jpeg rosak dari {} .", + "gambar kabur dari {} .", + "gambar {} .", + "gambar yang baik dari {} .", + "penyampaian {} .", + " {} dalam permainan video.", + "gambar satu {} .", + "menggodam sebuah {} .", + "gambar dekat {} .", + "gambar {} .", + "Origami {} .", + " {} dalam permainan video.", + "lakaran {} .", + "sebuah doodle dari {} .", + "origami {} .", + "gambar resolusi rendah dari {} .", + "mainan {} .", + "satu penggambaran {} .", + "gambar yang bersih {} .", + "gambar besar {} .", + "satu penggambaran {} .", + "gambar {} yang bagus.", + "gambar {} aneh.", + "gambar kabur dari {} .", + "sebuah kartun {} .", + "seni {} .", + "lakaran {} .", + "sebuah {} bersulam.", + "gambar piksel dari {} .", + "Itap {} .", + "gambar jpeg rosak {} .", + "gambar yang baik dari {} .", + " {} sebuah baju plushie.", + "gambar {} yang baik.", + "gambar kecil {} .", + "gambar {} pelik.", + "kartun {} .", + "Art of {} .", + "lukisan {} .", + "gambar besar {} .", + "gambar hitam dan putih dari {} .", + " {} yang berwarna pelusuk ", + "gambar gelap dari {} .", + "iap daripada {} .", + "Grafiti dari {} .", + "mainan {} .", + "Itap dari {} .", + "gambar seorang yang keren. {}", + "gambar kecil {} .", + "Tatu dari {} ." + ], + "UK": [ + "погане фото {} .", + "фото багатьох {} .", + "скульптура {} .", + "фото трудновидної {} .", + "фото з низькою роздільною здатністю {} .", + "відтворення {} .", + "графіти від {} .", + "погане фото з {} .", + "вирізану фотографію {} .", + "татуїровка {} .", + "вишитий {} .", + "фото трудновидної {} .", + "яскраве фото {} .", + "фото чистих {} .", + "фото брудної {} .", + "темна фотографія {} .", + "малюнок {} .", + "фото мого {} .", + "пластик {} .", + "фото крутого {} .", + "фото зближення з {} .", + "чорно-біла фотографія {} .", + "картина {} .", + "картина {} .", + "пікселезована фотографія {} .", + "скульптура {} .", + "яскраве фото {} .", + "вирізану фотографію {} .", + "пластикова {} .", + "фото брудної {} .", + "jpeg зіпсований фото {} .", + "розмита фотографія {} .", + "фото {} .", + "хорошу фотографію {} .", + "відтворення {} .", + " {} в відеоіграх.", + "фото одного {} .", + "малюнок {} .", + "фото зближення {} .", + "фото {} .", + "Оригамі {} .", + " {} в відеоіграх.", + "ескіз {} .", + "малюнок {} .", + "Оригамі {} .", + "фото з низькою роздільною здатністю {} .", + "іграшка {} .", + "представлення {} .", + "фото чистих {} .", + "фото великої {} .", + "відтворення {} .", + "фото гарного {} .", + "фото дивного {} .", + "розмита фотографія {} .", + "мультфільм {} .", + "мистецтво {} .", + "ескіз {} .", + "вишитий {} .", + "пікселезована фотографія {} .", + "ітап {} .", + "jpeg зіпсований фото {} .", + "хорошу фотографію {} .", + "плюшевий {} .", + "фото хорошого {} .", + "фото маленького {} .", + "фото дивного {} .", + "мультфільм {} .", + "з'явлено в статті {} .", + "малюнок {} .", + "фото великої {} .", + "чорно-біла фотографія {} .", + "Плюшч. {}", + "темна фотографія {} .", + "ітап {} .", + "графіти на {} .", + " {} іграшка.", + "Ітап мого {} .", + "фото крутого {} .", + "фото маленького {} .", + "татуїровка {} ." + ], + "GL": [ + "Unha mala foto dun {} .", + "Unha foto de moitos. {}", + "unha escultura de un {} .", + "Unha foto do difícil de ver {} .", + "Unha foto de baixa resolución do {} .", + "unha representación de {} .", + "Graffiti de un {} .", + "Unha mala foto do {} .", + "Unha foto recortada da {} .", + "unha tatuaxe dun {} .", + "o bordado {} .", + "Unha foto dun difícil de ver {} .", + "Unha foto brillante de un {} .", + "Unha foto dun {} limpo.", + "Unha foto dun {} porco.", + "Unha foto escura da {} .", + "Un debuxo de {} .", + "Unha foto do meu {} .", + "o plástico {} .", + "Unha foto do cool {} .", + "Unha foto de preto de {} .", + "Unha foto en branco e negro do {} .", + "unha pintura do {} .", + "unha pintura de {} .", + "unha foto pixelada do {} .", + "unha escultura da {} .", + "Unha foto brillante da {} .", + "Unha foto recortada de {} .", + "Un plástico {} .", + "Unha foto do sucio {} .", + "Unha foto corrompida de {} .", + "Unha foto borrosa da {} .", + "Unha foto da {} .", + "Unha boa foto do {} .", + "unha representación do {} .", + "Un {} nun videoxogo.", + "Unha foto dun {} .", + "Un doodle de un {} .", + "Unha foto de preto do {} .", + "Unha foto dun {} .", + "O origami. {}", + "O {} nun videoxogo.", + "Un esbozo de {} .", + "un garabato do {} .", + "Un origami. {}", + "Unha foto de baixa resolución de {} .", + "o xoguete. {}", + "unha representación do {} .", + "Unha foto da limpeza {} .", + "Unha foto dunha grande {} .", + "unha representación de {} .", + "Unha foto dunha fermosa {} .", + "Unha foto dun raro {} .", + "Unha foto borrosa de un {} .", + "Un debuxo animado. {}", + "Art. 1 {} .", + "Un esbozo do {} .", + "Un {} bordado.", + "unha foto pixelada de {} .", + "o número de {} .", + "Unha foto da {} .", + "Unha boa foto dun {} .", + "Un peludo. {}", + "Unha foto do bonito {} .", + "Unha foto da pequena {} .", + "Unha foto do estraño {} .", + "O cartón animado {} .", + "arte do {} .", + "un debuxo do {} .", + "Unha foto da grande {} .", + "Unha foto en branco e negro dun {} .", + "O de pel. {}", + "Unha foto escura de un {} .", + "o número de {} .", + "Graffiti do {} .", + "Un xoguete. {}", + "- O meu {} .", + "Unha foto de un cool {} .", + "Unha foto dun pequeno {} .", + "unha tatuaxe do {} ." + ], + "SQ": [ + "Një foto e keqe e një {} .", + "Një foto e shumë {} .", + "një skulpturë e një {} .", + "Një foto e të vështirë për të parë {} .", + "një foto me rezolucion të ulët të {} .", + "një rendersim i {} .", + "grafiti e një {} .", + "Një foto e keqe e {} .", + "një foto e shkurtuar e {} .", + "një tatuazh me një {} .", + "e broduar {} .", + "Një foto e një {} të vështirë për të parë.", + "nje foto te ndritshme e nje {} .", + "Një foto e një të pastër {} .", + "Një foto e një {} .", + "nje foto e errët e {} .", + "një vizatim i {} .", + "një foto e {} ", + "Plastiku {} .", + "Një foto e cool {} .", + "nje foto e ngushtë e {} .", + "Një foto e bardhë e zi të {} .", + "një pikturë e {} .", + "një pikturë e {} .", + "një foto e pikseluar e {} .", + "një skulpturë e {} .", + "nje foto te ndritshme e {} .", + "një foto e shkurtuar e një {} .", + "një plastike {} .", + "Një foto e një {} të ndyrë.", + "nje foto e korruptuar jpeg e {} .", + "një foto e paqartë e {} .", + "Një foto e {} .", + "Një foto e mirë e {} .", + "një rendersim i {} .", + "Një {} në një lojë video.", + "Një foto e një {} .", + "një pikturë e një {} .", + "nje foto e ngushtë e {} .", + "Një foto e një {} .", + "origami {} .", + " {} në një lojë video.", + "një skicë e {} .", + "një pikturë e {} .", + "origami. {}", + "një foto me rezolucion të ulët të {} .", + "lodër {} .", + "një përktheje e {} .", + "Një foto e pastër {} .", + "nje foto e nje {} te madh.", + "një përktheje e {} .", + "Një foto e një {} .", + "Një foto e një {} të çuditshme.", + "një foto e paqartë e një {} .", + "Një karikaturë {} .", + "arti i {} .", + "një skicë e {} .", + "një {} të brodhur.", + "një foto e pikseluar e {} .", + "Itap i {} .", + "nje foto e korruptuar jpeg e {} .", + "Një foto e mirë e një {} .", + "Një plushie {} .", + "Një foto e bukur {} .", + "nje foto e {} te vogel.", + "Një foto e çuditshme {} .", + "Karikaturën {} .", + "Arti i {} .", + "një vizatim i {} .", + "nje foto e {} te madh.", + "nje foto te zeze dhe te bardha te nje {} .", + " {} pluzi.", + "Një foto e errët e një {} .", + "Itap i {} .", + "grafiti e {} .", + "Një lodër. {}", + "- Epo, e kam. {}", + "Një foto e një të ftohtë {} .", + "Një foto e një {} të vogël.", + "një tatuazh i {} ." + ], + "SA": [ + "अच् चित्रम् {} ", + "अनेकेषु {} चित्रं", + "एकं मूर्तिकल्पं {} .", + "दृश्यावश्यकस्य चित्रम् {} .", + " {} इत्यस्य निम्नपरिष्कृतस्य चित्रम्", + " {} इत्यस्य प्रतिपादनम्", + " {} इति ग्रैफिटीः", + " {} अस्य खराबं चित्रम्।", + " {} इत्यस्य कटाक्षचित्रम्", + " {} इति कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्ण", + "कटाक्षं {} ", + "दृश्यावश्यकस्य {} चित्रम्", + " {} इत्यस्य उज्ज्वलचित्रम्", + "स्वच्छस्य चित्रम् {} .", + "एकं अश्लील {} चित्रम् ।", + " {} इति अन्धकारचित्रम्", + " {} इति चित्रम्", + "मम {} चित्रम्", + "प्लैस्टिक {} .", + "कूल {} इत्यस्य चित्रम् ।", + " {} इत्यस्य क्लो-अपस्फोटः", + " {} इति कालोत्पादचित्रम्", + " {} चित्रम्", + " {} चित्रम्", + " {} इत्यस्य पिक्सेलयुक्तं चित्रम्", + " {} इति मूर्तिकला।", + " {} इत्यस्य उज्ज्वलचित्रम्", + " {} इत्यस्य कटाक्षचित्रम्", + "प्लास्टिक {} .", + "तस्विरं कस्यचित् 'डर्टी' {} ", + " {} इत्यस्य jpeg भ्रष्टचित्रम्", + " {} इत्यस्य धूर्तः चित्रम्", + " {} इत्यस्य चित्रम्", + " {} अस्य सुचित्रम्।", + " {} इत्यस्य प्रतिपादनम्", + " {} विडियोगेमस्य मध्ये।", + "एकस्य चित्रम् {} .", + "एकं {} इति स्क्रूड्लः।", + " {} इत्यस्य निकटचित्रम्", + " {} इत्यस्य चित्रम्", + "ओरिगामी {} .", + " {} विडियोगेमस्य।", + " {} इति चित्रं", + " {} इति चिह्नस्य चिह्नं", + "ओरिगामी {} .", + " {} इत्यस्य निम्नपरिष्कृतस्य चित्रम्", + "क्रीडालिङ्गम् {} .", + " {} इत्यस्य प्रतिपादनम्", + "स्वच्छस्य चित्रम् {} .", + "एकं बृहत् {} चित्रम्", + " {} इत्यस्य प्रतिपादनात्", + "एकं सुन्दरं चित्रम् {} ", + "विचित्रस्य {} चित्रम्", + " {} इत्यस्य धूर्तः चित्रम्", + "कार्टून {} .", + "कलायाः {} ", + " {} इति चित्रं", + "कङ्कित {} ", + " {} इत्यस्य पिक्सेलयुक्तं चित्रम्", + " {} इति सूत्रस्य इटापः", + " {} इत्यस्य jpeg भ्रष्टचित्रम्", + "एकस्य {} चित्रस्य उत्तमं चित्रम्।", + "एकं पुष्पगुच्छं {} .", + "सुन्दरी {} याम् चित्रम्।", + "लघु {} इत्यस्य चित्रम् ।", + "विचित्रस्य {} चित्रम्।", + "कार्टून {} .", + "कलायाः {} ", + " {} इति चित्रम्", + "बृहत् {} इत्यस्य चित्रम्", + " {} इत्यस्य कालोत्पादचित्रम्", + "पुष्पिका {} .", + " {} इति अन्धकारचित्रम्", + "इटापः {} .", + " {} इति ग्राफिटीः", + "एकं क्रीडालिङ्गम् {} .", + "मम {} इति इटापः", + "कूल {} इत्यस्य चित्रम् ।", + "लघु {} कस्य चित्राः", + " {} इति कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्णस्य कर्ण" + ], + "LO": [ + "ຮູບພາບທີ່ບໍ່ດີຂອງ {} .", + "ຮູບພາບຂອງຫຼາຍ {} .", + "ຮູບປັ້ນຂອງ {} .", + "ຮູບຂອງຄົນທີ່ເບິ່ງບໍ່ເຫັນ {} .", + "ຮູບພາບຄວາມລະອຽດຕ່ໍາຂອງ {} .", + "ການສະແດງຂອງ {} .", + "ການຂຽນຮູບພາບຂອງ {} .", + "ຮູບພາບທີ່ບໍ່ດີຂອງ {} .", + "ຮູບພາບທີ່ຖືກຕັດຂອງ {} .", + "ຮູບແຕ້ມຮູບຂອງ {} .", + " {} ທີ່ຂົນຂົນ", + "ຮູບຂອງ {} ທີ່ເບິ່ງບໍ່ເຫັນ", + "ຮູບສົດໃສຂອງ {} .", + "ຮູບພາບຂອງຄົນສະອາດ {} .", + "ຮູບພາບຂອງຄົນເປື້ອນ {} ", + "ຮູບພາບທີ່ສີດໍາຂອງ {} .", + "ການແຕ້ມຂອງ {} .", + "ຮູບຂອງ {} ຂອງຂ້ອຍ.", + "ພລາສຕິກ {} .", + "ຮູບພາບຂອງ cool {} .", + "ຮູບຖ່າຍໃກ້ໆຂອງ {} .", + "ຮູບສີດໍາຂາວຂອງ {} .", + "ຮູບແຕ້ມຂອງ {} .", + "ຮູບແຕ້ມຂອງ {} .", + "ຮູບພາບ pixelated ຂອງ {} .", + "ຮູບປັ້ນຂອງ {} .", + "ຮູບສົດໃສຂອງ {} .", + "ຮູບພາບທີ່ຖືກຕັດຂອງ {} .", + " {} ພລາສຕິກ", + "ຮູບພາບຂອງຄົນເປື້ອນ {} ", + "ຮູບພາບ jpeg ທີ່ເປ່ເພຂອງ {} .", + "ຮູບພາບທີ່ຊຸ່ມຂອງ {} .", + "ຮູບຂອງ {} .", + "ຮູບພາບທີ່ດີຂອງ {} .", + "ການສະແດງຂອງ {} .", + " {} ໃນເກມວີດີໂອ.", + "ຮູບພາບຂອງ 1 {} .", + "ການຂຽນຮູບປັ້ນຂອງ {} .", + "ຮູບພາບໃກ້ໆຂອງ {} .", + "ຮູບຂອງ {} .", + " {} ການເຮັດຮູບອໍຣິຄາມີ", + " {} ໃນເກມວີດີໂອ.", + "ຮູບແຕ້ມຂອງ {} .", + "ການຂຽນຮູບຂອງ {} .", + "ເປັນເຄື່ອງເຮັດ origami {} .", + "ຮູບພາບຄວາມລະອຽດຕ່ໍາຂອງ {} .", + "ເຄື່ອງຫຼີ້ນ {} .", + "ການສະແດງຂອງ {} .", + "ຮູບພາບຂອງຄົນສະອາດ {} .", + "ຮູບພາບຂອງ {} ຂະຫນາດໃຫຍ່.", + "ການສະແດງຂອງ {} .", + "ຮູບພາບຂອງຄົນດີໆ {} ", + "ຮູບພາບຂອງ {} ", + "ຮູບພາບທີ່ຊຸ່ມຊື່ນຂອງ {} .", + "ຮູບກາຕູນ {} .", + "ສິນລະປະຂອງ {} .", + "ຮູບຮ່າງຂອງ {} .", + " {} ທີ່ຂົນຂົນ", + "ຮູບພາບ pixelated ຂອງ {} .", + "itap ຂອງ {} .", + "ຮູບພາບ jpeg ທີ່ເປ່ເພຂອງ {} .", + "ຮູບພາບທີ່ດີຂອງ {} .", + " {} ", + "ຮູບພາບຂອງຄົນງາມ {} ", + "ຮູບຂອງ {} ນ້ອຍ.", + "ຮູບພາບຂອງຄົນແປກໆ {} ", + "ຮູບກາຕູນ {} .", + "ຂອງ {} .", + "ການແຕ້ມຂອງ {} .", + "ຮູບພາບຂອງ {} ໃຫຍ່.", + "ຮູບສີດໍາຂາວຂອງ {} .", + "ຜ້າປູຊະນິດ {} ", + "ຮູບສີດໍາຂອງ {} .", + "itap ຂອງ {} .", + "ການຂຽນຮູບພາບຂອງ {} .", + "ເຄື່ອງຫຼິ້ນ {} ", + " {} ຂອງຂ້ອຍ.", + "ຮູບພາບຂອງ {} ", + "ຮູບຂອງ {} ນ້ອຍ.", + "ຮູບແຕ້ມຂອງ {} ." + ], + "HR": [ + "Loša slika {} .", + "fotografija mnogih {} .", + "skulptura od {} .", + "fotografija teško vidljive {} .", + "fotografija s niskom rezolucijom {} .", + "Izvršavanje a {} .", + "Grafiti od {} .", + "Loša slika {} .", + "Ograna fotografija {} .", + "Tetovaža s {} .", + "Brodiran {} .", + "Slika teško vidljive {} .", + "Slika s svjetlom od {} .", + "fotografija čiste {} .", + "Slika prljavog {} .", + "tamna slika {} .", + "nacrte {} .", + "Slika mog {} .", + "plastični {} .", + "Slika cool {} .", + "Približna fotografija {} .", + "crno-bijela fotografija {} .", + "slika {} .", + "Slika s {} .", + "Piksle fotografije {} .", + "skulptura {} .", + "Slika s svjetlom od {} .", + "Ograna fotografija {} .", + "plastični {} .", + "Slika prljavog {} .", + "JPEG pokvarena slika {} .", + "Nejasna fotografija {} .", + "fotografija {} .", + "Dobra slika {} .", + "-Preklad \" {} \".", + " {} u video igri.", + "fotografija jedne {} .", + "Čarobnjak od {} .", + "Približnu fotografiju {} .", + "fotografija {} .", + "origami {} .", + " {} u video igri.", + "skica {} .", + "Čarobnjak od {} .", + "origami {} .", + "fotografija {} niske rezolucije.", + " {} igračku.", + "Izvršavanje {} .", + "fotografija čiste {} .", + "fotografija velikog {} .", + "Izvršavanje {} .", + "Slika lijepog {} .", + "fotografija čudnog {} .", + "Nejasna fotografija {} .", + "crtić. {}", + "U skladu s člankom 1. {}", + "nacrte {} .", + "Brodiran {} .", + "Piksle fotografije {} .", + "U slučaju da je to moguće, {}", + "Jpeg pokvarena slika {} .", + "Dobra slika {} .", + "Pluškavi {} .", + "Slika lijepog {} .", + "fotografija malog {} .", + "fotografija čudnog {} .", + "crtić {} .", + "Umjetnost {} .", + "nacrte {} .", + "fotografija velikog {} .", + "crno-bijela fotografija {} .", + "Pluškavi {} .", + "tamna slika {} .", + "-To je {} .", + "Grafiti iz {} .", + "igračka. {}", + "-Itap od mog {} .", + "Slika cool {} .", + "Slika malog {} .", + "tetovaža s {} ." + ], + "KA": [ + "ნვდჲგა ფჲტჲრა ნა \"ე\". {}", + "ფოტო მრავალი {} .", + "ქანდაკება {} .", + "ფოტო რთულად დანახული {} .", + " {} -ის დაბალი გარჩევადობის ფოტო.", + "a-ს გამოსახულება {} .", + "გრაფიტი {} .", + "ცუდი ფოტო {} .", + "გადაჭრილი ფოტო {} .", + "ტატუირებული {} .", + "ნაღებვარე {} .", + "ფოტო რთულად დანახული {} .", + "ნათელი ფოტო {} .", + "სუფთა {} ფოტოსურათი.", + "ფჲტჲჟრა ნა ჟლვეკა. {}", + "ბნელი ფოტო {} .", + " {} -ის ნახაზი.", + "ჟლვეფა ნა მვნ. {}", + "პლასტმასის {} .", + "მაგარი {} ფოტოსურათი.", + "კლოუ-შოპ ფოტოს {} .", + "შავ-თეთრი ფოტო {} .", + " {} -ის ნახატი.", + "კადრი {} .", + " {} -ის პიქსელირებული ფოტო.", + "სკულპტურა {} .", + "ნათელი ფოტო {} .", + "გადაჭრილი ფოტო {} .", + "პლასტმასის {} .", + "ფჲტჲრა ნა ჟლვეკარა {} .", + "jpeg გაფუჭებული ფოტო {} .", + "გაურკვეველი ფოტო {} .", + "ფოტო {} .", + "კარგი ფოტო {} .", + " {} -ის გადმოცემა.", + "ა {} ვიდეო თამაშში.", + "ერთ-ერთი {} ფოტოსურათი.", + "ჟრპანჲგრა ნა \" {} \".", + " {} -ის ახლოდან გადაღებული ფოტო.", + "ფოტო {} .", + "ორიგამი {} .", + " {} ვიდეო თამაშში.", + "ნაჩვენები {} .", + "დუდლერი {} .", + "ორიგამი {} .", + "დაბალი გარჩევადობის ფოტო {} .", + "ნა£ე£სკა. {}", + " {} -ის გამოსახულება.", + "სუფთა {} ფოტოსურათი.", + "დიდი {} ფოტოსურათი.", + "a-ს გამოსახულება {} .", + "ფჲტჲჟრა ნა ლჲქნჲ ჟჲ. {}", + "ფჲტჲჟრა ნა ჟრანდლა. {}", + "ნაბნავი ფოტო {} .", + "ჟრანდაჟრა ჟრანდაჟრა. {}", + "სქემის {} .", + " {} -ის ესკიზი.", + "ნაღები {} .", + " {} -ის პიქსელირებული ფოტო.", + " {} -ის იტაპი", + "jpeg გაფუჭებული ფოტო {} .", + "კარგი ფოტო {} .", + "ჟჲჟრაჟკა. {}", + "ფჲტჲრა ნა ლჲქნჲრჲ {} .", + "პატარა {} .", + "ფჲტჲრა ნა ჟრანდჲპარა {} .", + "კარიკატურული ფილმი {} .", + "ხელოვნების {} .", + " {} -ის ნახაზი.", + "დიდი {} ფოტოსურათი.", + "შავ-თეთრი ფოტო {} .", + "ჟჲპკარა ჟჲბპვე. {}", + "ბნელი ფოტო {} .", + "a {} ", + "გრაფიტი {} .", + "ჟრანვკა. {}", + "ჲე მჲ£ჲრ {} .", + "ფოტო მაგარი {} .", + "პატარა {} .", + "ტატუირება {} ." + ], + "DA": [ + "et dårligt billede af en {} .", + "Et billede af mange {} .", + "en skulptur af en {} .", + "et billede af det svære at se {} .", + "et lavopløsningsbillede af {} .", + "en gengivelse af {} .", + "Graffiti af en {} .", + "et dårligt billede af {} .", + "et beskåret billede af {} .", + "en tatovering af en {} .", + "den broderede {} .", + "et billede af en svær at se {} .", + "et lysende billede af en {} .", + "et billede af en ren {} .", + "Et billede af en beskidt {} .", + "et mørkt billede af {} .", + "en tegning af {} .", + "et billede af min {} .", + "- Plastik {} .", + "et billede af den cool {} .", + "et nærbillede af en {} .", + "et sort-hvid billede af {} .", + "et maleri af {} .", + "et maleri af en {} .", + "et pixelateret billede af {} .", + "en skulptur af {} .", + "et lysende billede af {} .", + "et beskåret billede af en {} .", + "en plastik {} .", + "Et billede af den beskidte {} .", + "et jpeg-skadet billede af en {} .", + "et sløret billede af {} .", + "et billede af {} .", + "et godt billede af {} .", + "en gengivelse af {} .", + "En {} i et videospil.", + "et billede af en {} .", + "En doodle af en {} .", + "et nærbillede af {} .", + "et billede af en {} .", + "Origamien. {}", + " {} i et videospil.", + "et skits af en {} .", + "En krydser af {} .", + "- En origami. {}", + "et lavopløsningsbillede af en {} .", + "Legetøjet. {}", + "en gengivelse af {} .", + "et billede af den rene {} .", + "et billede af en stor {} .", + "en gengivelse af {} .", + "Et foto af en flot {} .", + "Et billede af en underlig {} .", + "et sløret billede af en {} .", + "En tegneserie. {}", + "art af en {} .", + "et skits af {} .", + "en broderet {} .", + "et pixelateret billede af en {} .", + "Itap af {} .", + "et jpeg-foto af {} .", + "et godt billede af en {} .", + "En plushie. {}", + "et billede af den hyggelige {} .", + "et billede af den lille {} .", + "Et billede af den mærkelige {} .", + "Den tegneserie {} .", + "Kunst af {} .", + "en tegning af {} .", + "et billede af den store {} .", + "et sort-hvid billede af en {} .", + "- Det er en plushie. {}", + "et mørkt billede af en {} .", + "Itap af a {} .", + "Graffiti af den {} .", + "- Et legetøj. {}", + "- Det er min {} .", + "et billede af en cool {} .", + "et billede af en lille {} .", + "en tatovering af {} ." + ], + "SW": [ + "picha mbaya ya {} .", + "picha ya wengi {} .", + "sanamu ya {} .", + "picha ya vigumu kuona {} .", + "picha ya azimio la chini ya {} .", + "rendering ya {} .", + "graffiti ya {} .", + "picha mbaya ya {} .", + "picha ya kupunguzwa ya {} .", + "tattoo ya {} .", + "embroidered {} .", + "picha ya vigumu kuona {} .", + "picha mkali wa {} .", + "picha ya safi {} .", + "picha ya {} chafu.", + "picha giza ya {} .", + "kuchora ya {} .", + "picha ya {} . yangu.", + "plastiki {} .", + "picha ya baridi {} .", + "picha ya karibu ya {} .", + "picha nyeusi na nyeupe ya {} .", + "picha ya {} .", + "picha ya {} .", + "picha pixelated ya {} .", + "sanamu ya {} .", + "picha mkali wa {} .", + "picha ya kupunguzwa ya {} .", + "plastiki {} .", + "picha ya chafu {} .", + "picha jpeg mbovu ya {} .", + "picha blurry ya {} .", + "picha ya {} .", + "picha nzuri ya {} .", + "rendering ya {} .", + " {} katika mchezo wa video.", + "picha ya moja {} .", + "doodle ya {} .", + "picha ya karibu ya {} .", + "picha ya {} .", + "origami {} .", + " {} katika mchezo wa video.", + "rasimu ya {} .", + "doodle ya {} .", + "origami {} .", + "picha ya azimio la chini ya {} .", + "toy {} .", + "tafsiri ya {} .", + "picha ya safi {} .", + "picha ya kubwa {} .", + "tafsiri ya {} .", + "picha ya nzuri {} .", + "picha ya mtu wa ajabu {} .", + "picha blurry ya {} .", + "katuni {} .", + "sanaa ya {} .", + "rasimu ya {} .", + "embroidered {} .", + "picha pixelated ya {} .", + "itap ya {} .", + "picha jpeg mbovu ya {} .", + "picha nzuri ya {} .", + "plushie {} .", + "picha ya nzuri {} .", + "picha ya ndogo {} .", + "picha ya weird {} .", + "katuni {} .", + "sanaa ya {} .", + "kuchora {} .", + "picha ya kubwa {} .", + "picha nyeusi na nyeupe ya {} .", + "plushie {} .", + "picha nyeusi ya {} .", + "itap ya {} .", + "graffiti ya {} .", + "toy {} .", + "Itap ya {} . yangu.", + "picha ya mtu mzuri {} .", + "picha ya ndogo {} .", + "tattoo ya {} ." + ], + "HU": [ + "egy rossz fotó egy {} .", + "Egy fotó sok-sok {} .", + "egy szobor egy {} .", + "A nehéz látni {} .", + "a {} alacsony felbontású fényképe.", + "a {} megjelenítése.", + "Egy {} graffiti.", + "egy rossz fotó a {} .", + "a {} vágott fényképe.", + "egy tetoválás egy {} .", + "a hímzett {} .", + "egy képet egy nehezen látható {} .", + "egy fényes fotó a {} .", + "egy tiszta {} fényképe.", + "Egy fotó egy mocskos {} .", + "egy sötét fénykép a {} .", + "a {} rajza.", + "egy fotó a {} -ről.", + "A műanyag {} .", + "A menő {} fényképe.", + "egy közelkép egy {} .", + "fekete-fehér fénykép a {} .", + "a {} festménye.", + "egy kép a {} .", + "a {} pixelezett fényképe.", + "A szobor a {} .", + "egy fényes fotó a {} .", + "egy megvágott fotó a {} .", + "műanyag {} .", + "Egy fotó a mocskos {} .", + "egy jpeg károsodott fotó egy {} .", + "egy homályos fotó a {} .", + "a {} fényképe.", + "egy jó fotó a {} .", + "a {} megjelenítése.", + " {} egy videojátékban.", + "egy fotó egy {} .", + "egy karikázás egy {} .", + "a {} közelképét.", + "egy fotó egy {} .", + "Az origami {} .", + "A {} egy videojátékban.", + "a {} vázlata.", + "egy karikázás a {} .", + "Egy origami {} .", + "egy {} alacsony felbontású fényképe.", + "A játékot. {}", + "a {} rendszere.", + "Egy fénykép a tiszta {} .", + "egy nagy {} fénykép.", + "a {} megjelenítése.", + "Egy szép {} fotó.", + "Egy képet egy fura {} .", + "egy homályos fotó a {} .", + "Egy rajzfilm {} .", + "a {} cikk szerint.", + "a {} vázlata.", + "egy hímzett {} .", + "egy {} pixelezett fényképe.", + "a {} táblázat.", + "egy jpeg károsodott fotó a {} .", + "egy jó fotó egy {} .", + "egy plüss. {}", + "Egy fotó a szép {} .", + "A kis {} fényképe.", + "Egy kép a fura {} .", + "A rajzfilm {} .", + "a {} .", + "a {} rajza.", + "A nagy {} fényképe.", + "egy fekete-fehér fotó a {} .", + "A plüss. {}", + "egy sötét fotó egy {} .", + "a {} a ", + "A {} graffitije.", + "Egy játék. {}", + "A {} -m.", + "Egy fénykép egy menő {} .", + "egy kis {} fényképét.", + "A tetoválás a {} ." + ], + "NL": [ + "Een slechte foto van een {} .", + "Een foto van vele {} .", + "een beeld van een {} .", + "een foto van de moeilijk te zien {} .", + "een foto met lage resolutie van de {} .", + "een weergave van {} .", + "Graffiti van een {} .", + "Een slechte foto van de {} .", + "een geknipte foto van de {} .", + "een tatoeage van een {} .", + "de geborduurde {} .", + "Een foto van een moeilijk te zien {} .", + "een heldere foto van een {} .", + "een foto van een schone {} .", + "Een foto van een vuile {} .", + "een donkere foto van de {} .", + "een tekening van {} .", + "Een foto van mijn {} .", + "het plastic {} .", + "Een foto van de cool {} .", + "een close-upfoto van een {} .", + "een zwart-wit foto van de {} .", + "een schilderij van de {} .", + "een schilderij van {} .", + "een gepixeliseerde foto van de {} .", + "een beeld van de {} .", + "een heldere foto van de {} .", + "een geknipte foto van een {} .", + "een plastic {} .", + "Een foto van de vuile {} .", + "Een beschadigde foto van een {} .", + "een wazig foto van de {} .", + "een foto van de {} .", + "Een goede foto van de {} .", + "een weergave van de {} .", + "Een {} in een videospel.", + "een foto van een {} .", + "Een doodle van een {} .", + "een close-upfoto van de {} .", + "een foto van een {} .", + "De origami {} .", + "De {} in een videospel.", + "een schets van {} .", + "Een doodle van de {} .", + "Een origami {} .", + "een foto met lage resolutie van {} .", + "Het speelgoed. {}", + "een weergave van de {} .", + "een foto van de schoon {} .", + "een foto van een grote {} .", + "een weergave van {} .", + "Een foto van een mooie {} .", + "Een foto van een rare {} .", + "een wazig foto van een {} .", + "Een tekenfilm. {}", + "De kunst van een {} .", + "een schets van de {} .", + "een geborduurde {} .", + "een gepixeliseerde foto van een {} .", + "De waarde van de {} .", + "Een beschadigde foto van de {} .", + "Een goede foto van een {} .", + "Een pluisje. {}", + "Een foto van de mooie {} .", + "een foto van de kleine {} .", + "Een foto van de rare {} .", + "De tekenfilm. {}", + "De kunst van de {} .", + "een tekening van {} .", + "een foto van de grote {} .", + "een zwart-wit foto van een {} .", + "De pluizige {} .", + "een donkere foto van een {} .", + "hetap van {} .", + "Graffiti van de {} .", + "Een speeltje. {}", + "Ik heb een {} .", + "Een foto van een cool {} .", + "een foto van een kleine {} .", + "een tatoeage van de {} ." + ], + "LT": [ + "blogą {} nuotrauką.", + "daugybės {} nuotrauka.", + "skulptūra iš {} .", + "Sunku matyti {} .", + "mažos skiriamosios gebos {} nuotrauka.", + "a {} vertimas.", + "Grafitai iš {} .", + "bloga nuotrauka iš {} .", + "iškirstas {} nuotraukas.", + "tatuiruotė su {} .", + "iškraipiotas {} .", + "Sunku matyti {} .", + "šviesios {} nuotraukos.", + "švarų {} nuotrauka.", + "Nuotrauka iš purvinos {} .", + "tamsi nuotrauka iš {} .", + "a {} brėžinys.", + "nuotrauka mano {} .", + "plastikinis {} .", + "Nuotrauka iš \"cool\" {} .", + " {} iš arti nuotrauka.", + "juodai balta {} nuotrauka.", + " {} paveikslas.", + " {} paveikslas.", + " {} pikseliuotos nuotraukos.", + " {} skulptūra.", + "šviesios {} nuotraukos.", + "iškirstas {} nuotrauka.", + "plastikinis {} .", + "Nuotrauka iš purvinos {} .", + " {} sugadinta nuotrauka.", + "išmatyta {} nuotrauka.", + " {} nuotrauka.", + "gerą {} nuotrauką.", + " {} vertimo.", + " {} vaizdo žaidime.", + "vieno {} nuotrauka.", + " {} .", + " {} iš arti nuotrauka.", + " {} nuotrauka.", + "origami {} .", + " {} vaizdo žaidime.", + " {} skizas.", + " {} .", + "origami {} .", + "mažos skiriamosios gebos {} .", + "Žaislas {} .", + " {} vertimas.", + "švarų {} nuotrauka.", + "didelės {} .", + "a {} vertimas.", + "gražios {} nuotrauka.", + "Keistas {} ", + "Neaiški nuotrauka iš {} .", + "animacinis filmas {} .", + "a {} straipsnio 1 dalis.", + " {} skizas.", + "iškraipiotas {} .", + " {} pikseliuotą nuotrauką.", + " {} ištraukite.", + " {} sugadinta nuotrauka.", + "gerą {} nuotrauką.", + "Plušinis. {}", + "gražios {} nuotrauka.", + "mažosios {} .", + "Nuotrauka iš keisto {} .", + "animacinis filmas {} .", + " {} meno.", + " {} briaunamas.", + "didelio {} .", + "juodai balta nuotrauka iš {} .", + "Plušinis {} .", + "tamsi nuotrauka iš {} .", + "a {} tapas.", + "Grafitai iš {} .", + "Žaislas. {}", + "Mano {} .", + "Nuotrauka iš kieto {} .", + "mažos {} .", + " {} tatuiruotė." + ], + "ML": [ + "ഒരു {} എന്നതിന്റെ മോശം ഫോട്ടോ.", + "പലരുടെയും ഫോട്ടോ. {}", + "ഒരു ശില്പം {} .", + "കാണാന് പ്രയാസമുള്ള ഒരു ഫോട്ടോ {} .", + " {} ന്റെ ഒരു താഴ്ന്ന റെസലൂഷൻ ഫോട്ടോ.", + "ഒരു {} ന്റെ ഒരു റാൻഡറിംഗ്.", + "ഒരു {} എന്ന ഗ്രാഫിറ്റി.", + " {} എന്നതിന്റെ മോശം ഫോട്ടോ.", + " {} എന്നതിന്റെ ഒരു ക്രോപ്പ് ചെയ്ത ഫോട്ടോ.", + "ഒരു {} എന്ന ഒരു ടാറ്റൂ.", + "മുദ്രകുത്തിക്കിട്ടിയ {} .", + "കാണാന് പ്രയാസമുള്ള ഒരു {} എന്ന ചിത്രമാണ്.", + "ഒരു {} എന്നതിന്റെ ഒരു തിളക്കമുള്ള ഫോട്ടോ.", + "ഒരു ശുദ്ധമായ {} എന്നതിന്റെ ഒരു ഫോട്ടോ.", + "ഒരു വൃത്തികെട്ട {} ന്റെ ഫോട്ടോ.", + " {} എന്നതിന്റെ ഒരു ഇരുണ്ട ഫോട്ടോ.", + "ഒരു {} എന്ന വരയ്ക്കുക.", + "എന്റെ {} ന്റെ ഒരു ഫോട്ടോ.", + "പ്ലാസ്റ്റിക് {} .", + "ഒരു ഫോട്ടോ കോൾ {} .", + "ഒരു {} ന്റെ ഒരു ക്ലോസ്-അപ്പ് ഫോട്ടോ.", + " {} ന്റെ ഒരു കറുപ്പും വെളുപ്പും ഫോട്ടോ.", + " {} എന്ന ചിത്രത്തിന്റെ ഒരു ചിത്രം.", + "ഒരു ചിത്രത്തിന്റെ {} .", + " {} ന്റെ പിക്സൽ ചെയ്ത ഫോട്ടോ.", + "ഒരു ശില്പം {} .", + " {} എന്നതിന്റെ ഒരു തിളക്കമുള്ള ഫോട്ടോ.", + "ഒരു {} ന്റെ ഒരു മുറിച്ച ഫോട്ടോ.", + "ഒരു പ്ലാസ്റ്റിക് {} .", + "ഒരു ഫോട്ടോ കട്ടൻ {} ", + "ഒരു {} ന്റെ ഒരു jpeg കേടായ ഫോട്ടോ.", + " {} എന്നതിന്റെ ഒരു അസ്വസ്ഥമായ ഫോട്ടോ.", + "ഒരു ഫോട്ടോ {} .", + " {} ഒരു നല്ല ഫോട്ടോ.", + " {} എന്നതിന്റെ ഒരു രെൻഡറിംഗ്.", + "ഒരു വീഡിയോ ഗെയിമിലെ ഒരു {} .", + "ഒരു {} എന്നതിന്റെ ഒരു ഫോട്ടോ.", + "ഒരു {} എന്ന ഒരു ഡൂഡ്ലിംഗ്.", + " {} ന്റെ ഒരു ക്ലോസ്-അപ്പ് ഫോട്ടോ.", + "ഒരു {} എന്നതിന്റെ ഒരു ഫോട്ടോ.", + "ഒറിഗമി {} .", + "ഒരു വീഡിയോ ഗെയിമിലെ {} .", + "ഒരു {} ന്റെ ഒരു സ്കെച്ച്.", + "ഒരു {} എന്നതിന്റെ ഒരു ഡൂഡ്ലിംഗ്.", + "ഒരു ഒറിഗമി {} .", + "ഒരു {} ന്റെ കുറഞ്ഞ റെസലൂഷൻ ഫോട്ടോ.", + "കളിപ്പാട്ടം {} .", + " {} എന്നതിന്റെ ഒരു രെഡര്", + "ഒരു ഫോട്ടോ ശുദ്ധമായ {} ", + "ഒരു വലിയ {} ന്റെ ഒരു ഫോട്ടോ.", + "ഒരു {} എന്നതിന്റെ ഒരു രചന.", + "ഒരു നല്ല {} ന്റെ ഫോട്ടോ.", + "ഒരു വിചിത്രമായ {} ", + "ഒരു {} ന്റെ ഒരു മങ്ങിയ ഫോട്ടോ.", + "ഒരു കാർട്ടൂൺ {} .", + "കലയുടെ {} .", + " {} ന്റെ ഒരു സ്കെച്ച്.", + "ഒരു മുദ്രയിട്ട {} .", + "ഒരു {} ന്റെ പിക്സൽ ചെയ്ത ഫോട്ടോ.", + " {} എന്നതിന്റെ ഇറ്റാപ്പ്.", + " {} എന്നതിന്റെ ഒരു jpeg കേടായ ഫോട്ടോ.", + "ഒരു നല്ല ഫോട്ടോ ഒരു {} .", + "ഒരു പ്ളഷി {} .", + " {} നല്ലൊരു ചിത്രത്തിന്റെ", + "ചെറിയ {} ന്റെ ഒരു ഫോട്ടോ.", + " {} വിചിത്രമായ ഒരു ഫോട്ടോ.", + "കാർട്ടൂൺ {} .", + "കലയുടെ {} .", + " {} എന്നതിന്റെ ഒരു വരവ്.", + "വലിയ {} ന്റെ ഒരു ഫോട്ടോ.", + "ഒരു {} ന്റെ കറുപ്പും വെളുപ്പും ഫോട്ടോ.", + "ആ പ്ളഷി {} ", + "ഒരു {} എന്നതിന്റെ ഒരു ഇരുണ്ട ഫോട്ടോ.", + "ഒരു {} ന്റെ ഇറ്റാപ്പ്.", + " {} എന്നതിന്റെ ഗ്രാഫിറ്റികൾ.", + "ഒരു കളിപ്പാട്ടം {} .", + "എന്റെ {} ", + "ഒരു തണുത്ത {} ന്റെ ഫോട്ടോ.", + "ഒരു ചെറിയ {} എന്നതിന്റെ ഒരു ഫോട്ടോ.", + "ഒരു പച്ചകുത്തൽ {} ." + ], + "EN": [ + "a bad photo of a {} .", + "a photo of many {} .", + "a sculpture of a {} .", + "a photo of the hard to see {} .", + "a low resolution photo of the {} .", + "a rendering of a {} .", + "Graffiti of a {} .", + "A bad photo of the {} .", + "a cropped photo of the {} .", + "a tattoo of a {} .", + "the embroidered {} .", + "a photo of a hard to see {} .", + "a bright photo of a {} .", + "a photo of a clean {} .", + "A photo of a dirty {} .", + "a dark photo of the {} .", + "a drawing of a {} .", + "A photo of my {} .", + "the plastic {} .", + "A photo of the cool {} .", + "a close-up photo of a {} .", + "a black and white photo of the {} .", + "a painting of the {} .", + "a painting of a {} .", + "a pixelated photo of the {} .", + "a sculpture of the {} .", + "a bright photo of the {} .", + "a cropped photo of a {} .", + "a plastic {} .", + "A photo of the dirty {} .", + "a jpeg corrupted photo of a {} .", + "a blurry photo of the {} .", + "a photo of the {} .", + "A good photo of the {} .", + "a rendering of the {} .", + "a {} in a video game.", + "a photo of one {} .", + "A doodle of a {} .", + "a close-up photo of the {} .", + "a photo of a {} .", + "The origami {} .", + "The {} in a video game.", + "a sketch of a {} .", + "a doodle of the {} .", + "I'm going to make you an origami. {}", + "a low resolution photo of a {} .", + "The toy {} .", + "a rendering of the {} .", + "a photo of the clean {} .", + "a photo of a large {} .", + "a rendering of a {} .", + "A photo of a nice {} .", + "A photo of a weird {} .", + "a blurry photo of a {} .", + "a cartoon {} .", + "the art of a {} .", + "a sketch of the {} .", + "a embroidered {} .", + "a pixelated photo of a {} .", + "the number of the {} .", + "a jpeg corrupted photo of the {} .", + "a good photo of a {} .", + "A plushie. {}", + "A photo of the nice {} .", + "a photo of the small {} .", + "A photo of the weird {} .", + "the cartoon {} .", + "The art of the {} .", + "a drawing of the {} .", + "a photo of the large {} .", + "a black and white photo of a {} .", + "The plushie {} .", + "a dark photo of a {} .", + "the number of a {} .", + "Graffiti of the {} .", + "A toy. {}", + "I'm in the middle of my {} .", + "A photo of a cool {} .", + "a photo of a small {} .", + "a tattoo of the {} ." + ], + "HE": [ + "תמונה גרועה של {} .", + "תמונה של הרבה {} .", + "פסל של {} .", + "תמונה של קשה לראות {} .", + "תמונה ברזולוציה נמוכה של {} .", + "הגדרת של {} .", + "גרפיטי של {} .", + "תמונה גרועה של {} .", + "תמונה ממוזגת של {} .", + "קעקוע של {} .", + " {} הג'ימייק", + "תמונה של קשה לראות {} .", + "תמונה בהירה של {} .", + "תמונה של {} נקי.", + "תמונה של {} מלוכלך.", + "תמונה חשוכה של {} .", + "ציור של {} .", + "תמונה של {} ", + "הפלסטיק {} .", + "תמונה של {} מגניב.", + "תמונה של {} .", + "תמונה בשחור לבן של {} .", + "ציור של {} .", + "ציור של {} .", + "תמונה של {} .", + "פסל של ה- {} .", + "תמונה בהירה של ה- {} .", + "תמונה מצטמצמת של {} .", + " {} פלסטיק.", + "תמונה של {} ", + "תמונה פג מופחתת של {} .", + "תמונה מטושטשת של {} .", + "תמונה של ה- {} .", + "תמונה טובה של {} .", + "הגדרת של {} .", + " {} במשחק וידאו.", + "תמונה של אחד. {}", + "דוגל של {} .", + "תמונה של {} .", + "תמונה של {} .", + "האוריגמי. {}", + "את {} במשחק וידאו.", + "סקיצה של {} .", + "תרגום של {} .", + "אוריגמי. {}", + "תמונה ברזולוציה נמוכה של {} .", + "הצעצוע. {}", + "תרגום של {} .", + "תמונה של {} הנקייה.", + "תמונה של {} גדול.", + "תרגום של {} .", + "תמונה של {} ", + "תמונה של {} מוזר.", + "תמונה מטושטשת של {} .", + " {} סרט מצויר.", + "אמנות של {} .", + "סקיצה של {} .", + " {} ג'ימייק", + "תמונה של {} .", + "איטפ של {} .", + "תמונה פג מופחתת של {} .", + "תמונה טובה של {} .", + " {} ", + "תמונה של {} הנחמד.", + "תמונה של ה- {} הקטן.", + "תמונה של {} מוזר.", + " {} הקריקטורה.", + "אמנות של {} .", + "ציור של {} .", + "תמונה של {} גדול.", + "תמונה בשחור לבן של {} .", + "החרא הזה. {}", + "תמונה חשוכה של {} .", + "איטפ של {} .", + "גרפיטי של {} .", + "צעצוע. {}", + " {} Itap של שלי.", + "תמונה של מגניב {} .", + "תמונה של {} קטן.", + "קעקוע של ה- {} ." + ], + "AS": [ + "এটা {} ৰ এটা বেয়া ফটো।", + "বহুতো {} ৰ ফটো।", + "এটা {} ৰ মূৰ্তি।", + "দেখা কঠিন {} ৰ এখন ফটো।", + " {} ৰ এটা নিম্ন সংজ্ঞাযুক্ত ফটো।", + " {} ৰ অনুবাদ", + "এটা {} ৰ গ্ৰাফিতি।", + " {} ", + " {} ৰ এটা চিত্ৰ চপোৱা", + "এটা {} ৰ ট্যাটু।", + "কটা {} ", + "এটা কঠিন দেখা পোৱা {} ছবি।", + "এটা উজ্জ্বল ছবি {} .", + "এটা শুদ্ধ {} ৰ ফটো।", + "এটা লম্পট {} ৰ ফটো।", + " {} ৰ এটা আন্ধাৰ ফটো।", + " {} ৰ অংকন", + "মোৰ {} ৰ এখন ফটো।", + "প্লাষ্টিক {} .", + "শীতল {} ৰ এখন ফটো।", + " {} ৰ এটা কলো-আপ ফটো", + " {} ৰ এটা ব্লেক এণ্ড হোৱাইট ফটো।", + " {} ৰ এখন ছবি।", + " {} ৰ ছবি", + " {} ৰ এটা পিক্সেলযুক্ত ফটো", + " {} ৰ এটা মূৰ্তি", + " {} ৰ এটা উজ্জ্বল ফটো।", + " {} ৰ এটা ক্ৰমিত ফটো", + "প্লাষ্টিকৰ {} .", + " {} এখন ছবিৰ লম্পট", + " {} ৰ এটা jpeg বিকৃত ফটো", + " {} ৰ এটা ধূসৰ ফটো।", + " {} ৰ এখন ফটো।", + " {} ", + " {} ৰ এটা ৰূপান্তৰ।", + "এটা ভিডিঅ' গেমত এটা {} ", + "এটা {} ৰ ফটো।", + "এটা {} ৰ ডুডল।", + " {} ৰ এটা কলো-আপ ফটো।", + "এটা {} ৰ ফটো", + "অৰিগামি {} .", + "ভিডিঅ' গেমত {} ", + " {} ৰ স্কেচ", + " {} ৰ এটা ডুডল।", + "এটা অৰিগামি {} .", + " {} ৰ নিম্ন সংজ্ঞাযুক্ত ফটো", + "খেলনাটো {} .", + " {} ৰ এটা ৰূপান্তৰ।", + "পৰিষ্কাৰ {} ৰ এখন ফটো।", + "এটা ডাঙৰ {} ৰ ফটো", + " {} ৰ এটা ৰূপান্তৰ।", + "এটা সুন্দৰ {} ৰ ফটো", + "এটা অদ্ভুত {} ৰ ফটো।", + "এটা {} ৰ এটা ধূসৰ ফটো।", + "কাৰ্টুন {} .", + " {} ", + " {} ৰ স্কেচ", + "কটা {} ", + " {} ৰ এটা পিক্সেলযুক্ত ফটো", + " {} ৰ আইটেপ", + " {} ৰ এটা jpeg বিকৃত ফটো", + "এটা ভাল ফটো এখনৰ {} ", + "এটা প্লিচী {} ।", + "সুন্দৰ {} ৰ এখন ফটো।", + "সৰু {} ৰ এখন ফটো।", + "এটা ছবিৰ অদ্ভুত {} .", + "কাৰ্টুন {} .", + " {} ৰ কলা।", + " {} ৰ অংকন", + "বৃহৎ {} ৰ এখন ফটো।", + "এটা {} ৰ এটা ব্লেক এণ্ড হোৱাইট ফটো।", + "প্লিচী {} ", + "এটা {} ৰ এটা অন্ধকাৰ ফটো।", + "a {} ৰ এটা স্তৰ", + " {} ৰ গ্ৰাফিতি।", + "এটা খেলনা {} ", + "মোৰ {} ৰ এটা অংশ।", + "এটা কুল {} ৰ ফটো।", + "এটা সৰু {} ৰ ফটো", + " {} ৰ এটা টেম্পু।" + ], + "XH": [ + "ifoto embi ye {} .", + "ifoto ye- {} ezininzi.", + "umfanekiso oqingqiweyo we {} .", + "ifoto yomntu onzima ukubona {} .", + "ifoto yesisombululo esisezantsi se {} .", + "ukuguqulelwa kwe {} .", + "amagqabi omfanekiso we {} .", + "ifoto embi ye {} .", + "ifoto esikiweyo ye {} .", + "I tattoo ye {} .", + " {} ebhalwe ngemibala.", + "ifoto yomntu onzima ukuyibona {} .", + "ifoto eqaqambileyo ye {} .", + "ifoto ye- {} ecocekileyo.", + "ifoto yomntu ongcolileyo. {}", + "ifoto emnyama ye {} .", + "umzobo we {} .", + "ifoto yam {} .", + "iplastiki {} .", + "ifoto yomntu opholileyo {} .", + "ifoto esondeleyo ye {} .", + "ifoto emnyama namhlophe ye {} .", + "umzobo we {} .", + "umzobo we {} .", + "ifoto ye-pixel ye- {} .", + "umfanekiso oqingqiweyo we {} .", + "ifoto eqaqambileyo ye {} .", + "ifoto esikiweyo ye {} .", + "iplastiki {} .", + "ifoto ye- {} emdaka.", + "ifoto ye-jpeg eyonakeleyo ye- {} .", + "ifoto engacacanga ye {} .", + "ifoto ye {} .", + "ifoto entle ye {} .", + "ukuguqulelwa kwe {} .", + " {} kumdlalo wevidiyo.", + "ifoto yomnye {} .", + "umzobo we- {} .", + "ifoto esondeleyo ye {} .", + "ifoto ye {} .", + "i-origami {} .", + " {} kumdlalo wevidiyo.", + "umzobo we {} .", + "umzobo we {} .", + "i-origami {} .", + "ifoto yesisombululo esisezantsi se {} .", + "ithoyi {} .", + "ukuguqulelwa kwe {} .", + "ifoto ye- {} ecocekileyo.", + "ifoto ye {} enkulu.", + "ukuguqulelwa kwe {} .", + "ifoto yomntu omhle. {}", + "ifoto yomntu ongaqhelekanga. {}", + "ifoto engacacanga ye {} .", + "umzobo weqonga {} .", + " {} .", + "umzobo we {} .", + " {} ehonjisiweyo.", + "ifoto ye-pixel ye- {} .", + "I-itap ye {} .", + "ifoto ye-jpeg eyonakeleyo ye- {} .", + "ifoto entle ye {} .", + "iplushie {} .", + "ifoto ye- {} entle.", + "ifoto ye- {} encinane.", + "ifoto ye-b {} engaqhelekanga.", + "umboniso weqonga {} .", + " {} .", + "umzobo we {} .", + "ifoto ye {} enkulu.", + "ifoto emnyama namhlophe ye {} .", + "iplushie {} .", + "ifoto emnyama ye {} .", + "isampulu ye {} .", + "amagqabi omfanekiso we {} .", + "into yokudlala {} .", + "I-itap ye {} . yam", + "ifoto yomntu obandayo. {}", + "ifoto ye- {} encinane.", + "I-tattoo ye- {} ." + ], + "HA": [ + "hoto mara kyau na {} .", + "hoton mutane da yawa {} .", + "wani sassaka na {} .", + "hoton da wuya a gani {} .", + "hoton ƙananan ƙuduri na {} .", + "wani sakewa na {} .", + "zane-zane na {} .", + "hoto mara kyau na {} .", + "a yanka hoto na {} .", + "wani zane na {} .", + "da aka saka {} .", + "hoton da ba a iya gani ba {} .", + "hoto mai haske na {} .", + "hoton mai tsabta {} .", + "hoton wani datti {} .", + "hoton duhu na {} .", + "zane na {} .", + "hoton na {} .", + "da filastik {} .", + "hoton hoton {} .", + "hoton hoto na {} .", + "hoton baki da fari na {} .", + "wani zane na {} .", + "wani zane na {} .", + "wani pixelated photo na {} .", + "wani sassaka na {} .", + "hoton hoto mai haske na {} .", + "wani yanke hoto na {} .", + "wani filastik {} .", + "hoton datti {} .", + "hoton jpeg da aka lalata na {} .", + "hoto mara kyau na {} .", + "hoton {} .", + "hoto mai kyau na {} .", + "wani sakewa na {} .", + " {} a cikin wasan bidiyo.", + "hoton daya {} .", + "wani zane na {} .", + "hoton hoto na {} .", + "hoton {} .", + "da kuma origami {} .", + " {} a cikin wani video game.", + "wani zane na {} .", + "wani zane na {} .", + "wani origami {} .", + "hoton ƙananan ƙuduri na {} .", + "abin wasan {} .", + "wani fassarar {} .", + "hoton mai tsabta {} .", + "hoton babban {} .", + "wani fassarar {} .", + "hoton wani kyakkyawa {} .", + "hoton wani baƙon {} .", + "hoto mai ban mamaki na {} .", + "wani zane mai ban dariya {} .", + "a cikin {} .", + "wani zane na {} .", + "mai ƙwanƙwasa {} .", + "hoton pixelated na {} .", + "da kuma {} .", + "wani jpeg lalace photo na {} .", + "hoto mai kyau na {} .", + "wani mai tsalle-tsalle {} .", + "hoton mai kyau {} .", + "hoton ƙananan {} .", + "hoton ban mamaki {} .", + "hoton zane mai ban dariya {} .", + "a cikin {} .", + "zane na {} .", + "hoto na babban {} .", + "hoton baki da fari na {} .", + "da furen {} .", + "hoton duhu na {} .", + "da kuma {} .", + "zane-zane na {} .", + "wani abin wasa {} .", + "Itap na {} ", + "hoton wani mai kyau {} .", + "hoton wani karamin {} .", + "wani zane na {} ." + ], + "BE": [ + "дрэннае фота з {} .", + "фота многіх {} .", + "скульптура {} .", + "фатаграфія цяжка бачыць {} .", + "фотаздымка з нізкім дазволам {} .", + "пераклад {} .", + "Графіці з {} .", + "дрэннае фота з {} .", + "абрэзаная фота {} .", + "татуіроўка з {} .", + "вышытыя {} .", + "фатаграфія цяжка бачыць {} .", + "яркае фота {} .", + "фота чыстай {} .", + "фота бруднага {} .", + "цёмнае фота {} .", + "малюнак {} .", + "фота маёй {} .", + "Пластыкавы {} .", + "фота файны {} .", + "блізкае фота {} .", + "чорна-белая фатаграфія {} .", + "карціна {} .", + "карціна {} .", + "пікселяваная фота {} .", + "скульптура {} .", + "яркае фота {} .", + "абрэзаная фатаграфія {} .", + "Пластыкавы {} .", + "фота бруднага {} .", + "jpeg пашкоджаны фота {} .", + "размытае фота {} .", + "фота {} .", + "добрае фота з {} .", + "пераклад {} .", + " {} у відэагульні.", + "фатаграфія аднаго {} .", + "малюнак з {} .", + "блізкае фота {} .", + "фота {} .", + "Арыгамі {} .", + " {} у відэагульні.", + "Нарыск {} .", + "малюнак з {} .", + "арыгамі {} .", + "фотаздымка з нізкім дазволам {} .", + "гульня {} .", + "пераклад {} .", + "фота чыстай {} .", + "фатаграфія вялікага {} .", + "пераклад {} .", + "фота прыгожага {} .", + "фота дзіўнага {} .", + "размытае фота {} .", + "Мультфільм {} .", + "мастацтва {} .", + "Нарыск {} .", + "вышытыя {} .", + "пікселяваная фота {} .", + "ітап з {} .", + "пашкоджанае фота jpeg {} .", + "добрае фота з {} .", + "плюшавы {} .", + "фота прыгожага {} .", + "фота маленькага {} .", + "фота дзіўнага {} .", + "Мультфільм {} .", + "мастацтва {} .", + "малюнак {} .", + "фатаграфія вялікага {} .", + "чорна-белая фатаграфія {} .", + "плюшавы {} .", + "цёмнае фота {} .", + "ітап ад {} .", + "Графіці з {} .", + "цацка {} .", + "Ітап маёй {} .", + "фота файны {} .", + "фатаграфія маленькага {} .", + "татуіроўка {} ." + ], + "RO": [ + "o poză proastă a unui {} .", + "o fotografie a multor {} .", + "o sculptură a {} .", + "o fotografie a celui greu de văzut {} .", + "o fotografie cu rezoluție scăzută a {} .", + "o redare a {} .", + "graffiti de un {} .", + "o poză proastă a {} .", + "o fotografie tăiată a {} .", + "un tatuaj cu un {} .", + " {} ", + "O fotografie a unui greu de văzut {} .", + "o fotografie luminoasă a {} .", + "o fotografie a unui {} curat.", + "o fotografie cu un {} murdar.", + "o fotografie întunecată a {} .", + "o desene cu {} .", + "o poză cu {} ", + "plasticul {} .", + "o fotografie a lui cool {} .", + "o fotografie de aproape a {} .", + "o fotografie alb-negru a {} .", + "un tablou al {} .", + "un tablou cu {} .", + "o fotografie pixelizată a {} .", + "o sculptură a {} .", + "o fotografie luminoasă a {} .", + "o fotografie tăiată a {} .", + "un {} .", + "o fotografie a {} murdar.", + "o fotografie jpeg corupt de un {} .", + "o fotografie neclară a {} .", + "o fotografie a {} .", + "o poză bună a lui {} .", + "o redare a {} .", + "Un {} într-un joc video.", + "o fotografie a unuia dintre {} .", + "un scrier de un {} .", + "o fotografie de aproape a {} .", + "o fotografie a unui {} .", + "origami {} .", + " {} într-un joc video.", + "o schiţă a {} .", + "un doodle de {} .", + "Un origami. {}", + "o fotografie cu rezoluție scăzută a {} .", + "jucăria. {}", + "o interpretare a {} .", + "o fotografie a curat {} .", + "o fotografie a unui mare {} .", + "o interpretare a {} .", + "o poză cu un {} drăguţ.", + "o poză cu un {} ciudat.", + "o fotografie neclară a {} .", + "un desen animat {} .", + "Arta unui {} ", + "o schiță a {} .", + "un {} brodat.", + "o fotografie pixelizată a {} .", + "Itap din {} .", + "o fotografie jpeg corupt de {} .", + "o poză bună a unui {} .", + "Un plushie {} .", + "o poză cu {} drăguţ.", + "o fotografie a micului {} .", + "o fotografie a {} ciudat.", + "desenul animat {} .", + "Arta de a {} .", + "o desene de {} .", + "o fotografie a {} mare.", + "o fotografie alb-negru a unui {} .", + " {} pluşie.", + "o fotografie întunecată a {} .", + "Itap de {} .", + "graffiti din {} .", + "O jucărie. {}", + "- Nu, nu, nu. {}", + "o fotografie a unui {} .", + "o fotografie cu un mic {} .", + "un tatuaj al {} ." + ], + "BS": [ + "Loša slika. {}", + "fotografija mnogih {} .", + "skulptura od {} .", + "Slika teško vidljive {} .", + "fotografija {} niske rezolucije.", + "prevod {} .", + "Grafiti od {} .", + "Loša slika. {}", + "obrezana slika {} .", + "tetovaža sa {} .", + "Brodiran {} .", + "Slika teško vidljive {} .", + "svjetlu fotografiju {} .", + "fotografija čiste {} .", + "fotografija prljavog {} .", + "tamna slika {} .", + "crtež {} .", + "Slika mog {} .", + "plastiku {} .", + "fotografiju kulog {} .", + "Priblizna slika {} .", + "crno-bijela slika {} .", + "slika {} .", + "slika {} .", + "Piksle foto {} .", + "skulptura {} .", + "Bliska slika {} .", + "obrezana slika {} .", + "plastični {} .", + "Slika prljavog {} .", + "JPEG pokvarena slika {} .", + "Nejasna slika {} .", + "fotografiju {} .", + "Dobar snimak {} .", + "prevod {} .", + " {} u video igri.", + "fotografija jednog {} .", + "-Čitanje \" {} \".", + "Priblizna slika {} .", + "fotografija {} .", + "origami {} .", + " {} u video igri.", + "skica {} .", + "Doodle od {} .", + "origami {} .", + "fotografija {} niske rezolucije.", + "igračku. {}", + "prevod {} .", + "fotografiju čiste {} .", + "fotografija velikog {} .", + "Izvodnja {} .", + "Slika lijepog {} .", + "fotografija čudnog {} .", + "zamagljena slika {} .", + "crtić. {}", + "Ustanovljeno u {} .", + "skica {} .", + "sa vezanim {} .", + "Piksle foto {} .", + "i tap od {} .", + "JPEG pokvarena slika {} .", + "Dobar snimak {} .", + "-Izuzetno je lijepo. {}", + "Slika lijepog {} .", + "Slika malog {} .", + "fotografiju čudnog {} .", + "-Krijupci. {}", + "Umetnost {} .", + "crtež {} .", + "fotografija velikog {} .", + "crno-bijela slika {} .", + "-Plušavicu. {}", + "tamna slika {} .", + "-To je {} .", + "Grafiti iz {} .", + "igračka. {}", + "-Itap moje {} .", + "Slika cool {} .", + "Slika malog {} .", + "tetovaža s {} ." + ], + "VI": [ + "một bức ảnh xấu của một {} .", + "một bức ảnh của nhiều {} .", + "một tác phẩm điêu khắc của {} .", + "một bức ảnh của khó nhìn thấy {} .", + "một bức ảnh độ phân giải thấp của {} .", + "một bản render của {} .", + "hình vẽ của một {} .", + "một bức ảnh xấu của {} .", + "một bức ảnh cắt của {} .", + "một hình xăm của một {} .", + " {} Đồ đúc ", + "một bức ảnh của một khó nhìn thấy {} .", + "một bức ảnh sáng của {} .", + "một bức ảnh của một {} sạch.", + "Một bức ảnh của một {} người bẩn thỉu.", + "một bức ảnh tối của {} .", + "một bản vẽ của {} .", + "một bức ảnh của {} ", + "Vật liệu nhựa {} .", + "Một bức ảnh của cái lạnh {} .", + "một bức ảnh cận cảnh của {} .", + "một bức ảnh đen trắng của {} .", + "một bức tranh của {} .", + "một bức tranh của {} .", + "một bức ảnh được pixelate của {} .", + "một tác phẩm điêu khắc của {} .", + "một bức ảnh sáng của {} .", + "một bức ảnh cắt của {} .", + "một loại nhựa {} .", + "Một bức ảnh của {} Dirty.", + "một ảnh jpeg bị hỏng của {} .", + "một bức ảnh mờ của {} .", + "một bức ảnh của {} .", + "Một bức ảnh đẹp của {} .", + "một bản render của {} .", + "một {} trong một trò chơi điện tử.", + "một bức ảnh của một {} .", + "một hình vẽ của một {} .", + "một bức ảnh cận cảnh của {} .", + "một bức ảnh của {} .", + "origami {} .", + " {} trong một trò chơi điện tử.", + "một bản phác thảo của {} .", + "một hình vẽ của {} .", + " {} một origami.", + "một bức ảnh độ phân giải thấp của {} .", + " {} đồ chơi", + "một bản dịch của {} .", + "một bức ảnh của {} sạch.", + "một bức ảnh của một {} .", + "một bản dịch của {} .", + "một bức ảnh của một {} đẹp.", + "một bức ảnh của một {} kỳ lạ.", + "một bức ảnh mờ của {} .", + "một phim hoạt hình {} .", + "Nghệ thuật của {} .", + "một bản phác thảo của {} .", + "một {} thêu.", + "một bức ảnh pixelated của {} .", + "Itap của {} .", + "một ảnh jpeg bị hỏng của {} .", + "một bức ảnh tốt của một {} .", + " {} một đồ bông.", + "một bức ảnh của {} đẹp.", + "một bức ảnh của {} .", + "một bức ảnh của {} kỳ lạ.", + "phim hoạt hình {} .", + "Nghệ thuật của {} .", + "một bản vẽ của {} .", + "một bức ảnh của {} .", + "một bức ảnh đen trắng của {} .", + " {} ", + "một bức ảnh tối của {} .", + "Itap của {} .", + "graffiti của {} .", + " {} một đồ chơi.", + " {} ", + "Một bức ảnh của một {} cool.", + "một bức ảnh của một {} .", + "một hình xăm của {} ." + ], + "EL": [ + "Μια κακή φωτογραφία ενός {} .", + "Μια φωτογραφία πολλών {} .", + "ένα γλυπτό ενός {} .", + "μια φωτογραφία του δυσκολότερο να δει {} .", + "μια φωτογραφία χαμηλής ανάλυσης του {} .", + "μια αναπαραγωγή του {} .", + "Γκραφίτι ενός {} .", + "Μια κακή φωτογραφία του {} .", + "μια κομμένη φωτογραφία του {} .", + "ένα τατουάζ ενός {} .", + "το κεντημένο {} .", + "Μια φωτογραφία ενός δύσκολα ορατού {} .", + "μια φωτεινή φωτογραφία ενός {} .", + "μια φωτογραφία καθαρού {} .", + "Μια φωτογραφία με ένα βρώμικο {} .", + "μια σκούρα φωτογραφία του {} .", + "ένα σχέδιο της {} .", + "Μια φωτογραφία του {} μου.", + "το πλαστικό {} .", + "μια φωτογραφία του δροσερού {} .", + "μια κοντινή φωτογραφία ενός {} .", + "μια μαύρο-λευκή φωτογραφία του {} .", + "ένα πίνακα του {} .", + "ένα πίνακα ενός {} .", + "μια φωτογραφία με pixelation του {} .", + "ένα γλυπτό του {} .", + "μια φωτεινή φωτογραφία του {} .", + "μια κομμένη φωτογραφία ενός {} .", + "ένα πλαστικό {} .", + "Μια φωτογραφία του βρώμικου {} .", + "Μια jpeg διαφθαρμένη φωτογραφία ενός {} .", + "μια θολή φωτογραφία του {} .", + "μια φωτογραφία του {} .", + "μια καλή φωτογραφία του {} .", + "μια αναπαραγωγή του {} .", + "Ένα {} σε ένα βιντεοπαιχνίδι.", + "μια φωτογραφία ενός {} .", + "Ένα χαζομάρασμα ενός {} .", + "μια κοντινή φωτογραφία του {} .", + "μια φωτογραφία ενός {} .", + "Το όριγκαμι. {}", + "Το \" {} \" σε ένα βιντεοπαιχνίδι.", + "ένα σκίτσο της {} .", + "ένα doodle του {} .", + "Ένα όριγκαμι. {}", + "μια φωτογραφία χαμηλής ανάλυσης ενός {} .", + "Το παιχνίδι. {}", + "μια εκδοχή του {} .", + "μια φωτογραφία του καθαρού {} .", + "μια φωτογραφία ενός μεγάλου {} .", + "μια εκδοχή της {} .", + "Μια φωτογραφία με ένα ωραίο {} .", + "Μια φωτογραφία με ένα περίεργο {} .", + "μια θολή φωτογραφία ενός {} .", + "Ένα καρτούν. {}", + "Τέχνη ενός {} .", + "ένα σκίτσο του {} .", + "ένα κεντημένο {} .", + "μια φωτογραφία με pixelation ενός {} .", + "ιταπ του {} .", + "Μια jpeg διαφθαρμένη φωτογραφία του {} .", + "Μια καλή φωτογραφία ενός {} .", + "Ένα πλούσιο. {}", + "Μια φωτογραφία του ωραίου {} .", + "μια φωτογραφία του μικρού {} .", + "Μια φωτογραφία του περίεργου {} .", + "Το καρτούν. {}", + "Τεχνική του {} .", + "ένα σχέδιο του {} .", + "μια φωτογραφία του μεγάλου {} .", + "μια μαύρο-λευκή φωτογραφία ενός {} .", + "Το πλούσιο. {}", + "μια σκούρα φωτογραφία ενός {} .", + "ιταπ του {} .", + "Γκραφίτι του {} .", + "Ένα παιχνίδι. {}", + "Το νούμερο του {} μου.", + "Μια φωτογραφία από ένα ωραίο {} .", + "μια φωτογραφία ενός μικρού {} .", + "ένα τατουάζ του {} ." + ], + "UZ": [ + " {} ning yomon fotosurati.", + "ko'plab {} rasmlari.", + "a {} ning haykaltarosi.", + "ko'rinishida qiyin bo'lgan {} .", + " {} ning past aniqlikdagi fotosurati.", + " {} ning koʻrinishi.", + " {} graffitilar.", + " {} ning yomon fotosurati.", + " {} ning kesilgan fotosurati.", + "bir {} ning tatuirovkasi.", + "tikilgan {} .", + "ko'rinishida qiyin bo'lgan {} .", + "a {} ning yorqin fotosurati.", + "toza {} ning fotosurati.", + "iflos {} ning fotosurati.", + " {} ning qorong'i fotosurati.", + " {} chizmasi.", + "mening {} fotosuratini.", + "plastik {} .", + "chiroyli {} ning fotosurati.", + " {} ning yaqin fotosurati.", + " {} ning qora va oq fotosurati.", + " {} ning rasmini.", + " {} rasmini.", + " {} ning piksellangan fotosurati.", + " {} ning haykaltarosi.", + " {} ning yorqin fotosurati.", + " {} ning kesilgan fotosurati.", + "plastik {} .", + "iflos {} rasmini.", + " {} ning jpeg bilan buzilgan fotosurati.", + " {} ning bulg'ang fotosurati.", + " {} ning fotosurati.", + " {} ning yaxshi fotosurati.", + " {} ning koʻrinishi.", + "a {} video o'yinida.", + "bir {} fotosurati.", + "bir {} ning qiroli.", + " {} ning yaqin fotosurati.", + " {} ning fotosurati.", + "origami {} .", + "video o'yinidagi {} ", + " {} ning chizmasi.", + " {} ning chizmasi.", + "origami {} .", + " {} ning past aniqlikdagi fotosurati.", + "o'yinchoq {} .", + " {} ning tarjima qilinganligi.", + "toza {} ning fotosurati.", + "katta {} ning fotosurati.", + " {} ning tarjima qilinishi.", + "chiroyli {} ning fotosurati.", + "g'alati {} ning fotosurati.", + " {} ning bulg'ang fotosurati.", + "rasmli film {} .", + " {} sanasi", + " {} ning chizmasi.", + "tikilgan {} .", + " {} ning piksellangan fotosurati.", + " {} ning itap.", + " {} ning jpeg bilan buzilgan fotosurati.", + "a {} ning yaxshi fotosurati.", + "koʻkrakli {} .", + "chiroyli {} ning fotosurati.", + "kichik {} ning fotosurati.", + "g'alati {} ning fotosurati.", + "rasmli film {} .", + " {} sanasi ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~", + " {} chizmasi", + "katta {} ning fotosurati.", + " {} ning qora va oq fotosurati.", + "koʻkrakli {} .", + "a {} ning qorong'i fotosurati.", + "a {} ning itap.", + " {} graffitilar.", + "o'yinchoq {} .", + "mening {} .", + "chiroyli {} ning fotosurati.", + "kichik {} ning fotosurati.", + " {} ning tatuirovkasi." + ], + "GA": [ + "pictiúr dona de {} .", + "grianghraf de go leor {} .", + "dealbh de {} .", + "grianghraf den rud atá deacair a fheiceáil {} .", + "grianghraf íseal-réiteach den {} .", + "a rendering of {} .", + "graffiti de {} .", + "pictiúr dona den {} .", + "grianghraf ghearrte den {} .", + "tatú de {} .", + "an {} a bhfuil an t-airgead a scuabadh.", + "grianghraf de deacair a fheiceáil {} .", + "grianghraf geal de {} .", + "grianghraf de {} glan.", + "grianghraf de dúr {} .", + "grianghraf dorcha den {} .", + "líníocht de {} .", + "grianghraf de mo {} .", + "an plaisteach {} .", + "grianghraf den {} fionnuar.", + "grianghraf mór-chlúdach de {} .", + "grianghraf dubh agus bán den {} .", + "pictiúr den {} .", + "pictiúr de {} .", + "pictiúr pionsaithe den {} .", + "scúlpúr den {} .", + "grianghraf geal den {} .", + "grianghraf ghearrte de {} .", + " {} plaisteach.", + "grianghraf an salach {} .", + "pictiúr jpeg truaillithe de {} .", + "grianghraf damhsa den {} .", + "grianghraf den {} .", + "grianghraf maith den {} .", + "an {} . a léiriú.", + " {} i gcluiche físeáin.", + "grianghraf de cheann {} .", + "scriotáil de {} .", + "grianghraf mór-chlúdach den {} .", + "grianghraf de {} .", + "an origami {} .", + " {} i gcluiche físeáin.", + "an t-ealaín de {} .", + "scriotáil an {} .", + "origami {} .", + "grianghraf íseal-réiteach de {} .", + "an bréagán {} .", + "an t-athrú ar {} .", + "grianghraf den glan {} .", + "grianghraf de {} mór.", + "an léiriú ar {} .", + "grianghraf de nice {} .", + "grianghraf de c weird {} .", + "grianghraf damhsa de {} .", + "cartún {} .", + "an t-eagraíocht a {} .", + "an t-ealaín de {} .", + " {} a bhfuil an t-athdhéanamh déanta air.", + "pictiúr pixeláilte de {} .", + "iap an {} .", + "pictiúr jpeg truaillithe an {} .", + "grianghraf maith de {} .", + "plushie {} .", + "grianghraf den nice {} .", + "grianghraf den {} .", + "grianghraf an weird {} .", + "an charthanacht {} .", + "an {} ", + "líníocht den {} .", + "grianghraf den {} mór.", + "grianghraf dubh agus bán de {} .", + "an plushie {} .", + "grianghraf dorcha de {} .", + "iap de {} .", + "graffiti an {} .", + "bréagán {} .", + "Táim ag iarraidh mo {} .", + "grianghraf de cool {} .", + "grianghraf de {} .", + "tatú an {} ." + ], + "AM": [ + "የ {} መጥፎ ፎቶ።", + " {} የብዙዎቹ ፎቶ።", + "የ {} ቅርጽ ያለው ቅርጽ።", + " {} ለማየት አስቸጋሪ የሆነ ፎቶ።", + "የ {} ፎቶ ዝቅተኛ ጥራት ያለው ፎቶ።", + "የ {} ትርጓሜ", + "የ {} ግራፊቲ።", + "የ {} መጥፎ ፎቶ።", + "የ {} የተቆረጠ ፎቶ።", + "የ {} ንቅሳት።", + "የተለጠፈውን {} .", + " {} ለመመልከት አስቸጋሪ የሆነ ፎቶ።", + "የ {} ደማቅ ፎቶ።", + "የንጹህ {} ፎቶ።", + " {} የቆሸሸ ፎቶ።", + "የ {} ጥቁር ፎቶ።", + "የ {} ስዕል", + "የኔ ፎቶ {}", + "ፕላስቲክ {} .", + "የኮል ፎቶ። {}", + "የ {} የቅርብ ፎቶ።", + "የ {} ጥቁር ነጭ ፎቶ።", + "የ {} ሥዕል", + "የ {} ሥዕል", + "የ {} ፒክስል የተደረገለት ፎቶ።", + "የ {} ቅርጽ", + "የ {} ብርሃናዊ ፎቶ።", + "የ {} የተቆረጠ ፎቶ።", + "የፕላስቲክ {} .", + "የ {} Dirty ፎቶ።", + "የ {} የተበላሸ የ jpeg ፎቶ።", + "የ {} የጠቆመ ፎቶ።", + "የ {} . ፎቶግራፍ", + "የ {} ጥሩ ፎቶ።", + "የ {} ትርጓሜ", + "በቪዲዮ ጨዋታ ውስጥ {} ", + "የአንድ {} ፎቶ።", + "የ {} አንድ ስዕል።", + "የ {} የቅርብ ፎቶ።", + "የ {} . ፎቶግራፍ", + "ኦሪጋሚ {} ።", + "በቪዲዮ ጨዋታ ውስጥ ያለው {} ", + "የ {} ንድፍ።", + "የ {} ን ቅጅ።", + "ኦሪጋሚ {}", + "የ {} ፎቶ ዝቅተኛ ጥራት ያለው ፎቶ።", + "መጫወቻውን {} .", + "የ {} ትርጓሜ", + "የንጹህ {} ፎቶ።", + "ትልቅ {} ፎቶ።", + "የ {} ትርጓሜ", + " {} የደስ ደስ ያለ ፎቶ።", + "አንድ እንግዳ የሆነ ፎቶ። {}", + "የ {} ደብዛዛ ፎቶ።", + "የካርቱን ፊልም {} .", + "የ {} .", + "የ {} ንድፍ።", + "የተለጠፈ {} .", + "የ {} ፒክስል የተደረገለት ፎቶ።", + "የ {} አይፓፕ", + "የ {} የተበላሸ የ jpeg ፎቶ።", + "ጥሩ የ {} ፎቶ።", + " {} የፕላሽዬ", + "የደስ ደስ የሚል {} ፎቶ።", + "የትንሹን {} . ፎቶግራፍ", + "የጭራቅ {} ፎቶ።", + "የካርቱን ፊልም {} .", + "የ {} የሥነ ጥበብ.", + "የ {} ስዕል", + "የዋናው {} ፎቶ።", + "የ {} ጥቁር ነጭ ፎቶ።", + "የፕላሽዬው {} .", + "የ {} ጥቁር ፎቶ።", + "የ {} .", + "የ {} ግራፊቲዎች።", + " {} መጫወቻ።", + "የኔን {} .", + "አሪፍ የሆነ {} ፎቶ።", + "የትንሽ {} ፎቶ።", + "የ {} ን ንቅሳት።" + ], + "SR": [ + "лоша фотографија {} .", + "фотографија многих {} .", + "скулптура од {} .", + "фотографија тешко видљивог {} .", + "фотографија са ниском резолуцијом {} .", + "превод {} .", + "графити од {} .", + "лоша фотографија {} .", + "резана фотографија {} .", + "тетоважа од {} .", + "са вештачком {} .", + "фотографија тешко видљиве {} .", + "сјајна фотографија {} .", + "фотографија чисте {} .", + "фотографија прљавог {} .", + "тамна фотографија {} .", + "цртеж од {} .", + "фотографију моје {} .", + "пластична {} .", + "фотографија хладног {} .", + "фотоскопа са {} .", + "црно-бела фотографија {} .", + "слика {} .", + "слика од {} .", + "пикселизована фотографија {} .", + "скулптура {} .", + "сјајна фотографија {} .", + "резана фотографија {} .", + "пластична {} .", + "фотографија прљавог {} .", + "jpeg оштећена фотографија {} .", + "нејасна фотографија {} .", + "фотографија {} .", + "добра фотографија {} .", + "превод {} .", + " {} у видео игри.", + "фотографија једног {} .", + "црцање у {} .", + "фотоскопа са {} .", + "фотографија {} .", + "Оригами {} .", + " {} у видео игри.", + "скица {} .", + "црцање на {} .", + "Оригами {} .", + "фотографија са ниском резолуцијом {} .", + "играчка {} .", + "превод {} .", + "фотографија чисте {} .", + "фотографија великог {} .", + "превод од {} .", + "слика лепе {} .", + "фотографија чудног {} .", + "нејасна фотографија {} .", + "црикутер {} .", + "у {} .", + "скица {} .", + "са вештачком {} .", + "пикселизована фотографија {} .", + "Итап од {} .", + "jpeg оштећена фотографија {} .", + "добра фотографија {} .", + "Плушије {} .", + "фотографију лепег {} .", + "фотографија мале {} .", + "фотографија чудног {} .", + " {} цртани .", + "уметност {} .", + "цртеж {} .", + "фотографија великог {} .", + "црно-бела фотографија {} .", + "Плушије {} .", + "тамна фотографија {} .", + "Итап од {} .", + "графити из {} .", + "играчка. {}", + "Итап од мојих {} .", + "фотографија хладне {} .", + "фотографија мале {} .", + "тетоважа {} ." + ], + "KN": [ + "ಒಂದು {} ನ ಕೆಟ್ಟ ಫೋಟೋ.", + "ಅನೇಕ {} . ಒಂದು ಫೋಟೋ", + "ಒಂದು ಶಿಲ್ಪದ ಒಂದು {} .", + " {} ನೋಡಲು ಕಷ್ಟದ ಫೋಟೋ.", + " {} ನ ಕಡಿಮೆ ರೆಸಲ್ಯೂಶನ್ ಫೋಟೋ.", + " {} ನ ಒಂದು ಅನುವಾದ.", + "ಗೀಚುಬರಹದ ಒಂದು {} .", + "ಒಂದು ಕೆಟ್ಟ ಫೋಟೋ {} .", + " {} . ನ ಕ್ರಾಪ್ ಮಾಡಲಾದ ಫೋಟೋ", + "ಒಂದು {} .", + "ಕಸೂತಿ ಮಾಡಲಾದ {} .", + "ಒಂದು ಫೋಟೋವನ್ನು ನೋಡಲು ಕಷ್ಟ {} .", + "ಒಂದು {} . ನ ಪ್ರಕಾಶಮಾನವಾದ ಫೋಟೋ", + "ಒಂದು ಶುದ್ಧ {} .", + "ಒಂದು ಕೊಳಕು {} .", + " {} . ನ ಕಪ್ಪು ಫೋಟೋ", + " {} ನ ಒಂದು ರೇಖಾಚಿತ್ರ.", + "ನನ್ನ {} ", + "ಪ್ಲಾಸ್ಟಿಕ್ {} .", + "ತಂಪಾದ {} . ಒಂದು ಫೋಟೋ", + " {} . ನ ಒಂದು ಕ್ಲೋಸ್ ಅಪ್ ಫೋಟೋ", + " {} . ನ ಕಪ್ಪು ಮತ್ತು ಬಿಳಿ ಫೋಟೋ", + " {} . ನ ಒಂದು ಚಿತ್ರಕಲೆ", + "ಒಂದು {} .", + " {} ನ ಪಿಕ್ಸೆಲೇಟೆಡ್ ಫೋಟೋ", + " {} ನ ಶಿಲ್ಪ.", + " {} . ನ ಒಂದು ಪ್ರಕಾಶಮಾನವಾದ ಫೋಟೋ", + " {} . ನ ಕ್ರಾಪ್ ಮಾಡಲಾದ ಫೋಟೋ", + "ಪ್ಲಾಸ್ಟಿಕ್ {} .", + "ಒಂದು ಫೋಟೋವನ್ನು ಕೊಳಕು {} .", + " {} ನ jpeg ಭ್ರಷ್ಟ ಫೋಟೋ.", + " {} . ನ ಮಸುಕಾದ ಫೋಟೋ", + " {} . ನ ಒಂದು ಫೋಟೋ", + "ಒಂದು ಉತ್ತಮ ಫೋಟೋ {} .", + " {} ನ ಒಂದು ಅನುವಾದ.", + "ವಿಡಿಯೋ ಗೇಮ್ ನಲ್ಲಿ {} ", + "ಒಂದು ಛಾಯಾಚಿತ್ರವನ್ನು {} .", + "ಒಂದು {} ನ ಡೂಡ್ಲ್.", + " {} . ನ ಒಂದು ಕ್ಲೋಸ್ ಅಪ್ ಫೋಟೋ", + "ಒಂದು {} .", + "ಒರಿಗಮಿ {} .", + "ವಿಡಿಯೋ ಗೇಮ್ ನಲ್ಲಿ {} ", + " {} . ನ ಒಂದು ರೇಖಾಚಿತ್ರ.", + "ಒಂದು ಡೂಡ್ಲ್ ಆಫ್ ದಿ {} .", + "ಒಂದು ಒರಿಗಮಿ {} .", + " {} ನ ಕಡಿಮೆ ರೆಸಲ್ಯೂಶನ್ ಫೋಟೋ.", + "ಆಟಿಕೆ {} .", + " {} ನ ಒಂದು ಅನುವಾದ.", + "ಶುದ್ಧ {} . ಒಂದು ಫೋಟೋ", + "ದೊಡ್ಡ {} . ಒಂದು ಫೋಟೋ", + " {} ನ ಒಂದು ಅನುವಾದ.", + "ಒಂದು ಸುಂದರ {} ಚಿತ್ರ.", + "ಒಂದು ವಿಚಿತ್ರ {} ಚಿತ್ರ.", + " {} . ನ ಮಸುಕಾದ ಫೋಟೋ", + "ಒಂದು ಕಾರ್ಟೂನ್ {} .", + "ಕಲೆ ಒಂದು {} .", + " {} . ನ ಒಂದು ರೇಖಾಚಿತ್ರ.", + "ಕಸೂತಿ ಮಾಡಲಾದ {} .", + " {} ನ ಪಿಕ್ಸೆಲೇಟೆಡ್ ಫೋಟೋ", + " {} ನ ಇಟ್ಯಾಪ್", + " {} ನ jpeg ಭ್ರಷ್ಟ ಫೋಟೋ.", + "ಒಂದು ಉತ್ತಮ ಫೋಟೋ {} .", + "ಒಂದು ಪ್ಲಶ್ಶೀ {} .", + "ಸುಂದರ {} . ಒಂದು ಫೋಟೋ.", + "ಸಣ್ಣ {} . ಒಂದು ಫೋಟೋ", + "ವಿಚಿತ್ರವಾದ {} . ಒಂದು ಫೋಟೋ", + "ಕಾರ್ಟೂನ್ {} .", + "ಕಲೆ {} .", + " {} ನ ಒಂದು ರೇಖಾಚಿತ್ರ.", + "ದೊಡ್ಡ {} . ನ ಫೋಟೋ", + " {} . ನ ಕಪ್ಪು ಮತ್ತು ಬಿಳಿ ಫೋಟೋ", + "ಪ್ಲಶ್ಶೀ {} .", + " {} . ನ ಕಪ್ಪು ಫೋಟೋ", + "ಒಂದು {} ನ ಇಟಾಪ್.", + " {} ನ ಗೀಚುಬರಹ.", + "ಒಂದು ಆಟಿಕೆ {} .", + "ನನ್ನ {} .", + "ಒಂದು ತಂಪಾದ {} . ಒಂದು ಫೋಟೋ", + "ಒಂದು ಸಣ್ಣ {} .", + " {} ನ ಒಂದು ಹಚ್ಚೆ." + ] +} \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/objectnet.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/objectnet.py new file mode 100644 index 0000000000000000000000000000000000000000..957726a943337b10a08d222ff3087eed5edf54b8 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/objectnet.py @@ -0,0 +1,76 @@ +""" +Code adapted from https://github.com/mlfoundations/wise-ft/blob/master/src/datasets/objectnet.py +Thanks to the authors of wise-ft +""" + +import os +import json +from pathlib import Path +import PIL + +import numpy as np + +import torch +from torchvision import datasets +from torchvision.transforms import Compose + +from pathlib import Path + +def get_metadata(folder): + metadata = Path(folder) + + with open(metadata / 'folder_to_objectnet_label.json', 'r') as f: + folder_map = json.load(f) + folder_map = {v: k for k, v in folder_map.items()} + with open(metadata / 'objectnet_to_imagenet_1k.json', 'r') as f: + objectnet_map = json.load(f) + + with open(metadata / 'pytorch_to_imagenet_2012_id.json', 'r') as f: + pytorch_map = json.load(f) + pytorch_map = {v: k for k, v in pytorch_map.items()} + + with open(metadata / 'imagenet_to_label_2012_v2', 'r') as f: + imagenet_map = {v.strip(): str(pytorch_map[i]) for i, v in enumerate(f)} + + folder_to_ids, class_sublist = {}, [] + classnames = [] + for objectnet_name, imagenet_names in objectnet_map.items(): + imagenet_names = imagenet_names.split('; ') + imagenet_ids = [int(imagenet_map[imagenet_name]) for imagenet_name in imagenet_names] + class_sublist.extend(imagenet_ids) + folder_to_ids[folder_map[objectnet_name]] = imagenet_ids + + class_sublist = sorted(class_sublist) + class_sublist_mask = [(i in class_sublist) for i in range(1000)] + classname_map = {v: k for k, v in folder_map.items()} + return class_sublist, class_sublist_mask, folder_to_ids, classname_map + +class ObjectNetDataset(datasets.ImageFolder): + + def __init__(self, root, transform): + (self._class_sublist, + self.class_sublist_mask, + self.folders_to_ids, + self.classname_map) = get_metadata(root) + subdir = os.path.join(root, "objectnet-1.0", "images") + label_map = {name: idx for idx, name in enumerate(sorted(list(self.folders_to_ids.keys())))} + self.label_map = label_map + super().__init__(subdir, transform=transform) + self.samples = [ + d for d in self.samples + if os.path.basename(os.path.dirname(d[0])) in self.label_map + ] + self.imgs = self.samples + self.classes = sorted(list(self.folders_to_ids.keys())) + self.classes = [self.classname_map[c].lower() for c in self.classes] + + def __len__(self): + return len(self.samples) + + def __getitem__(self, index): + path, target = self.samples[index] + sample = self.loader(path) + if self.transform is not None: + sample = self.transform(sample) + label = os.path.basename(os.path.dirname(path)) + return sample, self.label_map[label] \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/sugar_crepe.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/sugar_crepe.py new file mode 100644 index 0000000000000000000000000000000000000000..1e42554099f42619ffb40c302d3f7b53379c2ed9 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/sugar_crepe.py @@ -0,0 +1,24 @@ +import os +from torch.utils.data import Dataset +from PIL import Image +import json +class SugarCrepe(Dataset): + + def __init__(self, root, ann_file, transform=None): + self.root = root + self.ann = json.load(open(ann_file)) + self.transform = transform + self.idx_strings = list(self.ann.keys()) # NOTE : indices may be non-contiguous + + def __getitem__(self, idx): + idx_str = self.idx_strings[idx] + data = self.ann[idx_str] + img = Image.open(os.path.join(self.root, data['filename'])) + if self.transform is not None: + img = self.transform(img) + caption = data['caption'] + negative_caption = data['negative_caption'] + return img, [caption, negative_caption] + + def __len__(self): + return len(self.ann) \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/tfds.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/tfds.py new file mode 100644 index 0000000000000000000000000000000000000000..320776e9b011abc8fe8c505d17124eb8af412be2 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/tfds.py @@ -0,0 +1,48 @@ +import torch +from PIL import Image + + +def download_tfds_dataset(name, data_dir=None): + import tensorflow_datasets as tfds + import timm + builder = tfds.builder(name, data_dir=data_dir) + builder.download_and_prepare() + +def disable_gpus_on_tensorflow(): + import tensorflow as tf + tf.config.set_visible_devices([], 'GPU') + +class VTABIterableDataset(torch.utils.data.IterableDataset): + + def __init__(self, tfds_dataset, split="test", input_name="image", label_name="label", input_mode="RGB", transform=None, target_transform=None, classes=None): + self.tfds_dataset = tfds_dataset + self.input_name = input_name + self.label_name = label_name + self.transform = transform + self.target_transform = target_transform + self.input_mode = input_mode + self.num_examples = tfds_dataset.get_num_samples(split) + self.split = split + if classes is None: + self.classes = tfds_dataset._dataset_builder.info.features['label'].names + else: + self.classes = classes + def __iter__(self): + worker_info = torch.utils.data.get_worker_info() + iterator = self.tfds_dataset.get_tf_data(self.split, batch_size=1, epochs=1, for_eval=True) + if worker_info is not None: + iterator = iterator.shard(index=worker_info.id, num_shards=worker_info.num_workers) + nb = 0 + for data in iterator: + inputs = (data[self.input_name].numpy()) + labels = data[self.label_name].numpy() + for input, label in zip(inputs, labels): + input = Image.fromarray(input, mode=self.input_mode) + if self.transform is not None: + input = self.transform(input) + if self.target_transform is not None: + label = self.target_transform(label) + yield input, label + + def __len__(self): + return self.num_examples diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/voc2007.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/voc2007.py new file mode 100644 index 0000000000000000000000000000000000000000..8d2e4e01093d58f4e63169f5ee51b8238a7a9fc0 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/voc2007.py @@ -0,0 +1,248 @@ +# Code from https://github.com/SsnL/dataset-distillation/blob/master/datasets/pascal_voc.py , thanks to the authors +"""Dataset setting and data loader for PASCAL VOC 2007 as a classification task. + +Modified from +https://github.com/Cadene/pretrained-models.pytorch/blob/56aa8c921819d14fb36d7248ab71e191b37cb146/pretrainedmodels/datasets/voc.py +""" + +import os +import os.path +import tarfile +import xml.etree.ElementTree as ET + +import torch.utils.data as data +import torchvision +from PIL import Image +from urllib.parse import urlparse +import torch + +object_categories = ['aeroplane', 'bicycle', 'bird', 'boat', + 'bottle', 'bus', 'car', 'cat', 'chair', + 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', + 'sheep', 'sofa', 'train', 'tvmonitor'] + +category_to_idx = {c: i for i, c in enumerate(object_categories)} + +urls = { + 'devkit': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar', + 'trainval_2007': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar', + 'test_images_2007': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar', + 'test_anno_2007': 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtestnoimgs_06-Nov-2007.tar', +} + + +def download_url(url, path): + root, filename = os.path.split(path) + torchvision.datasets.utils.download_url(url, root=root, filename=filename, md5=None) + + +def download_voc2007(root): + path_devkit = os.path.join(root, 'VOCdevkit') + path_images = os.path.join(root, 'VOCdevkit', 'VOC2007', 'JPEGImages') + tmpdir = os.path.join(root, 'tmp') + + # create directory + if not os.path.exists(root): + os.makedirs(root) + + if not os.path.exists(path_devkit): + + if not os.path.exists(tmpdir): + os.makedirs(tmpdir) + + parts = urlparse(urls['devkit']) + filename = os.path.basename(parts.path) + cached_file = os.path.join(tmpdir, filename) + + if not os.path.exists(cached_file): + download_url(urls['devkit'], cached_file) + + # extract file + print('[dataset] Extracting tar file {file} to {path}'.format(file=cached_file, path=root)) + cwd = os.getcwd() + tar = tarfile.open(cached_file, "r") + os.chdir(root) + tar.extractall() + tar.close() + os.chdir(cwd) + print('[dataset] Done!') + + # train/val images/annotations + if not os.path.exists(path_images): + + # download train/val images/annotations + parts = urlparse(urls['trainval_2007']) + filename = os.path.basename(parts.path) + cached_file = os.path.join(tmpdir, filename) + + if not os.path.exists(cached_file): + download_url(urls['trainval_2007'], cached_file) + + # extract file + print('[dataset] Extracting tar file {file} to {path}'.format(file=cached_file, path=root)) + cwd = os.getcwd() + tar = tarfile.open(cached_file, "r") + os.chdir(root) + tar.extractall() + tar.close() + os.chdir(cwd) + print('[dataset] Done!') + + # test annotations + test_anno = os.path.join(path_devkit, 'VOC2007/ImageSets/Main/aeroplane_test.txt') + if not os.path.exists(test_anno): + + # download test annotations + parts = urlparse(urls['test_images_2007']) + filename = os.path.basename(parts.path) + cached_file = os.path.join(tmpdir, filename) + + if not os.path.exists(cached_file): + download_url(urls['test_images_2007'], cached_file) + + # extract file + print('[dataset] Extracting tar file {file} to {path}'.format(file=cached_file, path=root)) + cwd = os.getcwd() + tar = tarfile.open(cached_file, "r") + os.chdir(root) + tar.extractall() + tar.close() + os.chdir(cwd) + print('[dataset] Done!') + + # test images + test_image = os.path.join(path_devkit, 'VOC2007/JPEGImages/000001.jpg') + if not os.path.exists(test_image): + + # download test images + parts = urlparse(urls['test_anno_2007']) + filename = os.path.basename(parts.path) + cached_file = os.path.join(tmpdir, filename) + + if not os.path.exists(cached_file): + download_url(urls['test_anno_2007'], cached_file) + + # extract file + print('[dataset] Extracting tar file {file} to {path}'.format(file=cached_file, path=root)) + cwd = os.getcwd() + tar = tarfile.open(cached_file, "r") + os.chdir(root) + tar.extractall() + tar.close() + os.chdir(cwd) + print('[dataset] Done!') + + +def read_split(root, dataset, split): + base_path = os.path.join(root, 'VOCdevkit', dataset, 'ImageSets', 'Main') + filename = os.path.join(base_path, object_categories[0] + '_' + split + '.txt') + + with open(filename, 'r') as f: + paths = [] + for line in f.readlines(): + line = line.strip().split() + if len(line) > 0: + assert len(line) == 2 + paths.append(line[0]) + + return tuple(paths) + + +def read_bndbox(root, dataset, paths): + xml_base = os.path.join(root, 'VOCdevkit', dataset, 'Annotations') + instances = [] + for path in paths: + xml = ET.parse(os.path.join(xml_base, path + '.xml')) + for obj in xml.findall('object'): + c = obj[0] + assert c.tag == 'name', c.tag + c = category_to_idx[c.text] + bndbox = obj.find('bndbox') + xmin = int(bndbox[0].text) # left + ymin = int(bndbox[1].text) # top + xmax = int(bndbox[2].text) # right + ymax = int(bndbox[3].text) # bottom + instances.append((path, (xmin, ymin, xmax, ymax), c)) + return instances + + +class PASCALVoc2007(data.Dataset): + """ + Multi-label classification problem for voc2007 + labels are of one hot of shape (C,), denoting the presence/absence + of each class in each image, where C is the number of classes. + """ + def __init__(self, root, set, transform=None, download=False, target_transform=None): + self.root = root + self.path_devkit = os.path.join(root, 'VOCdevkit') + self.path_images = os.path.join(root, 'VOCdevkit', 'VOC2007', 'JPEGImages') + self.transform = transform + self.target_transform = target_transform + + # download dataset + if download: + download_voc2007(self.root) + + paths = read_split(self.root, 'VOC2007', set) + bndboxes = read_bndbox(self.root, 'VOC2007', paths) + labels = torch.zeros(len(paths), len(object_categories)) + path_index = {} + for i, p in enumerate(paths): + path_index[p] = i + for path, bbox, c in bndboxes: + labels[path_index[path], c] = 1 + self.labels = labels + self.classes = object_categories + self.paths = paths + + def __getitem__(self, index): + path = self.paths[index] + img = Image.open(os.path.join(self.path_images, path + '.jpg')).convert('RGB') + target = self.labels[index] + if self.transform is not None: + img = self.transform(img) + if self.target_transform is not None: + target = self.target_transform(target) + return img, target + + def __len__(self): + return len(self.paths) + +class PASCALVoc2007Cropped(data.Dataset): + """ + voc2007 is originally object detection and multi-label. + In this version, we just convert it to single-label per image classification + problem by looping over bounding boxes in the dataset and cropping the relevant + object. + """ + def __init__(self, root, set, transform=None, download=False, target_transform=None): + self.root = root + self.path_devkit = os.path.join(root, 'VOCdevkit') + self.path_images = os.path.join(root, 'VOCdevkit', 'VOC2007', 'JPEGImages') + self.transform = transform + self.target_transform = target_transform + + # download dataset + if download: + download_voc2007(self.root) + + paths = read_split(self.root, 'VOC2007', set) + self.bndboxes = read_bndbox(self.root, 'VOC2007', paths) + self.classes = object_categories + + print('[dataset] VOC 2007 classification set=%s number of classes=%d number of bndboxes=%d' % ( + set, len(self.classes), len(self.bndboxes))) + + def __getitem__(self, index): + path, crop, target = self.bndboxes[index] + img = Image.open(os.path.join(self.path_images, path + '.jpg')).convert('RGB') + img = img.crop(crop) + if self.transform is not None: + img = self.transform(img) + if self.target_transform is not None: + target = self.target_transform(target) + return img, target + + def __len__(self): + return len(self.bndboxes) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/winoground.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/winoground.py new file mode 100644 index 0000000000000000000000000000000000000000..b09661b8c06bac3421045f0d55d70856558c1980 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/winoground.py @@ -0,0 +1,30 @@ +import os +from torch.utils.data import Dataset +from PIL import Image +import torch +import json + +class WinoGround(Dataset): + + def __init__(self, root=".", transform=None): + from datasets import load_dataset + self.ds = load_dataset("facebook/winoground", cache_dir=root)["test"] + self.transform = transform + + def __getitem__(self, idx): + data = self.ds[idx] + img0 = data["image_0"] + img1 = data["image_1"] + cap0 = data["caption_0"] + cap1 = data["caption_1"] + if self.transform is not None: + img0 = self.transform(img0) + img1 = self.transform(img1) + imgs = torch.stack([img0, img1]) + else: + imgs = [img0, img1] + caps = [cap0, cap1] + return imgs, caps + + def __len__(self): + return len(self.ds) \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/xtd200.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/xtd200.py new file mode 100644 index 0000000000000000000000000000000000000000..935ac5a67539c7bffba6f0be527227af56a9c995 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/datasets/xtd200.py @@ -0,0 +1,119 @@ +import codecs +import json +import os +from subprocess import call + +import requests +from PIL import Image +from torchvision.datasets import VisionDataset + +from .flores_langs import flores_languages + +GITHUB_DATA_PATH = ( + "https://raw.githubusercontent.com/visheratin/nllb-clip/main/data/xtd200/" +) +SUPPORTED_LANGUAGES = flores_languages + +IMAGE_INDEX_FILENAME = "test_image_names.txt" + +CAPTIONS_FILENAME_TEMPLATE = "{}.txt" +OUTPUT_FILENAME_TEMPLATE = "xtd200-{}.json" + +IMAGES_DOWNLOAD_URL = "https://nllb-data.com/test/xtd10/images.tar.gz" + + +class XTD200(VisionDataset): + def __init__(self, root, ann_file, transform=None, target_transform=None): + super().__init__(root, transform=transform, target_transform=target_transform) + self.ann_file = os.path.expanduser(ann_file) + with codecs.open(ann_file, "r", encoding="utf-8") as fp: + data = json.load(fp) + self.data = [ + (img_path, txt) + for img_path, txt in zip(data["image_paths"], data["annotations"]) + ] + + def __getitem__(self, index): + img, captions = self.data[index] + + # Image + img = Image.open(img).convert("RGB") + if self.transform is not None: + img = self.transform(img) + + # Captions + target = [ + captions, + ] + if self.target_transform is not None: + target = self.target_transform(target) + + return img, target + + def __len__(self) -> int: + return len(self.data) + + +def _get_lines(url): + response = requests.get(url, timeout=30) + return response.text.splitlines() + + +def _download_images(out_path): + os.makedirs(out_path, exist_ok=True) + print("Downloading images") + call(f"wget {IMAGES_DOWNLOAD_URL} -O images.tar.gz", shell=True) + call(f"tar -xzf images.tar.gz -C {out_path}", shell=True) + call("rm images.tar.gz", shell=True) + + +def create_annotation_file(root, lang_code): + if lang_code not in SUPPORTED_LANGUAGES: + raise ValueError( + f"Language code {lang_code} not supported. Supported languages are {SUPPORTED_LANGUAGES}" + ) + data_dir = os.path.join(root, "xtd200") + if not os.path.exists(data_dir): + _download_images(data_dir) + images_dir = os.path.join(data_dir, "images") + print("Downloading xtd200 index file") + download_path = os.path.join(GITHUB_DATA_PATH, IMAGE_INDEX_FILENAME) + target_images = _get_lines(download_path) + + print("Downloading xtd200 captions:", lang_code) + captions_path = GITHUB_DATA_PATH + download_path = os.path.join( + captions_path, CAPTIONS_FILENAME_TEMPLATE.format(lang_code) + ) + target_captions = _get_lines(download_path) + + number_of_missing_images = 0 + valid_images, valid_annotations, valid_indicies = [], [], [] + for i, (img, txt) in enumerate(zip(target_images, target_captions)): + image_path = os.path.join(images_dir, img) + if not os.path.exists(image_path): + print("Missing image file", img) + number_of_missing_images += 1 + continue + + valid_images.append(image_path) + valid_annotations.append(txt) + valid_indicies.append(i) + + if number_of_missing_images > 0: + print(f"*** WARNING *** missing {number_of_missing_images} files.") + + with codecs.open( + os.path.join(root, OUTPUT_FILENAME_TEMPLATE.format(lang_code)), + "w", + encoding="utf-8", + ) as fp: + json.dump( + { + "image_paths": valid_images, + "annotations": valid_annotations, + "indicies": valid_indicies, + }, + fp, + ensure_ascii=False, + ) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/__init__.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/captioning.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/captioning.py new file mode 100644 index 0000000000000000000000000000000000000000..1e4c70b8556da5712dcf5718e687c0803bfd6113 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/captioning.py @@ -0,0 +1,99 @@ +import json +from open_clip import tokenize +from tqdm.auto import tqdm +from open_clip.tokenizer import _tokenizer + + +from pycocoevalcap.tokenizer.ptbtokenizer import PTBTokenizer +from pycocoevalcap.bleu.bleu import Bleu +from pycocoevalcap.meteor.meteor import Meteor +from pycocoevalcap.rouge.rouge import Rouge +from pycocoevalcap.cider.cider import Cider +from pycocoevalcap.spice.spice import Spice + + +""" +Code adapted from https://github.com/salaniz/pycocoevalcap/blob/master/eval.py +Thanks to @salaniz for the code! +""" +class COCOEvalCap: + def __init__(self, results): + self.evalImgs = [] + self.eval = {} + self.imgToEval = {} + self.results = results + def evaluate(self): + gts = {} + res = {} + for imgId, r in enumerate(self.results): + gts[imgId] = r['true'] + res[imgId] = r['gen'] + # ================================================= + # Set up scorers + # ================================================= + print('tokenization...') + tokenizer = PTBTokenizer() + gts = tokenizer.tokenize(gts) + res = tokenizer.tokenize(res) + + # ================================================= + # Set up scorers + # ================================================= + print('setting up scorers...') + scorers = [ + (Bleu(4), ["Bleu_1", "Bleu_2", "Bleu_3", "Bleu_4"]), + (Meteor(),"METEOR"), + (Rouge(), "ROUGE_L"), + (Cider(), "CIDEr"), + (Spice(), "SPICE") + ] + + # ================================================= + # Compute scores + # ================================================= + for scorer, method in scorers: + print('computing %s score...'%(scorer.method())) + score, scores = scorer.compute_score(gts, res) + if type(method) == list: + for sc, scs, m in zip(score, scores, method): + self.setEval(sc, m) + self.setImgToEvalImgs(scs, gts.keys(), m) + print("%s: %0.3f"%(m, sc)) + else: + self.setEval(score, method) + self.setImgToEvalImgs(scores, gts.keys(), method) + print("%s: %0.3f"%(method, score)) + self.setEvalImgs() + + def setEval(self, score, method): + self.eval[method] = score + + def setImgToEvalImgs(self, scores, imgIds, method): + for imgId, score in zip(imgIds, scores): + if not imgId in self.imgToEval: + self.imgToEval[imgId] = {} + self.imgToEval[imgId]["image_id"] = imgId + self.imgToEval[imgId][method] = score + + def setEvalImgs(self): + self.evalImgs = [eval for imgId, eval in self.imgToEval.items()] + +def evaluate(model, dataloader, batch_size, device, transform, train_dataloader=None, num_workers=None, amp=True, verbose=False): + results = [] + image_id = 0 + gt = [] + for idx, (img, captions) in enumerate(tqdm(dataloader)): + out = model.generate(img.to(device)) + decoded = [_tokenizer.decode(i).split("")[0].replace("", "").strip() for i in out.cpu().numpy()] + for pred, true in zip(decoded, captions): + true = [{'caption': t} for t in true] + pred = [{'caption': pred}] + results.append({"image_id":image_id, "gen":pred, "true": true}) + image_id += 1 + coco_eval = COCOEvalCap(results) + coco_eval.evaluate() + metrics = coco_eval.eval + # print output evaluation scores + for metric, score in metrics.items(): + print(f'{metric}: {score:.3f}') + return metrics diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/image_caption_selection.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/image_caption_selection.py new file mode 100644 index 0000000000000000000000000000000000000000..85b2eb3206843344ac14548efb97a453ac6d38b6 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/image_caption_selection.py @@ -0,0 +1,80 @@ +import logging +from contextlib import suppress + +import torch +import torch.nn.functional as F +from tqdm import tqdm + +def evaluate(model, dataloader, tokenizer, device, amp=True): + """ + Evaluate the model on the given dataset. + The task has N instances, each instance has I images and C captions. + For each instance, the goal is to find the correct image for each caption and the correct caption for each image. + This is done by computing the similarities between each image and each caption. + This procedure is used to evaluate the models on Winoground and SugarCrepe. + + Parameters + ---------- + + model: torch.nn,Module + CLIP-like model with `encode_image` and `encode_text` + + dataloader: torch.utils.data.Dataloader + dataloader to use for evaluation + + tokenizer: + text tokenizer, i.e. convert list of strings to torch.Tensor of integers + + device: cpu/cuda + + amp: whether to use automatic mixed precision + + Returns + ------- + + dict of accuracy metrics + """ + autocast = torch.cuda.amp.autocast if amp else suppress + image_score = [] + text_score = [] + score = [] + for batch_images, batch_texts in tqdm(dataloader): + if len(batch_images.shape) == 4: + B, C, H, W = batch_images.shape + batch_images = batch_images.view(B, 1, C, H, W) + # batch_images: B, nb_images_per_instance, C, H, W + # batch_texts: B, nb_captions_per_instance + + B, nim, C, H, W = batch_images.shape + nt = len(batch_texts[0]) + batch_images = batch_images.to(device) + batch_images_ = batch_images.view(B*nim, C, H, W) # B*nim, C, H, W + # tokenize all texts in the batch + batch_texts_tok_ = tokenizer([text for i, texts in enumerate(batch_texts) for text in texts]).to(device) + # compute the embedding of images and texts + with torch.no_grad(), autocast(): + batch_images_emb = F.normalize(model.encode_image(batch_images_), dim=-1).view(B, nim, -1) + batch_texts_emb = F.normalize(model.encode_text(batch_texts_tok_), dim=-1).view(B, nt, -1) + gt = torch.arange(min(nim, nt)).to(device) + for i in range(B): + # iteratve over instances + + # compute similarities between each image and each text + images_emb = batch_images_emb[i] + texts_emb = batch_texts_emb[i] + scores = images_emb @ texts_emb.t() + + # i-th image should be matched to the i-th text + image_closest_text = scores.argmax(dim=1)[:len(gt)] + text_closest_image = scores.argmax(dim=0)[:len(gt)] + pred_text_is_correct = (image_closest_text==gt).all().item() + pred_image_is_correct = (text_closest_image==gt).all().item() + all_correct = pred_text_is_correct and pred_image_is_correct + image_score.append(pred_image_is_correct) + text_score.append(pred_text_is_correct) + score.append(all_correct) + metrics = {} + metrics["image_acc"] = torch.Tensor(image_score).float().mean().item() + metrics["text_acc"] = torch.Tensor(text_score).float().mean().item() + metrics["acc"] = torch.Tensor(score).float().mean().item() + return metrics \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/linear_probe.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/linear_probe.py new file mode 100644 index 0000000000000000000000000000000000000000..ead75f097ab02a26bd19084370e0de585336bc08 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/linear_probe.py @@ -0,0 +1,307 @@ +import os +import time +from tqdm import tqdm +from contextlib import suppress +import torch +import torch.nn.functional as F +from torch.utils.data import Dataset, DataLoader, Sampler +import numpy as np +from .zeroshot_classification import accuracy + +from sklearn.metrics import classification_report, balanced_accuracy_score + +def assign_learning_rate(param_group, new_lr): + param_group["lr"] = new_lr + +def _warmup_lr(base_lr, warmup_length, step): + return base_lr * (step + 1) / warmup_length + +def cosine_lr(optimizer, base_lrs, warmup_length, steps): + if not isinstance(base_lrs, list): + base_lrs = [base_lrs for _ in optimizer.param_groups] + assert len(base_lrs) == len(optimizer.param_groups) + def _lr_adjuster(step): + for param_group, base_lr in zip(optimizer.param_groups, base_lrs): + if step < warmup_length: + lr = _warmup_lr(base_lr, warmup_length, step) + else: + e = step - warmup_length + es = steps - warmup_length + lr = 0.5 * (1 + np.cos(np.pi * e / es)) * base_lr + assign_learning_rate(param_group, lr) + return _lr_adjuster + + +class Featurizer(torch.nn.Module): + def __init__(self, model, normalize=True): + super().__init__() + self.model = model + self.normalize = normalize + + def forward(self, input): + image_features = self.model.encode_image(input) + if self.normalize: + image_features = F.normalize(image_features, dim=-1) + return image_features + +class FeatureDataset(Dataset): + def __init__(self, features, targets): + self.features = features + self.targets = targets + + def __len__(self): + return len(self.features) + + def __getitem__(self, i): + return self.features[i], self.targets[i] + + +def train(dataloader, input_shape, output_shape, weight_decay, lr, epochs, autocast, device, seed): + torch.manual_seed(seed) + model = torch.nn.Linear(input_shape, output_shape) + devices = [x for x in range(torch.cuda.device_count())] + model = model.cuda() + model = torch.nn.DataParallel(model, device_ids=devices) + optimizer = torch.optim.AdamW( + model.parameters(), + lr=lr, + weight_decay=weight_decay, + ) + criterion = torch.nn.CrossEntropyLoss() + + len_loader = len(dataloader) + scheduler = cosine_lr(optimizer, lr, 0., epochs * len_loader) + + for epoch in range(epochs): + end = time.time() + for i, (x, y) in enumerate(dataloader): + x, y = x.cuda(), y.cuda() + step = i + epoch * len_loader + data_time = time.time() - end + scheduler(step) + + optimizer.zero_grad() + with autocast(): + pred = model(x) + loss = criterion(pred, y) + + loss.backward() + optimizer.step() + + batch_time = time.time() - end + end = time.time() + + if (i % 20) == 1: + num_samples = i * len(x) + try: + samples_per_epoch = len(dataloader) + percent_complete = 100.0 * i / len(dataloader) + progress_message = f"[{num_samples}/{samples_per_epoch} ({percent_complete:.0f}%)]" + except TypeError: + progress_message = f"[{num_samples} samples]" + print( + f"Train Epoch: {epoch} {progress_message}\t" + f"Loss: {loss.item():.6f}\tData (t) {data_time:.3f}\tBatch (t) {batch_time:.3f}\t" + f"LR {optimizer.param_groups[0]['lr']:.5f}" + ) + return model + + +def infer(model, dataloader, autocast, device): + true, pred = [], [] + with torch.no_grad(): + for x, y in tqdm(dataloader): + x = x.to(device) + y = y.to(device) + + with autocast(): + logits = model(x) + + pred.append(logits.cpu()) + true.append(y.cpu()) + + logits = torch.cat(pred) + target = torch.cat(true) + return logits, target + + +def find_peak(wd_list, idxs, train_loader, val_loader, input_shape, output_shape, lr, epochs, autocast, device, verbose, seed): + best_wd_idx, max_acc = 0, 0 + for idx in idxs: + weight_decay = wd_list[idx] + model = train(train_loader, input_shape, output_shape, weight_decay, lr, epochs, autocast, device, seed) + logits, target = infer(model, val_loader, autocast, device) + acc1, = accuracy(logits.float(), target.float(), topk=(1,)) + if verbose: + print(f"Valid accuracy with weight_decay {weight_decay}: {acc1}") + if max_acc < acc1: + best_wd_idx, max_acc = idx, acc1 + return best_wd_idx + + +def evaluate(model, train_dataloader, dataloader, fewshot_k, batch_size, num_workers, lr, epochs, + model_id, seed, feature_root, device, val_dataloader=None, normalize=True, amp=True, verbose=False): + assert device == 'cuda' # need to use cuda for this else too slow + # first we need to featurize the dataset, and store the result in feature_root + if not os.path.exists(feature_root): + os.mkdir(feature_root) + feature_dir = os.path.join(feature_root, model_id) + if not os.path.exists(feature_dir): + os.mkdir(feature_dir) + + featurizer = Featurizer(model, normalize).cuda() + autocast = torch.cuda.amp.autocast if amp else suppress + if not os.path.exists(os.path.join(feature_dir, 'targets_train.pt')): + # now we have to cache the features + devices = [x for x in range(torch.cuda.device_count())] + featurizer = torch.nn.DataParallel(featurizer, device_ids=devices) + + splits = ["_train", "_val", "_test"] + for save_str, loader in zip(splits, [train_dataloader, val_dataloader, dataloader]): + if loader is None: + continue + features = [] + targets = [] + num_batches_tracked = 0 + num_cached = 0 + with torch.no_grad(): + for images, target in tqdm(loader): + images = images.to(device) + + with autocast(): + feature = featurizer(images) + + features.append(feature.cpu()) + targets.append(target) + + num_batches_tracked += 1 + if (num_batches_tracked % 100) == 0: + features = torch.cat(features) + targets = torch.cat(targets) + + torch.save(features, os.path.join(feature_dir, f'features{save_str}_cache_{num_cached}.pt')) + torch.save(targets, os.path.join(feature_dir, f'targets{save_str}_cache_{num_cached}.pt')) + num_cached += 1 + features = [] + targets = [] + + if len(features) > 0: + features = torch.cat(features) + targets = torch.cat(targets) + torch.save(features, os.path.join(feature_dir, f'features{save_str}_cache_{num_cached}.pt')) + torch.save(targets, os.path.join(feature_dir, f'targets{save_str}_cache_{num_cached}.pt')) + num_cached += 1 + + features = torch.load(os.path.join(feature_dir, f'features{save_str}_cache_0.pt')) + targets = torch.load(os.path.join(feature_dir, f'targets{save_str}_cache_0.pt')) + for k in range(1, num_cached): + next_features = torch.load(os.path.join(feature_dir, f'features{save_str}_cache_{k}.pt')) + next_targets = torch.load(os.path.join(feature_dir, f'targets{save_str}_cache_{k}.pt')) + features = torch.cat((features, next_features)) + targets = torch.cat((targets, next_targets)) + + for k in range(num_cached): + os.remove(os.path.join(feature_dir, f'features{save_str}_cache_{k}.pt')) + os.remove(os.path.join(feature_dir, f'targets{save_str}_cache_{k}.pt')) + + torch.save(features, os.path.join(feature_dir, f'features{save_str}.pt')) + torch.save(targets, os.path.join(feature_dir, f'targets{save_str}.pt')) + + features = torch.load(os.path.join(feature_dir, 'features_train.pt')) + targets = torch.load(os.path.join(feature_dir, 'targets_train.pt')) + + # second, make a dataloader with k features per class. if k = -1, use all features. + length = len(features) + perm = [p.item() for p in torch.randperm(length)] + idxs = [] + counts = {} + num_classes = 0 + + for p in perm: + target = targets[p].item() + if target not in counts: + counts[target] = 0 + num_classes += 1 + + if fewshot_k < 0 or counts[target] < fewshot_k: + counts[target] += 1 + idxs.append(p) + + for c in counts: + if fewshot_k > 0 and counts[c] != fewshot_k: + print('insufficient data for this eval') + return + + train_features = features[idxs] + train_labels = targets[idxs] + if val_dataloader is not None: + features_val = torch.load(os.path.join(feature_dir, 'features_val.pt')) + targets_val = torch.load(os.path.join(feature_dir, 'targets_val.pt')) + feature_val_dset = FeatureDataset(features_val, targets_val) + feature_val_loader = DataLoader( + feature_val_dset, batch_size=batch_size, + shuffle=True, num_workers=num_workers, + pin_memory=True, + ) + feature_train_val_dset = FeatureDataset(np.concatenate((train_features, features_val)), np.concatenate((train_labels, targets_val))) + feature_train_val_loader = DataLoader( + feature_train_val_dset, batch_size=batch_size, + shuffle=True, num_workers=num_workers, + pin_memory=True, + ) + feature_train_dset = FeatureDataset(train_features, train_labels) + feature_train_loader = DataLoader(feature_train_dset, batch_size=batch_size, + shuffle=True, num_workers=num_workers, + pin_memory=True, + ) + features_test = torch.load(os.path.join(feature_dir, 'features_test.pt')) + targets_test = torch.load(os.path.join(feature_dir, 'targets_test.pt')) + feature_test_dset = FeatureDataset(features_test, targets_test) + feature_test_loader = DataLoader( + feature_test_dset, batch_size=batch_size, + shuffle=True, num_workers=num_workers, + pin_memory=True, + ) + input_shape, output_shape = features[0].shape[0], targets.max().item() + 1 + if val_dataloader is not None: + # perform openAI-like hyperparameter sweep + # https://arxiv.org/pdf/2103.00020.pdf A.3 + # instead of scikit-learn LBFGS use FCNNs with AdamW + wd_list = np.logspace(-6, 2, num=97).tolist() + wd_list_init = np.logspace(-6, 2, num=7).tolist() + wd_init_idx = [i for i, val in enumerate(wd_list) if val in wd_list_init] + peak_idx = find_peak(wd_list, wd_init_idx, feature_train_loader, feature_val_loader, input_shape, output_shape, lr, epochs, autocast, device, verbose, seed) + step_span = 8 + while step_span > 0: + left, right = max(peak_idx - step_span, 0), min(peak_idx + step_span, len(wd_list)-1) + peak_idx = find_peak(wd_list, [left, peak_idx, right], feature_train_loader, feature_val_loader, input_shape, output_shape, lr, epochs, autocast, device, verbose, seed) + step_span //= 2 + best_wd = wd_list[peak_idx] + train_loader = feature_train_val_loader + else: + best_wd = 0 + train_loader = feature_train_loader + + final_model = train(train_loader, input_shape, output_shape, best_wd, lr, epochs, autocast, device, seed) + logits, target = infer(final_model, feature_test_loader, autocast, device) + pred = logits.argmax(axis=1) + + # measure accuracy + if target.max() >= 5: + acc1, acc5 = accuracy(logits.float(), target.float(), topk=(1, 5)) + else: + acc1, = accuracy(logits.float(), target.float(), topk=(1,)) + acc5 = float("nan") + mean_per_class_recall = balanced_accuracy_score(target, pred) + fair_info = { + "weight_decay": best_wd, + "acc1": acc1, + "acc5": acc5, + "mean_per_class_recall": mean_per_class_recall, + "classification_report": classification_report(target, pred, digits=3) + } + if verbose: + print(fair_info["classification_report"]) + print(f"Test acc1: {acc1} with weight_decay: {best_wd}") + return {"lp_acc1": fair_info["acc1"], "lp_acc5": fair_info["acc5"], "lp_mean_per_class_recall": fair_info["mean_per_class_recall"], + "weight_decay": fair_info['weight_decay'], 'epochs': epochs, 'seed': seed, 'fewshot_k': fewshot_k, 'normalized': normalize} diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/zeroshot_classification.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/zeroshot_classification.py new file mode 100644 index 0000000000000000000000000000000000000000..e3962aaf74f64220618fc28884ad8c0f323bfedf --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/zeroshot_classification.py @@ -0,0 +1,236 @@ +""" +Code adapated from https://github.com/mlfoundations/open_clip/blob/main/src/training/zero_shot.py +Thanks to the authors of OpenCLIP +""" +import logging +from contextlib import suppress + +import torch +import torch.nn.functional as F +from tqdm import tqdm + +from sklearn.metrics import classification_report, balanced_accuracy_score + + +def zero_shot_classifier(model, tokenizer, classnames, templates, device, amp=True): + """ + This function returns zero-shot vectors for each class in order + to use it for zero-shot classification. + + + model: + CLIP-like model with `encode_text` + + tokenizer: + text tokenizer, i.e. convert list of strings to torch.Tensor of integers + + classnames: list of str + name of classes + + templates: list of str + templates to use. + + Returns + ------- + + torch.Tensor of shape (N,C) where N is the number + of templates, and C is the number of classes. + """ + autocast = torch.cuda.amp.autocast if amp else suppress + with torch.no_grad(), autocast(): + zeroshot_weights = [] + for classname in tqdm(classnames): + if type(templates) == dict: + # class-specific prompts (e.g., CuPL https://arxiv.org/abs/2209.03320) + texts = templates[classname] + elif type(templates) == list: + # generic prompts tht are specialized for each class by replacing {c} with the class name + texts = [template.format(c=classname) for template in templates] + else: + raise ValueError("templates must be a list or a dict") + texts = tokenizer(texts).to(device) # tokenize + class_embeddings = model.encode_text(texts) + class_embedding = F.normalize(class_embeddings, dim=-1).mean(dim=0) + class_embedding /= class_embedding.norm() + zeroshot_weights.append(class_embedding) + zeroshot_weights = torch.stack(zeroshot_weights, dim=1).to(device) + return zeroshot_weights + + +def accuracy(output, target, topk=(1,)): + """ + Compute top-k accuracy + + output: torch.Tensor + shape (N, C) where N is the number of examples, C the number of classes. + these are the logits. + + target: torch.Tensor + shape (N,) where N is the number of examples. Groundtruth class id of each example. + + topk: tuple + which topk to compute, e.g., topk=(1,5) will compute top-1 and top-5 accuracies + + Returns + ------- + + list of top-k accuracies in the same order as `topk` + """ + pred = output.topk(max(topk), 1, True, True)[1].t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + n = len(target) + return [float(correct[:k].reshape(-1).float().sum(0, keepdim=True).cpu().numpy()) / n for k in topk] + + +def run_classification(model, classifier, dataloader, device, amp=True): + """ + Run zero-shot classifcation + + model: torch.nn.Module + CLIP-like model with `encode_image` and `encode_text` + + classifier: torch.Tensor + obtained from the function `zero_shot_classifier` + + dataloader: torch.utils.data.Dataloader + + Returns + ------- + (pred, true) where + - pred (N, C) are the logits + - true (N,) are the actual classes + """ + autocast = torch.cuda.amp.autocast if amp else suppress + pred = [] + true = [] + nb = 0 + with torch.no_grad(): + for images, target in tqdm(dataloader): + images = images.to(device) + target = target.to(device) + + with autocast(): + # predict + image_features = model.encode_image(images) + image_features = F.normalize(image_features, dim=-1) + logits = 100. * image_features @ classifier + + true.append(target.cpu()) + pred.append(logits.float().cpu()) + + pred = torch.cat(pred) + true = torch.cat(true) + return pred, true + +def average_precision_per_class(scores, targets): + """ + Compute average precision for each class + this metric is used for multi-label classification + see explanations here https://fangdahan.medium.com/calculate-mean-average-precision-map-for-multi-label-classification-b082679d31be + Code is adapted from https://github.com/pytorch/tnt/blob/master/torchnet/meter/meter.py, thanks to the authors of `tnt`. + + Parameters + ---------- + + scores: torch.Tensor + logits, of shape (N,C) where N is the number of examples, C the number of classes + + targets: torch.Tensor + one-hot vectors of groundtruth targets (N, C), where N is the number of examples, C is the + number of classes + + Returns + ------- + + torch.Tensor of shape (C,) of avereage precision for each class, where C is + the number of classes. + + """ + ap = torch.zeros(scores.size(1)) + rg = torch.arange(1, scores.size(0) + 1).float() + # compute average precision for each class + for k in range(scores.size(1)): + # sort scores + scores_k = scores[:, k] + targets_k = targets[:, k] + _, sortind = torch.sort(scores_k, 0, True) + truth = targets_k[sortind] + tp = truth.float().cumsum(0) + # compute precision curve + precision = tp.div(rg) + # compute average precision + ap[k] = precision[truth.bool()].sum() / max(float(truth.sum()), 1) + return ap + + +def evaluate(model, dataloader, tokenizer, classnames, templates, device, amp=True, verbose=False, save_clf=None, load_clfs=[]): + """ + Run zero-shot classification and evaluate the metrics + + Parameters + ---------- + + model: torch.nn.Module + CLIP-like model with `encode_image` and `encode_text` + + dataloader: torch.utils.data.Dataloader + + tokenizer: text tokenizer + + classnames: list of str + class names + + templates: list of str + templates to use for zero-shot classification + + device: cpu/cuda + + amp: whether to use automatic mixed precision + + verbose: whether to use verbose model + + Returns + ------- + + dict of classification metrics + """ + if len(load_clfs) > 0: + n = len(load_clfs) + classifier = torch.load(load_clfs[0], map_location='cpu') / n + for i in range(1, n): + classifier = classifier + torch.load(load_clfs[i], map_location='cpu') / n + classifier = classifier.to(device) + else: + classifier = zero_shot_classifier(model, tokenizer, classnames, templates, device, amp=amp) + + if save_clf is not None: + torch.save(classifier, save_clf) + # exit() - not sure if we want to exit here or not. + + logits, target = run_classification(model, classifier, dataloader, device, amp=amp) + is_multilabel = (len(target.shape) == 2) + + if is_multilabel: + if verbose: + print("Detected a multi-label classification dataset") + # Multiple labels per image, multiple classes on the dataset + ap_per_class = average_precision_per_class(logits, target) + if verbose: + for class_name, ap in zip(dataloader.dataset.classes, ap_per_class.tolist()): + print(f"Class: {class_name}, AveragePrecision: {ap}") + return {"mean_average_precision": ap_per_class.mean().item()} + else: + # Single label per image, multiple classes on the dataset + # just compute accuracy and mean_per_class_recall + + pred = logits.argmax(axis=1) + # measure accuracy + if len(dataloader.dataset.classes) >= 5: + acc1, acc5 = accuracy(logits, target, topk=(1, 5)) + else: + acc1, = accuracy(logits, target, topk=(1,)) + acc5 = float("nan") + mean_per_class_recall = balanced_accuracy_score(target, pred) + if verbose: + print(classification_report(target, pred, digits=3)) + return {"acc1": acc1, "acc5": acc5, "mean_per_class_recall": mean_per_class_recall} diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/zeroshot_retrieval.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/zeroshot_retrieval.py new file mode 100644 index 0000000000000000000000000000000000000000..3f1426af46730ea331cd6d2120f734ef25bdbda4 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/metrics/zeroshot_retrieval.py @@ -0,0 +1,127 @@ +import logging +from contextlib import suppress + +import torch +import torch.nn.functional as F +from tqdm import tqdm + +def evaluate(model, dataloader, tokenizer, device, amp=True, recall_k_list=[5]): + """ + Evaluate the model on the given dataset + + Parameters + ---------- + + model: torch.nn,Module + CLIP-like model with `encode_image` and `encode_text` + + dataloader: torch.utils.data.Dataloader + dataloader to use for evaluation + + tokenizer: + text tokenizer, i.e. convert list of strings to torch.Tensor of integers + + device: cpu/cuda + + amp: whether to use automatic mixed precision + + recall_k_list: list of int + recall@k k's to use + + Returns + ------- + + dict of retrieval metrics + """ + # list of batch of images embedding + batch_images_emb_list = [] + # list of batch of text embedding + batch_texts_emb_list = [] + # for each text, we collect the corresponding image index, as each image can have multiple corresponding texts + texts_image_index = [] + dataloader = dataloader_with_indices(dataloader) + autocast = torch.cuda.amp.autocast if amp else suppress + for batch_images, batch_texts, inds in tqdm(dataloader): + batch_images = batch_images.to(device) + # tokenize all texts in the batch + batch_texts_tok = tokenizer([text for i, texts in enumerate(batch_texts) for text in texts]).to(device) + # store the index of image for each text + batch_texts_image_index = [ind for ind, texts in zip(inds, batch_texts) for text in texts] + + # compute the embedding of images and texts + with torch.no_grad(), autocast(): + batch_images_emb = F.normalize(model.encode_image(batch_images), dim=-1) + batch_texts_emb = F.normalize(model.encode_text(batch_texts_tok), dim=-1) + + batch_images_emb_list.append(batch_images_emb.cpu()) + batch_texts_emb_list.append(batch_texts_emb.cpu()) + texts_image_index.extend(batch_texts_image_index) + + batch_size = len(batch_images_emb_list[0]) + + # concatenate all embeddings + images_emb = torch.cat(batch_images_emb_list) + texts_emb = torch.cat(batch_texts_emb_list) + + # get the score for each text and image pair + scores = texts_emb @ images_emb.t() + + # construct a the positive pair matrix, which tells whether each text-image pair is a positive or not + positive_pairs = torch.zeros_like(scores, dtype=bool) + positive_pairs[torch.arange(len(scores)), texts_image_index] = True + metrics = {} + for recall_k in recall_k_list: + # Note that recall_at_k computes **actual** recall i.e. nb_true_positive/nb_positives, where the number + # of true positives, e.g. for text retrieval, is, for each image, the number of retrieved texts matching that image among the top-k. + # Also, the number of positives are the total number of texts matching the image in the dataset, as we have a set of captions + # for each image, that number will be greater than 1 for text retrieval. + # However, image/text retrieval recall@k, the way it is done in CLIP-like papers, is a bit different. + # recall@k, in CLIP-like papers, is, for each image, either 1 or 0. It is 1 if atleast one text matches the image among the top-k. + # so we can easily compute that using the actual recall, by checking whether there is at least one true positive, + # which would be the case if the recall is greater than 0. One we compute the recal for each image (or text), we average + # it over the dataset. + metrics[f"image_retrieval_recall@{recall_k}"] = (batchify(recall_at_k, scores, positive_pairs, batch_size, device, k=recall_k)>0).float().mean().item() + metrics[f"text_retrieval_recall@{recall_k}"] = (batchify(recall_at_k, scores.T, positive_pairs.T, batch_size, device, k=recall_k)>0).float().mean().item() + + return metrics + +def dataloader_with_indices(dataloader): + start = 0 + for x, y in dataloader: + end = start + len(x) + inds = torch.arange(start, end) + yield x, y, inds + start = end + +def recall_at_k(scores, positive_pairs, k): + """ + Compute the recall at k for each sample + :param scores: compability score between text and image embeddings (nb texts, nb images) + :param k: number of images to consider per text, for retrieval + :param positive_pairs: boolean matrix of positive pairs (nb texts, nb images) + :return: recall at k averaged over all texts + """ + nb_texts, nb_images = scores.shape + # for each text, sort according to image scores in decreasing order + topk_indices = torch.topk(scores, k, dim=1)[1] + # compute number of positives for each text + nb_positive = positive_pairs.sum(dim=1) + # nb_texts, k, nb_images + topk_indices_onehot = torch.nn.functional.one_hot(topk_indices, num_classes=nb_images) + # compute number of true positives + positive_pairs_reshaped = positive_pairs.view(nb_texts, 1, nb_images) + # a true positive means a positive among the topk + nb_true_positive = (topk_indices_onehot * positive_pairs_reshaped).sum(dim=(1,2)) + # compute recall at k + recall_at_k = (nb_true_positive / nb_positive) + return recall_at_k + +def batchify(func, X, Y, batch_size, device, *args, **kwargs): + results = [] + for start in range(0, len(X), batch_size): + end = start + batch_size + x = X[start:end].to(device) + y = Y[start:end].to(device) + result = func(x, y, *args, **kwargs).cpu() + results.append(result) + return torch.cat(results) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/model_collection.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/model_collection.py new file mode 100644 index 0000000000000000000000000000000000000000..ec4d51b264816dfbf6134210b48b4f9afb0d0eb7 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/model_collection.py @@ -0,0 +1,29 @@ +import open_clip + +def get_model_collection_from_file(path): + return [l.strip().split(",") for l in open(path).readlines()] + +model_collection = { + "openclip_base": [ + ("ViT-B-32-quickgelu", "laion400m_e32"), + ("ViT-B-32","laion2b_e16"), + ("ViT-B-32","laion2b_s34b_b79k"), + ("ViT-B-16","laion400m_e32"), + ("ViT-B-16-plus-240","laion400m_e32"), + ("ViT-L-14","laion400m_e32"), + ("ViT-L-14","laion2b_s32b_b82k"), + ("ViT-H-14","laion2b_s32b_b79k"), + ("ViT-g-14","laion2b_s12b_b42k"), + ], + "openclip_multilingual":[ + ("xlm-roberta-base-ViT-B-32", "laion5b_s13b_b90k"), + ("xlm-roberta-large-ViT-H-14", "frozen_laion5b_s13b_b90k"), + ], + "openclip_all": open_clip.list_pretrained(), + "openai": [ + ("ViT-B-32","openai"), + ("ViT-B-16","openai"), + ("ViT-L-14", "openai"), + ("ViT-L-14-336", "openai"), + ] +} diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/__init__.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..87636a878029cdd8125e19fb08adfcb91ffc8882 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/__init__.py @@ -0,0 +1,33 @@ +from typing import Union +import torch +from .open_clip import load_open_clip +from .open_clip_hqq import load_open_clip_hqq +from .japanese_clip import load_japanese_clip + +# loading function must return (model, transform, tokenizer) +TYPE2FUNC = { + "open_clip": load_open_clip, + "open_clip_hqq": load_open_clip_hqq, + "ja_clip": load_japanese_clip +} +MODEL_TYPES = list(TYPE2FUNC.keys()) + + +def load_clip( + model_type: str, + model_name: str, + pretrained: str, + cache_dir: str, + device: Union[str, torch.device] = "cuda", + **kwargs +): + assert model_type in MODEL_TYPES, f"model_type={model_type} is invalid!" + load_func = TYPE2FUNC[model_type] + + return load_func( + model_name=model_name, + pretrained=pretrained, + cache_dir=cache_dir, + device=device, + **kwargs + ) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/japanese_clip.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/japanese_clip.py new file mode 100644 index 0000000000000000000000000000000000000000..6dee3a1c8e00b393936e48ecda4b693da8b9024f --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/japanese_clip.py @@ -0,0 +1,54 @@ +from typing import Dict +import torch + + +class DictTensor: + """ + enable to do `tokenizer(texts).to(device)` + """ + def __init__(self, d: Dict[str, torch.Tensor]): + self.d = d + + def to(self, device): + return {k: v.to(device) for k, v in self.d.items()} + + +class JaCLIPForBenchmark: + """ + enable to do model.encode_text(dict_tensor) + """ + def __init__(self, model): + self.model = model + + def encode_text(self, dict_tensor): + return self.model.get_text_features(**dict_tensor) + + def encode_image(self, image): + return self.model.get_image_features(image) + + +def load_japanese_clip(pretrained: str, device="cpu", **kwargs): + """ + Load Japanese CLIP/CLOOB by rinna (https://github.com/rinnakk/japanese-clip) + Remarks: + - You must input not only input_ids but also attention_masks and position_ids when doing `model.encode_text()` to make it work correctly. + """ + try: + import japanese_clip as ja_clip + except ImportError: + raise ImportError("Install `japanese_clip` by `pip install git+https://github.com/rinnakk/japanese-clip.git`") + cache_dir = kwargs.pop("cache_dir", None) + model, transform = ja_clip.load(pretrained, device=device, cache_dir=cache_dir) + + class JaTokenizerForBenchmark: + def __init__(self, ): + self.tokenizer = ja_clip.load_tokenizer() + + def __call__(self, texts) -> Dict[str, torch.Tensor]: + inputs = ja_clip.tokenize(texts, tokenizer=self.tokenizer, device="cpu") + return DictTensor(inputs) + + def __len__(self): + return len(self.tokenizer) + + return JaCLIPForBenchmark(model), transform, JaTokenizerForBenchmark() diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/nllb_clip.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/nllb_clip.py new file mode 100644 index 0000000000000000000000000000000000000000..cc6d540daf5fa7d5d1c736ba76a2b11188743970 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/nllb_clip.py @@ -0,0 +1,248 @@ +def set_language(tokenizer, lang_code): + lang = lang_map[lang_code] + print(f"Setting language for NLLB-CLIP: {lang}") + tokenizer.tokenizer.set_src_lang_special_tokens(lang) + + +lang_map = { + "en": "eng_Latn", + "es": "spa_Latn", + "it": "ita_Latn", + "ko": "kor_Hang", + "ru": "rus_Cyrl", + "zh": "zho_Hant", + "de": "deu_Latn", + "fr": "fra_Latn", + "jp": "jpn_Jpan", + "cn": "zho_Hant", + "zhm": "yue_Hant", + "ar": "arb_Arab", + "bn": "ben_Beng", + "cs": "ces_Latn", + "da": "dan_Latn", + "el": "ell_Grek", + "fa": "pes_Arab", + "fi": "fin_Latn", + "fil": "tgl_Latn", + "hi": "hin_Deva", + "hr": "hrv_Latn", + "hu": "hun_Latn", + "ja": "jpn_Jpan", + "id": "ind_Latn", + "he": "heb_Hebr", + "mi": "mri_Latn", + "nl": "nld_Latn", + "no": "nno_Latn", + "pl": "pol_Latn", + "pt": "por_Latn", + "quz": "quy_Latn", + "ro": "ron_Latn", + "sv": "swe_Latn", + "sw": "swh_Latn", + "te": "tel_Telu", + "th": "tha_Thai", + "tr": "tur_Latn", + "uk": "ukr_Cyrl", + "vi": "vie_Latn", + "ace_Arab": "ace_Arab", + "ace_Latn": "ace_Latn", + "acm_Arab": "acm_Arab", + "acq_Arab": "acq_Arab", + "aeb_Arab": "aeb_Arab", + "afr_Latn": "afr_Latn", + "ajp_Arab": "ajp_Arab", + "aka_Latn": "aka_Latn", + "amh_Ethi": "amh_Ethi", + "apc_Arab": "apc_Arab", + "arb_Arab": "arb_Arab", + "ars_Arab": "ars_Arab", + "ary_Arab": "ary_Arab", + "arz_Arab": "arz_Arab", + "asm_Beng": "asm_Beng", + "ast_Latn": "ast_Latn", + "awa_Deva": "awa_Deva", + "ayr_Latn": "ayr_Latn", + "azb_Arab": "azb_Arab", + "azj_Latn": "azj_Latn", + "bak_Cyrl": "bak_Cyrl", + "bam_Latn": "bam_Latn", + "ban_Latn": "ban_Latn", + "bel_Cyrl": "bel_Cyrl", + "bem_Latn": "bem_Latn", + "ben_Beng": "ben_Beng", + "bho_Deva": "bho_Deva", + "bjn_Arab": "bjn_Arab", + "bjn_Latn": "bjn_Latn", + "bod_Tibt": "bod_Tibt", + "bos_Latn": "bos_Latn", + "bug_Latn": "bug_Latn", + "bul_Cyrl": "bul_Cyrl", + "cat_Latn": "cat_Latn", + "ceb_Latn": "ceb_Latn", + "ces_Latn": "ces_Latn", + "cjk_Latn": "cjk_Latn", + "ckb_Arab": "ckb_Arab", + "crh_Latn": "crh_Latn", + "cym_Latn": "cym_Latn", + "dan_Latn": "dan_Latn", + "deu_Latn": "deu_Latn", + "dik_Latn": "dik_Latn", + "dyu_Latn": "dyu_Latn", + "dzo_Tibt": "dzo_Tibt", + "eng_Latn": "eng_Latn", + "ell_Grek": "ell_Grek", + "epo_Latn": "epo_Latn", + "est_Latn": "est_Latn", + "eus_Latn": "eus_Latn", + "ewe_Latn": "ewe_Latn", + "fao_Latn": "fao_Latn", + "fij_Latn": "fij_Latn", + "fin_Latn": "fin_Latn", + "fon_Latn": "fon_Latn", + "fra_Latn": "fra_Latn", + "fur_Latn": "fur_Latn", + "fuv_Latn": "fuv_Latn", + "gla_Latn": "gla_Latn", + "gle_Latn": "gle_Latn", + "glg_Latn": "glg_Latn", + "grn_Latn": "grn_Latn", + "guj_Gujr": "guj_Gujr", + "hat_Latn": "hat_Latn", + "hau_Latn": "hau_Latn", + "heb_Hebr": "heb_Hebr", + "hin_Deva": "hin_Deva", + "hne_Deva": "hne_Deva", + "hrv_Latn": "hrv_Latn", + "hun_Latn": "hun_Latn", + "hye_Armn": "hye_Armn", + "ibo_Latn": "ibo_Latn", + "ilo_Latn": "ilo_Latn", + "ind_Latn": "ind_Latn", + "isl_Latn": "isl_Latn", + "ita_Latn": "ita_Latn", + "jav_Latn": "jav_Latn", + "jpn_Jpan": "jpn_Jpan", + "kab_Latn": "kab_Latn", + "kac_Latn": "kac_Latn", + "kam_Latn": "kam_Latn", + "kan_Knda": "kan_Knda", + "kas_Arab": "kas_Arab", + "kas_Deva": "kas_Deva", + "kat_Geor": "kat_Geor", + "knc_Arab": "knc_Arab", + "knc_Latn": "knc_Latn", + "kaz_Cyrl": "kaz_Cyrl", + "kbp_Latn": "kbp_Latn", + "kea_Latn": "kea_Latn", + "khm_Khmr": "khm_Khmr", + "kik_Latn": "kik_Latn", + "kin_Latn": "kin_Latn", + "kir_Cyrl": "kir_Cyrl", + "kmb_Latn": "kmb_Latn", + "kmr_Latn": "kmr_Latn", + "kon_Latn": "kon_Latn", + "kor_Hang": "kor_Hang", + "lao_Laoo": "lao_Laoo", + "lij_Latn": "lij_Latn", + "lim_Latn": "lim_Latn", + "lin_Latn": "lin_Latn", + "lit_Latn": "lit_Latn", + "lmo_Latn": "lmo_Latn", + "ltg_Latn": "ltg_Latn", + "ltz_Latn": "ltz_Latn", + "lua_Latn": "lua_Latn", + "lug_Latn": "lug_Latn", + "luo_Latn": "luo_Latn", + "lus_Latn": "lus_Latn", + "lvs_Latn": "lvs_Latn", + "mag_Deva": "mag_Deva", + "mai_Deva": "mai_Deva", + "mal_Mlym": "mal_Mlym", + "mar_Deva": "mar_Deva", + "min_Latn": "min_Latn", + "mkd_Cyrl": "mkd_Cyrl", + "plt_Latn": "plt_Latn", + "mlt_Latn": "mlt_Latn", + "mni_Beng": "mni_Beng", + "khk_Cyrl": "khk_Cyrl", + "mos_Latn": "mos_Latn", + "mri_Latn": "mri_Latn", + "mya_Mymr": "mya_Mymr", + "nld_Latn": "nld_Latn", + "nno_Latn": "nno_Latn", + "nob_Latn": "nob_Latn", + "npi_Deva": "npi_Deva", + "nso_Latn": "nso_Latn", + "nus_Latn": "nus_Latn", + "nya_Latn": "nya_Latn", + "oci_Latn": "oci_Latn", + "gaz_Latn": "gaz_Latn", + "ory_Orya": "ory_Orya", + "pag_Latn": "pag_Latn", + "pan_Guru": "pan_Guru", + "pap_Latn": "pap_Latn", + "pes_Arab": "pes_Arab", + "pol_Latn": "pol_Latn", + "por_Latn": "por_Latn", + "prs_Arab": "prs_Arab", + "pbt_Arab": "pbt_Arab", + "quy_Latn": "quy_Latn", + "ron_Latn": "ron_Latn", + "run_Latn": "run_Latn", + "rus_Cyrl": "rus_Cyrl", + "sag_Latn": "sag_Latn", + "san_Deva": "san_Deva", + "scn_Latn": "scn_Latn", + "shn_Mymr": "shn_Mymr", + "sin_Sinh": "sin_Sinh", + "slk_Latn": "slk_Latn", + "slv_Latn": "slv_Latn", + "smo_Latn": "smo_Latn", + "sna_Latn": "sna_Latn", + "snd_Arab": "snd_Arab", + "som_Latn": "som_Latn", + "sot_Latn": "sot_Latn", + "spa_Latn": "spa_Latn", + "als_Latn": "als_Latn", + "srd_Latn": "srd_Latn", + "srp_Cyrl": "srp_Cyrl", + "ssw_Latn": "ssw_Latn", + "sun_Latn": "sun_Latn", + "swe_Latn": "swe_Latn", + "swh_Latn": "swh_Latn", + "szl_Latn": "szl_Latn", + "tam_Taml": "tam_Taml", + "tat_Cyrl": "tat_Cyrl", + "tel_Telu": "tel_Telu", + "tgk_Cyrl": "tgk_Cyrl", + "tgl_Latn": "tgl_Latn", + "tha_Thai": "tha_Thai", + "tir_Ethi": "tir_Ethi", + "taq_Latn": "taq_Latn", + "taq_Tfng": "taq_Tfng", + "tpi_Latn": "tpi_Latn", + "tsn_Latn": "tsn_Latn", + "tso_Latn": "tso_Latn", + "tuk_Latn": "tuk_Latn", + "tum_Latn": "tum_Latn", + "tur_Latn": "tur_Latn", + "twi_Latn": "twi_Latn", + "tzm_Tfng": "tzm_Tfng", + "uig_Arab": "uig_Arab", + "ukr_Cyrl": "ukr_Cyrl", + "umb_Latn": "umb_Latn", + "urd_Arab": "urd_Arab", + "uzn_Latn": "uzn_Latn", + "vec_Latn": "vec_Latn", + "vie_Latn": "vie_Latn", + "war_Latn": "war_Latn", + "wol_Latn": "wol_Latn", + "xho_Latn": "xho_Latn", + "ydd_Hebr": "ydd_Hebr", + "yor_Latn": "yor_Latn", + "yue_Hant": "yue_Hant", + "zho_Hans": "zho_Hans", + "zho_Hant": "zho_Hant", + "zsm_Latn": "zsm_Latn", + "zul_Latn": "zul_Latn", +} diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/open_clip.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/open_clip.py new file mode 100644 index 0000000000000000000000000000000000000000..610c6032a0eb40615838d411eb99dd5a4d7eadc9 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/open_clip.py @@ -0,0 +1,8 @@ +import open_clip + + +def load_open_clip(model_name: str = "ViT-B-32-quickgelu", pretrained: str = "laion400m_e32", cache_dir: str = None, device="cpu"): + model, _, transform = open_clip.create_model_and_transforms(model_name, pretrained=pretrained, cache_dir=cache_dir) + model = model.to(device) + tokenizer = open_clip.get_tokenizer(model_name) + return model, transform, tokenizer diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/open_clip_hqq.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/open_clip_hqq.py new file mode 100644 index 0000000000000000000000000000000000000000..f085fece30bca14fad68c20dfb5f151305e7f4a4 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/models/open_clip_hqq.py @@ -0,0 +1,42 @@ +import open_clip +from hqq.core.quantize import BaseQuantizeConfig +from hqq.engine.open_clip import HQQOpenCLIP + + +def load_open_clip_hqq( + model_name: str, + pretrained: str, + cache_dir: str = None, + device="cpu", + **kwargs, +): + model, _, transform = open_clip.create_model_and_transforms( + model_name, pretrained=pretrained, cache_dir=cache_dir + ) + + model = _quantize_model(model, model_name, **kwargs) + model = model.to(device) + + tokenizer = open_clip.get_tokenizer(model_name) + return model, transform, tokenizer + + +def _quantize_model(model, model_name, **kwargs): + # Quantize settings + budget = kwargs.get("budget", None) + if budget is not None: + quant_config = BaseQuantizeConfig(budget=budget, mixed=True, quant_scale=True) + quant_config["quant_metrics_file"] = kwargs.get("quant_metrics_file") + quant_config["weight_algo"] = kwargs.get("weight_algo", None) + quant_config["boost_stop"] = kwargs.get("boost_stop", None) + quant_config["ablation"] = kwargs.get("ablation", None) + quant_config["top_m_layer"] = kwargs.get("top_m_layer", None) + else: + b = kwargs.get("nbits", 4) + g = kwargs.get("group_size", 64) + quant_config = BaseQuantizeConfig(nbits=b, group_size=g) + + model = HQQOpenCLIP.wrap_model(model, model_name) + print(f"Using quant_config: {quant_config}") + model.quantize_model(quant_config=quant_config) + return model diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/webdataset_builder.py b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/webdataset_builder.py new file mode 100644 index 0000000000000000000000000000000000000000..b03bf122e3f9d1dfd8f0fd2d6217a8c309f44f75 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/clip_benchmark/webdataset_builder.py @@ -0,0 +1,271 @@ +# Convert CLIP_benchmark datasets to webdataset format + +import argparse +import io +import os +import sys + +from tqdm import tqdm +import torch +import torch.utils.data +import webdataset +from .datasets.builder import build_dataset + + +def get_parser_args(): + parser = argparse.ArgumentParser(description=""" + Convert a CLIP_benchmark dataset to the webdataset format (TAR files). + Datasets can be uploaded to the Huggingface Hub to allow CLIP model + evaluation from anywhere with an Internet connection. + + To convert other image classification datasets, use the Python API: + >>> import clip_benchmark.webdataset_builder + >>> help(clip_benchmark.webdataset_builder.convert_dataset) + """) + # Main arguments + parser.add_argument("--dataset", "-d", required=True, type=str, + help="CLIP_benchmark compatible dataset for conversion") + parser.add_argument("--split", "-s", default="test", type=str, + help="Dataset split to use") + parser.add_argument("--dataset-root", "-r", default="data", type=str, + help="Root directory for input data") + parser.add_argument("--output", "-o", required=True, type=str, + help="Root directory for output data") + # Special dataset types + parser_special = parser.add_mutually_exclusive_group() + parser_special.add_argument("--retrieval", action="store_true", + help="Flag to signal retrieval dataset (text captions instead of classes)") + parser_special.add_argument("--multilabel", action="store_true", + help="Flag to signal multilabel classification dataset") + # Additional parameters + parser.add_argument("--image-format", default="webp", type=str, + help="Image extension for saving: (lossless) webp, png, or jpg (Default: webp)") + parser.add_argument("--max-count", default=10_000, type=int, + help="Maximum number of images per TAR shard (Default: 10_000)") + parser.add_argument("--max-size", default=1_000_000_000, type=int, + help="Maximum size in bytes per TAR shard (Default: 1_000_000_000)") + args = parser.parse_args() + return args + +def main(): + args = get_parser_args() + run(args) + +def run(args): + # Setup dataset folder + os.makedirs(os.path.join(args.output, args.split), exist_ok=True) + # Load original dataset + dataset = build_dataset( + dataset_name=args.dataset, + root=args.dataset_root, + split=args.split, + transform=PIL_to_bytes(args.image_format), + download=True, + ) + # Run conversion + if args.retrieval: + convert_retrieval_dataset( + dataset, + args.split, + args.output, + transform=None, + image_format=args.image_format, + max_count=args.max_count, + max_size=args.max_size + ) + else: + convert_dataset( + dataset, + args.split, + args.output, + transform=None, + image_format=args.image_format, + max_count=args.max_count, + max_size=args.max_size, + multilabel=args.multilabel, + ) + + +def PIL_to_bytes(image_format): + OPTIONS = { + "webp": dict(format="webp", lossless=True), + "png": dict(format="png"), + "jpg": dict(format="jpeg"), + } + def transform(image): + bytestream = io.BytesIO() + image.save(bytestream, **OPTIONS[image_format]) + return bytestream.getvalue() + return transform + +def path_to_bytes(filepath): + with open(filepath, "rb") as fp: + return fp.read() + + +def convert_dataset(dataset, split, output_folder, *, transform=None, + image_format="webp", max_count=10_000, max_size=1_000_000_000, + multilabel=False, verbose=True): + """ + Convert an iterable `dataset` of (image, label) pairs to webdataset (.tar) format, and store in `output_folder/split`. + + Images may be passed in as either: + * File paths: pass in `transform=path_to_bytes`; + * PIL images: pass in `transform=PIL_to_bytes(image_format)` where `image_format` is e.g. "webp"; or + * Raw binary data: use a PyTorch `Dataset` that supports `transform=PIL_to_bytes(image_format)`, and pass in `transform=None` here. + Be sure that the transform is not applied twice. + + Copying image files directly or writing raw binary data is fastest since it allows multiprocessing; + passing in PIL images will be slower, but should work for any format of dataset. + + Labels must be zero-indexed integers (for multilabel datasets, labels must be arrays/tensors). + + Classnames and zero-shot classification templates can be provided as attributes of the dataset (`.classes` and `.templates`) + or filled in manually afterward. `dataset.classes` should be a list of strings indexed by the labels, + and `dataset.templates` should be a list of strings containing `{c}` to specify where classnames are to be inserted. + """ + # Create output directory + os.makedirs(os.path.join(output_folder, split), exist_ok=True) + # Multiprocessed dataloader, should work with Dataset or list + dataloader = torch.utils.data.DataLoader( + dataset, + batch_size=1, + num_workers=8, + collate_fn=lambda batch: batch[0] # No collate, only for multiprocessing + ) + if verbose: + try: + print(f"Dataset size: {len(dataset)}") + except TypeError: + print("IterableDataset has no len()") + # Save classnames + if hasattr(dataset, "classes") and dataset.classes: + classnames_fname = os.path.join(output_folder, "classnames.txt") + with open(classnames_fname, "w") as classnames_file: + print(*dataset.classes, sep="\n", end="\n", file=classnames_file) + if verbose: + print("Saved class names to '%s'" % classnames_fname) + elif verbose: + print("WARNING: No class names found") + # Save zeroshot templates + if hasattr(dataset, "templates") and dataset.templates: + templates_fname = os.path.join(output_folder, "zeroshot_classification_templates.txt") + with open(templates_fname, "w") as templates_file: + print(*dataset.templates, sep="\n", end="\n", file=templates_file) + if verbose: + print("Saved class names to '%s'" % templates_fname) + elif verbose: + print("WARNING: No zeroshot classification templates found") + # Save dataset type + if multilabel: + type_fname = os.path.join(output_folder, "dataset_type.txt") + with open(type_fname, "w") as type_file: + print("multilabel", end="\n", file=type_file) + if verbose: + print("Saved dataset type to '%s'" % type_fname) + # Write to TAR files + data_fname = os.path.join(output_folder, split, r"%d.tar") + sink = webdataset.ShardWriter( + data_fname, + maxcount=max_count, + maxsize=max_size + ) + nsamples = 0 + label_type = "npy" if multilabel else "cls" + for index, (input, output) in enumerate(tqdm(dataloader, desc="Converting")): + nsamples += 1 + if isinstance(input, str) and transform is path_to_bytes: + # If copying file, determine image format from extension + extension = os.path.splitext(input)[1].replace(".", "").lower().replace("jpeg", "jpg") or image_format + else: + extension = image_format + # Convert label if necessary + if isinstance(output, torch.Tensor): + if multilabel: + output = output.detach().cpu().numpy() + else: + output = output.item() + # Write example + sink.write({ + "__key__": "s%07d" % index, + extension: transform(input) if transform else input, + label_type: output, + }) + num_shards = sink.shard + sink.close() + if verbose: + print("Saved dataset to '%s'" % data_fname.replace(r"%d", "{0..%d}" % (num_shards - 1))) + # Save number of shards + nshards_fname = os.path.join(output_folder, split, "nshards.txt") + with open(nshards_fname, "w") as nshards_file: + print(num_shards, end="\n", file=nshards_file) + if verbose: + print("Saved number of shards = %d to '%s'" % (num_shards, nshards_fname)) + print("Final dataset size:", nsamples) + + +def convert_retrieval_dataset(dataset, split, output_folder, *, transform=None, image_format="webp", max_count=10_000, max_size=1_000_000_000, verbose=True): + """ + Convert an iterable `dataset` of (image, [caption1, caption2, ...]) pairs to webdataset (.tar) format, and store in `output_folder/split`. + + Labels must be lists of strings, with no newlines. + + Read the documentation of `convert_dataset` for more information. + """ + # Create output directory + os.makedirs(os.path.join(output_folder, split), exist_ok=True) + # Multiprocessed dataloader, should work with Dataset or list + dataloader = torch.utils.data.DataLoader( + dataset, + batch_size=1, + num_workers=8, + collate_fn=lambda batch: batch[0] # No collate, only for multiprocessing + ) + if verbose: + try: + print(f"Dataset size: {len(dataset)}") + except TypeError: + print("IterableDataset has no len()") + # No classnames + # No zeroshot templates + # Save dataset type + type_fname = os.path.join(output_folder, "dataset_type.txt") + with open(type_fname, "w") as type_file: + print("retrieval", end="\n", file=type_file) + if verbose: + print("Saved dataset type to '%s'" % type_fname) + # Write to TAR files + data_fname = os.path.join(output_folder, split, r"%d.tar") + sink = webdataset.ShardWriter( + data_fname, + maxcount=max_count, + maxsize=max_size + ) + nsamples = 0 + for index, (input, output) in enumerate(tqdm(dataloader, desc="Converting")): + nsamples += 1 + if isinstance(input, str) and transform is path_to_bytes: + # If copying file, determine image format from extension + extension = os.path.splitext(input)[1].replace(".", "").lower().replace("jpeg", "jpg") or image_format + else: + extension = image_format + sink.write({ + "__key__": "s%07d" % index, + extension: transform(input) if transform else input, + "txt": "\n".join(caption.replace("\n", r"\n") for caption in output), + }) + num_shards = sink.shard + sink.close() + if verbose: + print("Saved dataset to '%s'" % data_fname.replace(r"%d", "{0..%d}" % (num_shards - 1))) + # Save number of shards + nshards_fname = os.path.join(output_folder, split, "nshards.txt") + with open(nshards_fname, "w") as nshards_file: + print(num_shards, end="\n", file=nshards_file) + if verbose: + print("Saved number of shards = %d to '%s'" % (num_shards, nshards_fname)) + print("Final dataset size:", nsamples) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/PROBES.md b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/PROBES.md new file mode 100644 index 0000000000000000000000000000000000000000..6a14005e6775e1113df9eebaa14f4f24c0af0411 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/PROBES.md @@ -0,0 +1,9 @@ +Steps to run. + +1. Navigate to `CLIP_benchmark`. +2. Run `export PYTHONPATH=$PWD`. +3. (Optional) To re-run the experiments, run `python probe_benchmark/scaling_experiments.py`. You'll have to change line 51 to point to your data. +4. (Optional) To generate the results, run `python probe_benchmark/build_df_scaling_experiments.py`. +5. (Optional) VTAB requires post-processing to average. Run `python probe_benchmark/process_vtab.py`. +6. Generate plots with `python probe_benchmark/scaling_plot.py`. +7. Generate table with `python probe_benchark/generate_table.py`. \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/build_df_scaling_experiments.py b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/build_df_scaling_experiments.py new file mode 100644 index 0000000000000000000000000000000000000000..5baa42d2d7f6b7e801a2588fdd87ac9dd11e7d94 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/build_df_scaling_experiments.py @@ -0,0 +1,116 @@ +import os +import pandas as pd +import json + +if __name__ == '__main__': + + compute_df = pd.read_csv('probe_benchmark/clip_table_2.csv') + #mdf = pd.read_csv("https://gist.githubusercontent.com/mehdidc/58dee67cecd5431a80ee3a2346c9c165/raw/45288ebccaacc34a97f580f8bf16fb3274927f2c/gistfile1.txt") + mdf = pd.read_csv("probe_benchmark/openclip_results.csv") + info = [] + #import pdb; pdb.set_trace() + models = ['ViT-B-32-quickgelu,laion400m_e32', + 'ViT-B-32,openai', + 'ViT-B-32,laion2b_s34b_b79k', + 'ViT-B-16,laion400m_e32', + 'ViT-B-16-plus-240,laion400m_e32', + 'ViT-B-16,openai', + #'ViT-L-14-336,openai', + 'ViT-L-14,openai', + 'ViT-B-32,laion2b_e16', + 'ViT-L-14,laion400m_e32', + 'ViT-L-14,laion2b_s32b_b82k', + 'ViT-H-14,laion2b_s32b_b79k', + 'ViT-g-14,laion2b_s12b_b42k', + ] + alt_models = ['B/32 400M', + 'B/32 CLIP WIT', + 'B/32 2B', + 'B/16 400M', + 'B/16+ 400M', + 'B/16 CLIP WIT', + #'ViT-L-14-336,openai', + 'L/14 CLIP WIT', + 'B/32 2B', + 'L/14 400M', + 'L/14 2B', + 'H/14 2B', + 'g/14 2B', + ] + + datasets = ['imagenet1k-unverified', 'cifar100'] + datasets = datasets + [ + 'vtab/caltech101', + 'vtab/cifar10', + 'vtab/cifar100', + 'vtab/clevr_count_all', + 'vtab/clevr_closest_object_distance', + 'vtab/diabetic_retinopathy', + 'vtab/dmlab', + 'vtab/dsprites_label_orientation', + 'vtab/dsprites_label_x_position', + 'vtab/dtd', + 'vtab/eurosat', + 'vtab/kitti_closest_vehicle_distance', + 'vtab/flowers', + 'vtab/pets', + 'vtab/pcam', + 'vtab/resisc45', + 'vtab/smallnorb_label_azimuth', + 'vtab/smallnorb_label_elevation', + 'vtab/svhn', + ] + + ks = [10, 25, -1] + lrs = [0.1, 0.01, 0.001] + epoch_vals = [10, 20, 40] + batch_sizes = [32 * 8] + + def get_us_dataset(pretrained): + if '2b' in pretrained: + return 'LAION-2B' + elif 'laion' in pretrained: + return 'LAION-400M' + else: + return 'CLIP-WIT' + + for dataset in datasets: + dataset_root = '/datasets01/imagenet_full_size/061417' if dataset.startswith('imagenet') else '/private/home/mitchellw/git/forks/CLIP_benchmark' + for ii, model_info in enumerate(models): + model_info_split = model_info.split(',') + model, pretrained = model_info_split[0], model_info_split[1] + for epochs in epoch_vals: + for k in ks: + if k == 25 and 'vtab' in dataset: + continue + for lr in lrs: + for bs in batch_sizes: + pth = '/private/home/mitchellw/git/forks/CLIP_benchmark/probe_benchmark/data/' + f'{model}-{pretrained}-{dataset}-{epochs}-{k}-{lr}-{bs}.json'.replace('/', '_') + print(pth) + assert os.path.exists(pth) + row = { + 'k' : k, + 'lr' : lr, + 'bs' : bs, + 'epochs' : epochs, + 'model' : model.replace('-quickgelu', ''), + 'pretrained' : pretrained, + 'pretrained_short' : 'laion2b' if 'laion2b' in pretrained else pretrained, + 'pretrained_clean' : 'LAION' if 'laion' in pretrained else 'CLIP-WiT', + 'dataset' : dataset, + 'macts' : compute_df[compute_df.model == model.replace('-quickgelu', '')]['image_macts'].values[0], + # 'gmacs_total': mdf[mdf.model_fullname_pretty == alt_models[ii]]['gmacs_total'].values[0], + # 'samples_seen': mdf[mdf.model_fullname_pretty == alt_models[ii]]['samples_seen'].values[0], + 'gmacs_total': mdf[mdf.model_fullname == models[ii].replace(',', ' ')]['gmacs_total'].values[0], + 'samples_seen': mdf[mdf.model_fullname == models[ii].replace(',', ' ')]['samples_seen'].values[0], + 'samples_seen_pretty': mdf[mdf.model_fullname == models[ii].replace(',', ' ')]['samples_seen_pretty'].values[0], + 'model_short' : models[ii].replace(',', ' '), + 'upstream_dataset' : get_us_dataset(pretrained) + } + with open(pth, 'r') as f: + row.update(json.load(f)['metrics']) + info.append(row) + + with open('probe_benchmark/scaling_experiment_data2.json', 'w') as f: + json.dump(info, f) + diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/clip_table_2.csv b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/clip_table_2.csv new file mode 100644 index 0000000000000000000000000000000000000000..dd138322d3868f8689e95b650ab40e7af84be5dd --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/clip_table_2.csv @@ -0,0 +1,24 @@ +model,image_size,image_width,text_width,embed_dim,gmacs,macts,mparams,image_gmacs,image_macts,image_mparams,text_gmacs,text_macts,text_mparams +ViT-B-32,224,768,512,512,7.4,10.31,151.28,4.41,5.01,87.85,2.98,5.3,63.43 +ViT-B-32-plus-256,256,896,640,640,12.43,14.38,210.3,7.79,7.76,119.13,4.64,6.63,91.16 +RN50,224,2048,512,1024,9.16,18.29,102.01,6.17,12.98,38.32,2.98,5.3,63.69 +ViT-M-16,224,512,512,512,10.99,21.23,102.02,8.0,15.93,38.59,2.98,5.3,63.43 +RN101,224,2048,512,512,12.84,23.38,119.69,9.86,18.08,56.26,2.98,5.3,63.43 +ViT-M-16-256,256,512,512,512,13.62,27.56,102.05,10.63,22.26,38.62,2.98,5.3,63.43 +ViT-B-16,224,768,512,512,20.57,29.2,149.62,17.58,23.9,86.19,2.98,5.3,63.43 +ViT-B-16-plus,224,896,640,640,28.41,34.5,208.35,23.77,27.88,117.19,4.64,6.63,91.16 +ViT-B-16-plus-240,240,896,640,640,32.05,39.71,208.38,27.41,33.08,117.21,4.64,6.63,91.16 +RN50x4,288,2560,640,640,26.09,41.9,178.3,21.45,35.27,87.14,4.64,6.63,91.16 +ViT-L-16,224,1024,768,768,68.26,71.47,427.74,61.6,63.52,304.09,6.66,7.95,123.65 +ViT-L-14,224,1024,768,768,87.73,96.74,427.62,81.08,88.79,303.97,6.66,7.95,123.65 +RN50x16,384,3072,768,768,81.86,111.49,290.98,75.2,103.54,167.33,6.66,7.95,123.65 +ViT-H-16,224,1280,1024,1024,150.96,122.01,986.26,127.4,100.81,632.23,23.57,21.2,354.03 +ViT-H-14,224,1280,1024,1024,190.97,160.61,986.11,167.4,139.41,632.08,23.57,21.2,354.03 +ViT-L-14-280,280,1024,768,768,136.0,168.66,427.76,129.34,160.71,304.11,6.66,7.95,123.65 +RN50x64,448,4096,1024,1024,193.4,199.15,500.28,181.61,188.55,297.4,11.78,10.6,202.88 +ViT-g-14,224,1408,1024,1024,290.74,213.84,1366.68,267.18,192.64,1012.65,23.57,21.2,354.03 +ViT-H-14-280,280,1280,1024,1024,289.49,268.29,986.29,265.93,247.09,632.26,23.57,21.2,354.03 +ViT-L-14-336,336,1024,768,768,197.76,278.19,427.94,191.1,270.24,304.29,6.66,7.95,123.65 +ViT-g-14-280,280,1408,1024,1024,446.95,358.73,1366.88,423.38,337.53,1012.85,23.57,21.2,354.03 +ViT-H-14-336,336,1280,1024,1024,414.53,428.74,986.52,390.97,407.54,632.49,23.57,21.2,354.03 +ViT-g-14-336,336,1408,1024,1024,644.21,571.87,1367.13,620.65,550.67,1013.1,23.57,21.2,354.03 diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/generate_table.py b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/generate_table.py new file mode 100644 index 0000000000000000000000000000000000000000..132a39208da1df1babed525d754a5bd99701d333 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/generate_table.py @@ -0,0 +1,86 @@ +import numpy +import pandas as pd +import json + +# make a new version of vtab + +if __name__ == '__main__': + df_full = pd.read_json('probe_benchmark/scaling_experiment_data2.json') + df = df_full[df_full.fewshot_k == -1] + df25 = df_full[df_full.fewshot_k == 25] + df10 = df_full[df_full.fewshot_k == 10] + + datasets = [ + 'vtab/caltech101', + 'vtab/cifar10', + 'vtab/cifar100', + 'vtab/clevr_count_all', + 'vtab/clevr_closest_object_distance', + 'vtab/diabetic_retinopathy', + 'vtab/dmlab', + 'vtab/dsprites_label_orientation', + 'vtab/dsprites_label_x_position', + 'vtab/dtd', + 'vtab/eurosat', + 'vtab/kitti_closest_vehicle_distance', + 'vtab/flowers', + 'vtab/pets', + 'vtab/pcam', + 'vtab/resisc45', + 'vtab/smallnorb_label_azimuth', + 'vtab/smallnorb_label_elevation', + 'vtab_svhn', + ] + + datasets2 = [ + 'imagenet1k-unverified', 'cifar100' + ] + + + all_info = [] + cols = [] + first = True + for n, g in df_full.groupby(['model', 'pretrained', 'samples_seen_pretty']): + count = 0 + total = 0. + for d in datasets: + g_filter = g[(g.dataset == d) & (g.fewshot_k == -1)] + count += 1 + total += g_filter.lp_acc1.max() + + avg = total / count + info = {'VTAB acc' : avg} + if first: + cols.append('VTAB acc') + + for d in datasets2: + for k in [10, 25, -1]: + g_filter = g[(g.dataset == d) & (g.fewshot_k == k)] + info[f'{d}: {k} shot'] = g_filter.lp_acc1.max() + if first: + cols.append(f'{d}: {k} shot') + + + for k in ['model', 'pretrained', 'upstream_dataset', 'gmacs_total', 'samples_seen_pretty']: + info[k] = g[k].values[0] + all_info.append(info) + first = False + + df = pd.DataFrame(all_info) + formatters = {} + print(df.keys()) + columns = ['model', 'samples_seen_pretty', 'upstream_dataset'] + df = df.sort_values(by=['model', 'samples_seen_pretty', 'upstream_dataset']) + for ds in cols: + columns.append(ds) + formatters[ds] = lambda x: f'{100*x:.2f}' + latex = df.to_latex(columns=columns, formatters=formatters) + print(latex) + + + # with open('probe_benchmark/scaling_experiment_data_combined.json', 'w') as f: + # json.dump(all_info, f) + + + + diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/gmacs_vs_perf_retrieval.pdf b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/gmacs_vs_perf_retrieval.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9bec967f1833cb501470d28127706cb5fa300387 Binary files /dev/null and b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/gmacs_vs_perf_retrieval.pdf differ diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/imagenet_cifar_lp.pdf b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/imagenet_cifar_lp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a80e2e428335ab2c96c12ead45541515830613d8 Binary files /dev/null and b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/imagenet_cifar_lp.pdf differ diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/imagenet_cifar_lp_vtab.pdf b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/imagenet_cifar_lp_vtab.pdf new file mode 100644 index 0000000000000000000000000000000000000000..29841eef70a8db2c653e3dc301b0d03e172677b2 Binary files /dev/null and b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/imagenet_cifar_lp_vtab.pdf differ diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/laion5b_fewshot_experiments.py b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/laion5b_fewshot_experiments.py new file mode 100644 index 0000000000000000000000000000000000000000..44f6e001c814160ea144e20e736bb7972f2ce60f --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/laion5b_fewshot_experiments.py @@ -0,0 +1,52 @@ +import os +from clip_benchmark.cli import run, get_parser_args + +# /private/home/mitchellw/miniconda3/envs/cb/bin/python probe_benchmark/laion5b_fewshot_experiments.py +if __name__ == '__main__': + + models = ['ViT-B-32-quickgelu,laion400m_e32', + 'ViT-B-32,openai', + 'ViT-B-32,laion2b_s34b_b79k', + 'ViT-B-16,laion400m_e32', + #'ViT-B-16-plus-240,laion400m_e32', + 'ViT-B-16,openai', + #'ViT-L-14-336,openai', + 'ViT-L-14,openai', + #'ViT-B-32,laion2b_e16', + 'ViT-L-14,laion400m_e32', + 'ViT-L-14,laion2b_s32b_b82k', + 'ViT-H-14,laion2b_s32b_b79k', + ] + + datasets = ['imagenet1k-unverified'] + + ks = [1,2,4,8,16,32,64,128] + lrs = [0.1, 0.01, 0.001, 0.0001] + epoch_vals = [10, 20, 40, 80] + batch_sizes = [32 * 8] + + for epochs in epoch_vals: + for dataset in datasets: + dataset_root = '/datasets01/imagenet_full_size/061417' if dataset.startswith('imagenet') else '/private/home/mitchellw/git/forks/CLIP_benchmark' + for model_info in models: + model_info_split = model_info.split(',') + model, pretrained = model_info_split[0], model_info_split[1] + + for k in ks: + for lr in lrs: + for bs in batch_sizes: + args = get_parser_args() + args.dataset_root = dataset_root + args.dataset = dataset + args.task = 'linear_probe' + args.pretrained = pretrained + args.model = model + args.output = '/private/home/mitchellw/git/forks/CLIP_benchmark/probe_benchmark/data/' + f'{model}-{pretrained}-{dataset}-{epochs}-{k}-{lr}-{bs}.json'.replace('/', '_') + if os.path.exists(args.output): + print('skipping - exists.') + args.fewshot_k = k + args.fewshot_epochs = epochs + args.fewshot_lr = lr + args.batch_size = bs + args.skip_load = True # NOTE + run(args) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/openclip_results.csv b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/openclip_results.csv new file mode 100644 index 0000000000000000000000000000000000000000..2e012b48349c26858d62787483748cd6e704f464 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/openclip_results.csv @@ -0,0 +1,1429 @@ +model_fullname,arch,samples_seen,gmacs_total,gmacs,upstream_dataset,downstream_dataset,acc1,acc5,mean_per_class_recall,image_retrieval_recall@5,text_retrieval_recall@5,task,samples_seen_pretty +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,imagenet_robustness,0.7138686446015579,0.9019612132286229,0.7015927221983966,,,zeroshot_classification,13B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,imagenet_robustness,0.711291878768914,0.9012295279381928,0.7041271441794895,,,zeroshot_classification,34B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8,290.74,LAION-2B,imagenet_robustness,0.6961007145186431,0.8909269253492965,0.6903803526256987,,,zeroshot_classification,13B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,imagenet_robustness,0.6755141951853131,0.8804507790098277,0.6700462212857073,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,imagenet_robustness,0.6524704720564751,0.8608225373202565,0.6479373308643208,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,imagenet_robustness,0.6460825839618001,0.8625529140547374,0.6390391250953824,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,imagenet_robustness,0.6383939446690603,0.8571322291324937,0.6317483459988562,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,imagenet_robustness,0.6329325631362772,0.8516797915983924,0.6284171308899518,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,imagenet_robustness,0.5864814465490348,0.8246854596025003,0.5821019488838068,,,zeroshot_classification,34B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,imagenet_robustness,0.5864008510276177,0.8328327220870678,0.5765314589347447,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.4,87.73,LAION-2B,imagenet_robustness,0.5755729556550009,0.8193546988663666,0.570874279650937,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,imagenet_robustness,0.5753043064744505,0.8177521552188542,0.570906432723542,,,zeroshot_classification,3B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.410000000000004,LAION-400M,imagenet_robustness,0.5735310368727052,0.8165530052774198,0.5718939057972472,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,imagenet_robustness,0.5713740101858134,0.8122513764676562,0.567739895131195,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,imagenet_robustness,0.5589030874174228,0.8072089598093524,0.5590589934519972,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,imagenet_robustness,0.548916205568661,0.7985335987848554,0.5451820711722067,,,zeroshot_classification,13B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,imagenet_robustness,0.5271338220544035,0.7710690165428087,0.5263203617207266,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,imagenet_robustness,0.5218998952908236,0.7676071230732184,0.5208426816838733,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.4,7.4,LAION-400M,imagenet_robustness,0.5012210695607061,0.749071527137725,0.500228836735715,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,imagenet_robustness,0.4896623900173468,0.7370881281607886,0.4880522623424861,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,imagenet_robustness,0.4883182293768873,0.7416675028002334,0.4870719911834575,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,imagenet_robustness,0.4869400547864228,0.7382931374383341,0.48562787346511505,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,imagenet_robustness,0.486263647676539,0.7535636209026594,0.4825562175122455,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.4,87.73,LAION-80M,imagenet_robustness,0.4826300766584407,0.7328718195263916,0.4796576589442435,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,imagenet_robustness,0.4806545003314948,0.7367234921607864,0.4799530077500263,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,imagenet_robustness,0.47820678006929757,0.7389447148547961,0.4772455070452345,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,imagenet_robustness,0.47285964942554715,0.7272267012881379,0.4705068906396511,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,imagenet_robustness,0.4348081443700574,0.6921799796838443,0.43221454604783655,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet_robustness,0.428087635866045,0.6863362009727834,0.4274057551296959,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet_robustness,0.4276454410074395,0.6801272530012797,0.4268913239506286,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet_robustness,0.424391223863419,0.6781321612155177,0.42444733376468635,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,imagenet_robustness,0.42232094371342105,0.6694833222925755,0.4210599242263363,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet_robustness,0.416039894596715,0.6663511118630551,0.41659311907698776,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,imagenet_robustness,0.3794948069947538,0.6297268314290616,0.3774084656372819,,,zeroshot_classification,3B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab,0.4675383603695855,0.780948726019307,0.46278056635705656,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab,0.4519293601975323,0.7577615327191863,0.44075667038308713,,,zeroshot_classification,13B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab,0.44977024379627567,0.7788683938837977,0.46483834133422436,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab,0.4442794015580135,0.7505642953944571,0.43145150659133324,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab,0.44386150677449304,0.7697168122545337,0.45372505030684324,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.3999999999999995,LAION-2B,vtab,0.4363470283789193,0.751540646976185,0.4143381467747291,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab,0.4361944101540189,0.7504146596569391,0.4224800806112721,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab,0.43256071715726274,0.7620114599089363,0.44690872018399774,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab,0.43201642176566285,0.7644864478906179,0.43975894947884175,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab,0.41611357091096535,0.746442649133423,0.41933754855319155,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab,0.4141779975913564,0.7532296231681846,0.430441263667163,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab,0.4131099310006277,0.7570653814567339,0.42372318683897403,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab,0.4070022628641271,0.7362806367465853,0.3980400901255489,,,zeroshot_classification,3B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.409999999999997,LAION-400M,vtab,0.40662004015585934,0.7419070908484078,0.4241103735269527,,,zeroshot_classification,13B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.19998,7.3999999999999995,LAION-2B,vtab,0.40039589889438204,0.7497194396828639,0.407977650015016,,,zeroshot_classification,34B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab,0.399972961639047,0.7481694570107829,0.41007268465927904,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.3999999999999995,LAION-400M,vtab,0.3986454095011735,0.721977522970376,0.37222418217212505,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab,0.39560841323291873,0.7184811290787475,0.38316869316158114,,,zeroshot_classification,3B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.3999999999999995,LAION-400M,vtab,0.3946131204758372,0.7419781679307563,0.39757841769648605,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab,0.392009819124826,0.7592765393433382,0.4094375920800845,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.3999999999999995,LAION-400M,vtab,0.3875400175952234,0.7377137443742809,0.3997904519912511,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.3999999999999995,LAION-400M,vtab,0.3854664296232869,0.7436794141054247,0.39531726643314175,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab,0.3816499572999793,0.7047257109466616,0.3564429343387951,,,zeroshot_classification,3B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.3999999999999995,CLIP-WIT,vtab,0.38070092193924626,0.7358109036976269,0.3859255271845176,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab,0.3806430854818885,0.7472409731301681,0.40399519850226023,,,zeroshot_classification,34B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab,0.3798830887258859,0.7342852127504537,0.39910795905768487,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.3999999999999995,LAION-2B,vtab,0.37920688915842143,0.7382846429140073,0.38748434230998663,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab,0.37901153366323737,0.7328360172102458,0.3891148318147297,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab,0.37547419244257857,0.7226439502639354,0.36309291400812765,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.3999999999999995,LAION-2B,vtab,0.3749722680596928,0.7259623734251018,0.39341657516441153,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.3999999999999995,LAION-2B,vtab,0.36792870527198146,0.7338162372122312,0.37415884125036397,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.3999999999999995,LAION-80M,vtab,0.3663075467752684,0.7159758608471228,0.35171572623199204,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.3999999999999995,LAION-400M,vtab,0.349205934421467,0.7102283717238745,0.3585330138058392,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.3999999999999995,LAION-80M,vtab,0.3227524797472288,0.6980951891851737,0.33550063619194304,,,zeroshot_classification,3B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab+,0.5654112282297443,0.8329414582676622,0.56279878057792,,,zeroshot_classification,13B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab+,0.5643146274147648,0.8362355507068666,0.5722016106049133,,,zeroshot_classification,34B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab+,0.5575715695022163,0.822912606951281,0.5499716559874979,,,zeroshot_classification,13B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab+,0.546345087664638,0.8199550143440342,0.5505264926886714,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab+,0.530063593203829,0.8071234496208669,0.5351606773905058,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab+,0.528262053879799,0.8114016470690724,0.5307170683029797,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab+,0.5259634301313555,0.7934332529979573,0.5172264748669052,,,zeroshot_classification,34B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab+,0.5179729260464788,0.8024756513105532,0.522170731863021,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab+,0.5163973493729939,0.7902576901904209,0.5067283400386818,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab+,0.515074134164474,0.7967024575549938,0.5214435626533176,,,zeroshot_classification,13B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab+,0.50790690571226,0.7827552535427339,0.493560502382332,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab+,0.5050058124520579,0.786383202284325,0.5032746539532374,,,zeroshot_classification,3B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab+,0.4928579086091836,0.7795719444617056,0.5004366949742134,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab+,0.48722562605230796,0.7920552937523083,0.4951991162930417,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab+,0.4839465731748074,0.7791486525764005,0.4879494537160219,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab+,0.4830597365558873,0.7857492797732425,0.493600567142433,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab+,0.4805518373033898,0.7779520355650965,0.48411302914666254,,,zeroshot_classification,34B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab+,0.47497915041348276,0.7832615784615367,0.4833133643685722,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab+,0.46934797969776787,0.7569401052820519,0.46326353990695424,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.4,7.4,LAION-400M,vtab+,0.46406078786752736,0.7662779994128331,0.466866700327472,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab+,0.4618373148087323,0.7632699801645344,0.46805867241078575,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab+,0.4581281152133625,0.7567237368827066,0.45886858373649386,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab+,0.45686061067144584,0.7440976275704222,0.4473172336386544,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab+,0.45502425628155374,0.7595439827965222,0.4583703816227995,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab+,0.45139236288913637,0.7570114077325348,0.4559530541099208,,,zeroshot_classification,3B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab+,0.44888900407585897,0.7640630279527814,0.44991315648477004,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab+,0.4441936415615748,0.7397462838203751,0.43626008684517825,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab+,0.44404507794877035,0.7346509642628893,0.4280894940995933,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab+,0.4366182492580091,0.7396413246281579,0.44580988956923895,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab+,0.4348174056634131,0.7255670056721212,0.41910632896347627,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab+,0.4308039037042432,0.7449242838250092,0.43262165724618906,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab+,0.42300823898917134,0.725374647424298,0.41365130485873036,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab+,0.41533342601476475,0.7220243345254671,0.4199025448431518,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab+,0.38054876401881826,0.7064909383508629,0.3864098864944945,,,zeroshot_classification,3B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/dsprites_label_orientation,0.0232340494791666,0.1152615017361111,0.0242046402834269,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,gtsrb,0.501821060965954,0.7586698337292161,0.4394378810250903,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,mnist,0.7679,0.9386,0.7581398074696393,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/dtd,0.551063829787234,0.8356382978723405,0.5499999999999999,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/dsprites_label_x_position,0.0317789713541666,0.147705078125,0.0324921668671336,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/pcam,0.5159912109375,,0.5157975788193991,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,imagenetv2,0.6968,0.9081,0.6974,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/pets,0.9307713273371492,0.9980921231943308,0.9330900923082088,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/dmlab,0.1674950516824279,0.8040906091928745,0.1782001238774596,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/svhn,0.5706822372464659,0.9138752304855562,0.5886888789913961,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/resisc45,0.6352380952380953,0.9225396825396824,0.6419889996880412,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/kitti_closest_vehicle_distance,0.2236286919831223,,0.3717030717825018,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,cars,0.7768934212162666,0.983957219251337,0.777448930592225,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,imagenet1k,0.7549,0.946,0.7545,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,imagenet-r,0.8787,0.9709333333333332,0.8651131734542029,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/smallnorb_label_elevation,0.1143209876543209,0.5373662551440329,0.1138628810502107,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,objectnet,0.6908043501669,0.8805319263486594,0.6736647184602601,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,sun397,0.675285506739982,0.9369310554094562,0.6824513086557495,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/diabetic_retinopathy,0.7331380360909304,1.0,0.206266837915639,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,stl10,0.99375,1.0,0.993625,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/cifar10,0.9569,0.9963,0.9572,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,imagenet_sketch,0.596238872840889,0.8439741397944546,0.5964254901960785,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,flickr30k,,,,0.8715999722480774,0.9739999771118164,zeroshot_retrieval,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/eurosat,0.6266666666666667,0.9611111111111112,0.6380077170682305,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,mscoco_captions,,,,0.6108356714248657,0.7918000221252441,zeroshot_retrieval,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,country211,0.3182464454976303,0.5937914691943128,0.3175829383886256,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,fer2013,0.4896907216494845,0.9721370855391472,0.4887152232577444,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/smallnorb_label_azimuth,0.04559670781893,0.274320987654321,0.0456436809466583,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,imagenet-a,0.7068,0.9062666666666668,0.6753602288814418,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/flowers,0.7916734428362335,0.9193364774760124,0.7931691849985836,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,voc2007,0.7832532051282052,0.9692174145299144,0.864352156405908,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/clevr_closest_object_distance,0.1606666666666666,0.9079333333333334,0.1772310296867651,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,renderedsst2,0.6985172981878089,,0.6986603265589717,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,flickr8k,,,,0.5979236364364624,0.766036331653595,zeroshot_retrieval,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,fgvc_aircraft,0.3171317131713171,0.7827782778277828,0.3170053475935828,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/cifar100,0.7613,0.9289,0.7611,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/clevr_count_all,0.1895333333333333,0.7248666666666667,0.1870254885776544,,,zeroshot_classification,13B +ViT-L-14 openai,ViT-L-14,12800000000.0,1122944000000.0,87.73,CLIP-WIT,vtab/caltech101,0.8385930309007232,0.9539776462853384,0.9334530557615972,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,fer2013,0.4460852605182502,0.9469211479520758,0.3940612716631316,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/svhn,0.3628226797787339,0.6565765212046711,0.4033487053539641,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,fgvc_aircraft,0.1854185418541854,0.4452445244524452,0.1875846702317291,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,flickr8k,,,,0.6441478133201599,0.7916203141212463,zeroshot_retrieval,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/flowers,0.7105220361034315,0.8590014636526264,0.6857234783638442,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,sun397,0.6981352410026298,0.9398183055335896,0.6849982147927691,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/smallnorb_label_elevation,0.1080658436213991,0.5204115226337449,0.108510287776451,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,country211,0.1884360189573459,0.4163507109004739,0.1883412322274882,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,imagenetv2,0.6137,0.8644,0.6146999999999999,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/kitti_closest_vehicle_distance,0.2841068917018284,,0.4076831334000694,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,imagenet1k,0.6909,0.91432,0.69156,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,stl10,0.96875,0.99975,0.9695,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/diabetic_retinopathy,0.1316147176001874,1.0,0.230780955782727,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,mnist,0.5699,0.8279,0.5675693520579019,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/cifar10,0.9272,0.9988,0.9272000000000002,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,renderedsst2,0.5782537067545305,,0.5785203520352036,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,flickr30k,,,,0.8894000053405762,0.9710000157356262,zeroshot_retrieval,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,mscoco_captions,,,,0.6620951890945435,0.8101999759674072,zeroshot_retrieval,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/smallnorb_label_azimuth,0.0550617283950617,0.2645267489711934,0.055379474051494,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/pets,0.9037884982284,0.9970019078768056,0.9039815014388496,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/dsprites_label_x_position,0.0427924262152777,0.1601019965277778,0.0430371102717507,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/dsprites_label_orientation,0.0259874131944444,0.1214463975694444,0.0262399607702056,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,imagenet_sketch,0.5442040519562185,0.8052231327005837,0.5451807843137254,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,imagenet-r,0.8039,0.9392333333333334,0.7907448605291261,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,imagenet-a,0.3677333333333333,0.7024,0.3814206048810433,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/clevr_closest_object_distance,0.1594666666666666,0.8705333333333334,0.1702024394180443,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/caltech101,0.8328402366863905,0.952827087442472,0.9177765781998192,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,voc2007,0.7626201923076923,0.9526575854700856,0.815718996924191,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/pcam,0.543701171875,,0.5435553179465629,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/eurosat,0.5796296296296296,0.9525925925925924,0.5888803943202612,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,objectnet,0.5381177990739744,0.7715085603531818,0.5274232792623416,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/resisc45,0.613015873015873,0.91,0.6150226494017114,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,cars,0.8441736102474816,0.9912946150976246,0.8456794155511405,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/cifar100,0.7372,0.9338,0.7372000000000001,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/dmlab,0.1485814822960193,0.8129316032548933,0.1482313831309264,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/clevr_count_all,0.2315333333333333,0.805,0.2332901934437162,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,vtab/dtd,0.5569148936170213,0.8558510638297873,0.5542553191489361,,,zeroshot_classification,13B +ViT-B-16-plus-240 laion400m_e32,ViT-B-16-plus,13034626688.0,370313744206.08,28.41,LAION-400M,gtsrb,0.4948535233570863,0.7578780680918448,0.4319824074083427,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/dtd,0.4457446808510638,0.7585106382978724,0.449468085106383,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,mnist,0.4955,0.8497,0.5259367109048434,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,gtsrb,0.4362628661916072,0.7091844813935075,0.370358797280688,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/dsprites_label_orientation,0.0197618272569444,0.1133355034722222,0.0176459217575104,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/pcam,0.50628662109375,,0.5062329426609509,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/dsprites_label_x_position,0.029541015625,0.1558973524305555,0.0292117961574083,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/dmlab,0.1590499230261711,0.8403782713877281,0.1701282125753662,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/pets,0.8893431452711911,0.9940038157536112,0.884512216368383,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,imagenetv2,0.6188,0.8745,0.6202000000000001,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,cars,0.6445715707001617,0.9434149981345604,0.6469166001999892,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/kitti_closest_vehicle_distance,0.270042194092827,,0.3517916468296155,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/resisc45,0.5850793650793651,0.910952380952381,0.5919202546199539,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/svhn,0.3048171481253841,0.7613706207744315,0.3503741918499782,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,imagenet-r,0.7766666666666666,0.9304333333333332,0.7605432098970494,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,imagenet1k,0.68352,0.91864,0.68396,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,sun397,0.6434889751181566,0.9243614027989776,0.6527406670624641,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,objectnet,0.5544309249488533,0.7926671691611931,0.5363732822578842,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/smallnorb_label_elevation,0.1186008230452674,0.560082304526749,0.1176434679315522,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,stl10,0.98275,1.0,0.982875,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/diabetic_retinopathy,0.0633231778767283,1.0,0.2107285863733837,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/eurosat,0.5559259259259259,0.8868518518518519,0.5469811732579133,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,flickr30k,,,,0.855400025844574,0.9629999995231628,zeroshot_retrieval,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,imagenet_sketch,0.481439996855902,0.763229774607479,0.4822572549019607,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/cifar10,0.9083,0.9944,0.9082,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,mscoco_captions,,,,0.5836865305900574,0.7681999802589417,zeroshot_retrieval,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,country211,0.2279620853080568,0.486303317535545,0.2282938388625592,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/smallnorb_label_azimuth,0.0558847736625514,0.2832098765432099,0.0522661133926831,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,fer2013,0.4582056283087211,0.9531903037057676,0.4167779537443768,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,imagenet-a,0.5006666666666667,0.8033333333333333,0.4832835476168289,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,voc2007,0.7843883547008547,0.9570646367521368,0.835061321772101,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/flowers,0.7136119694259229,0.8591640917222313,0.691284904068223,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,renderedsst2,0.6112026359143328,,0.6113264286955011,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,flickr8k,,,,0.5640835762023926,0.7279693484306335,zeroshot_retrieval,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/clevr_closest_object_distance,0.1583333333333333,0.8006,0.1676244908434004,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/cifar100,0.6691,0.8925,0.6685000000000001,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,fgvc_aircraft,0.2418241824182418,0.6054605460546054,0.2405525846702317,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/caltech101,0.8254437869822485,0.954963839579224,0.908884143116176,,,zeroshot_classification,13B +ViT-B-16 openai,ViT-B-16,12800000000.0,263296000000.0,20.57,CLIP-WIT,vtab/clevr_count_all,0.2044,0.7866666666666666,0.2151124081246672,,,zeroshot_classification,13B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,sun397,0.7521562425290105,0.9608106368501388,0.7512820500659019,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,fer2013,0.5175536361103371,0.9651713569239344,0.5055924943171644,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/eurosat,0.7174074074074074,0.9561111111111112,0.7202760268647987,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,gtsrb,0.5844813935075218,0.820744259699129,0.5442606899522975,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/cifar100,0.8468,0.9733,0.8471000000000001,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,imagenet1k,0.77972,0.95216,0.77952,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/pets,0.9438539111474517,0.9986372308530936,0.9434557685576204,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,renderedsst2,0.6408566721581549,,0.6410094956864107,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,imagenet_sketch,0.665743087897188,0.8816640138340309,0.6655023529411764,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,voc2007,0.7761084401709402,0.9418402777777778,0.8508423918048074,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,imagenetv2,0.7082,0.9169,0.709,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,mscoco_captions,,,,0.734306275844574,0.8604000210762024,zeroshot_retrieval,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,cars,0.9345852505907224,0.9988807362268376,0.9351484667320789,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,mnist,0.7294,0.9415,0.7332910901261492,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/dsprites_label_orientation,0.0260687934027777,0.1259223090277778,0.0268337475785376,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/caltech101,0.8504273504273504,0.953155818540434,0.9440706929933655,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,stl10,0.984375,0.999875,0.9849999999999998,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/smallnorb_label_elevation,0.111275720164609,0.5548971193415638,0.1102182875784799,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/diabetic_retinopathy,0.2380126552613077,1.0,0.233320813717688,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/dsprites_label_x_position,0.0313856336805555,0.1553955078125,0.0307666564982354,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/dmlab,0.1419837255333186,0.8292060699362217,0.16573619863836,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/kitti_closest_vehicle_distance,0.1111111111111111,,0.2722929936305732,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,flickr30k,,,,0.9409999847412108,0.9929999709129332,zeroshot_retrieval,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,imagenet-a,0.5922666666666667,0.8565333333333334,0.5810468077571583,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/svhn,0.5612707437000615,0.8849492931776275,0.5565312569182044,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/clevr_closest_object_distance,0.1676666666666666,0.8819333333333333,0.1954414937508546,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/resisc45,0.6957142857142857,0.9571428571428572,0.706242238089474,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,flickr8k,,,,0.745371401309967,0.8561364412307739,zeroshot_retrieval,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/clevr_count_all,0.2784,0.8929333333333334,0.2563239722391655,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/flowers,0.8020816392909416,0.9253537160513904,0.7985485908748879,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,objectnet,0.697049639280715,0.877516959190266,0.6846202591899297,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,imagenet-r,0.8932,0.9735333333333334,0.8804663010091829,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/pcam,0.53631591796875,,0.53614377703907,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/dtd,0.6787234042553192,0.923936170212766,0.6813829787234043,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/smallnorb_label_azimuth,0.0549794238683127,0.2670781893004115,0.0559609415916413,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,vtab/cifar10,0.9742,0.9994,0.9742999999999998,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,fgvc_aircraft,0.4275427542754275,0.8361836183618362,0.4260962566844919,,,zeroshot_classification,34B +ViT-H-14 laion2b_s32b_b79k,ViT-H-14,34725395968.0,6631508868008.96,190.97,LAION-2B,country211,0.3000947867298578,0.556872037914692,0.2994312796208531,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/cifar100,0.7557,0.9386,0.7554000000000001,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,imagenet1k,0.665,0.89844,0.66506,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/pets,0.9070591441809758,0.995366584900518,0.9070894162634328,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,gtsrb,0.4934283452098179,0.7430720506730008,0.4353727539920664,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/eurosat,0.482037037037037,0.935,0.493913656654034,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,sun397,0.6867793368519779,0.9372344925244128,0.6845985471139586,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,fer2013,0.4690721649484536,0.931178601281694,0.4334946917742944,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,voc2007,0.7910657051282052,0.9600026709401708,0.8052125971178338,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,imagenetv2,0.5819,0.8386,0.5815,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,imagenet_sketch,0.5363831083338246,0.7926467409459804,0.53684,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,renderedsst2,0.5661724327292696,,0.5658672775172254,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,stl10,0.96575,0.999375,0.966625,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/smallnorb_label_elevation,0.1149794238683127,0.5761316872427984,0.115904554765943,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/dsprites_label_orientation,0.0342746310763888,0.1416965060763889,0.034365141983162,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/caltech101,0.8392504930966469,0.9510190664036818,0.9090841082001052,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,mnist,0.6922,0.9403,0.6883700135057857,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,mscoco_captions,,,,0.654218316078186,0.7982000112533569,zeroshot_retrieval,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,cars,0.8599676657132197,0.9912946150976246,0.8615494787047302,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,flickr30k,,,,0.8835999965667725,0.9629999995231628,zeroshot_retrieval,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,imagenet-a,0.2633333333333333,0.574,0.2790514196577626,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/dsprites_label_x_position,0.0302191840277777,0.1466335720486111,0.0300817149220147,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/dmlab,0.157994281944139,0.8222564328128437,0.1661260800820199,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/kitti_closest_vehicle_distance,0.2587904360056259,,0.3397102822066769,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/diabetic_retinopathy,0.7354112959925005,1.0,0.1999235670840696,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,flickr8k,,,,0.6287232637405396,0.7776541709899902,zeroshot_retrieval,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/clevr_count_all,0.1573333333333333,0.6964666666666667,0.1495026928557915,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/resisc45,0.6087301587301587,0.9147619047619048,0.6152225643499313,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/clevr_closest_object_distance,0.1902,0.9085333333333332,0.1387289271305892,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/svhn,0.4102258758451137,0.8022818070067609,0.4216815643098484,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/pcam,0.585723876953125,,0.5857677281000415,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,imagenet-r,0.7640666666666667,0.9159,0.7521727338627011,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/flowers,0.7160513904699951,0.8744511302650837,0.6998995164388323,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,objectnet,0.4899860019381932,0.7341983417680629,0.4820376550831692,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/dtd,0.5574468085106383,0.8648936170212767,0.5622340425531915,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/smallnorb_label_azimuth,0.0623868312757201,0.2708641975308642,0.0631906837062103,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,vtab/cifar10,0.9351,0.998,0.936,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,country211,0.1663981042654028,0.3825118483412322,0.1670142180094786,,,zeroshot_classification,34B +ViT-B-32 laion2b_s34b_b79k,ViT-B-32,39337362620.0,291096483388.0,7.4,LAION-2B,fgvc_aircraft,0.2463246324632463,0.5724572457245725,0.2460249554367201,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/dmlab,0.1889597536837475,0.819793270288102,0.1681683759314615,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,fgvc_aircraft,0.2304230423042304,0.5295529552955296,0.2319696969696969,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/eurosat,0.5016666666666667,0.959074074074074,0.511474800858698,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,imagenet-r,0.7590333333333333,0.9128666666666668,0.7444515544684158,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/caltech101,0.8310322156476002,0.9529914529914528,0.903296243135675,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,imagenetv2,0.5716,0.8386,0.5721,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/pcam,0.503753662109375,,0.5035515136049098,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,mscoco_captions,,,,0.6467413306236267,0.7950000166893005,zeroshot_retrieval,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/dtd,0.5404255319148936,0.8398936170212766,0.5367021276595745,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/dsprites_label_x_position,0.0313313802083333,0.1560872395833333,0.031335128135504,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/cifar100,0.7524,0.9418,0.7528999999999999,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,imagenet-a,0.2618666666666667,0.5721333333333334,0.2839019082932269,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,imagenet_sketch,0.5293285385839769,0.78944369117098,0.5286741176470588,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,voc2007,0.7889957264957265,0.9573317307692308,0.8054447759101763,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,flickr8k,,,,0.621826708316803,0.7605981826782227,zeroshot_retrieval,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/cifar10,0.9401,0.9992,0.9405,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,mnist,0.6367,0.9218,0.6276012948452819,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/pets,0.8934314527119106,0.9956391387298992,0.8906060208128682,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/kitti_closest_vehicle_distance,0.1659634317862166,,0.3247233185334074,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/svhn,0.3852181929932391,0.7822295636140135,0.379296565517112,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/dsprites_label_orientation,0.0268283420138888,0.1092258029513889,0.025387675404758,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,stl10,0.9645,0.999375,0.965125,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/diabetic_retinopathy,0.2699554722287321,1.0,0.2211405088000341,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/resisc45,0.6174603174603175,0.921904761904762,0.624279367877562,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/smallnorb_label_azimuth,0.0517695473251028,0.2697942386831276,0.0537673960190341,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,flickr30k,,,,0.8812000155448914,0.9639999866485596,zeroshot_retrieval,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/clevr_count_all,0.1979333333333333,0.8076,0.1820160989597282,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/clevr_closest_object_distance,0.1674,0.8695333333333334,0.1827530663763387,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,objectnet,0.487670937870141,0.7249919241951115,0.4750858280106649,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,renderedsst2,0.5370675453047776,,0.5373060332349024,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,fer2013,0.4774310392867094,0.9402340484814712,0.4649079545536754,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/smallnorb_label_elevation,0.1087242798353909,0.540164609053498,0.1086253991970707,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,imagenet1k,0.65528,0.894,0.6563199999999999,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,country211,0.1650710900473933,0.3788625592417061,0.164218009478673,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,cars,0.8415619947767691,0.9900509886829996,0.8435641961196442,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,gtsrb,0.3651623119556611,0.7007917656373713,0.3512103003164681,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,sun397,0.684701252367729,0.9328576420177648,0.6783238400960281,,,zeroshot_classification,34B +ViT-B-32 laion2b_e16,ViT-B-32,34725396128.0,256967931347.2,7.4,LAION-2B,vtab/flowers,0.6885672467067816,0.8466417303626605,0.6732279033655394,,,zeroshot_classification,34B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,sun397,0.6246666789267521,0.91313422954558,0.6346910684418603,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,objectnet,0.4417465274038979,0.7008721869279638,0.4272611771980346,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/smallnorb_label_elevation,0.1178600823045267,0.5817283950617284,0.1208963734895024,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,imagenet-r,0.6932,0.8887,0.6785851251044699,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,imagenet1k,0.63334,0.88778,0.63284,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/eurosat,0.5072222222222222,0.9255555555555556,0.489609055911575,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,flickr30k,,,,0.8338000178337097,0.9490000009536744,zeroshot_retrieval,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,imagenet_sketch,0.4230383776454636,0.7030792509186661,0.4230898039215686,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/cifar10,0.8982,0.9963,0.8995000000000001,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,stl10,0.97075,0.999375,0.971875,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/diabetic_retinopathy,0.2629716428404031,1.0,0.2194476579174435,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/pcam,0.6219482421875,,0.6220625731388706,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/dsprites_label_x_position,0.0346001519097222,0.1698269314236111,0.0339338982697889,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/dtd,0.4425531914893617,0.7638297872340426,0.4430851063829787,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,mnist,0.4855,0.8418,0.4575381785680641,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,gtsrb,0.3311163895486936,0.7250989707046714,0.3196447660118034,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/dsprites_label_orientation,0.0237358940972222,0.1186116536458333,0.0218059467808842,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,cars,0.5940803382663847,0.917174480785972,0.5967107342155968,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/kitti_closest_vehicle_distance,0.2742616033755274,,0.405770386325608,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/resisc45,0.5376190476190477,0.8671428571428571,0.5417275836816031,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/svhn,0.1236939151813153,0.6480485556238476,0.1332639799678708,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/dmlab,0.1945898394545854,0.8513305476138113,0.1635130198328585,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/pets,0.8732624693376942,0.9926410466067048,0.8695864391489154,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,imagenetv2,0.5596,0.8341,0.5602,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,flickr8k,,,,0.5319737792015076,0.6991719007492065,zeroshot_retrieval,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,renderedsst2,0.5897858319604613,,0.5895015488390944,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/clevr_closest_object_distance,0.1716,0.9095333333333332,0.1619443104834767,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,voc2007,0.765625,0.959869123931624,0.8071517771314477,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/flowers,0.6630346397788258,0.8573751829565783,0.6645264657992297,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/caltech101,0.819197896120973,0.9465811965811964,0.8786521640800292,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/clevr_count_all,0.2352,0.7871333333333334,0.2199570643185355,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/cifar100,0.6453,0.888,0.6451,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,fgvc_aircraft,0.1971197119711971,0.5022502250225023,0.197344028520499,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,country211,0.1715165876777251,0.4024170616113744,0.1707582938388625,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,mscoco_captions,,,,0.5584565997123718,0.748199999332428,zeroshot_retrieval,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,imagenet-a,0.3137333333333333,0.6410666666666667,0.3236449813371542,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,vtab/smallnorb_label_azimuth,0.06,0.288312757201646,0.0630119225348046,,,zeroshot_classification,13B +ViT-B-32 openai,ViT-B-32,12800000000.0,94720000000.0,7.4,CLIP-WIT,fer2013,0.409445528002229,0.9413485650599052,0.3587300457745208,,,zeroshot_classification,13B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,gtsrb,0.5609659540775931,0.8069675376088677,0.5169427663206733,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/pets,0.9321340964840557,0.9978195693649496,0.9313974108097984,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,country211,0.2636018957345971,0.5149289099526067,0.2629857819905213,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/flowers,0.758985200845666,0.8894129126687266,0.7455642498757189,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/smallnorb_label_elevation,0.1094650205761317,0.5571193415637861,0.1098932195729559,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/resisc45,0.6666666666666666,0.941904761904762,0.6759805529181834,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/svhn,0.4630454824830977,0.817340196681008,0.4869931863892911,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/caltech101,0.8504273504273504,0.9681130834976988,0.9394300669046936,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/diabetic_retinopathy,0.210639793766112,1.0,0.2335698910327324,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,objectnet,0.6550016151609777,0.8503284160654678,0.6433184742666794,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,imagenetv2,0.6769,0.9012,0.6781,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,flickr8k,,,,0.7120504379272461,0.8223952651023865,zeroshot_retrieval,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/dtd,0.6276595744680851,0.9069148936170212,0.6324468085106383,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,imagenet-a,0.5388,0.8212,0.5362716338708938,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,voc2007,0.805221688034188,0.9551282051282052,0.8491537874687232,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/cifar100,0.8336,0.9666,0.8325000000000001,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/dsprites_label_orientation,0.0200330946180555,0.1053195529513889,0.0222572574909185,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/pcam,0.5526123046875,,0.5526478181769814,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/eurosat,0.6514814814814814,0.9551851851851852,0.6638062361650154,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,imagenet_sketch,0.6327693607655879,0.8639588123170037,0.6325447058823529,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,fgvc_aircraft,0.3693369336933693,0.744974497449745,0.3649286987522281,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,sun397,0.743319785938908,0.9583279695459478,0.7348385903018446,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,mnist,0.5487,0.8411,0.5430718178404617,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/dmlab,0.2242797448867385,0.8738508906971629,0.1816019549723685,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/kitti_closest_vehicle_distance,0.2292545710267229,,0.3081761474014508,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,cars,0.9261285909712722,0.9976371098122124,0.9261518670531818,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,fer2013,0.537057676232934,0.9492894956812482,0.5338791359180816,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/dsprites_label_x_position,0.0315348307291666,0.1596544053819444,0.0323590170008084,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,flickr30k,,,,0.929199993610382,0.9869999885559082,zeroshot_retrieval,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,imagenet1k,0.75202,0.94252,0.7526400000000001,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/clevr_closest_object_distance,0.161,0.9128666666666668,0.1739135544326629,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/smallnorb_label_azimuth,0.0562962962962962,0.274156378600823,0.0567608380809354,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,stl10,0.988625,0.999875,0.988625,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/clevr_count_all,0.3109333333333333,0.8006,0.3066391557930237,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,renderedsst2,0.5930807248764415,,0.5925413265010712,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,imagenet-r,0.8741,0.9655666666666668,0.8599962924086103,,,zeroshot_classification,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,mscoco_captions,,,,0.7107957005500793,0.8399999737739563,zeroshot_retrieval,34B +ViT-L-14 laion2b_s32b_b82k,ViT-L-14,32000000000.0,2807360000000.0,87.73,LAION-2B,vtab/cifar10,0.9664,0.9987,0.9665,,,zeroshot_classification,34B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/caltech101,0.8522353714661407,0.963346482577252,0.944284654839904,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,imagenet1k,0.76664,0.9485,0.76656,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/cifar100,0.8391,0.9729,0.8388,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,imagenetv2,0.6961,0.9086,0.6957000000000001,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,stl10,0.985875,0.99975,0.9864999999999998,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/diabetic_retinopathy,0.4342160768689946,1.0,0.2167811161586062,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,imagenet-a,0.5710666666666666,0.8348,0.5639196371233688,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/smallnorb_label_elevation,0.1134156378600823,0.5579423868312757,0.1146512139135114,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,renderedsst2,0.6457990115321252,,0.6459400874297956,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/clevr_count_all,0.3319333333333333,0.9534,0.3193231509666999,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/flowers,0.7760611481541714,0.9046999512115792,0.7813275676765017,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,imagenet-r,0.8865,0.9695666666666668,0.8748158307459671,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/dtd,0.6813829787234043,0.925531914893617,0.6829787234042553,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,imagenet_sketch,0.6521841655367565,0.8748649020416986,0.6524090196078433,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,mscoco_captions,,,,0.7239903807640076,0.853600025177002,zeroshot_retrieval,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,flickr8k,,,,0.7296255230903625,0.8460017442703247,zeroshot_retrieval,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/smallnorb_label_azimuth,0.0588477366255144,0.268395061728395,0.0601925439678357,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,gtsrb,0.4973871733966746,0.7704671417260491,0.4655936453259506,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/pets,0.9427636958299264,0.9983646770237122,0.9434000102313552,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,objectnet,0.6746527403897922,0.8668030580381177,0.6650572756513145,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/resisc45,0.7171428571428572,0.958095238095238,0.7258469461953507,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/eurosat,0.647962962962963,0.9805555555555556,0.6445566610022502,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/clevr_closest_object_distance,0.1772666666666666,0.7803333333333333,0.2270014558851883,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/dsprites_label_x_position,0.035400390625,0.1624348958333333,0.0364155761076967,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,fgvc_aircraft,0.378037803780378,0.8028802880288028,0.3781639928698752,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,mnist,0.6904,0.9518,0.6833555055021581,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,flickr30k,,,,0.9348000288009644,0.99099999666214,zeroshot_retrieval,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/cifar10,0.9705,0.9994,0.9711,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/svhn,0.6033343577135832,0.8973570989551322,0.5683458085959752,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/kitti_closest_vehicle_distance,0.1462728551336146,,0.1818997858588953,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/dmlab,0.1901913349461183,0.8472839234660215,0.1733383864929211,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/dsprites_label_orientation,0.0307752821180555,0.1437852647569444,0.0304426618193977,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,fer2013,0.4657286152131513,0.9445528002229032,0.4812190866355833,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,vtab/pcam,0.5509033203125,,0.5508520491113902,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,sun397,0.7540228405391985,0.9617025580668296,0.7523924485563404,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,cars,0.9277453053102848,0.9983832856609874,0.9288577913034778,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,voc2007,0.8102964743589743,0.9655448717948718,0.8579252085748035,,,zeroshot_classification,13B +ViT-g-14 laion2b_s12b_b42k,ViT-g-14,12208147020.0,3549396664594.8003,290.74,LAION-2B,country211,0.2872511848341232,0.542085308056872,0.2880094786729857,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,flickr30k,,,,0.8546000123023987,0.9409999847412108,zeroshot_retrieval,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/kitti_closest_vehicle_distance,0.2883263009845288,,0.3645688070267072,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/flowers,0.6828752642706131,0.8578630671653927,0.6628139602370955,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,imagenetv2,0.5512,0.8156,0.5509,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/smallnorb_label_elevation,0.0972839506172839,0.5397530864197531,0.0973286727349915,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/dsprites_label_x_position,0.0293918185763888,0.150390625,0.0306791200330755,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/cifar100,0.7021,0.9244,0.703,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/eurosat,0.5155555555555555,0.9201851851851852,0.526225901185735,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/clevr_closest_object_distance,0.1593333333333333,0.9299333333333332,0.1673057808855792,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,voc2007,0.7567441239316239,0.9461805555555556,0.7914514618991711,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,imagenet_sketch,0.4932893159621922,0.7566861207726621,0.4940521568627451,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,imagenet1k,0.62918,0.87652,0.6289,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,cars,0.7920656634746922,0.9787339883099117,0.7926165075935756,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,country211,0.1469194312796208,0.3500473933649289,0.1470142180094787,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,gtsrb,0.4199524940617577,0.6838479809976247,0.393417229364651,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,imagenet-a,0.2166666666666666,0.5310666666666667,0.2348332752565157,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,fer2013,0.4267205349679576,0.9361939258846476,0.3989364402674789,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,mscoco_captions,,,,0.6084766387939453,0.7675999999046326,zeroshot_retrieval,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/dsprites_label_orientation,0.0193684895833333,0.1180826822916666,0.0197744129948227,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,mnist,0.3742,0.7294,0.3706020613065869,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/resisc45,0.546031746031746,0.902063492063492,0.5542849348347576,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/clevr_count_all,0.1633333333333333,0.7125333333333334,0.1575975877364315,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/pets,0.8683565004088307,0.9934587080948488,0.8661667839491306,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/caltech101,0.8328402366863905,0.94543063773833,0.9085289082247568,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/svhn,0.2786954517516902,0.7308312845728334,0.2795999671407248,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,renderedsst2,0.5255354200988468,,0.5258471570841294,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/pcam,0.545867919921875,,0.5459467330999297,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/dtd,0.5430851063829787,0.8356382978723405,0.5473404255319149,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,stl10,0.955,0.9995,0.955375,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,objectnet,0.4393776246365888,0.684612899752342,0.4268760394558317,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/cifar10,0.9078,0.9977,0.9083,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/dmlab,0.1721574664614031,0.8585001099626127,0.1577427840925754,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,flickr8k,,,,0.5787171125411987,0.7392163872718811,zeroshot_retrieval,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,imagenet-r,0.7341666666666666,0.9035,0.7214778957504825,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,fgvc_aircraft,0.168016801680168,0.4119411941194119,0.1658110516934046,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/smallnorb_label_azimuth,0.0454320987654321,0.2672427983539094,0.0450240211431134,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,vtab/diabetic_retinopathy,0.337965783923131,1.0,0.2591163084325771,,,zeroshot_classification,13B +ViT-B-32-quickgelu laion400m_e32,ViT-B-32,13034626688.0,96456237491.20001,7.4,LAION-400M,sun397,0.6696489324530592,0.9273222134358275,0.6609448269493161,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/pcam,0.605010986328125,,0.605165824864527,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,flickr8k,,,,0.6204919219017029,0.7667778730392456,zeroshot_retrieval,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,gtsrb,0.4345209817893903,0.707680126682502,0.400638686800972,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/dtd,0.5132978723404256,0.7787234042553192,0.5095744680851063,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/cifar10,0.9172,0.9975,0.9172,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,mscoco_captions,,,,0.6364254355430603,0.7961999773979187,zeroshot_retrieval,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/dmlab,0.1508247195953375,0.8088849791071036,0.1720986035113953,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/clevr_count_all,0.2877333333333333,0.9075333333333332,0.2821869879006831,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,fer2013,0.4286709389802173,0.898300362217888,0.392124222029496,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,imagenet1k,0.67002,0.90424,0.67026,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,flickr30k,,,,0.881600022315979,0.9679999947547911,zeroshot_retrieval,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,renderedsst2,0.5469522240527183,,0.5464163192635053,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,objectnet,0.5149133196941962,0.7512652094325402,0.5017005288059357,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,voc2007,0.7683627136752137,0.952590811965812,0.8035754023986389,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/cifar100,0.7101,0.9209,0.7106999999999999,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/kitti_closest_vehicle_distance,0.189873417721519,,0.2568338943834677,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,country211,0.1812322274881516,0.4011374407582938,0.181563981042654,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/diabetic_retinopathy,0.087368174361378,1.0,0.2520359622114083,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/resisc45,0.5853968253968254,0.896984126984127,0.5932699170625959,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,fgvc_aircraft,0.1746174617461746,0.45004500450045,0.1753386809269162,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/clevr_closest_object_distance,0.2450666666666666,0.8254,0.1666666666666666,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,sun397,0.6960663515824705,0.9390183349577946,0.6804128851625355,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,imagenet-a,0.3318666666666666,0.6664,0.3409181030776702,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/smallnorb_label_elevation,0.0984362139917695,0.5293827160493827,0.0977694426163014,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,mnist,0.6659,0.9224,0.6665327286676481,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,imagenet-r,0.779,0.9289333333333334,0.7643246651538985,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/flowers,0.6929582045861116,0.8668076109936576,0.6668176645957112,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/svhn,0.3860633066994468,0.8061232329440688,0.3685311302620919,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,cars,0.8368362144011939,0.987439373212287,0.8375394945435981,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/pets,0.8923412373943854,0.9967293540474244,0.8919759072052595,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/eurosat,0.5031481481481481,0.92,0.5110567650187513,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/dsprites_label_x_position,0.0311008029513888,0.1568060980902778,0.0321637232587243,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,imagenet_sketch,0.5230010414824422,0.7913694511584036,0.5233670588235293,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/caltech101,0.8353057199211046,0.9546351084812624,0.9005042720791782,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/dsprites_label_orientation,0.0303819444444444,0.1311170789930555,0.0332405586865836,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,imagenetv2,0.5958,0.8547,0.5955999999999999,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,vtab/smallnorb_label_azimuth,0.0590123456790123,0.279835390946502,0.0603763349553147,,,zeroshot_classification,13B +ViT-B-16 laion400m_e32,ViT-B-16,13034626688.0,268122270972.16,20.57,LAION-400M,stl10,0.96975,0.999875,0.96975,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/cifar10,0.9467,0.999,0.9466,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/dtd,0.6031914893617021,0.8867021276595745,0.6042553191489363,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,gtsrb,0.5,0.7502771179730799,0.4499584478173962,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/pcam,0.485626220703125,,0.4856418903784925,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,flickr8k,,,,0.6753677129745483,0.8063279986381531,zeroshot_retrieval,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,mscoco_captions,,,,0.6805678009986877,0.8216000199317932,zeroshot_retrieval,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/dmlab,0.1856168902573125,0.82608313173521,0.1925396140565279,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,flickr30k,,,,0.9082000255584716,0.977999985218048,zeroshot_retrieval,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,imagenet1k,0.72734,0.9293,0.72694,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,fer2013,0.5009752020061299,0.932153803287824,0.449919123283142,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/clevr_count_all,0.2424666666666666,0.7876,0.2312503165591237,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/cifar100,0.7744,0.9471,0.7737999999999998,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/kitti_closest_vehicle_distance,0.2081575246132208,,0.1791674645508319,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,voc2007,0.7555422008547008,0.9489182692307692,0.830992972154603,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,objectnet,0.5989555292344136,0.8103262625174976,0.586320244179702,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,renderedsst2,0.5634266886326195,,0.5635892536622082,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/diabetic_retinopathy,0.0715256620576517,1.0,0.2196341124982623,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,country211,0.2307582938388625,0.4708056872037914,0.2308530805687204,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,sun397,0.7259778950659286,0.9500616069294004,0.7127784763377728,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,imagenet-a,0.4661333333333333,0.7688,0.4728184257301568,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/clevr_closest_object_distance,0.1486,0.9095333333333332,0.1443124682607226,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,fgvc_aircraft,0.2505250525052505,0.6012601260126013,0.2483244206773618,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/resisc45,0.6730158730158731,0.938095238095238,0.6781338184038964,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/smallnorb_label_elevation,0.1097119341563786,0.5409053497942387,0.1081320376350696,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/flowers,0.7537811026183119,0.8923402179216132,0.7256696912813558,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,imagenet-r,0.8475333333333334,0.9550666666666666,0.8331685531673508,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,mnist,0.764,0.9231,0.7589335620721703,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/svhn,0.381760909649662,0.7632913337430854,0.4057750407393451,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/eurosat,0.6177777777777778,0.957037037037037,0.6299267597724122,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/pets,0.9185064050149904,0.9956391387298992,0.9161666963118203,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,cars,0.8959084690958836,0.9960203954732,0.8961635505798664,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/caltech101,0.841715976331361,0.940828402366864,0.9341112975275198,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,imagenet_sketch,0.5961406197803062,0.8388060288077973,0.5956784313725489,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/dsprites_label_x_position,0.0298394097222222,0.1414794921875,0.0308127750442299,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/smallnorb_label_azimuth,0.0516872427983539,0.2725925925925926,0.0526600212836742,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,imagenetv2,0.6559,0.8854,0.6541,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,vtab/dsprites_label_orientation,0.0257297092013888,0.1208224826388889,0.0259727501505128,,,zeroshot_classification,13B +ViT-L-14 laion400m_e32,ViT-L-14,13034626688.0,1143527799338.24,87.73,LAION-400M,stl10,0.980125,0.999875,0.980875,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,flickr30k,,,,0.8077999949455261,0.9190000295639038,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/kitti_closest_vehicle_distance,0.2630098452883263,,0.213933170542953,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/clevr_count_all,0.1329333333333333,0.6432666666666667,0.1315177265770149,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,stl10,0.9425,0.99925,0.9425,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/dtd,0.4074468085106383,0.6787234042553192,0.4074468085106384,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,renderedsst2,0.5211422295442065,,0.520632490880667,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,imagenet-a,0.1758666666666666,0.4649333333333333,0.189391004090539,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,flickr8k,,,,0.7889999747276306,0.9010000228881836,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/eurosat,0.4137037037037037,0.9062962962962964,0.4320865943595451,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,fer2013,0.4302033992755642,0.9204513792142658,0.37026350906683,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/cifar10,0.8793,0.9963,0.8793,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,imagenetv2,0.502,0.7692,0.5021,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/dmlab,0.1770398064658016,0.8065977567627007,0.1736206433456909,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,mnist,0.4069,0.9149,0.4079686211647755,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/cifar100,0.6377,0.8817,0.6376999999999999,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/dsprites_label_orientation,0.0297309027777777,0.1425103081597222,0.0302075237160539,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,voc2007,0.7058627136752137,0.9206730769230768,0.7394604380406663,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,cars,0.746922024623803,0.9656759109563487,0.7481875391857694,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/caltech101,0.8159408381265407,0.9456039441248972,0.8782232895450505,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/svhn,0.2280270436385986,0.6697141979102643,0.2405672653796698,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/dsprites_label_x_position,0.0279405381944444,0.1617160373263889,0.0272734594824477,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,mscoco_captions,,,,0.5582966804504395,0.7221999764442444,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/resisc45,0.4826984126984127,0.827936507936508,0.4900311201949828,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,imagenet_sketch,0.4276955727170901,0.697498477077561,0.4278176470588236,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/smallnorb_label_elevation,0.1174485596707819,0.5479012345679012,0.1167813118235797,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,objectnet,0.3961451491331969,0.6564014213416604,0.3853304945231068,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/clevr_closest_object_distance,0.1588,0.7975333333333333,0.1715900231551288,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,country211,0.1142180094786729,0.293175355450237,0.114218009478673,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,sun397,0.6114165915736433,0.8952222446990455,0.5897540800936756,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/pets,0.8135731807031888,0.9855546470427908,0.8106187831401711,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/pcam,0.5634765625,,0.5636385516013541,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,gtsrb,0.3539192399049881,0.63729216152019,0.3205803198411894,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/smallnorb_label_azimuth,0.0498765432098765,0.2673251028806584,0.050699724461204,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,fgvc_aircraft,0.1167116711671167,0.2931293129312931,0.1166221033868092,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,imagenet-r,0.6723333333333333,0.8728666666666667,0.6564335845667132,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,imagenet1k,0.57554,0.83606,0.5755,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/flowers,0.628882745161815,0.822735404130753,0.5860017223575912,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-80M,vtab/diabetic_retinopathy,0.6917037731427232,1.0,0.220723954150355,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,renderedsst2,0.6232839099395936,,0.6230675699148862,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,fer2013,0.5452772359988854,0.958623572025634,0.4765555190886895,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,mnist,0.4977,0.7647,0.5032891680615029,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/cifar100,0.8034,0.9624,0.8033999999999999,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/pcam,0.492950439453125,,0.4928820641756846,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,imagenet_sketch,0.6078916858260135,0.8481204189510503,0.6080298039215686,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/dsprites_label_orientation,0.0306939019097222,0.1248236762152777,0.0309446273599094,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/kitti_closest_vehicle_distance,0.250351617440225,,0.3632890819896964,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,flickr30k,,,,0.9172000288963318,0.984000027179718,zeroshot_retrieval,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,cars,0.9107076234299216,0.9966422086805125,0.9109031786252751,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,stl10,0.984125,0.999875,0.984125,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,imagenet-r,0.8551666666666666,0.9585,0.8419725344640705,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,imagenet1k,0.73096,0.93136,0.73104,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,flickr8k,,,,0.8971999883651733,0.962000012397766,zeroshot_retrieval,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/dtd,0.6069148936170212,0.874468085106383,0.6069148936170212,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,fgvc_aircraft,0.3189318931893189,0.7152715271527152,0.3183600713012477,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/flowers,0.7404456009107172,0.8814441372580908,0.734400597014451,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,country211,0.2329857819905213,0.4769194312796208,0.2329857819905213,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,voc2007,0.7856570512820513,0.9527243589743588,0.8348449719110584,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/dsprites_label_x_position,0.0359157986111111,0.1713595920138889,0.035883996300352,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,objectnet,0.624421233982987,0.8292774846559707,0.6126149835252711,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/svhn,0.5411416717885679,0.8555239704978488,0.5620048662182784,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/caltech101,0.8435497124075596,0.9479046836483156,0.9355442718115106,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/clevr_closest_object_distance,0.1168666666666666,0.7744666666666666,0.1882732501231087,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/cifar10,0.9611,0.999,0.9610999999999998,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/clevr_count_all,0.3752,0.9381333333333334,0.3699505757621409,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,mscoco_captions,,,,0.6915633678436279,0.8294000029563904,zeroshot_retrieval,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/pets,0.9285908967020988,0.9986372308530936,0.9273960033653732,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,imagenet-a,0.4869333333333333,0.7886666666666666,0.4761783035660016,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,imagenetv2,0.656,0.8882,0.6564000000000001,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/smallnorb_label_azimuth,0.051275720164609,0.2668312757201646,0.0519695838940528,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/dmlab,0.1537277325709259,0.8089729491972729,0.145929168286468,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/diabetic_retinopathy,0.2153737989219592,1.0,0.2076003791462033,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,sun397,0.7169759273222135,0.9499052908398772,0.7102585875097726,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,gtsrb,0.51243072050673,0.7658749010292953,0.4678911388016545,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/resisc45,0.6696825396825397,0.9204761904761904,0.6776857489956047,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/smallnorb_label_elevation,0.1167078189300411,0.5366255144032922,0.1156712635603865,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-2B_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,12800000000.0,1122944000000.0,87.73,LAION-2B,vtab/eurosat,0.5288888888888889,0.9422222222222222,0.5312667243659434,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,renderedsst2,0.4936847885777045,,0.4935223785536448,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/clevr_closest_object_distance,0.208,0.9219333333333334,0.1734274689849711,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/kitti_closest_vehicle_distance,0.2334739803094233,,0.1954179238844919,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/diabetic_retinopathy,0.0296695570658542,1.0,0.2020889227139848,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,cars,0.7436885959457779,0.9667951747295112,0.7444169799016871,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/dmlab,0.1982845832416978,0.8451286562568726,0.1923325371570016,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/flowers,0.599121808424134,0.823548544478777,0.5794234260697011,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/smallnorb_label_elevation,0.1093827160493827,0.5403292181069959,0.1086589549600785,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,gtsrb,0.433174980205859,0.692874109263658,0.4064017403597788,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet-a,0.1374666666666666,0.3964,0.1584236987871494,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/smallnorb_label_azimuth,0.0537448559670781,0.2568724279835391,0.054094065224706,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/svhn,0.2383604794099569,0.6257298709280885,0.2768558426639088,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/pets,0.8043063505042246,0.983646770237122,0.8011954627434265,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,stl10,0.9395,0.998875,0.9395,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,mnist,0.4981,0.8542,0.4951144573364048,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/cifar10,0.8622,0.9962,0.8622,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,objectnet,0.3588349305480779,0.6137611715300958,0.3512056559387272,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,fgvc_aircraft,0.1155115511551155,0.3027302730273027,0.1150891265597147,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/dsprites_label_x_position,0.0292019314236111,0.1475965711805555,0.0282836174704741,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,flickr30k,,,,0.8050000071525574,0.9160000085830688,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,voc2007,0.7403178418803419,0.9543936965811964,0.7554210526929961,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/dtd,0.4303191489361702,0.7329787234042553,0.4303191489361702,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet_sketch,0.4395645424354968,0.7037277211185129,0.4398909803921568,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,sun397,0.6246758739908417,0.9033139010978908,0.6093709490170997,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet1k,0.5712,0.8293,0.5711999999999999,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/clevr_count_all,0.1517333333333333,0.6965333333333333,0.1497668304593401,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/eurosat,0.4488888888888889,0.8422222222222222,0.4663866314932224,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/dsprites_label_orientation,0.0160861545138888,0.1102023654513889,0.0162468137720324,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/caltech101,0.8167625308134757,0.9393590797041906,0.879027900420164,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,country211,0.1158767772511848,0.2848815165876777,0.1158767772511848,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/pcam,0.5072021484375,,0.5072323860764016,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,flickr8k,,,,0.7940000295639038,0.9079999923706056,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/cifar100,0.663,0.9029,0.6629999999999999,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet-r,0.6550333333333334,0.8579666666666667,0.6435452602669054,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,fer2013,0.3083031485093341,0.8188910560044581,0.3027536991590182,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/resisc45,0.4726984126984127,0.8015873015873016,0.4789983802637705,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenetv2,0.4893,0.7599,0.4899,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,mscoco_captions,,,,0.5628548860549927,0.7337999939918518,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/dsprites_label_orientation,0.0237358940972222,0.114501953125,0.0242834838735771,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/pets,0.8956118833469611,0.9956391387298992,0.8946010018567978,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,imagenet_sketch,0.5492935604944094,0.8078366641120871,0.549541568627451,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/cifar10,0.9163,0.9973,0.9163,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/smallnorb_label_azimuth,0.0533333333333333,0.2774485596707819,0.0545005027546213,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/cifar100,0.7162,0.9188,0.7162000000000001,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/dsprites_label_x_position,0.030517578125,0.1544460720486111,0.0310940896088316,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/svhn,0.2220344191763982,0.6653733866011063,0.2724412453084024,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/resisc45,0.6092063492063492,0.9066666666666666,0.6156290950020897,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/clevr_closest_object_distance,0.1553333333333333,0.8999333333333334,0.1629551379223542,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,mnist,0.6955,0.9312,0.6910914800348824,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,imagenet-r,0.8023333333333333,0.9369333333333332,0.7879801818398815,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/caltech101,0.8405916187345933,0.9488907148726377,0.925977112578642,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,country211,0.1913744075829384,0.42260663507109,0.1913744075829384,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/dmlab,0.1619089509566747,0.8332087090389267,0.185608975321048,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/clevr_count_all,0.2469333333333333,0.8553333333333333,0.2429848646568625,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,mscoco_captions,,,,0.6580567955970764,0.8051999807357788,zeroshot_retrieval,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,flickr30k,,,,0.895799994468689,0.9739999771118164,zeroshot_retrieval,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,imagenetv2,0.6168,0.8659,0.6171,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,voc2007,0.7632211538461539,0.9501201923076924,0.8061581005915089,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/dtd,0.5409574468085107,0.8175531914893617,0.5409574468085107,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,imagenet1k,0.69,0.91254,0.69,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,fgvc_aircraft,0.2142214221422142,0.516951695169517,0.2140196078431372,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,renderedsst2,0.5496979681493684,,0.5495664698048752,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/flowers,0.7084078711985689,0.8825825337453245,0.6890539306750676,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,objectnet,0.5216431571013245,0.761386884892861,0.5095186395268402,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,imagenet-a,0.3668,0.6892,0.3745590856618023,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/diabetic_retinopathy,0.0467541598312631,1.0,0.1914109582226553,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/pcam,0.461761474609375,,0.4618402202806279,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/smallnorb_label_elevation,0.1072427983539094,0.5381069958847736,0.1063453251449081,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,gtsrb,0.4398258115597783,0.7004750593824228,0.4228521175207222,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,stl10,0.967375,0.999875,0.967375,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/kitti_closest_vehicle_distance,0.1111111111111111,,0.2699115673339399,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,cars,0.8656883472204949,0.9910458898146997,0.8655973989448195,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,vtab/eurosat,0.6007407407407407,0.9557407407407408,0.6035401827353057,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,fer2013,0.5247979938701588,0.9575090554471998,0.44707702046335,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,flickr8k,,,,0.8690000176429749,0.949999988079071,zeroshot_retrieval,34B +ViT-B-16 Model-B-16_Data-400M_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215895056.0,703820961301.92,20.57,LAION-400M,sun397,0.6998363278592051,0.9388712139323612,0.6865736314587024,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/cifar10,0.9507,0.9988,0.9507,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,mscoco_captions,,,,0.68400639295578,0.8212000131607056,zeroshot_retrieval,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,fgvc_aircraft,0.2598259825982598,0.6276627662766276,0.2595365418894831,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/smallnorb_label_azimuth,0.051440329218107,0.2634567901234568,0.0518701124144121,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,flickr8k,,,,0.8939999938011169,0.9610000252723694,zeroshot_retrieval,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,country211,0.2336966824644549,0.4733649289099526,0.233696682464455,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/eurosat,0.5461111111111111,0.9242592592592592,0.5651049536565794,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/cifar100,0.7912,0.9515,0.7911999999999999,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/caltech101,0.8455217748562038,0.9452752670501232,0.9336784228685904,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,mnist,0.6384,0.7872,0.6332639435849633,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,flickr30k,,,,0.9103999733924866,0.9829999804496764,zeroshot_retrieval,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,cars,0.8985200845665962,0.9966422086805125,0.8985695974226346,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,imagenet1k,0.73056,0.9301,0.7305799999999999,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/kitti_closest_vehicle_distance,0.250351617440225,,0.299339840959125,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/dsprites_label_x_position,0.0302327473958333,0.1550971137152778,0.0289072399615189,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/pets,0.9185064050149904,0.9967293540474244,0.916855959704084,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/smallnorb_label_elevation,0.1157201646090535,0.5345679012345679,0.1148406504063801,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/svhn,0.4287031346035648,0.7552627535341119,0.4543559591057532,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/clevr_count_all,0.3082666666666667,0.8043333333333333,0.3058184188823591,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/flowers,0.7285737518295657,0.8853472109286062,0.7138829747044899,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,objectnet,0.5962097555723054,0.8110261656078389,0.5837895726115563,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,imagenet_sketch,0.6014266344396628,0.8458016467212953,0.6019035294117648,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/diabetic_retinopathy,0.1302788844621513,1.0,0.2609871985127597,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,imagenetv2,0.6557,0.8862,0.6561,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,sun397,0.7168196112326903,0.948130643470585,0.7038768134719974,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/pcam,0.471710205078125,,0.4717085831378421,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/clevr_closest_object_distance,0.1535333333333333,0.9150666666666668,0.159853279831333,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,imagenet-a,0.4813333333333333,0.7841333333333333,0.4748023128208691,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/dsprites_label_orientation,0.0243326822916666,0.1102566189236111,0.0248290341061374,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,stl10,0.97825,0.999875,0.9782499999999998,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,voc2007,0.7693643162393162,0.9485844017094016,0.832493633538963,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/resisc45,0.6584126984126984,0.928095238095238,0.6658487712664471,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/dtd,0.5595744680851064,0.8622340425531915,0.5595744680851064,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,gtsrb,0.4703087885985748,0.7259699129057798,0.424934649086823,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,vtab/dmlab,0.1400923685946778,0.8252914009236859,0.1558513286011827,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,fer2013,0.497353023126219,0.9157146837559208,0.4320938258846923,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,imagenet-r,0.8573,0.9585,0.8421463151500908,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-L-14,13216000000.0,1159439680000.0,87.73,LAION-400M,renderedsst2,0.5392641405820977,,0.5392800793237218,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,imagenet_sketch,0.4775688262689382,0.7421643184185187,0.4777388235294117,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,gtsrb,0.3931116389548693,0.7148851939825811,0.386098297762605,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/svhn,0.356138598647818,0.7813844499078058,0.3183875932201201,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/eurosat,0.5361111111111111,0.960925925925926,0.5402061732362095,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,imagenet1k,0.61822,0.86812,0.6182000000000001,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/flowers,0.6292080013010246,0.8250121971052203,0.6097769489185794,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/dmlab,0.1959973608972949,0.8484715196833077,0.1537792141447116,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/diabetic_retinopathy,0.3324584016873682,1.0,0.2056859412699506,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,flickr8k,,,,0.8331999778747559,0.930999994277954,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/cifar100,0.6986,0.9257,0.6986,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,imagenet-a,0.2250666666666666,0.5396,0.2439647287803816,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/kitti_closest_vehicle_distance,0.3684950773558368,,0.4092196602069964,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/dsprites_label_orientation,0.0198160807291666,0.1240912543402777,0.0201250774947325,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,flickr30k,,,,0.8511999845504761,0.9459999799728394,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,renderedsst2,0.5458539264140582,,0.5454609605697411,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,mscoco_captions,,,,0.6108356714248657,0.7671999931335449,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,country211,0.1406635071090047,0.3352132701421801,0.1406635071090047,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/resisc45,0.5546031746031747,0.8653968253968254,0.5605999247121412,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,stl10,0.958375,0.9995,0.958375,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/smallnorb_label_azimuth,0.0613168724279835,0.2740740740740741,0.0615409789398097,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/pcam,0.6007080078125,,0.6008674742374801,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,objectnet,0.4549370087218692,0.7087864757187466,0.4439432398853564,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/clevr_count_all,0.1576666666666666,0.7054666666666667,0.1558386869852082,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,imagenet-r,0.7077,0.8910666666666667,0.695518246554982,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,sun397,0.6566379167662798,0.9261912205528072,0.6468643550699787,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,voc2007,0.7785122863247863,0.959067841880342,0.7991835611313458,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/caltech101,0.8277732128184059,0.9503697617091208,0.8979865006338752,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,cars,0.8224101479915433,0.984703395100112,0.8217522402775477,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,mnist,0.5574,0.8886,0.5658251613818176,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/dsprites_label_x_position,0.0319010416666666,0.1665988498263889,0.0314069883914952,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,fer2013,0.4380050153246029,0.9286709389802174,0.3782122141672192,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/dtd,0.4936170212765957,0.7909574468085107,0.4936170212765959,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/clevr_closest_object_distance,0.2238,0.8220666666666666,0.1717397203178954,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,fgvc_aircraft,0.1227122712271227,0.3444344434443444,0.1223262032085561,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/smallnorb_label_elevation,0.128559670781893,0.5576954732510289,0.1292634608884045,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/cifar10,0.9156,0.9985,0.9156000000000002,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,vtab/pets,0.8596347778686291,0.9923684927773236,0.8572559924412451,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2560013280.0,52659473169.6,20.57,LAION-2B,imagenetv2,0.538,0.802,0.5385999999999999,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,imagenet-a,0.2154666666666666,0.5288,0.2316582783524024,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,imagenetv2,0.5433,0.8124,0.5432,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,voc2007,0.7787793803418803,0.9537259615384616,0.8009688700344689,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,objectnet,0.45854420157209,0.7024335092064176,0.4471764695090219,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,cars,0.8087302574306678,0.985200845665962,0.8085231504422035,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,imagenet_sketch,0.4990469453123465,0.7658040047947493,0.4992627450980392,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,flickr8k,,,,0.8371999859809875,0.930999994277954,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/dsprites_label_orientation,0.0247395833333333,0.1142849392361111,0.0253118800162134,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,sun397,0.6687845964286371,0.9285267668315648,0.66045132085206,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,country211,0.1451658767772511,0.3481042654028436,0.1451658767772512,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/svhn,0.4105331899200983,0.8198755377996312,0.3637262577611196,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,mnist,0.4655,0.7838,0.4725722537775307,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/diabetic_retinopathy,0.0683149753925474,1.0,0.2064839395288543,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/smallnorb_label_azimuth,0.0554732510288065,0.2768724279835391,0.0559142116321244,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/pets,0.874897792313982,0.9942763695829926,0.8733712746094637,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/dmlab,0.2004398504508467,0.831845172641302,0.1670659455725167,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,stl10,0.953125,0.99925,0.953125,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/dtd,0.5377659574468086,0.8372340425531914,0.5377659574468084,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/clevr_closest_object_distance,0.1260666666666666,0.8023333333333333,0.1431105323488104,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/resisc45,0.5477777777777778,0.8884126984126984,0.5538971077387721,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/flowers,0.6329484469019353,0.837534558464791,0.6206558497922174,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,flickr30k,,,,0.853600025177002,0.9449999928474426,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/eurosat,0.5431481481481482,0.9042592592592592,0.5426613813797865,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,fer2013,0.4353580384508219,0.9158539983282252,0.4197447539736966,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/cifar10,0.9265,0.9984,0.9265,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,fgvc_aircraft,0.1674167416741674,0.4578457845784578,0.1668983957219251,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/smallnorb_label_elevation,0.1187654320987654,0.5808230452674897,0.1176812180550676,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/clevr_count_all,0.1652666666666666,0.6874666666666667,0.1642859387560007,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,imagenet-r,0.7252333333333333,0.8989,0.7140624629578244,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,mscoco_captions,,,,0.6166333556175232,0.7703999876976013,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,renderedsst2,0.5453047775947282,,0.5455749522320653,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/kitti_closest_vehicle_distance,0.1912798874824191,,0.2191710929978566,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/caltech101,0.8220213640098604,0.95152013147083,0.8943124874379637,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/dsprites_label_x_position,0.0360921223958333,0.1627739800347222,0.035788339896763,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,imagenet1k,0.62526,0.87618,0.62522,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,gtsrb,0.4281868566904196,0.7278701504354711,0.3811076440318098,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/pcam,0.454315185546875,,0.4542477680673474,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-2B_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,13000000000.0,96200000000.0,7.4,LAION-2B,vtab/cifar100,0.7263,0.9328,0.7263000000000001,,,zeroshot_classification,13B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/kitti_closest_vehicle_distance,0.2109704641350211,,0.350648498238932,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,gtsrb,0.4975455265241488,0.7553444180522565,0.4424723917340196,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,imagenetv2,0.6678,0.8895,0.6675,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,flickr8k,,,,0.8989999890327454,0.962000012397766,zeroshot_retrieval,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/svhn,0.4227489244007376,0.7498847572218807,0.4641679917545769,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/cifar10,0.9502,0.999,0.9502,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,voc2007,0.7625534188034188,0.9368990384615384,0.8347463690365172,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/eurosat,0.5572222222222222,0.9729629629629628,0.5605465567472842,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/smallnorb_label_elevation,0.1023045267489712,0.5306172839506172,0.1018345034711639,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,cars,0.9095883596567592,0.99651784603905,0.9088512000991836,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/caltech101,0.8376335250616269,0.9360723089564504,0.933992126557585,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,stl10,0.982375,0.999875,0.982375,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/dsprites_label_orientation,0.0271809895833333,0.1223415798611111,0.0275037211984385,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/diabetic_retinopathy,0.2634637918912585,1.0,0.2091240578422589,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/dsprites_label_x_position,0.0330268012152777,0.1616075303819444,0.0333679231523241,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/dtd,0.5728723404255319,0.8664893617021276,0.5728723404255319,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,mscoco_captions,,,,0.6862455010414124,0.8343999981880188,zeroshot_retrieval,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/pcam,0.518280029296875,,0.5181100364304774,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,imagenet-r,0.8672666666666666,0.9603666666666668,0.8522318898584128,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/smallnorb_label_azimuth,0.0536625514403292,0.2612345679012345,0.053278654576598,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/cifar100,0.7843,0.9481,0.7843000000000001,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,imagenet-a,0.4982666666666667,0.7808,0.5010418980012707,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/flowers,0.7360546430313872,0.9090909090909092,0.7250038404334703,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/clevr_count_all,0.3800666666666666,0.8624666666666667,0.3752165942915276,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,renderedsst2,0.5107084019769358,,0.5099136558392682,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,objectnet,0.6092387207925056,0.8206094540755895,0.5988916899913324,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,fgvc_aircraft,0.306030603060306,0.6924692469246925,0.3051782531194296,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/pets,0.9321340964840557,0.9978195693649496,0.9312698565843472,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,imagenet1k,0.7394,0.93342,0.7393200000000001,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,mnist,0.6055,0.9324,0.6129541063668154,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/dmlab,0.2218605674070816,0.8741587860127557,0.1691970559759249,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,country211,0.2458293838862559,0.4837440758293839,0.2458293838862559,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/resisc45,0.6566666666666666,0.9476190476190476,0.664351081842984,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,flickr30k,,,,0.9128000140190125,0.9769999980926514,zeroshot_retrieval,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,fer2013,0.5087768180551686,0.934800780161605,0.4481503361031994,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,sun397,0.7190632068705519,0.9460709491145152,0.7107487295540873,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,vtab/clevr_closest_object_distance,0.1788,0.9097333333333332,0.1698864710204816,,,zeroshot_classification,34B +ViT-L-14 Model-L-14_Data-400M_Samples-34B_lr-1e-3_bs-86k.pt,ViT-L-14,34215895056.0,3001760473262.8804,87.73,LAION-400M,imagenet_sketch,0.6197803061565368,0.8528365658590266,0.6200211764705882,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,voc2007,0.6971821581196581,0.931557158119658,0.7328704415736629,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/dsprites_label_orientation,0.0161539713541666,0.1209988064236111,0.0164085763144711,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/flowers,0.549357619125061,0.7856562042608555,0.5247059225491861,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,flickr30k,,,,0.7599999904632568,0.8820000290870667,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/eurosat,0.4187037037037037,0.8692592592592593,0.4391973995651304,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,stl10,0.9215,0.99825,0.9215,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,imagenet1k,0.51938,0.79014,0.5193999999999999,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,cars,0.6761596816316379,0.9411764705882352,0.679009152214651,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/smallnorb_label_elevation,0.0840329218106995,0.5035390946502057,0.0837716997968719,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/dtd,0.3547872340425532,0.6132978723404255,0.3547872340425532,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,mnist,0.2873,0.8903,0.2931978452910186,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,mscoco_captions,,,,0.5104358196258545,0.6715999841690063,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/resisc45,0.419047619047619,0.7682539682539683,0.4265426336724944,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/caltech101,0.8106820049301561,0.9350862777321282,0.8664413925408332,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/diabetic_retinopathy,0.0389969533630185,1.0,0.1859508157888545,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/pets,0.756064322703734,0.9582992641046608,0.7529608589855814,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/dsprites_label_x_position,0.0309516059027777,0.158203125,0.0315745507964889,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,sun397,0.5582691211357743,0.8610258013498354,0.5463396570802187,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/dmlab,0.1581702221244776,0.8383549593138333,0.1644193635732437,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,fer2013,0.3676511563109501,0.9058233491223182,0.3331638040440747,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,renderedsst2,0.5063152114222954,,0.5064721932719588,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/svhn,0.1289950829748002,0.6535802089735709,0.1575248098807942,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/kitti_closest_vehicle_distance,0.2883263009845288,,0.331695458729469,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,imagenetv2,0.442,0.7212,0.4423,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,imagenet-a,0.1252,0.3674666666666666,0.1380330158218144,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/cifar10,0.8366,0.9935,0.8366,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,fgvc_aircraft,0.0858085808580858,0.258025802580258,0.0855704099821746,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,country211,0.0954976303317535,0.2496682464454976,0.0954976303317535,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,imagenet-r,0.614,0.8301666666666667,0.5987898786937776,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/clevr_closest_object_distance,0.1598666666666666,0.919,0.1339790006137771,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,imagenet_sketch,0.3836585509638625,0.6484505492346087,0.383776862745098,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,gtsrb,0.2960411718131433,0.6330166270783848,0.2595101347646848,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/cifar100,0.6182,0.8704,0.6182,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/pcam,0.501739501953125,,0.5017852413932861,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,objectnet,0.3326154840099063,0.5813502745773662,0.3241425709257197,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,flickr8k,,,,0.7427999973297119,0.8799999952316284,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/clevr_count_all,0.1921333333333333,0.7537333333333334,0.1907902678312629,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-80M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-80M,vtab/smallnorb_label_azimuth,0.0478189300411522,0.2589300411522633,0.047437204492401,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,renderedsst2,0.5875892366831411,,0.5874895055295003,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/dsprites_label_x_position,0.0305718315972222,0.1600341796875,0.0300087224198642,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/cifar100,0.751,0.9413,0.7509999999999999,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/resisc45,0.6250793650793651,0.9138095238095238,0.6311439546044071,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,fgvc_aircraft,0.2094209420942094,0.501950195019502,0.2087611408199643,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/eurosat,0.5944444444444444,0.9687037037037036,0.5940963614186365,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,cars,0.8597189404302947,0.9920407909463996,0.8605255762626218,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,gtsrb,0.5228820269200317,0.7663499604117181,0.4449808109166046,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/kitti_closest_vehicle_distance,0.2039381153305204,,0.2339960063971601,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/caltech101,0.8364831552999178,0.9633525061626952,0.9233410384313956,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/dmlab,0.1370134154387508,0.8116560369474378,0.1608456275119595,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,mnist,0.6621,0.8885,0.6733763842295903,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/diabetic_retinopathy,0.2831966252636513,1.0,0.2916713222390558,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,country211,0.19260663507109,0.4207582938388625,0.19260663507109,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/dsprites_label_orientation,0.0402289496527777,0.1250678168402778,0.0401554057720827,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,imagenet-r,0.8040666666666667,0.9412333333333334,0.7899859994680973,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/clevr_closest_object_distance,0.2366666666666666,0.8038,0.2042342670467063,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,fer2013,0.4541655057118974,0.9387015881861244,0.4029490136320012,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/smallnorb_label_elevation,0.1043621399176954,0.5586008230452675,0.1045578473066382,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,objectnet,0.52298912458275,0.7669322709163346,0.5101657392808597,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/dtd,0.5335106382978724,0.8420212765957447,0.5335106382978724,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,imagenet_sketch,0.5572324077895027,0.811295171844603,0.5573803921568627,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,voc2007,0.8004807692307693,0.9661458333333334,0.8182982357735871,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/clevr_count_all,0.1716,0.7050666666666666,0.1693859283836313,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,stl10,0.977,0.99975,0.977,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/smallnorb_label_azimuth,0.059835390946502,0.2784362139917695,0.0598568872994735,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,imagenet-a,0.3765333333333333,0.706,0.3816000327118903,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/flowers,0.6910066677508538,0.8578630671653927,0.6844446671408827,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,flickr8k,,,,0.8726000189781189,0.9490000009536744,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,imagenet1k,0.69306,0.91318,0.6931799999999999,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,imagenetv2,0.6157,0.8633,0.6154,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,flickr30k,,,,0.8913999795913696,0.977999985218048,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/pcam,0.55096435546875,,0.5511352867097744,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/svhn,0.457859557467732,0.8234480639213276,0.4184803639768905,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,sun397,0.7025120915092778,0.9412711256597458,0.6907008457630803,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/cifar10,0.9335,0.9986,0.9335,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,mscoco_captions,,,,0.656297504901886,0.8077999949455261,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2443992504.0,214411462375.92,87.73,LAION-400M,vtab/pets,0.8958844371763424,0.9950940310711366,0.8948482517911287,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/smallnorb_label_elevation,0.1088065843621399,0.5838683127572016,0.1080646717324675,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,flickr8k,,,,0.8159999847412109,0.9079999923706056,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,imagenet_sketch,0.4715753895733852,0.7405922694491933,0.4717564705882353,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,fgvc_aircraft,0.1434143414341434,0.3519351935193519,0.1431461675579322,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/smallnorb_label_azimuth,0.0523456790123456,0.2646090534979424,0.0522686995595765,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/caltech101,0.8264585045193098,0.9316351684470008,0.8924490474209781,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,cars,0.7923143887576172,0.9794801641586868,0.7917464522383153,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/kitti_closest_vehicle_distance,0.3206751054852321,,0.3410894841398236,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,country211,0.1346919431279621,0.3259241706161137,0.1346919431279621,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/clevr_closest_object_distance,0.1528666666666666,0.8516666666666667,0.1620459974239773,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/cifar100,0.6741,0.8975,0.6741000000000001,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/flowers,0.6420556187998049,0.8342819970726948,0.6079887684405633,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,voc2007,0.6996527777777778,0.9246127136752136,0.7659544389573008,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,imagenet1k,0.61144,0.86088,0.61138,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/svhn,0.3151121696373694,0.708320528580209,0.3428214290269942,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/dsprites_label_orientation,0.0171305338541666,0.1156548394097222,0.0172674605259277,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,objectnet,0.4213416603854851,0.6655001615160978,0.4115551327049906,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/resisc45,0.5377777777777778,0.8544444444444445,0.5471635301134532,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/dtd,0.4590425531914893,0.7813829787234042,0.4590425531914893,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,fer2013,0.4132070214544441,0.9225410977988298,0.3272288874981255,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,mscoco_captions,,,,0.5841663479804993,0.7490000128746033,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/pcam,0.528076171875,,0.52827625306523,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/diabetic_retinopathy,0.5124209046168268,1.0,0.2206853591871915,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/pets,0.8470973017170891,0.9847369855546472,0.8438195855401428,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,renderedsst2,0.514003294892916,,0.5144172311968039,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,gtsrb,0.4656373713380839,0.7329374505146476,0.4003560738216957,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,imagenetv2,0.5379,0.8002,0.5379,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/dsprites_label_x_position,0.0304768880208333,0.1539984809027778,0.0302738715462311,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/cifar10,0.8988,0.9969,0.8987999999999999,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,mnist,0.432,0.8375,0.4346385181635083,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/eurosat,0.4192592592592593,0.8318518518518518,0.4276730141317242,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,imagenet-r,0.7302,0.9031333333333332,0.7138908648633964,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,flickr30k,,,,0.8416000008583069,0.9359999895095824,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,imagenet-a,0.2521333333333333,0.5549333333333333,0.2631858265645955,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,sun397,0.6331077477610019,0.9044448939809112,0.6144159205428064,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,stl10,0.95525,0.999875,0.95525,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/dmlab,0.2047503848691444,0.8186496591159006,0.1755271472648345,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-80M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-80M,vtab/clevr_count_all,0.235,0.6971333333333334,0.2352323772166311,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,sun397,0.6972157345936701,0.941611343031061,0.6894437415023493,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/flowers,0.6897056431940153,0.8650187022280046,0.678040533467117,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,objectnet,0.5397867987509422,0.7797997200387639,0.527792820198982,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,imagenet-a,0.3808,0.7057333333333333,0.3828988498028893,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/cifar100,0.7713,0.9549,0.7713,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/dsprites_label_orientation,0.0238444010416666,0.1124674479166666,0.0243964892712102,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/resisc45,0.6255555555555555,0.926031746031746,0.633211160389363,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/smallnorb_label_elevation,0.1009876543209876,0.5709465020576132,0.0998050903727592,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/caltech101,0.8392769104354971,0.9582580115036976,0.9179771751883274,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,cars,0.8742693694814078,0.9950254943414998,0.8739204275249158,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/clevr_closest_object_distance,0.1967333333333333,0.8630666666666666,0.2031768208080794,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/pets,0.8956118833469611,0.9956391387298992,0.894917577327516,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,imagenet1k,0.68928,0.9123,0.68926,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,imagenet-r,0.7978333333333333,0.9398666666666666,0.7835816890371271,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,renderedsst2,0.5738605161998902,,0.5738828817092236,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,country211,0.1891943127962085,0.4172511848341232,0.1891943127962085,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/svhn,0.4854025814382299,0.8221035648432699,0.5157358181926537,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/cifar10,0.9423,0.9988,0.9423,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/dtd,0.5563829787234043,0.8537234042553191,0.5563829787234043,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,mscoco_captions,,,,0.6620551943778992,0.7986000180244446,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/diabetic_retinopathy,0.7295289430513241,1.0,0.2134833649397848,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,stl10,0.97675,0.999875,0.97675,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,gtsrb,0.485193982581156,0.7505146476642913,0.4368059548959447,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,mnist,0.6746,0.9307,0.6792092705652595,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,imagenetv2,0.6074,0.86,0.6078000000000001,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,voc2007,0.8006810897435898,0.963074252136752,0.8284084682642036,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/dmlab,0.1156806685726852,0.8087970090169342,0.1658886594914495,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,imagenet_sketch,0.5520446461907288,0.8113737742930692,0.5522980392156862,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,fer2013,0.4921983839509612,0.9370298133184732,0.4546063366561688,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/clevr_count_all,0.1574666666666666,0.6836,0.1561662664889611,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,flickr8k,,,,0.8733999729156494,0.9509999752044678,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/pcam,0.551025390625,,0.5510200411080644,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/eurosat,0.5498148148148149,0.9737037037037036,0.5659348033653779,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,fgvc_aircraft,0.21002100210021,0.5298529852985299,0.2096613190730837,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/kitti_closest_vehicle_distance,0.2236286919831223,,0.3118768373346399,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/dsprites_label_x_position,0.0302191840277777,0.1490749782986111,0.0301312350713192,,,zeroshot_classification,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,flickr30k,,,,0.8981999754905701,0.9670000076293944,zeroshot_retrieval,3B +ViT-L-14 Model-L-14_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-L-14,2560013280.0,224589965054.40002,87.73,LAION-2B,vtab/smallnorb_label_azimuth,0.048312757201646,0.2781069958847736,0.0482329385717943,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/flowers,0.6810863555049601,0.8697349162465442,0.6764146606045666,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/diabetic_retinopathy,0.0636747129130536,1.0,0.2303364200860029,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/smallnorb_label_azimuth,0.0433744855967078,0.2586831275720164,0.0435081656140131,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/dtd,0.5718085106382979,0.8675531914893617,0.5718085106382979,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/kitti_closest_vehicle_distance,0.1954992967651195,,0.3156967559240423,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/dmlab,0.2079612931603255,0.845876402023312,0.1702584758422929,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,cars,0.8635741823156324,0.9925382415122496,0.8635096581774894,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/clevr_closest_object_distance,0.1572666666666666,0.9128,0.1366105080168025,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,renderedsst2,0.543108182317408,,0.5427378264142204,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,imagenet_sketch,0.5420031833991629,0.7989742380475152,0.5421490196078431,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/eurosat,0.3959259259259259,0.8861111111111111,0.4072372144039525,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,flickr30k,,,,0.8989999890327454,0.9760000109672546,zeroshot_retrieval,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,flickr8k,,,,0.8766000270843506,0.9490000009536744,zeroshot_retrieval,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/cifar10,0.9411,0.9986,0.9411,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,fgvc_aircraft,0.2082208220822082,0.5343534353435343,0.2079679144385026,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,imagenet-a,0.3476,0.6797333333333333,0.3692599765558562,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,country211,0.1824170616113744,0.4107109004739336,0.1824170616113744,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/smallnorb_label_elevation,0.1046090534979423,0.5433744855967079,0.1047751482380013,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,sun397,0.6821266344226419,0.9394045276495576,0.6851078108678123,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/resisc45,0.6211111111111111,0.9207936507936508,0.6288974641610129,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,mnist,0.7383,0.9117,0.7349934422268695,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/pets,0.9125102207686018,0.9970019078768056,0.9119387333840184,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,voc2007,0.7803151709401709,0.95960202991453,0.8159137265266688,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/dsprites_label_x_position,0.0296766493055555,0.1740587022569444,0.029065695049173,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/dsprites_label_orientation,0.0292697482638888,0.1514214409722222,0.0290464586713721,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,stl10,0.9755,0.99975,0.9755,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,gtsrb,0.4070467141726049,0.7258907363420427,0.3734933032738897,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/clevr_count_all,0.3378666666666666,0.8647333333333334,0.3353079203357023,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,imagenetv2,0.5968,0.8556,0.5965999999999999,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/pcam,0.425933837890625,,0.4258393211891008,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,fer2013,0.4892727779325717,0.959738088604068,0.4383869208058531,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/cifar100,0.7532,0.943,0.7532,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,mscoco_captions,,,,0.6610955595970154,0.8100000023841858,zeroshot_retrieval,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,imagenet-r,0.7855,0.9335666666666668,0.7722869301065296,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/caltech101,0.8415776499589154,0.9529991783073132,0.9159077138707258,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,vtab/svhn,0.3937077443146896,0.7801551936078672,0.4083572726247156,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,imagenet1k,0.68134,0.90914,0.6813400000000001,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13034626670.0,268122270601.9,20.57,LAION-2B,objectnet,0.522612253687951,0.7681705609992463,0.5149990409897575,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,flickr30k,,,,0.9031999707221984,0.9800000190734864,zeroshot_retrieval,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/cifar10,0.9494,0.9986,0.9494,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,fer2013,0.5178322652549456,0.9375870716076902,0.4622780318482748,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/clevr_closest_object_distance,0.2107333333333333,0.9191333333333334,0.164196252612167,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,objectnet,0.5604608592656402,0.7883062345213739,0.5497943267391228,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,voc2007,0.7884615384615384,0.960136217948718,0.8249927842901265,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,fgvc_aircraft,0.27002700270027,0.6075607560756076,0.2697950089126559,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/dsprites_label_orientation,0.0268147786458333,0.1239013671875,0.0263178325085634,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,country211,0.203127962085308,0.4356398104265402,0.203127962085308,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/diabetic_retinopathy,0.679587532224045,1.0,0.2921957720510518,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,mnist,0.6599,0.8953,0.6607719731339258,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/dmlab,0.1992522542335605,0.8446448207609413,0.1718811417749711,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/pcam,0.563720703125,,0.563811814884763,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/kitti_closest_vehicle_distance,0.1715893108298171,,0.2685743595576398,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/smallnorb_label_elevation,0.1130041152263374,0.5348148148148149,0.1124431932400892,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,imagenet_sketch,0.5609463734795339,0.8195877301577944,0.561446274509804,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/dsprites_label_x_position,0.0330268012152777,0.1588812934027778,0.0326506396764361,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/cifar100,0.7683,0.9464,0.7683000000000001,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/flowers,0.7123109448690844,0.8835583021629533,0.7082090459891224,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/svhn,0.5139443761524278,0.815880454824831,0.5359109973969346,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,imagenet1k,0.70222,0.9176,0.70232,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/pets,0.9051512673753066,0.9975470155355682,0.9044945920177176,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,cars,0.8849645566471832,0.9935331426439498,0.885078794095415,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,stl10,0.978625,1.0,0.978625,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,flickr8k,,,,0.8820000290870667,0.9589999914169312,zeroshot_retrieval,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,imagenet-r,0.8059333333333333,0.9398,0.7915264997074314,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/smallnorb_label_azimuth,0.0567078189300411,0.2802469135802469,0.0566890540963755,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/dtd,0.5632978723404255,0.8595744680851064,0.5632978723404256,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/caltech101,0.8382908792111751,0.952013147082991,0.9286557392358036,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,sun397,0.7084612979752469,0.9461537046913217,0.7017444028895757,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,mscoco_captions,,,,0.6772890686988831,0.817799985408783,zeroshot_retrieval,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/clevr_count_all,0.2148666666666666,0.6789333333333334,0.2115888451415034,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,gtsrb,0.4824228028503562,0.7608867775138559,0.4602819717544187,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,imagenet-a,0.3822666666666666,0.7057333333333333,0.3846426434626763,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,renderedsst2,0.5980230642504119,,0.5981667245671936,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,imagenetv2,0.6228,0.87,0.6230999999999999,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/resisc45,0.6276190476190476,0.9214285714285714,0.6343610941534898,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-2B_Samples-34B_lr-1e-3_bs-88k.pt,ViT-B-16,34215894963.0,703820959388.91,20.57,LAION-2B,vtab/eurosat,0.5346296296296297,0.8964814814814814,0.5522559756687014,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/clevr_closest_object_distance,0.1406666666666666,0.8042666666666667,0.2001475881890152,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/svhn,0.30089889366933,0.8045866625691457,0.3054781843595318,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/dmlab,0.1609852650098966,0.8072135473938861,0.1624263493711032,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,objectnet,0.3792936362657478,0.6380424248950145,0.3711019401030146,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/dsprites_label_x_position,0.0313991970486111,0.1613905164930555,0.0310898168647383,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/smallnorb_label_elevation,0.1121810699588477,0.5088065843621399,0.1112240210965432,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/clevr_count_all,0.1672666666666666,0.7331333333333333,0.1656007889898113,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/eurosat,0.4931481481481481,0.9546296296296296,0.4991884417473762,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/cifar100,0.7009,0.928,0.7008999999999999,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,cars,0.7638353438627037,0.975127471707499,0.764644482010144,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/diabetic_retinopathy,0.0842277947035387,1.0,0.2266517528663995,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,fgvc_aircraft,0.1449144914491449,0.3756375637563756,0.1442602495543672,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,renderedsst2,0.500823723228995,,0.5010910630536738,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet_sketch,0.4494291497180137,0.7147517145159071,0.4497188235294118,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/resisc45,0.5290476190476191,0.8501587301587301,0.5368600562138595,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet-r,0.6581666666666667,0.8564333333333334,0.6479423214620611,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/dsprites_label_orientation,0.0203857421875,0.1083984375,0.0208368170378917,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,country211,0.1146445497630331,0.2853554502369668,0.1146445497630332,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,voc2007,0.7594818376068376,0.9540598290598292,0.7747958934172992,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,flickr8k,,,,0.7922000288963318,0.9039999842643738,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,sun397,0.6194990529083988,0.9065321735292496,0.6104990052710068,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/kitti_closest_vehicle_distance,0.350210970464135,,0.4346951737197426,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,gtsrb,0.4212193190815518,0.7054631828978623,0.3906851771978162,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/dtd,0.4670212765957446,0.750531914893617,0.4670212765957448,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,mnist,0.4989,0.9261,0.5058220732670333,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet-a,0.1474666666666666,0.4169333333333333,0.1656735837289444,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/caltech101,0.819063270336894,0.9413311421528348,0.8830869522359956,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,flickr30k,,,,0.8216000199317932,0.9269999861717224,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,fer2013,0.4115352465867929,0.8856227361382001,0.3905360497127455,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/cifar10,0.9049,0.9976,0.9049,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/smallnorb_label_azimuth,0.0545679012345679,0.2660905349794238,0.0557748627741821,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenetv2,0.4876,0.7645,0.4878,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,mscoco_captions,,,,0.5701319575309753,0.7310000061988831,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet1k,0.57358,0.83266,0.5734400000000001,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/pcam,0.626495361328125,,0.6265021383710383,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,stl10,0.941375,0.998875,0.941375,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/pets,0.8405560098119379,0.9912782774597984,0.8391397095136071,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/flowers,0.6059521873475362,0.8250121971052203,0.5977919929062319,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,mscoco_captions,,,,0.5782087445259094,0.745199978351593,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,fer2013,0.4403733630537754,0.8859013652828086,0.3816147154435082,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/kitti_closest_vehicle_distance,0.3347398030942334,,0.271540260079423,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/flowers,0.6111562855748902,0.8178565620426086,0.5813580165054681,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,flickr8k,,,,0.8041999936103821,0.9169999957084656,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet-r,0.6650666666666667,0.8649,0.6539215386335667,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,renderedsst2,0.5052169137836353,,0.5056615858954316,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,objectnet,0.3869925702595025,0.6469796489716808,0.3782145017874584,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/clevr_closest_object_distance,0.1623333333333333,0.9081333333333332,0.1408869655635748,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,stl10,0.94525,0.998875,0.94525,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/cifar10,0.9095,0.9983,0.9095,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/svhn,0.2978257529194837,0.7737784265519361,0.2840161161139649,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet-a,0.152,0.4374666666666666,0.1684507744431408,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,fgvc_aircraft,0.1305130513051305,0.3519351935193519,0.1302762923351158,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/dsprites_label_orientation,0.0238444010416666,0.1230333116319444,0.0243334631868077,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenetv2,0.492,0.77,0.4918,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,voc2007,0.7423878205128205,0.9483840811965812,0.7753117917627217,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,flickr30k,,,,0.8288000226020813,0.9229999780654908,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/pcam,0.527923583984375,,0.5281234434919384,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/clevr_count_all,0.2105333333333333,0.6880666666666667,0.2081540178087392,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,mnist,0.4023,0.9145,0.4077438730181041,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/diabetic_retinopathy,0.0539957815795641,1.0,0.220344126320416,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/cifar100,0.6977,0.9228,0.6977,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/dtd,0.4728723404255319,0.7824468085106383,0.4728723404255319,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/caltech101,0.8210353327855382,0.9492193919474116,0.8865648265964818,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/eurosat,0.4396296296296296,0.9475925925925924,0.4500908055165188,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/pets,0.8280185336603979,0.9901880621422732,0.8267496567503188,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,gtsrb,0.4151227236737925,0.7238321456848773,0.3837471222183052,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,sun397,0.6350754914761756,0.910807878330912,0.6257826013269177,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/smallnorb_label_elevation,0.102880658436214,0.5377777777777778,0.1024239793716217,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,cars,0.7635866185797786,0.9727645815197116,0.7638433042963291,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/dmlab,0.1415438750824719,0.8176819881240378,0.1529642128115768,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet_sketch,0.4443789424040559,0.7123346892255694,0.4446419607843137,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/resisc45,0.5426984126984127,0.8657142857142858,0.5477025572946044,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/dsprites_label_x_position,0.0319417317708333,0.1607666015625,0.0317850880262409,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,vtab/smallnorb_label_azimuth,0.0548971193415637,0.2790123456790123,0.0556255065667706,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,imagenet1k,0.57394,0.83994,0.5739000000000001,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-2B_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2560013280.0,18944098272.0,7.4,LAION-2B,country211,0.1188625592417061,0.2965876777251184,0.1188625592417061,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,flickr8k,,,,0.8379999995231628,0.9300000071525574,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/dsprites_label_orientation,0.0211452907986111,0.1048990885416666,0.021627250367987,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/kitti_closest_vehicle_distance,0.3178621659634318,,0.3694271787355175,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,fgvc_aircraft,0.1692169216921692,0.4326432643264326,0.1686631016042781,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,voc2007,0.7401175213675214,0.9419738247863249,0.7925239289170585,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,imagenet_sketch,0.5028984652871937,0.7627581599166814,0.5030949019607843,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,fer2013,0.4263025912510448,0.9356366675954304,0.4035496021935579,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,imagenetv2,0.5522,0.8158,0.5525999999999999,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/clevr_count_all,0.149,0.6874,0.1474573742665263,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,cars,0.8204203457281433,0.9855739335903496,0.8207146508027379,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,imagenet1k,0.63228,0.87936,0.63222,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,objectnet,0.4396468181328739,0.6820824808872618,0.4269669897415499,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,imagenet-r,0.7358333333333333,0.9057333333333332,0.7234854467533498,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,flickr30k,,,,0.8519999980926514,0.9559999704360962,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,country211,0.1485308056872037,0.3463981042654028,0.1485308056872038,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,imagenet-a,0.2177333333333333,0.5190666666666667,0.2341139732567465,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/clevr_closest_object_distance,0.2254666666666666,0.9104666666666666,0.161397452638686,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/flowers,0.6757196292080013,0.857700439095788,0.6693671827926093,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/resisc45,0.5461904761904762,0.8726984126984128,0.5531773823599635,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/dsprites_label_x_position,0.0311279296875,0.1601019965277778,0.0311122599786221,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/caltech101,0.8276088742810189,0.9447822514379622,0.9020843132472066,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/smallnorb_label_azimuth,0.0546502057613168,0.2652674897119341,0.0551759891550263,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/cifar10,0.9141,0.9979,0.9141,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,mscoco_captions,,,,0.6189923882484436,0.7760000228881836,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/pcam,0.5250244140625,,0.5249790576248387,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/cifar100,0.7172,0.9238,0.7172000000000002,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/dtd,0.5101063829787233,0.8159574468085107,0.5101063829787232,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/eurosat,0.5790740740740741,0.9488888888888888,0.5774745296170576,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,sun397,0.6662007834194604,0.9261452452323592,0.6568580233881012,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,stl10,0.952125,0.999375,0.952125,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,renderedsst2,0.5019220208676551,,0.5025259104857854,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/diabetic_retinopathy,0.0597375205062104,1.0,0.1952401162536691,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/pets,0.8762605614608885,0.994548923412374,0.8743938459257584,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/dmlab,0.1899714097206949,0.8488673850890697,0.2049683604747196,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/svhn,0.271819299323909,0.7237246465888137,0.3050411987028591,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,vtab/smallnorb_label_elevation,0.1190946502057613,0.5558847736625514,0.1189306893258987,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,gtsrb,0.4482185273159145,0.7342042755344418,0.4097564569086308,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-13B_lr-1e-3_bs-86k.pt,ViT-B-32,13216000000.0,97798400000.0,7.4,LAION-400M,mnist,0.5995,0.945,0.6010641782320482,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,renderedsst2,0.5365183964854475,,0.5364031468936368,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/cifar10,0.9036,0.9978,0.9036000000000002,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/caltech101,0.8262941659819227,0.9487263763352506,0.9019100023416858,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,voc2007,0.7276308760683761,0.9321581196581196,0.7904804018345657,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/pcam,0.48907470703125,,0.4890853314294712,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,stl10,0.956375,0.99925,0.956375,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/smallnorb_label_azimuth,0.0551440329218107,0.2839506172839506,0.0551133175520754,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,flickr30k,,,,0.859000027179718,0.9559999704360962,zeroshot_retrieval,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,objectnet,0.4569828792936363,0.6964035748896307,0.4449989923743058,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,imagenet-a,0.232,0.5432,0.2499579143225107,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,imagenet1k,0.64062,0.8835,0.6406799999999999,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,imagenet-r,0.7477,0.9046666666666666,0.7359955122758766,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,gtsrb,0.4391923990498812,0.7007125890736342,0.3822364418340151,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/dsprites_label_orientation,0.0166829427083333,0.1114230685763889,0.0168694033799794,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/flowers,0.6833631484794276,0.8494064075459424,0.6675586250066137,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/dmlab,0.187552232241038,0.8416538376951836,0.1876089733792748,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,sun397,0.6804255475660665,0.9284899865752064,0.6660547707234755,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/pets,0.8738075769964568,0.9959116925592804,0.8715968687781168,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/diabetic_retinopathy,0.0696742441996719,1.0,0.2262387142258092,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,country211,0.1569194312796208,0.3579620853080569,0.1569194312796208,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/kitti_closest_vehicle_distance,0.2672292545710267,,0.310205706781201,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,imagenetv2,0.56,0.8276,0.5604000000000001,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/clevr_closest_object_distance,0.1976,0.9218,0.1609843748657092,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,flickr8k,,,,0.8371999859809875,0.9319999814033508,zeroshot_retrieval,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/dsprites_label_x_position,0.0312635633680555,0.1631130642361111,0.0316668917590326,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/eurosat,0.507962962962963,0.9388888888888888,0.5099280102395993,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/clevr_count_all,0.1827333333333333,0.7098666666666666,0.1815903610756167,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,cars,0.8156945653525681,0.9818430543464745,0.8168259911046946,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,mscoco_captions,,,,0.6227508783340454,0.7746000289916992,zeroshot_retrieval,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/svhn,0.324139520590043,0.7631760909649662,0.2989101159384785,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/cifar100,0.6997,0.9144,0.6996999999999999,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/dtd,0.5085106382978724,0.823936170212766,0.5085106382978722,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,fer2013,0.4772917247144051,0.9437169127890778,0.3939151281284105,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,mnist,0.5816,0.8806,0.5746393804497891,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/smallnorb_label_elevation,0.111275720164609,0.5497119341563786,0.111456145173769,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,imagenet_sketch,0.509422468509894,0.7734873941323273,0.5097917647058823,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,vtab/resisc45,0.6114285714285714,0.8980952380952381,0.6160398112819125,,,zeroshot_classification,34B +ViT-B-32 Model-B-32_Data-400M_Samples-34B_lr-5e-4_bs-32k.pt,ViT-B-32,34215895056.0,253197623414.40002,7.4,LAION-400M,fgvc_aircraft,0.1767176717671767,0.4554455445544554,0.1760873440285204,,,zeroshot_classification,34B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/eurosat,0.4242592592592593,0.9357407407407408,0.4269761939822954,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/dsprites_label_orientation,0.0237765842013888,0.127685546875,0.0238893267255131,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/caltech101,0.8226787181594084,0.9367296631059984,0.8844586635375133,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,country211,0.1316113744075829,0.3179146919431279,0.1316113744075829,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/smallnorb_label_elevation,0.1139917695473251,0.571522633744856,0.11325302340012,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,imagenetv2,0.5262,0.7919,0.5267000000000001,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,stl10,0.945125,0.998625,0.945125,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,mscoco_captions,,,,0.5783286690711975,0.7383999824523926,zeroshot_retrieval,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,flickr30k,,,,0.847599983215332,0.9490000009536744,zeroshot_retrieval,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/cifar100,0.6442,0.8831,0.6442,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/diabetic_retinopathy,0.4479493789547691,1.0,0.2420303980176945,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,objectnet,0.433670722515344,0.6856358350382254,0.4236579977850957,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/clevr_count_all,0.1680666666666666,0.785,0.1656457028805694,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,gtsrb,0.4003167062549485,0.6694378463974664,0.3611335758481865,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,renderedsst2,0.5496979681493684,,0.5497419807770251,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,sun397,0.6055593357485701,0.888371921952296,0.5777566175762181,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/svhn,0.2084357713583282,0.6903426551936078,0.2209116633395918,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,fer2013,0.4222624686542212,0.9123711340206184,0.3679942803659091,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,mnist,0.5003,0.7861,0.5090210207269967,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,fgvc_aircraft,0.1263126312631263,0.3189318931893189,0.125855614973262,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,imagenet-a,0.2261333333333333,0.53,0.2384580124294436,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/dsprites_label_x_position,0.0333658854166666,0.1585286458333333,0.0333032776652579,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/pcam,0.54278564453125,,0.5428144544285098,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/resisc45,0.4622222222222222,0.8296825396825397,0.4674732733765159,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/dmlab,0.1851330547613811,0.8387508247195954,0.1916155651316855,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,voc2007,0.7074652777777778,0.9210069444444444,0.7619702771650675,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/smallnorb_label_azimuth,0.0530041152263374,0.2838683127572016,0.053899137710603,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/flowers,0.6160351276630346,0.8250121971052203,0.6006585468645863,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,imagenet_sketch,0.4603941912790583,0.7331643380691308,0.4606980392156862,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,imagenet1k,0.6024,0.85422,0.6022799999999999,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,cars,0.7798781246113667,0.9769929113294368,0.7799700959645296,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/clevr_closest_object_distance,0.2060666666666666,0.7994,0.1687139634368278,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/kitti_closest_vehicle_distance,0.3037974683544304,,0.2696882127306655,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,flickr8k,,,,0.8127999901771545,0.9279999732971193,zeroshot_retrieval,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/dtd,0.4234042553191489,0.7382978723404255,0.4234042553191489,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/cifar10,0.8831,0.9952,0.8831,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,imagenet-r,0.7179,0.8954333333333333,0.7030204037680302,,,zeroshot_classification,13B +ViT-B-16 Model-B-16_Data-80M_Samples-13B_lr-1e-3_bs-88k.pt,ViT-B-16,13040067645.0,268234191457.65,20.57,LAION-80M,vtab/pets,0.8492777323521395,0.992913600436086,0.8480730900311084,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/dsprites_label_orientation,0.0235866970486111,0.1260308159722222,0.0235776564684639,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,cars,0.7322472329312275,0.9640591966173362,0.7331506459045898,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,mnist,0.4643,0.8628,0.4715752470175416,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,flickr30k,,,,0.784600019454956,0.912999987602234,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/dsprites_label_x_position,0.030517578125,0.1550021701388889,0.0307556147690604,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/dtd,0.4212765957446808,0.7356382978723405,0.4212765957446808,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,imagenet1k,0.56464,0.82542,0.5649200000000001,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,voc2007,0.6937099358974359,0.9157986111111112,0.750484704034834,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,objectnet,0.3689566060083988,0.611930655755357,0.3601219121343764,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/kitti_closest_vehicle_distance,0.230661040787623,,0.2149012193265813,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,renderedsst2,0.4876441515650741,,0.4870519946731515,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,country211,0.1054028436018957,0.2690047393364929,0.1054028436018957,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,imagenet-a,0.1557333333333333,0.4256,0.1736659892898739,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,mscoco_captions,,,,0.5466613173484802,0.7031999826431274,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,stl10,0.934375,0.999,0.934375,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/diabetic_retinopathy,0.4928286852589641,1.0,0.224261840892512,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/caltech101,0.8111750205423172,0.933607230895645,0.8686400566349263,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/dmlab,0.1567627006817682,0.8364636023751925,0.1600699319847713,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/smallnorb_label_elevation,0.1150617283950617,0.5277366255144033,0.1145910912304748,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/clevr_count_all,0.2154666666666666,0.8019333333333334,0.2137887580199603,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,gtsrb,0.3903404592240697,0.6677751385589865,0.3501654769789248,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/pcam,0.550537109375,,0.5505645907583272,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,fer2013,0.388269713011981,0.8833937029813318,0.3200695557739008,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/svhn,0.2569145666871543,0.6992163491087892,0.2472643690938181,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,flickr8k,,,,0.7746000289916992,0.8889999985694885,zeroshot_retrieval,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/pets,0.8141182883619514,0.9844644317252658,0.8117368103255315,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,voc2007_multilabel,,,,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,imagenet_sketch,0.4311147792253729,0.698952622374187,0.4312980392156862,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/eurosat,0.3153703703703703,0.8655555555555555,0.3307907121584266,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,imagenet-r,0.6748,0.8640333333333333,0.6588136804917454,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/resisc45,0.4506349206349206,0.7834920634920635,0.4577315567508887,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,fgvc_aircraft,0.1092109210921092,0.3108310831083108,0.1090017825311942,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/clevr_closest_object_distance,0.2042,0.8685333333333334,0.1729730328575236,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/cifar100,0.6406,0.8841,0.6406000000000001,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,sun397,0.5814314875774684,0.8734299428067014,0.567742582856187,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/smallnorb_label_azimuth,0.0453497942386831,0.2861728395061728,0.0459141077736481,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/cifar10,0.8637,0.9949,0.8637,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,vtab/flowers,0.6033501382338592,0.8102130427711823,0.5854182707620663,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-80M_Samples-13B_lr-5e-4_bs-32k.pt,ViT-B-32,12800066400.0,94720491360.0,7.4,LAION-80M,imagenetv2,0.481,0.7469,0.4814,,,zeroshot_classification,13B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/smallnorb_label_azimuth,0.0505349794238683,0.2696296296296296,0.0515279154447017,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet_sketch,0.4397806991687791,0.7068325178329304,0.4398866666666666,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/dsprites_label_x_position,0.0353054470486111,0.1683349609375,0.0347696657485216,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet-r,0.6650666666666667,0.8640333333333333,0.65246039121862,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,sun397,0.6274435882818103,0.9078286775658826,0.6196716793454274,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/cifar10,0.8809,0.9983,0.8808999999999999,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/dsprites_label_orientation,0.0221218532986111,0.1285536024305555,0.0224691829142696,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/flowers,0.6057895592779313,0.8136282322328834,0.5818702992234199,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,cars,0.7436885959457779,0.9700286034075364,0.7451034666109658,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/clevr_count_all,0.1472,0.6812,0.1460670599833463,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,gtsrb,0.3174188440221694,0.6782264449722882,0.2949156931897073,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,objectnet,0.3863465058684182,0.6396037471734682,0.3779088262761731,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/caltech101,0.8210353327855382,0.9413311421528348,0.8908003535559995,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/pets,0.8250204415372036,0.9901880621422732,0.8233112981273693,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,stl10,0.940625,0.999375,0.940625,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet-a,0.1521333333333333,0.4178666666666666,0.1690007355916834,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/dmlab,0.1799868044864746,0.8365075874202771,0.1754866949657205,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/eurosat,0.5033333333333333,0.9051851851851852,0.5076229557624716,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,renderedsst2,0.5118066996155958,,0.5115945805106826,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/dtd,0.4340425531914894,0.752127659574468,0.4340425531914893,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/pcam,0.559051513671875,,0.5592341940942239,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,flickr8k,,,,0.7960000038146973,0.9279999732971193,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,mscoco_captions,,,,0.5662534832954407,0.7418000102043152,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/diabetic_retinopathy,0.7185844855870636,1.0,0.2296193697402813,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,flickr30k,,,,0.8155999779701233,0.9229999780654908,zeroshot_retrieval,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/clevr_closest_object_distance,0.2162666666666666,0.9191333333333334,0.1652548995025715,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,country211,0.1175829383886255,0.2916587677725119,0.1175829383886256,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenetv2,0.4949,0.7723,0.4952,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/svhn,0.2312538414259373,0.6733251382913338,0.2273017653704368,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,imagenet1k,0.5816,0.84188,0.5816399999999999,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,fgvc_aircraft,0.1137113711371137,0.3195319531953195,0.1132263814616755,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/cifar100,0.6732,0.9126,0.6731999999999999,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,mnist,0.4657,0.8823,0.4685414703911372,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/kitti_closest_vehicle_distance,0.3164556962025316,,0.3157738789947584,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/smallnorb_label_elevation,0.102716049382716,0.5510288065843622,0.1019288378243662,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,fer2013,0.4001114516578434,0.9042908888269712,0.3707648340004087,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,voc2007,0.7559428418803419,0.9489850427350428,0.7515218479090429,,,zeroshot_classification,3B +ViT-B-32 Model-B-32_Data-400M_Samples-3B_lr-5e-4_bs-32k.pt,ViT-B-32,2443992504.0,18085544529.600002,7.4,LAION-400M,vtab/resisc45,0.5049206349206349,0.823015873015873,0.5123068574810018,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,stl10,0.956125,0.999875,0.956125,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/cifar10,0.9019,0.9974,0.9019,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,imagenetv2,0.5434,0.8102,0.5437000000000001,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/cifar100,0.6965,0.9193,0.6965,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,imagenet_sketch,0.4769793079054412,0.7444634400361572,0.4772999999999999,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,country211,0.143127962085308,0.3420379146919431,0.143127962085308,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,mnist,0.5638,0.9222,0.5746826341042367,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/pets,0.8588171163804852,0.9893704006541292,0.856254869739505,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/dmlab,0.1946778095447547,0.831977127776556,0.1639843561635569,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/eurosat,0.4766666666666667,0.8987037037037037,0.4739042707998637,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,voc2007_multilabel,,,,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/dtd,0.4898936170212766,0.800531914893617,0.4898936170212766,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,imagenet-a,0.2242666666666666,0.5478666666666666,0.239978029745786,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,renderedsst2,0.5310269082921472,,0.530549765502866,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,imagenet-r,0.7073333333333334,0.8968666666666667,0.696267883366398,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,objectnet,0.4390545924410466,0.6953268009044902,0.4289816221139885,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/diabetic_retinopathy,0.0804312163112256,1.0,0.2587474380506817,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,fer2013,0.4180830314850933,0.9076344385622735,0.3702999787338195,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/smallnorb_label_elevation,0.0972839506172839,0.5348148148148149,0.0971291450097513,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,sun397,0.6566746970226383,0.9215109329312026,0.6474831321291062,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/flowers,0.6443324117742723,0.8386729549520248,0.6288237804371607,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/smallnorb_label_azimuth,0.0506172839506172,0.2698765432098765,0.0509459810096712,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/kitti_closest_vehicle_distance,0.3234880450070324,,0.352482993511716,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,fgvc_aircraft,0.1353135313531353,0.3627362736273627,0.1350267379679144,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,voc2007,0.7527377136752137,0.951255341880342,0.781924348364919,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/dsprites_label_orientation,0.0244140625,0.1178656684027777,0.0247846842195497,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,flickr30k,,,,0.8583999872207642,0.9559999704360962,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/resisc45,0.5447619047619048,0.8788888888888889,0.5511028452989539,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,cars,0.8041288396965551,0.9810968784976992,0.8051324535375299,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,mscoco_captions,,,,0.6085165739059448,0.7717999815940857,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/dsprites_label_x_position,0.0316162109375,0.1589219835069444,0.0314453168829181,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/pcam,0.516204833984375,,0.5164100110683238,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/clevr_count_all,0.1748666666666666,0.672,0.1719884465279306,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/clevr_closest_object_distance,0.2171333333333333,0.9191333333333334,0.1760974697486708,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,gtsrb,0.373396674584323,0.7333333333333333,0.353578673844599,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,imagenet1k,0.62684,0.87386,0.6266,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,flickr8k,,,,0.8321999907493591,0.9300000071525574,zeroshot_retrieval,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/svhn,0.2985172095881991,0.7572602950215119,0.3067749253445277,,,zeroshot_classification,3B +ViT-B-16 Model-B-16_Data-400M_Samples-3B_lr-1e-3_bs-88k.pt,ViT-B-16,2443992504.0,50272925807.28,20.57,LAION-400M,vtab/caltech101,0.8243221035332785,0.9493837304847988,0.8984285215167004,,,zeroshot_classification,3B \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/process_vtab.py b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/process_vtab.py new file mode 100644 index 0000000000000000000000000000000000000000..d84829e4537dad134af6b4283e4ae60f9e8eb089 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/process_vtab.py @@ -0,0 +1,51 @@ +import numpy +import pandas as pd +import json + +# make a new version of vtab + +if __name__ == '__main__': + df = pd.read_json('probe_benchmark/scaling_experiment_data2.json') + df = df[df.fewshot_k == -1] + datasets = [ + 'vtab/caltech101', + 'vtab/cifar10', + 'vtab/cifar100', + 'vtab/clevr_count_all', + 'vtab/clevr_closest_object_distance', + 'vtab/diabetic_retinopathy', + 'vtab/dmlab', + 'vtab/dsprites_label_orientation', + 'vtab/dsprites_label_x_position', + 'vtab/dtd', + 'vtab/eurosat', + 'vtab/kitti_closest_vehicle_distance', + 'vtab/flowers', + 'vtab/pets', + 'vtab/pcam', + 'vtab/resisc45', + 'vtab/smallnorb_label_azimuth', + 'vtab/smallnorb_label_elevation', + 'vtab/svhn', + ] + all_info = [] + for n, g in df.groupby(['model', 'pretrained', 'samples_seen_pretty']): + count = 0 + total = 0. + for d in datasets: + g_filter = g[g.dataset == d] + count += 1 + total += g_filter.lp_acc1.max() + + avg = total / count + info = {'dataset' : 'vtab', 'lp_acc1' : avg, 'fewshot_k' : -1} + for k in ['model', 'pretrained', 'upstream_dataset', 'gmacs_total', 'samples_seen_pretty']: + info[k] = g[k].values[0] + all_info.append(info) + + with open('probe_benchmark/scaling_experiment_data_vtab.json', 'w') as f: + json.dump(all_info, f) + + + + diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_experiment_data_vtab.json b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_experiment_data_vtab.json new file mode 100644 index 0000000000000000000000000000000000000000..ee8094e21213a8cb25979ca5deae3007cdd6df80 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_experiment_data_vtab.json @@ -0,0 +1 @@ +[{"dataset": "vtab", "lp_acc1": 0.7272385796110142, "fewshot_k": -1, "model": "ViT-B-16", "pretrained": "laion400m_e32", "upstream_dataset": "LAION-400M", "gmacs_total": 268122270972.16, "samples_seen_pretty": "13B"}, {"dataset": "vtab", "lp_acc1": 0.7125347395825511, "fewshot_k": -1, "model": "ViT-B-16", "pretrained": "openai", "upstream_dataset": "CLIP-WIT", "gmacs_total": 263296000000.0, "samples_seen_pretty": "13B"}, {"dataset": "vtab", "lp_acc1": 0.7332202011443508, "fewshot_k": -1, "model": "ViT-B-16-plus-240", "pretrained": "laion400m_e32", "upstream_dataset": "LAION-400M", "gmacs_total": 370313744206.08, "samples_seen_pretty": "13B"}, {"dataset": "vtab", "lp_acc1": 0.7143166719197058, "fewshot_k": -1, "model": "ViT-B-32", "pretrained": "laion2b_e16", "upstream_dataset": "LAION-2B", "gmacs_total": 256967931347.2, "samples_seen_pretty": "34B"}, {"dataset": "vtab", "lp_acc1": 0.7152995214130362, "fewshot_k": -1, "model": "ViT-B-32", "pretrained": "laion2b_s34b_b79k", "upstream_dataset": "LAION-2B", "gmacs_total": 291096483388.0, "samples_seen_pretty": "34B"}, {"dataset": "vtab", "lp_acc1": 0.7183753019516755, "fewshot_k": -1, "model": "ViT-B-32", "pretrained": "laion400m_e32", "upstream_dataset": "LAION-400M", "gmacs_total": 96456237491.2, "samples_seen_pretty": "13B"}, {"dataset": "vtab", "lp_acc1": 0.6971394911855741, "fewshot_k": -1, "model": "ViT-B-32", "pretrained": "openai", "upstream_dataset": "CLIP-WIT", "gmacs_total": 94720000000.0, "samples_seen_pretty": "13B"}, {"dataset": "vtab", "lp_acc1": 0.7596462313700938, "fewshot_k": -1, "model": "ViT-H-14", "pretrained": "laion2b_s32b_b79k", "upstream_dataset": "LAION-2B", "gmacs_total": 6631508868008.96, "samples_seen_pretty": "34B"}, {"dataset": "vtab", "lp_acc1": 0.744758325311516, "fewshot_k": -1, "model": "ViT-L-14", "pretrained": "laion2b_s32b_b82k", "upstream_dataset": "LAION-2B", "gmacs_total": 2807360000000.0, "samples_seen_pretty": "34B"}, {"dataset": "vtab", "lp_acc1": 0.7397637678783028, "fewshot_k": -1, "model": "ViT-L-14", "pretrained": "laion400m_e32", "upstream_dataset": "LAION-400M", "gmacs_total": 1143527799338.24, "samples_seen_pretty": "13B"}, {"dataset": "vtab", "lp_acc1": 0.7376775015037333, "fewshot_k": -1, "model": "ViT-L-14", "pretrained": "openai", "upstream_dataset": "CLIP-WIT", "gmacs_total": 1122944000000.0, "samples_seen_pretty": "13B"}, {"dataset": "vtab", "lp_acc1": 0.7517780869059744, "fewshot_k": -1, "model": "ViT-g-14", "pretrained": "laion2b_s12b_b42k", "upstream_dataset": "LAION-2B", "gmacs_total": 3549396664594.8, "samples_seen_pretty": "13B"}] \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_experiments.py b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_experiments.py new file mode 100644 index 0000000000000000000000000000000000000000..6259cb41731d4f19b164dd4d2d433e5e832b1c09 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_experiments.py @@ -0,0 +1,79 @@ +import os +from clip_benchmark.cli import run, get_parser_args + +if __name__ == '__main__': + + models = ['ViT-B-32-quickgelu,laion400m_e32', + 'ViT-B-32,openai', + 'ViT-B-32,laion2b_s34b_b79k', + 'ViT-B-16,laion400m_e32', + 'ViT-B-16-plus-240,laion400m_e32', + 'ViT-B-16,openai', + 'ViT-L-14-336,openai', + 'ViT-L-14,openai', + 'ViT-B-32,laion2b_e16', + 'ViT-L-14,laion400m_e32', + 'ViT-L-14,laion2b_s32b_b82k', + 'ViT-H-14,laion2b_s32b_b79k', + 'ViT-g-14,laion2b_s12b_b42k', + ] + + datasets = ['imagenet1k-unverified', 'cifar100'] + datasets = datasets + [ + 'vtab/caltech101', + 'vtab/cifar10', + 'vtab/cifar100', + 'vtab/clevr_count_all', + 'vtab/clevr_closest_object_distance', + 'vtab/diabetic_retinopathy', + 'vtab/dmlab', + 'vtab/dsprites_label_orientation', + 'vtab/dsprites_label_x_position', + 'vtab/dtd', + 'vtab/eurosat', + 'vtab/kitti_closest_vehicle_distance', + 'vtab/flowers', + 'vtab/pets', + 'vtab/pcam', + 'vtab/resisc45', + 'vtab/smallnorb_label_azimuth', + 'vtab/smallnorb_label_elevation', + 'vtab/svhn', + ] + ks = [10, 25, -1] + lrs = [0.1, 0.01, 0.001] + epoch_vals = [10, 20, 40] + batch_sizes = [32 * 8] + + if not os.path.exists('probe_benchmark/data'): + os.mkdir('probe_benchmark/data') + + for dataset in datasets: + dataset_root = 'datasets/' + dataset.split('/')[-1] # TODO: change! + print(dataset_root) + for model_info in models: + model_info_split = model_info.split(',') + model, pretrained = model_info_split[0], model_info_split[1] + for epochs in epoch_vals: + # For VTAB, do not run >= 25 shot. + for k in ks: + if k >= 25 and dataset.startswith('vtab'): + continue + for lr in lrs: + for bs in batch_sizes: + args = get_parser_args() + args.dataset_root = dataset_root + args.dataset = dataset + args.task = 'linear_probe' + args.pretrained = pretrained + args.model = model + args.output = f'probe_benchmark/data/' + f'{model}-{pretrained}-{dataset}-{epochs}-{k}-{lr}-{bs}.json'.replace('/', '_') + if os.path.exists(args.output): + print('skipping - exists.') + continue + args.fewshot_k = k + args.fewshot_epochs = epochs + args.fewshot_lr = lr + args.batch_size = bs + run(args) + print(dataset, model, pretrained, epochs, k, lr, bs) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_plot.ipynb b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_plot.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fb8353d97c0fea157b9eff6c9da0aa06cbec47a0 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/probe_benchmark/scaling_plot.ipynb @@ -0,0 +1,1690 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import os\n", + "from collections import defaultdict\n", + "%matplotlib inline\n", + "from operator import truediv\n", + "from tokenize import group\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.ticker as mticker\n", + "\n", + "from matplotlib.gridspec import GridSpec\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from matplotlib.lines import Line2D\n", + "import plotly.express as px\n", + "from matplotlib import cm\n", + "from matplotlib.colors import ListedColormap, LinearSegmentedColormap\n", + "#new_porange = ListedColormap(newcolors)\n", + "import statsmodels.api as sm\n", + "def lstsq(x, y):\n", + " A = np.vstack([x, np.ones(len(x))]).T\n", + " coefs, *rest = np.linalg.lstsq(A, y, rcond=None)\n", + " return coefs\n", + "plt.rcParams.update({'font.size': 15})" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "upstream_colors = {\n", + " \"LAION-80M\": \"blue\",\n", + " \"LAION-400M\": \"orange\",\n", + " \"LAION-2B\": \"green\",\n", + " \"CLIP-WIT\": \"black\",\n", + "}\n", + "upstream_colors2 = {\n", + " \"LAION-80M\": \"orange\",\n", + " \"LAION-400M\": \"orange\",\n", + " \"LAION-2B\": \"orange\",\n", + " \"CLIP-WIT\": \"blue\",\n", + "}\n", + "upstream_dataset_styles = {\n", + " \"LAION-80M\": \"v\",\n", + " \"LAION-400M\": \"o\",\n", + " \"LAION-2B\": \"s\",\n", + " \"CLIP-WIT\": \"*\",\n", + "\n", + "}\n", + "upstream_order = [\"LAION-80M\", \"LAION-400M\", \"LAION-2B\", \"CLIP WiT\"]\n", + "samples_seen_sizes = {\n", + " #\"3B\": 60,\n", + " #\"13B\": 100,\n", + " #\"34B\": 180,\n", + " #\"3B\": 100,\n", + " \"13B\": 150,\n", + " \"34B\": 300,\n", + "}\n", + "samples_seen_order = [\"13B\", \"34B\"]\n", + "arch_order = [\"ViT-B/32\", \"ViT-B/16\", \"ViT-L/14\", \"ViT-H/14\", \"ViT-g/14\"]\n", + "arch_sizes = {\n", + " \"ViT-B/32\": 40, \n", + " \"ViT-B/16\": 80, \n", + " \"ViT-L/14\": 120,\n", + " \"ViT-H/14\": 160, \n", + " \"ViT-g/14\": 200,\n", + "}\n", + "model_styles = {\n", + " \"ViT-B/32\": \"v\", \n", + " \"ViT-B/16\": \"o\", \n", + " \"ViT-L/14\": \"s\",\n", + " \"ViT-H/14\": \"P\", \n", + " \"ViT-g/14\": \"*\",\n", + "\n", + "}\n", + "upstream_sizes = {\n", + " \"LAION-80M\": 60,\n", + " \"LAION-400M\": 100,\n", + " \"LAION-2B\": 180,\n", + " \"CLIP-WIT\": 100,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def build_df2(target='imagenet1k-unverified', fewshot_k=10):\n", + " target_pretty = {\n", + " \"imagenet1k\": \"ImageNet\",\n", + " \"mscoco_captions\": \"MS-COCO\",\n", + " \"vtab+\": \"VTAB+\",\n", + " \"vtab\": \"VTAB\",\n", + " \"imagenet_robustness\": \"ImageNet robustness\",\n", + " \"flickr30k\": \"Flickr30K\",\n", + " \"imagenet1k-unverified\" : \"ImageNet\",\n", + " \"cifar100\" : \"CIFAR100\",\n", + " }[target]\n", + " metric = 'err1%'\n", + " metric_pretty = {\n", + " 'acc1%': 'Top-1 accuracy %',\n", + " 'err1%': 'Error rate %',\n", + " \"image_retrieval_recall@5%\": 'Image retrieval Recall@5'\n", + " }[metric]\n", + " metric_pretty2 = {\n", + " 'err1%': 'error rate (%)',\n", + " \"image_retrieval_recall@5%\": '(100 - Recall@5%)'\n", + " }[metric]\n", + "\n", + " metric_higher_is_better ={\n", + " \"image_retrieval_recall@5%\": True,\n", + " \"acc1%\": True,\n", + " \"err1%\": False,\n", + " }[metric]\n", + "\n", + " d = newdf[(newdf.dataset==target) & (newdf.fewshot_k == fewshot_k)].copy()\n", + " \n", + " def f(s):\n", + " return {\n", + " #'LAION-80M': 80e6,\n", + " 'LAION-400M': 400e6,\n", + " 'LAION-2B': 2e9,\n", + " 'CLIP-WIT': 400e6,\n", + " }[s]\n", + " d['data_scale'] = d.upstream_dataset.apply(f)\n", + " d['err1'] = 1 - (d['image_retrieval_recall@5'] if metric == 'image_retrieval_recall@5%' else d['lp_acc1'])\n", + " #d['image_retrieval_recall@5%'] = d['image_retrieval_recall@5'] * 100.0\n", + " d['acc1%'] = d['lp_acc1'] * 100.0\n", + " d['err1%'] = d['err1'] * 100.0\n", + " d['arch_pretty'] = d.model.apply(lambda a:'-'.join(a.split('-')[0:-1]) + '/' + a.split('-')[-1])\n", + " d['Model'] = d['arch_pretty']\n", + " d['Model Data'] = d.apply(lambda r:r['Model'] + ' ' + r['upstream_dataset'], axis=1)\n", + " d['Dataset'] = d['upstream_dataset']\n", + " d['Samples seen'] = d['samples_seen_pretty']\n", + " d = d.sort_values(by=metric)\n", + " d['Dataset source'] = d.upstream_dataset.apply(lambda u:\"CLIP-WIT\" if u == \"CLIP-WIT\" else \"LAION\")\n", + " d = d[d.model != \"ViT-B-16-plus\"]\n", + " print(len(d))\n", + " print(d[d.model == 'ViT-B-32'])\n", + " d = d.sort_values(by=metric).drop_duplicates(subset=[\"samples_seen_pretty\", \"model\", \"upstream_dataset\"], keep='first')\n", + " print(len(d))\n", + " d = d.sort_values(by='gmacs_total')\n", + " openai = (d.upstream_dataset==\"CLIP-WIT\")\n", + " openclip = ~openai\n", + " d_openclip = d[openclip]\n", + " d_openai = d[openai]\n", + " return d, d_openai, d_openclip, target_pretty, metric_pretty, metric_pretty2, metric" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "108\n", + " k lr bs epochs model pretrained pretrained_short \\\n", + "73 10 0.010 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "64 10 0.010 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "208 10 0.010 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "54 10 0.100 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "63 10 0.100 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "72 10 0.100 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "199 10 0.010 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "189 10 0.100 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "198 10 0.100 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "207 10 0.100 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "19 10 0.010 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "46 10 0.010 256 40 ViT-B-32 openai openai \n", + "10 10 0.010 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "27 10 0.100 256 10 ViT-B-32 openai openai \n", + "0 10 0.100 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "36 10 0.100 256 20 ViT-B-32 openai openai \n", + "9 10 0.100 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "45 10 0.100 256 40 ViT-B-32 openai openai \n", + "55 10 0.010 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "18 10 0.100 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "37 10 0.010 256 20 ViT-B-32 openai openai \n", + "190 10 0.010 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "1 10 0.010 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "74 10 0.001 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "209 10 0.001 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "28 10 0.010 256 10 ViT-B-32 openai openai \n", + "200 10 0.001 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "65 10 0.001 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "20 10 0.001 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "11 10 0.001 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "56 10 0.001 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "191 10 0.001 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "47 10 0.001 256 40 ViT-B-32 openai openai \n", + "38 10 0.001 256 20 ViT-B-32 openai openai \n", + "2 10 0.001 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "29 10 0.001 256 10 ViT-B-32 openai openai \n", + "\n", + " pretrained_clean dataset macts ... data_scale \\\n", + "73 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "64 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "208 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "54 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "63 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "72 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "199 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "189 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "198 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "207 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "19 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "46 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "10 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "27 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "0 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "36 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "9 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "45 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "55 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "18 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "37 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "190 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "1 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "74 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "209 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "28 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "200 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "65 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "20 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "11 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "56 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "191 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "47 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "38 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "2 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "29 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "\n", + " err1 acc1% err1% arch_pretty Model Model Data \\\n", + "73 0.37602 62.398 37.602 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "64 0.38000 62.000 38.000 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "208 0.38110 61.890 38.110 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "54 0.38206 61.794 38.206 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "63 0.38322 61.678 38.322 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "72 0.38456 61.544 38.456 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "199 0.38630 61.370 38.630 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "189 0.38746 61.254 38.746 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "198 0.38794 61.206 38.794 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "207 0.38960 61.040 38.960 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "19 0.40644 59.356 40.644 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "46 0.40838 59.162 40.838 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "10 0.41064 58.936 41.064 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "27 0.41302 58.698 41.302 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "0 0.41504 58.496 41.504 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "36 0.41512 58.488 41.512 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "9 0.41594 58.406 41.594 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "45 0.41632 58.368 41.632 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "55 0.41680 58.320 41.680 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "18 0.41722 58.278 41.722 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "37 0.42416 57.584 42.416 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "190 0.42576 57.424 42.576 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "1 0.44444 55.556 44.444 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "74 0.46386 53.614 46.386 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "209 0.46550 53.450 46.550 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "28 0.46878 53.122 46.878 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "200 0.47044 52.956 47.044 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "65 0.47144 52.856 47.144 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "20 0.49062 50.938 49.062 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "11 0.49752 50.248 49.752 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "56 0.50216 49.784 50.216 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "191 0.50616 49.384 50.616 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "47 0.51074 48.926 51.074 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "38 0.51884 48.116 51.884 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "2 0.53028 46.972 53.028 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "29 0.55664 44.336 55.664 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "\n", + " Dataset Samples seen Dataset source \n", + "73 LAION-2B 34B LAION \n", + "64 LAION-2B 34B LAION \n", + "208 LAION-2B 34B LAION \n", + "54 LAION-2B 34B LAION \n", + "63 LAION-2B 34B LAION \n", + "72 LAION-2B 34B LAION \n", + "199 LAION-2B 34B LAION \n", + "189 LAION-2B 34B LAION \n", + "198 LAION-2B 34B LAION \n", + "207 LAION-2B 34B LAION \n", + "19 LAION-400M 13B LAION \n", + "46 CLIP-WIT 13B CLIP-WIT \n", + "10 LAION-400M 13B LAION \n", + "27 CLIP-WIT 13B CLIP-WIT \n", + "0 LAION-400M 13B LAION \n", + "36 CLIP-WIT 13B CLIP-WIT \n", + "9 LAION-400M 13B LAION \n", + "45 CLIP-WIT 13B CLIP-WIT \n", + "55 LAION-2B 34B LAION \n", + "18 LAION-400M 13B LAION \n", + "37 CLIP-WIT 13B CLIP-WIT \n", + "190 LAION-2B 34B LAION \n", + "1 LAION-400M 13B LAION \n", + "74 LAION-2B 34B LAION \n", + "209 LAION-2B 34B LAION \n", + "28 CLIP-WIT 13B CLIP-WIT \n", + "200 LAION-2B 34B LAION \n", + "65 LAION-2B 34B LAION \n", + "20 LAION-400M 13B LAION \n", + "11 LAION-400M 13B LAION \n", + "56 LAION-2B 34B LAION \n", + "191 LAION-2B 34B LAION \n", + "47 CLIP-WIT 13B CLIP-WIT \n", + "38 CLIP-WIT 13B CLIP-WIT \n", + "2 LAION-400M 13B LAION \n", + "29 CLIP-WIT 13B CLIP-WIT \n", + "\n", + "[36 rows x 30 columns]\n", + "11\n", + "imagenet1k-unverified [-0.1314607 1.05755934] [-0.17566435 1.54138056]\n", + "$E = 11.42 \\/*\\/ C^{ -0.13 }$\n", + "108\n", + " k lr bs epochs model pretrained pretrained_short \\\n", + "67 25 0.010 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "202 25 0.010 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "76 25 0.010 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "58 25 0.010 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "211 25 0.010 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "57 25 0.100 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "193 25 0.010 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "66 25 0.100 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "192 25 0.100 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "75 25 0.100 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "201 25 0.100 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "210 25 0.100 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "49 25 0.010 256 40 ViT-B-32 openai openai \n", + "13 25 0.010 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "40 25 0.010 256 20 ViT-B-32 openai openai \n", + "22 25 0.010 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "4 25 0.010 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "30 25 0.100 256 10 ViT-B-32 openai openai \n", + "39 25 0.100 256 20 ViT-B-32 openai openai \n", + "48 25 0.100 256 40 ViT-B-32 openai openai \n", + "3 25 0.100 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "31 25 0.010 256 10 ViT-B-32 openai openai \n", + "12 25 0.100 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "77 25 0.001 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "21 25 0.100 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "212 25 0.001 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "68 25 0.001 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "23 25 0.001 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "203 25 0.001 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "59 25 0.001 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "194 25 0.001 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "50 25 0.001 256 40 ViT-B-32 openai openai \n", + "14 25 0.001 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "5 25 0.001 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "41 25 0.001 256 20 ViT-B-32 openai openai \n", + "32 25 0.001 256 10 ViT-B-32 openai openai \n", + "\n", + " pretrained_clean dataset macts ... data_scale \\\n", + "67 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "202 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "76 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "58 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "211 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "57 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "193 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "66 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "192 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "75 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "201 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "210 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "49 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "13 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "40 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "22 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "4 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "30 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "39 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "48 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "3 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "31 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "12 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "77 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "21 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "212 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "68 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "23 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "203 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "59 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "194 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "50 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "14 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "5 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "41 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "32 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "\n", + " err1 acc1% err1% arch_pretty Model Model Data \\\n", + "67 0.32016 67.984 32.016 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "202 0.32512 67.488 32.512 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "76 0.32512 67.488 32.512 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "58 0.32922 67.078 32.922 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "211 0.32970 67.030 32.970 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "57 0.33466 66.534 33.466 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "193 0.33718 66.282 33.718 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "66 0.33772 66.228 33.772 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "192 0.33914 66.086 33.914 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "75 0.34008 65.992 34.008 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "201 0.34202 65.798 34.202 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "210 0.34488 65.512 34.488 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "49 0.34730 65.270 34.730 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "13 0.34828 65.172 34.828 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "40 0.34966 65.034 34.966 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "22 0.35548 64.452 35.548 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "4 0.35686 64.314 35.686 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "30 0.35802 64.198 35.802 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "39 0.36210 63.790 36.210 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "48 0.36538 63.462 36.538 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "3 0.36822 63.178 36.822 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "31 0.36934 63.066 36.934 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "12 0.37052 62.948 37.052 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "77 0.37102 62.898 37.102 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "21 0.37308 62.692 37.308 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "212 0.37964 62.036 37.964 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "68 0.39614 60.386 39.614 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "23 0.39998 60.002 39.998 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "203 0.40216 59.784 40.216 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "59 0.41278 58.722 41.278 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "194 0.41522 58.478 41.522 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "50 0.41992 58.008 41.992 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "14 0.42544 57.456 42.544 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "5 0.44106 55.894 44.106 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "41 0.44410 55.590 44.410 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "32 0.45940 54.060 45.940 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "\n", + " Dataset Samples seen Dataset source \n", + "67 LAION-2B 34B LAION \n", + "202 LAION-2B 34B LAION \n", + "76 LAION-2B 34B LAION \n", + "58 LAION-2B 34B LAION \n", + "211 LAION-2B 34B LAION \n", + "57 LAION-2B 34B LAION \n", + "193 LAION-2B 34B LAION \n", + "66 LAION-2B 34B LAION \n", + "192 LAION-2B 34B LAION \n", + "75 LAION-2B 34B LAION \n", + "201 LAION-2B 34B LAION \n", + "210 LAION-2B 34B LAION \n", + "49 CLIP-WIT 13B CLIP-WIT \n", + "13 LAION-400M 13B LAION \n", + "40 CLIP-WIT 13B CLIP-WIT \n", + "22 LAION-400M 13B LAION \n", + "4 LAION-400M 13B LAION \n", + "30 CLIP-WIT 13B CLIP-WIT \n", + "39 CLIP-WIT 13B CLIP-WIT \n", + "48 CLIP-WIT 13B CLIP-WIT \n", + "3 LAION-400M 13B LAION \n", + "31 CLIP-WIT 13B CLIP-WIT \n", + "12 LAION-400M 13B LAION \n", + "77 LAION-2B 34B LAION \n", + "21 LAION-400M 13B LAION \n", + "212 LAION-2B 34B LAION \n", + "68 LAION-2B 34B LAION \n", + "23 LAION-400M 13B LAION \n", + "203 LAION-2B 34B LAION \n", + "59 LAION-2B 34B LAION \n", + "194 LAION-2B 34B LAION \n", + "50 CLIP-WIT 13B CLIP-WIT \n", + "14 LAION-400M 13B LAION \n", + "5 LAION-400M 13B LAION \n", + "41 CLIP-WIT 13B CLIP-WIT \n", + "32 CLIP-WIT 13B CLIP-WIT \n", + "\n", + "[36 rows x 30 columns]\n", + "11\n", + "imagenet1k-unverified [-0.12618628 0.92703027] [-0.17877075 1.50354337]\n", + "$E = 8.45 \\/*\\/ C^{ -0.13 }$\n", + "108\n", + " k lr bs epochs model pretrained pretrained_short \\\n", + "61 -1 0.010 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "80 -1 0.001 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "196 -1 0.010 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "215 -1 0.001 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "70 -1 0.010 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "71 -1 0.001 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "205 -1 0.010 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "79 -1 0.010 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "206 -1 0.001 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "214 -1 0.010 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "34 -1 0.010 256 10 ViT-B-32 openai openai \n", + "43 -1 0.010 256 20 ViT-B-32 openai openai \n", + "62 -1 0.001 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "53 -1 0.001 256 40 ViT-B-32 openai openai \n", + "52 -1 0.010 256 40 ViT-B-32 openai openai \n", + "7 -1 0.010 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "26 -1 0.001 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "197 -1 0.001 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "16 -1 0.010 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "44 -1 0.001 256 20 ViT-B-32 openai openai \n", + "60 -1 0.100 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "17 -1 0.001 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "195 -1 0.100 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "25 -1 0.010 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "33 -1 0.100 256 10 ViT-B-32 openai openai \n", + "69 -1 0.100 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "204 -1 0.100 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "8 -1 0.001 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "35 -1 0.001 256 10 ViT-B-32 openai openai \n", + "42 -1 0.100 256 20 ViT-B-32 openai openai \n", + "213 -1 0.100 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "78 -1 0.100 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "6 -1 0.100 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "51 -1 0.100 256 40 ViT-B-32 openai openai \n", + "15 -1 0.100 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "24 -1 0.100 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "\n", + " pretrained_clean dataset macts ... data_scale \\\n", + "61 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "80 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "196 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "215 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "70 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "71 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "205 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "79 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "206 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "214 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "34 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "43 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "62 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "53 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "52 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "7 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "26 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "197 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "16 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "44 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "60 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "17 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "195 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "25 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "33 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "69 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "204 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "8 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "35 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "42 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "213 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "78 LAION imagenet1k-unverified 5.01 ... 2.000000e+09 \n", + "6 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "51 CLIP-WiT imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "15 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "24 LAION imagenet1k-unverified 5.01 ... 4.000000e+08 \n", + "\n", + " err1 acc1% err1% arch_pretty Model Model Data \\\n", + "61 0.23066 76.934 23.066 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "80 0.23142 76.858 23.142 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "196 0.23400 76.600 23.400 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "215 0.23500 76.500 23.500 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "70 0.23508 76.492 23.508 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "71 0.23612 76.388 23.612 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "205 0.23672 76.328 23.672 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "79 0.24208 75.792 24.208 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "206 0.24260 75.740 24.260 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "214 0.24274 75.726 24.274 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "34 0.24388 75.612 24.388 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "43 0.24564 75.436 24.564 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "62 0.24670 75.330 24.670 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "53 0.24680 75.320 24.680 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "52 0.25054 74.946 25.054 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "7 0.25098 74.902 25.098 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "26 0.25126 74.874 25.126 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "197 0.25278 74.722 25.278 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "16 0.25520 74.480 25.520 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "44 0.25552 74.448 25.552 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "60 0.25602 74.398 25.602 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "17 0.25662 74.338 25.662 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "195 0.25788 74.212 25.788 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "25 0.26038 73.962 26.038 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "33 0.26348 73.652 26.348 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "69 0.26546 73.454 26.546 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "204 0.26560 73.440 26.560 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "8 0.26812 73.188 26.812 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "35 0.26936 73.064 26.936 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "42 0.27184 72.816 27.184 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "213 0.27272 72.728 27.272 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "78 0.27326 72.674 27.326 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B \n", + "6 0.27332 72.668 27.332 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "51 0.28008 71.992 28.008 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT \n", + "15 0.28122 71.878 28.122 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "24 0.28822 71.178 28.822 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M \n", + "\n", + " Dataset Samples seen Dataset source \n", + "61 LAION-2B 34B LAION \n", + "80 LAION-2B 34B LAION \n", + "196 LAION-2B 34B LAION \n", + "215 LAION-2B 34B LAION \n", + "70 LAION-2B 34B LAION \n", + "71 LAION-2B 34B LAION \n", + "205 LAION-2B 34B LAION \n", + "79 LAION-2B 34B LAION \n", + "206 LAION-2B 34B LAION \n", + "214 LAION-2B 34B LAION \n", + "34 CLIP-WIT 13B CLIP-WIT \n", + "43 CLIP-WIT 13B CLIP-WIT \n", + "62 LAION-2B 34B LAION \n", + "53 CLIP-WIT 13B CLIP-WIT \n", + "52 CLIP-WIT 13B CLIP-WIT \n", + "7 LAION-400M 13B LAION \n", + "26 LAION-400M 13B LAION \n", + "197 LAION-2B 34B LAION \n", + "16 LAION-400M 13B LAION \n", + "44 CLIP-WIT 13B CLIP-WIT \n", + "60 LAION-2B 34B LAION \n", + "17 LAION-400M 13B LAION \n", + "195 LAION-2B 34B LAION \n", + "25 LAION-400M 13B LAION \n", + "33 CLIP-WIT 13B CLIP-WIT \n", + "69 LAION-2B 34B LAION \n", + "204 LAION-2B 34B LAION \n", + "8 LAION-400M 13B LAION \n", + "35 CLIP-WIT 13B CLIP-WIT \n", + "42 CLIP-WIT 13B CLIP-WIT \n", + "213 LAION-2B 34B LAION \n", + "78 LAION-2B 34B LAION \n", + "6 LAION-400M 13B LAION \n", + "51 CLIP-WIT 13B CLIP-WIT \n", + "15 LAION-400M 13B LAION \n", + "24 LAION-400M 13B LAION \n", + "\n", + "[36 rows x 30 columns]\n", + "11\n", + "imagenet1k-unverified [-0.12020044 0.71410972] [-0.18009978 1.36318424]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/private/home/mitchellw/miniconda3/envs/cb/lib/python3.10/site-packages/seaborn/_oldcore.py:200: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if palette in QUAL_PALETTES:\n", + "/private/home/mitchellw/miniconda3/envs/cb/lib/python3.10/site-packages/seaborn/_oldcore.py:200: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if palette in QUAL_PALETTES:\n", + "/private/home/mitchellw/miniconda3/envs/cb/lib/python3.10/site-packages/seaborn/_oldcore.py:200: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if palette in QUAL_PALETTES:\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$E = 5.18 \\/*\\/ C^{ -0.12 }$\n", + "108\n", + " k lr bs epochs model pretrained pretrained_short \\\n", + "387 10 0.100 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "378 10 0.100 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "397 10 0.010 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "396 10 0.100 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "522 10 0.100 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "531 10 0.100 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "513 10 0.100 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "388 10 0.010 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "532 10 0.010 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "379 10 0.010 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "523 10 0.010 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "398 10 0.001 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "514 10 0.010 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "324 10 0.100 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "333 10 0.100 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "343 10 0.010 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "342 10 0.100 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "334 10 0.010 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "533 10 0.001 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "325 10 0.010 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "344 10 0.001 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "360 10 0.100 256 20 ViT-B-32 openai openai \n", + "369 10 0.100 256 40 ViT-B-32 openai openai \n", + "351 10 0.100 256 10 ViT-B-32 openai openai \n", + "389 10 0.001 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "370 10 0.010 256 40 ViT-B-32 openai openai \n", + "524 10 0.001 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "361 10 0.010 256 20 ViT-B-32 openai openai \n", + "335 10 0.001 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "352 10 0.010 256 10 ViT-B-32 openai openai \n", + "371 10 0.001 256 40 ViT-B-32 openai openai \n", + "362 10 0.001 256 20 ViT-B-32 openai openai \n", + "380 10 0.001 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "515 10 0.001 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "326 10 0.001 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "353 10 0.001 256 10 ViT-B-32 openai openai \n", + "\n", + " pretrained_clean dataset macts ... data_scale err1 acc1% \\\n", + "387 LAION cifar100 5.01 ... 2.000000e+09 0.2453 75.47 \n", + "378 LAION cifar100 5.01 ... 2.000000e+09 0.2456 75.44 \n", + "397 LAION cifar100 5.01 ... 2.000000e+09 0.2482 75.18 \n", + "396 LAION cifar100 5.01 ... 2.000000e+09 0.2487 75.13 \n", + "522 LAION cifar100 5.01 ... 2.000000e+09 0.2576 74.24 \n", + "531 LAION cifar100 5.01 ... 2.000000e+09 0.2601 73.99 \n", + "513 LAION cifar100 5.01 ... 2.000000e+09 0.2604 73.96 \n", + "388 LAION cifar100 5.01 ... 2.000000e+09 0.2611 73.89 \n", + "532 LAION cifar100 5.01 ... 2.000000e+09 0.2622 73.78 \n", + "379 LAION cifar100 5.01 ... 2.000000e+09 0.2756 72.44 \n", + "523 LAION cifar100 5.01 ... 2.000000e+09 0.2784 72.16 \n", + "398 LAION cifar100 5.01 ... 2.000000e+09 0.2919 70.81 \n", + "514 LAION cifar100 5.01 ... 2.000000e+09 0.2929 70.71 \n", + "324 LAION cifar100 5.01 ... 4.000000e+08 0.2950 70.50 \n", + "333 LAION cifar100 5.01 ... 4.000000e+08 0.2964 70.36 \n", + "343 LAION cifar100 5.01 ... 4.000000e+08 0.2978 70.22 \n", + "342 LAION cifar100 5.01 ... 4.000000e+08 0.2988 70.12 \n", + "334 LAION cifar100 5.01 ... 4.000000e+08 0.3063 69.37 \n", + "533 LAION cifar100 5.01 ... 2.000000e+09 0.3070 69.30 \n", + "325 LAION cifar100 5.01 ... 4.000000e+08 0.3187 68.13 \n", + "344 LAION cifar100 5.01 ... 4.000000e+08 0.3400 66.00 \n", + "360 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3607 63.93 \n", + "369 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3630 63.70 \n", + "351 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3755 62.45 \n", + "389 LAION cifar100 5.01 ... 2.000000e+09 0.3761 62.39 \n", + "370 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3920 60.80 \n", + "524 LAION cifar100 5.01 ... 2.000000e+09 0.4005 59.95 \n", + "361 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.4039 59.61 \n", + "335 LAION cifar100 5.01 ... 4.000000e+08 0.4249 57.51 \n", + "352 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.4254 57.46 \n", + "371 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.4402 55.98 \n", + "362 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.5706 42.94 \n", + "380 LAION cifar100 5.01 ... 2.000000e+09 0.5812 41.88 \n", + "515 LAION cifar100 5.01 ... 2.000000e+09 0.6182 38.18 \n", + "326 LAION cifar100 5.01 ... 4.000000e+08 0.6237 37.63 \n", + "353 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.7910 20.90 \n", + "\n", + " err1% arch_pretty Model Model Data Dataset \\\n", + "387 24.53 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "378 24.56 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "397 24.82 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "396 24.87 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "522 25.76 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "531 26.01 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "513 26.04 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "388 26.11 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "532 26.22 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "379 27.56 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "523 27.84 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "398 29.19 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "514 29.29 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "324 29.50 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "333 29.64 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "343 29.78 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "342 29.88 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "334 30.63 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "533 30.70 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "325 31.87 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "344 34.00 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "360 36.07 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "369 36.30 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "351 37.55 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "389 37.61 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "370 39.20 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "524 40.05 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "361 40.39 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "335 42.49 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "352 42.54 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "371 44.02 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "362 57.06 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "380 58.12 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "515 61.82 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "326 62.37 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "353 79.10 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "\n", + " Samples seen Dataset source \n", + "387 34B LAION \n", + "378 34B LAION \n", + "397 34B LAION \n", + "396 34B LAION \n", + "522 34B LAION \n", + "531 34B LAION \n", + "513 34B LAION \n", + "388 34B LAION \n", + "532 34B LAION \n", + "379 34B LAION \n", + "523 34B LAION \n", + "398 34B LAION \n", + "514 34B LAION \n", + "324 13B LAION \n", + "333 13B LAION \n", + "343 13B LAION \n", + "342 13B LAION \n", + "334 13B LAION \n", + "533 34B LAION \n", + "325 13B LAION \n", + "344 13B LAION \n", + "360 13B CLIP-WIT \n", + "369 13B CLIP-WIT \n", + "351 13B CLIP-WIT \n", + "389 34B LAION \n", + "370 13B CLIP-WIT \n", + "524 34B LAION \n", + "361 13B CLIP-WIT \n", + "335 13B LAION \n", + "352 13B CLIP-WIT \n", + "371 13B CLIP-WIT \n", + "362 13B CLIP-WIT \n", + "380 34B LAION \n", + "515 34B LAION \n", + "326 13B LAION \n", + "353 13B CLIP-WIT \n", + "\n", + "[36 rows x 30 columns]\n", + "11\n", + "cifar100 [-0.17437949 1.41119465] [-0.19432683 1.69820658]\n", + "$E = 25.77 \\/*\\/ C^{ -0.17 }$\n", + "108\n", + " k lr bs epochs model pretrained pretrained_short \\\n", + "381 25 0.100 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "400 25 0.010 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "390 25 0.100 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "516 25 0.100 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "399 25 0.100 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "535 25 0.010 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "391 25 0.010 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "525 25 0.100 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "534 25 0.100 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "526 25 0.010 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "382 25 0.010 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "401 25 0.001 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "517 25 0.010 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "346 25 0.010 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "327 25 0.100 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "536 25 0.001 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "336 25 0.100 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "392 25 0.001 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "345 25 0.100 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "337 25 0.010 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "527 25 0.001 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "328 25 0.010 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "347 25 0.001 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "363 25 0.100 256 20 ViT-B-32 openai openai \n", + "338 25 0.001 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "372 25 0.100 256 40 ViT-B-32 openai openai \n", + "354 25 0.100 256 10 ViT-B-32 openai openai \n", + "373 25 0.010 256 40 ViT-B-32 openai openai \n", + "383 25 0.001 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "364 25 0.010 256 20 ViT-B-32 openai openai \n", + "518 25 0.001 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "374 25 0.001 256 40 ViT-B-32 openai openai \n", + "355 25 0.010 256 10 ViT-B-32 openai openai \n", + "329 25 0.001 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "365 25 0.001 256 20 ViT-B-32 openai openai \n", + "356 25 0.001 256 10 ViT-B-32 openai openai \n", + "\n", + " pretrained_clean dataset macts ... data_scale err1 acc1% \\\n", + "381 LAION cifar100 5.01 ... 2.000000e+09 0.2003 79.97 \n", + "400 LAION cifar100 5.01 ... 2.000000e+09 0.2055 79.45 \n", + "390 LAION cifar100 5.01 ... 2.000000e+09 0.2085 79.15 \n", + "516 LAION cifar100 5.01 ... 2.000000e+09 0.2127 78.73 \n", + "399 LAION cifar100 5.01 ... 2.000000e+09 0.2127 78.73 \n", + "535 LAION cifar100 5.01 ... 2.000000e+09 0.2142 78.58 \n", + "391 LAION cifar100 5.01 ... 2.000000e+09 0.2167 78.33 \n", + "525 LAION cifar100 5.01 ... 2.000000e+09 0.2199 78.01 \n", + "534 LAION cifar100 5.01 ... 2.000000e+09 0.2246 77.54 \n", + "526 LAION cifar100 5.01 ... 2.000000e+09 0.2283 77.17 \n", + "382 LAION cifar100 5.01 ... 2.000000e+09 0.2301 76.99 \n", + "401 LAION cifar100 5.01 ... 2.000000e+09 0.2351 76.49 \n", + "517 LAION cifar100 5.01 ... 2.000000e+09 0.2443 75.57 \n", + "346 LAION cifar100 5.01 ... 4.000000e+08 0.2482 75.18 \n", + "327 LAION cifar100 5.01 ... 4.000000e+08 0.2494 75.06 \n", + "536 LAION cifar100 5.01 ... 2.000000e+09 0.2498 75.02 \n", + "336 LAION cifar100 5.01 ... 4.000000e+08 0.2544 74.56 \n", + "392 LAION cifar100 5.01 ... 2.000000e+09 0.2552 74.48 \n", + "345 LAION cifar100 5.01 ... 4.000000e+08 0.2586 74.14 \n", + "337 LAION cifar100 5.01 ... 4.000000e+08 0.2598 74.02 \n", + "527 LAION cifar100 5.01 ... 2.000000e+09 0.2690 73.10 \n", + "328 LAION cifar100 5.01 ... 4.000000e+08 0.2754 72.46 \n", + "347 LAION cifar100 5.01 ... 4.000000e+08 0.2785 72.15 \n", + "363 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2936 70.64 \n", + "338 LAION cifar100 5.01 ... 4.000000e+08 0.2957 70.43 \n", + "372 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3003 69.97 \n", + "354 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3012 69.88 \n", + "373 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3233 67.67 \n", + "383 LAION cifar100 5.01 ... 2.000000e+09 0.3290 67.10 \n", + "364 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3432 65.68 \n", + "518 LAION cifar100 5.01 ... 2.000000e+09 0.3446 65.54 \n", + "374 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3648 63.52 \n", + "355 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3659 63.41 \n", + "329 LAION cifar100 5.01 ... 4.000000e+08 0.3672 63.28 \n", + "365 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3868 61.32 \n", + "356 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.4875 51.25 \n", + "\n", + " err1% arch_pretty Model Model Data Dataset \\\n", + "381 20.03 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "400 20.55 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "390 20.85 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "516 21.27 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "399 21.27 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "535 21.42 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "391 21.67 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "525 21.99 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "534 22.46 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "526 22.83 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "382 23.01 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "401 23.51 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "517 24.43 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "346 24.82 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "327 24.94 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "536 24.98 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "336 25.44 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "392 25.52 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "345 25.86 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "337 25.98 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "527 26.90 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "328 27.54 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "347 27.85 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "363 29.36 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "338 29.57 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "372 30.03 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "354 30.12 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "373 32.33 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "383 32.90 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "364 34.32 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "518 34.46 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "374 36.48 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "355 36.59 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "329 36.72 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "365 38.68 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "356 48.75 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "\n", + " Samples seen Dataset source \n", + "381 34B LAION \n", + "400 34B LAION \n", + "390 34B LAION \n", + "516 34B LAION \n", + "399 34B LAION \n", + "535 34B LAION \n", + "391 34B LAION \n", + "525 34B LAION \n", + "534 34B LAION \n", + "526 34B LAION \n", + "382 34B LAION \n", + "401 34B LAION \n", + "517 34B LAION \n", + "346 13B LAION \n", + "327 13B LAION \n", + "536 34B LAION \n", + "336 13B LAION \n", + "392 34B LAION \n", + "345 13B LAION \n", + "337 13B LAION \n", + "527 34B LAION \n", + "328 13B LAION \n", + "347 13B LAION \n", + "363 13B CLIP-WIT \n", + "338 13B LAION \n", + "372 13B CLIP-WIT \n", + "354 13B CLIP-WIT \n", + "373 13B CLIP-WIT \n", + "383 34B LAION \n", + "364 13B CLIP-WIT \n", + "518 34B LAION \n", + "374 13B CLIP-WIT \n", + "355 13B CLIP-WIT \n", + "329 13B LAION \n", + "365 13B CLIP-WIT \n", + "356 13B CLIP-WIT \n", + "\n", + "[36 rows x 30 columns]\n", + "11\n", + "cifar100 [-0.18484099 1.44546899] [-0.19827113 1.65290788]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/private/home/mitchellw/miniconda3/envs/cb/lib/python3.10/site-packages/seaborn/_oldcore.py:200: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if palette in QUAL_PALETTES:\n", + "/private/home/mitchellw/miniconda3/envs/cb/lib/python3.10/site-packages/seaborn/_oldcore.py:200: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if palette in QUAL_PALETTES:\n", + "/private/home/mitchellw/miniconda3/envs/cb/lib/python3.10/site-packages/seaborn/_oldcore.py:200: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if palette in QUAL_PALETTES:\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$E = 27.89 \\/*\\/ C^{ -0.18 }$\n", + "108\n", + " k lr bs epochs model pretrained pretrained_short \\\n", + "403 -1 0.010 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "394 -1 0.010 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "384 -1 0.100 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "538 -1 0.010 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "393 -1 0.100 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "529 -1 0.010 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "385 -1 0.010 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "519 -1 0.100 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "528 -1 0.100 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "402 -1 0.100 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "520 -1 0.010 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "404 -1 0.001 256 40 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "537 -1 0.100 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "539 -1 0.001 256 40 ViT-B-32 laion2b_e16 laion2b \n", + "340 -1 0.010 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "349 -1 0.010 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "330 -1 0.100 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "395 -1 0.001 256 20 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "331 -1 0.010 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "339 -1 0.100 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "530 -1 0.001 256 20 ViT-B-32 laion2b_e16 laion2b \n", + "348 -1 0.100 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "350 -1 0.001 256 40 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "386 -1 0.001 256 10 ViT-B-32 laion2b_s34b_b79k laion2b \n", + "357 -1 0.100 256 10 ViT-B-32 openai openai \n", + "366 -1 0.100 256 20 ViT-B-32 openai openai \n", + "376 -1 0.010 256 40 ViT-B-32 openai openai \n", + "521 -1 0.001 256 10 ViT-B-32 laion2b_e16 laion2b \n", + "375 -1 0.100 256 40 ViT-B-32 openai openai \n", + "367 -1 0.010 256 20 ViT-B-32 openai openai \n", + "341 -1 0.001 256 20 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "332 -1 0.001 256 10 ViT-B-32 laion400m_e32 laion400m_e32 \n", + "358 -1 0.010 256 10 ViT-B-32 openai openai \n", + "377 -1 0.001 256 40 ViT-B-32 openai openai \n", + "368 -1 0.001 256 20 ViT-B-32 openai openai \n", + "359 -1 0.001 256 10 ViT-B-32 openai openai \n", + "\n", + " pretrained_clean dataset macts ... data_scale err1 acc1% \\\n", + "403 LAION cifar100 5.01 ... 2.000000e+09 0.1401 85.99 \n", + "394 LAION cifar100 5.01 ... 2.000000e+09 0.1422 85.78 \n", + "384 LAION cifar100 5.01 ... 2.000000e+09 0.1443 85.57 \n", + "538 LAION cifar100 5.01 ... 2.000000e+09 0.1494 85.06 \n", + "393 LAION cifar100 5.01 ... 2.000000e+09 0.1496 85.04 \n", + "529 LAION cifar100 5.01 ... 2.000000e+09 0.1518 84.82 \n", + "385 LAION cifar100 5.01 ... 2.000000e+09 0.1520 84.80 \n", + "519 LAION cifar100 5.01 ... 2.000000e+09 0.1533 84.67 \n", + "528 LAION cifar100 5.01 ... 2.000000e+09 0.1580 84.20 \n", + "402 LAION cifar100 5.01 ... 2.000000e+09 0.1590 84.10 \n", + "520 LAION cifar100 5.01 ... 2.000000e+09 0.1604 83.96 \n", + "404 LAION cifar100 5.01 ... 2.000000e+09 0.1634 83.66 \n", + "537 LAION cifar100 5.01 ... 2.000000e+09 0.1671 83.29 \n", + "539 LAION cifar100 5.01 ... 2.000000e+09 0.1707 82.93 \n", + "340 LAION cifar100 5.01 ... 4.000000e+08 0.1708 82.92 \n", + "349 LAION cifar100 5.01 ... 4.000000e+08 0.1709 82.91 \n", + "330 LAION cifar100 5.01 ... 4.000000e+08 0.1750 82.50 \n", + "395 LAION cifar100 5.01 ... 2.000000e+09 0.1789 82.11 \n", + "331 LAION cifar100 5.01 ... 4.000000e+08 0.1790 82.10 \n", + "339 LAION cifar100 5.01 ... 4.000000e+08 0.1820 81.80 \n", + "530 LAION cifar100 5.01 ... 2.000000e+09 0.1897 81.03 \n", + "348 LAION cifar100 5.01 ... 4.000000e+08 0.1900 81.00 \n", + "350 LAION cifar100 5.01 ... 4.000000e+08 0.1952 80.48 \n", + "386 LAION cifar100 5.01 ... 2.000000e+09 0.1974 80.26 \n", + "357 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2003 79.97 \n", + "366 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2029 79.71 \n", + "376 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2037 79.63 \n", + "521 LAION cifar100 5.01 ... 2.000000e+09 0.2080 79.20 \n", + "375 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2113 78.87 \n", + "367 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2134 78.66 \n", + "341 LAION cifar100 5.01 ... 4.000000e+08 0.2138 78.62 \n", + "332 LAION cifar100 5.01 ... 4.000000e+08 0.2320 76.80 \n", + "358 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2324 76.76 \n", + "377 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2609 73.91 \n", + "368 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.2890 71.10 \n", + "359 CLIP-WiT cifar100 5.01 ... 4.000000e+08 0.3132 68.68 \n", + "\n", + " err1% arch_pretty Model Model Data Dataset \\\n", + "403 14.01 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "394 14.22 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "384 14.43 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "538 14.94 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "393 14.96 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "529 15.18 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "385 15.20 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "519 15.33 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "528 15.80 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "402 15.90 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "520 16.04 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "404 16.34 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "537 16.71 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "539 17.07 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "340 17.08 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "349 17.09 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "330 17.50 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "395 17.89 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "331 17.90 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "339 18.20 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "530 18.97 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "348 19.00 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "350 19.52 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "386 19.74 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "357 20.03 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "366 20.29 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "376 20.37 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "521 20.80 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "375 21.13 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "367 21.34 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "341 21.38 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "332 23.20 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "358 23.24 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "377 26.09 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "368 28.90 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "359 31.32 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "\n", + " Samples seen Dataset source \n", + "403 34B LAION \n", + "394 34B LAION \n", + "384 34B LAION \n", + "538 34B LAION \n", + "393 34B LAION \n", + "529 34B LAION \n", + "385 34B LAION \n", + "519 34B LAION \n", + "528 34B LAION \n", + "402 34B LAION \n", + "520 34B LAION \n", + "404 34B LAION \n", + "537 34B LAION \n", + "539 34B LAION \n", + "340 13B LAION \n", + "349 13B LAION \n", + "330 13B LAION \n", + "395 34B LAION \n", + "331 13B LAION \n", + "339 13B LAION \n", + "530 34B LAION \n", + "348 13B LAION \n", + "350 13B LAION \n", + "386 34B LAION \n", + "357 13B CLIP-WIT \n", + "366 13B CLIP-WIT \n", + "376 13B CLIP-WIT \n", + "521 34B LAION \n", + "375 13B CLIP-WIT \n", + "367 13B CLIP-WIT \n", + "341 13B LAION \n", + "332 13B LAION \n", + "358 13B CLIP-WIT \n", + "377 13B CLIP-WIT \n", + "368 13B CLIP-WIT \n", + "359 13B CLIP-WIT \n", + "\n", + "[36 rows x 30 columns]\n", + "11\n", + "cifar100 [-0.17690599 1.19607582] [-0.18168383 1.3049806 ]\n", + "$E = 15.71 \\/*\\/ C^{ -0.18 }$\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_173601/2074057257.py:208: UserWarning: Tight layout not applied. tight_layout cannot make axes width small enough to accommodate all axes decorations\n", + " plt.tight_layout()\n" + ] + }, + { + "data": { + "image/png": "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O6VcuXLKO++8o8THx6dbZ8OGDUrHjh0VGxsbxcbGRqlbt64yceJE5datW8ZlvLy8lAYNGmS572ddvXpVefHFFxVHR0fF0tJSqVOnjjJ16lTj/NT39enP07Fjx5S2bdsqVlZWipubm/LJJ58ou3fvTvMe3rt3T3njjTcUT09PxdLSUnFyclK6du2q7N2717idffv2KS+88ILi5uammJubK25ubsrw4cNL9PlVGBRmzmRE8jpvCiqzfR5HKO8sPaL0mrlN6TVzm/L+8qPK3SdF87cvCby8vDLN6qe/soaHhysjRoxQatasqVhbWysWFhZKgwYNlK+//jpXfyPJ64LLa0VRlClTpiiAcunSJclryetSp6jzWlFKZ2aXlLxWFEWJjEtUftp+Wen9T2a/MHensvb4HSU5RVcAJRVFLaNMfZZOp1M+/fRTxdnZWbG2tlZ69+6t3LlzR/Hw8FBGjhxpXC6jjH0287Pax4wZMxRXV1fFyspK6dKli3L16tV0+0hISFA+/PBD43IdOnRQTpw4oXh5eSleXl5ptrllyxalfv36ipmZmQIoK1asUBRFUa5fv6706NFDsbW1VZydnZU333xTuXTpkgIo7777rpKUlKSEhIQoEydOVOrWravY2NgoDg4OSps2bZS1a9emK/uBAweU3r17Kw4ODoqlpaXi6empjBo1Sjl79qxxmZSUFOXdd99VXFxcFJVKleb7mxBFJadZo1KU/I/U065dO0JCQli2bBmtW7cmNjaWP/74g48++oiePXuyc+fO/O7CJKKionBwcCAyMhJ7e/sC3XZycjI7duygX79+aLPrkDQHfAOjmL/jCjf8IgDD3e33+zfEs1LuW6CLsqdatWo0bNiQbdu2mbooaSQnJ/Paa6/x119/ERwcXGB354UoLgozZzIieZ03BZnZOr3CtrP3WXnAh7ikFNQqFS+1rc6IzrWwNJfxQETWimteA0ydOpXZs2fz+PFj40DlQpQWRZ3XUDozuyTldarbAZH8vPMqN/wjAMPYXhP6NKBZdbkuESVTYRwnQhQnOc2aHPUhfv369UznJSUlcerUKebMmYOXlxdWVlY4OzszadIk+vTpk64PJlE4qle054dR7Xm3X0OsLcy49TiCd5YdY+neGyQkpWS/ASGEECWe5HXxp1GreKF1dZa+7UXHupXQKwrrTtxj3KLDnPQJNHXx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ERERqRTUIC7iIsuyivQvJibG3VX2mHqIiIiUJWW2iIiI51Nei4i7eLm7AiLlxZgxY3JNW7RoETt27KB169a0adMmx7zq1asXaf2WZREdHc2uXbvOoZZSWnr16sXChQuJjY3VDyAREQ+nzK7clNkiIuWD8rpyU16LO6lBXMRFU6dOzTVt7Nix7NixgyFDhjBx4sQyr5OIiIjkpswWERHxfMprEXEXdZkiIiIiIiIiIiIiIpWCGsRFSsmxY8d44IEHaNSoEX5+flSrVo3+/fszb968HOWmTp2KZVkA7N69O0cfab169cout2bNGsaPH0/79u2pUaMGvr6+1K9fn9tuu40DBw6UWL2NMXz++ef07duXsLAw/Pz8iImJ4YorruCXX37JVX7JkiUMHjw4u04xMTH51inrtU6cOJEdO3ZwxRVXUL16dYKDg7nkkkvYtGkTABkZGTz77LM0btwYPz8/GjZsyOTJk3Otb9euXdnvU3x8PHfddRdRUVH4+flx3nnn8eqrr+JwOHItV1C/b2fW8cxtLFy4EIB69erl+Izyeu8uvPBCqlatml2PiRMnkpSUVOD7LiIi7qPMVmYrs0VEPJ/yWnmtvJaSoi5TRErB/v37ueCCC9i5cyd169ZlyJAhxMXF8fPPPzN37lxeeeUV7rnnHgAaNmzImDFj+OijjwgMDGT48OHZ62natGn2/z///PNMnz6dVq1a0aNHD8AZ4G+//Tbff/89K1asICIi4pzqnZmZyahRo/j666/x8fGhe/fu1KpVi7179zJz5kzS0tLo06dPdvlPPvmEsWPHkpmZSffu3YmKimLVqlW8/fbbfPvttyxYsCDHa8gSGxtLp06dqFWrFhdddBGbNm1izpw5rFy5knXr1nHLLbewYMECevfuTf369fntt9+444478PHx4cYbb8y1vtTUVC688EJ27NjBhRdeSFpaGr/88gv33nsva9euzfNRPFcFBQUxZswY5syZw+HDhxk2bBhBQUG5yjkcDq6++mo+//xzgoKC6NChA1WrVmXFihVMmjSJ2bNns2DBAvz9/YtdFxERKXnKbGW2MltExPMpr5XXymspUUZEim3MmDEGME888USO6ZdeeqkBzOjRo01qamr29D/++MMEBAQYu91uVq9enWMZwERHR+e7rV9//dUcOnQox7TMzEwzadIkA5jrrrsu1zKFrfNs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nn/8+HFz6623mpiYGOPr62vq169vHnzwQZOYmGh69uxZImFtjDN0pk6dai644AITEhJifH19TUxMjLniiityBGWWxYsXm0GDBpmwsDDj7e1t6tata2699Vazb9++XGVLK6x79uxpTp48aW677TYTERFhfHx8TJMmTcxLL71kMjIy8lzfkiVLTK9evUxAQIAJDg42l1xyiVmzZk2BdXz11VdNs2bNjK+vrwFMXtcUZ8yYYQYOHGhq1qxpvL29Tc2aNU379u3N+PHjzcqVK/Osi4iIlD5ltjL7bMpsERHPo7xWXp9NeS2lwTLGg4bMFREpgl27dlGvXj169uzJggUL3F0dERERyYcyW0RExPMpr6WyUB/iIiIiIiIiIiIiIlIpqEFcRERERERERERERCoFNYiLiIiIiIiIiIiISKWgPsRFREREREREREREpFLQHeIiIiIiIiIiIiIiUimoQVxEREREREREREREKgU1iIuIiIiIiIiIiIhIpaAG8TLw5JNPYrPZWL9+fZ7z09PTmTJlCpdddhmRkZH4+fkRGBhIw4YNGTlyJJ999hmpqam5luvVqxeWZWFZFs8991y+2z948CBeXl7ZZXft2uVS2euvv96l15eYmMgrr7xC7969qVWrFj4+PlStWpWuXbvy+OOPs2fPnlzLxMfHM2nSJNq1a0eVKlXw9fUlMjKSrl27cv/99/P777+7tG3xHLt27cKyLHr16uXuqsgZxo4di2VZLFiwwN1VqVCGDBlCrVq1OH36tLurIiVIea28rgyU155JeV06lNcVk/JaeV0ZKK89k/K6dLglr42UqkOHDpmgoCAzYsSIPOdv3rzZNGnSxADGy8vLdO7c2VxxxRVm2LBhpkOHDsZmsxnAREZGmuPHj+dYtmfPngYwgGnevHm+dXj55ZezywEmNjY237IvvfRSdrng4GCTnJxc4OtbvHixCQ8PN4AJCAgwF154oRk1apQZMGCAqVGjhgGMr6+vmT9/fvYyu3fvNjExMQYwgYGB2ctcfPHFJiwszADm4osvLnC74nliY2MNYHr27OnuqsgZxowZYwDz22+/ubsqFcrKlSsNYCZMmODuqkgJUV4rrysL5bVnUl6XDuV1xaO8Vl5XFsprz6S8Lh3uyGs1iJeyO++80wBm1apVuebt3r07O6DGjBljDh06lKtMXFycmTRpkgkMDDR7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g7IxziBr06aNsdvtJi4uLnt61nuUX79vBfH39zdVq1Yt8nJne/TRRw1gfvjhhxzTs96Dxx57LNcy99xzjwFM/fr1c4SGMcasXbs2z5DNCpTo6GiTnp6ea51ZV2HP/MGWX2APHjzYAObHH3/M8zVddtllBvIeGCc/P/30kwHnnQY7d+40tWvXNjabLdcBvyD//e9/DWBee+01l5fJS1a/fe3atcsxPSuwg4ODc41gf/Lkyezv//vvv59rnZdffnmeIZu1r7z77ru5lsm686FBgwY5pucV2KtXr87+MX72jxVjnD8Os37MZLn11lsNYL7//vt834vCZB0X27RpU2jZ9PR0U716dRMYGJjngEhJSUkmPDzcVK1aNfs1HD582Hh7e5uoqKg8T5QOHjxofHx8TKtWrXJMzwrs9957L9cyWX1Inn1HQ5b33nvPAObOO+8s9DWJZ1Je5095XXzKayfltfJaeS0lRXmdP+V18SmvnZTXyuvKmNfqQ7yUHDlyBICqVasWa/np06fz0Ucf5fi3Zs2aApe5+uqriY+P58cffyQtLY2vv/6atm3b0qxZswKXS05O5ttvv8VmszF69Ojs6V5eXtn9s2X1f1YS/P39+fDDD9m6dSvPP/88l156KbVq1cIYw/Llyxk5ciR33XVXkdc7cuTIXNPCwsLo168fxhgWLVoEOD+btWvX0qhRo+y+185kWRbdu3cnMzOTlStX5pp/2WWXFblu7du358SJE4wbN46NGzcWWj4zM5N58+YxceJEbr75ZsaOHcvYsWP57bffANi2bVuey/Xr1y/XtPr16wPOftC8vb3znHfw4ME81zds2DC8vLxyTc/6Xvzxxx8Fvg6Hw8Evv/xCQEAAF198cZ5lzj//fIBcfYoVZODAgdx2223s2LGDNm3acPDgQR588MHsdbmiffv2ALz44ot88cUXJCQkFLrM/v37eeedd7j77ru5/vrrGTt2LLfeeis+Pj75fiYdOnTIdRwICQmhWrVqQMGfWX6fS17f9f79+1O1alV27NiR73JZ5s2bBzj76LLZcsdAVp9nZ34mWe/XI488wk8//VTk/tQAatasSWRkJGvWrOGhhx5i586d+ZZdtWoVR48epVu3btSqVSvXfH9//+z9Kuu9X7BgAenp6fTv3x9/f/9cy4SHh9OoUSPWr19PcnJyrvl5fRaNGzcG8v8ssj7HvPqClPJBeZ0/5bXy+kzKa+V1XpTXUlaU1/lTXiuvz6S8Vl7nRXmdmxrES8mpU6cA8h2oIywsDICjR4/mOX/79u0Y5x38PPfccy5tc+TIkXh5efHpp58yc+ZMTpw44dJgH99//z0JCQlceOGFRERE5JiXtfynn36KMSZX/c/lS9qwYUMefPBBfvzxRw4dOsTKlSsZNGgQAG+88QaLFy8u0vqio6PznB4TEwPAgQMHANi1axfgDD3LsvL8lzX4QF6fT926dYtUL4DJkydTr149PvzwQ1q0aEF4eDhXXnklX375Za7BK/bt20f79u25+OKLmTRpEu+++272j7asgSLyC5c6derkmhYUFFTovNTU1DzX5+p7mp+jR49y+vRpkpKS8PHxyfO9fuCBB7LLFsVLL71EnTp1iI+Pp1WrVrkGTylMnz59uOeeezhw4ACjRo2iWrVqdO7cmcceeyzPIHnllVeoV68et956K6+//jpTpkzJ/lySkpKK9JlA8T+XqlWr5ntcyfq8CvtcsvaBRx99NN994PTp0zk+k7Fjx3LFFVewadMmBg0aRNWqVbngggt49tlnOXToUIHbO9NHH31EjRo1+O9//0uDBg2IiYlhzJgxzJ49O886zp8/P986zpw5E/j3u5O1zHvvvZfvMhs3bsQYw/Hjx3PVLTIyMte0rPc6v30kODgYwKWBf8QzKa8Lp7xWXiuvldfKa3E35XXhlNfKa+W18lp57brcl6akRISEhAD5H1hbt27Np59+yurVq0tsmzVq1KBv377Mnj2bhIQE7HZ7niNwny3r6vSWLVvo0aNHrvnWP6MrL1q0KPsKYZs2bVi8eDGrVq1y6UeBK9q1a8f3339P586dWbFiBTNnzqR79+4lsu4zZY0uHB4enu9V1Sx5BZafn1+Rt9mqVSs2bdrEnDlzmDVrFgsWLOCrr77iq6++omvXrixYsAAfHx8AbrjhBtauXcuwYcMYP348TZo0oUqVKthsNt59911uvvnmHD+ezpTX1UhX5pWWrPc6KCiIYcOGFVi2efPmRVr3H3/8kR1Me/fu5ciRI/mGY35eeeUVbr75ZmbMmMHPP//M4sWLWb58OS+88AKff/55dp2XLl3KfffdR0hICK+//jq9evUiPDwcX19fACIiIvK9wlnY++7Oz6VHjx40aNDApWXsdjtffvklDz30EDNmzODXX39l2bJl/PHHHzz//PPMmTOHbt26FbqeCy+8kO3bt/PTTz8xZ84cFixYwMcff8zHH3/MsGHD+Oabb3LUsWHDhoUeB7JOILKWadOmDa1bty5wmazP7kzF+SyyTs5CQ0OLvKx4BuV10SmvlddFobwuPuW18lr+pbwuOuW18roolNfFp7wun3mtBvFSUrNmTYA8r5KA8/GL8ePHM3v2bE6dOpUd8Ofq6quvZvbs2fz666/07duX2rVrF1j+yJEjzJ8/H3Ae9Pbu3Ztv2WnTpmUH9sCBA5k8eTJff/01L7zwQp6P/RSHzWajZ8+erFixoshXNHfv3k2rVq3ynA5kX53PukpVvXp1pk6dem4VLgI/Pz+GDBnCkCFDANi4cSOjR49myZIlvP/++9x2220kJiYyf/58atWqxZdffondbs+xjoIegSkNWe9dftPPvuPhbNWrV8fPzw+bzcaUKVOwLKtE6nXs2DGuu+46LMti1KhRfPbZZ4wZMyb7amdRNGnShPHjxzN+/HhSUlJ48803eeCBB7j11luzA/u7774D4JlnnmHMmDE5lk9OTi7SFdxzdeLECRISEvK8ir1nzx6g8M8lax8YMmQI9913X5G237ZtW9q2bcvEiROJj49n4sSJvPrqq9x9990uP5YXHBzM6NGjsx8hXbp0KSNGjGD69OnMmjWLAQMGZNexadOmLu+nWcv06NGD//u//yvS6yquEydOAM4TJimflNfFo7xWXrtCea28Luh1Ka+lKJTXxaO8Vl67QnmtvC7odVXUvFaXKaWkZs2ahIeHs3fvXpKSknLNb9myJRdffDFJSUncf//9JbbdIUOGEBkZSVhYGGPHji20/Oeff05GRgbDhw/PfoTs7H+xsbEAfP3119mPNfTv35/mzZuzb98+nnnmmQK3ER8f71K/Xlm2b98O5P8oTH6++uqrXNOOHz/OvHnzsvstA+dO3bRpUzZt2sTWrVuLtI2S1Lx5c26//XYANmzYADivhjkcDmrXrp0rrNPT07ODo6x8++23uR45A/jiiy8A8rzj4UxeXl706tWL+Ph4fvnllxKr10033cSBAwcYP34806ZNo1evXvzyyy+88sor57RePz8/7r//fmrXrk1cXFx2X4VZB+W8Hvn5+uuv872joLTk9V2fN28ex48fp379+oX+UO/bty/AOX+fgoODee6557AsK/s7XBxdunThmmuuAf7dFzp27EhISAgLFy7M98TnbL1798Zut/PTTz+Rnp5e7PoUxebNmwHnVXMpn5TX/1Je5015XXzKa+V1XpTXUhzK638pr/OmvC4+5bXyOi8VPa/VIF6Kzj//fDIzM/N9bOvdd98lLCyM999/n7Fjx+Z5FSwxMZF169a5vM2AgAD27t3L0aNHcwzgkZ+sx7kKevQrJiaGrl27cvLkSX766SfA+ZjXJ598gp+fHxMnTuThhx8mMTExx3LGGH744Qc6dOjAX3/9BTj7AerUqRPffPMNaWlpOco7HA7ef/99fvjhB2w2G5dffrnLrxvgyy+/ZO7cudl/Z2RkcM8995CYmMill16ao2+yCRMm4HA4GDZsWJ6DqRw7doz33nuvSNvPT1JSEm+88UauPpAcDgdz5swBICoqCnD+0AsJCWHDhg05+njLzMzkwQcfLPMfGLt27crVd9i7777LkiVLqFWrVqGPaYGzHy2bzcZ1113HggULcs0/ffo0H374YZ6DMOTlww8/5Ntvv6Vdu3Y8+eST2Gw2PvroI0JDQ3n00Udd3l++//57li5dmmv6ypUrOXz4MEFBQdmP6WQN/PDBBx/kCIJNmzbx4IMPurS9kjRp0qTs/rzA2cdXVl9xWT8CC9K5c2f69u3L4sWLuf3224mPj89VZu3atdnfT3AeK/IK5dmzZ2OMyf4OF2TPnj1MnTo110lMSkpK9oA2Wevx9fVl/PjxJCQkMHTo0Dzv3ti/f3+OAYnq1KnD9ddfz65duxg1ahSHDx/Otcz27duZPn16oXV1VdZV+549e5bYOqXsKa+V16C8Vl6XPOW1k/JaSoryWnkNymvldclTXjtVurw2UmqmTp1qAPP000/nW2bTpk2mcePGBjBeXl6mc+fO5oorrjDDhg0zXbp0MQEBAQYwderUMb/99luOZXv27GkA88cff7hUnyZNmhjAxMbGZm8bMMHBwSY5ObnAZd944w0DmMGDB+eYvmjRIlOrVi0DmICAANOnTx8zevRoM3DgwOzpfn5+5ueffzbGGHPixAkDGMAEBQWZnj17mlGjRplLL73UxMTEGMBYlmWee+45l17Tme/D7bffbizLMj179jQjR4409erVM4CJiIgwu3fvzrXcI488YgBjs9lMu3btzIgRI8zw4cNN27Ztjd1uNyEhITnKjxkzxgC5PofCZL1mb29v06VLFzNy5EgzdOhQExUVZQATExNjjh49ml3+mWeeMYCx2+2mb9++5sorrzQxMTHG39/f3H777QYwTzzxRJ7vQdZne6YpU6bkuUwWwERHR+eY9sQTTxjA3Hjjjcbb29s0b97cjBo1ynTs2DH7tcyePTvHMrGxsQYwPXv2zLWNt99+29jtdgOYFi1amKFDh5orr7zSdO7c2fj6+hrAnDhxotD3cseOHSYoKMj4+/ubzZs355j36aefZq+/sO+zMcbcdddd2fvWpZdeakaPHm169eqVXc+XX345u+zRo0dNeHi4AUy9evXMFVdcYS666CLj7e1tRowYYaKjo83Zh9PffvvNAGbMmDF5bj+vZbJkvf9TpkzJMR0wdevWNZdeeqkJCAgwgwYNMkOHDjWhoaEGML179zbp6ek5lsnve3v48GHTtm1bA5jQ0FDTq1ev7H0367t51113ZZcfPHiwAUyDBg3MkCFDzKhRo0yXLl2MZVnGZrOZr776quA33BizevXq7GPFBRdcYEaPHm0GDx5satSoYQDToUMHk5KSkl0+MzPTXHPNNQYwPj4+pnPnztn7T/PmzY1lWaZ169Y5tpGUlGT69u1rABMYGGi6d+9uRo0aZS677DLTsGHDPI9jBX0WBX2OCQkJxs/PzzRt2rTQ1y6eTXmtvD7zNSuvlddnUl4rr8VzKK+V12e+ZuW18vpMymvldVGpQbwUJSUlmZCQENOsWbMCy6WlpZkPP/zQXHrppSYiIsL4+PiYgIAAU69ePTN8+HAzbdo0k5SUlGu5cw3shx9+uMADypkOHTpk7Ha78fb2zhEuxji/tC+99JLp2bOnqVGjhvHy8jKhoaGmc+fO5oknnjB79+7NLutwOMySJUvMxIkTTa9evUxMTIzx8/Mzfn5+pkGDBuaaa64xixcvdun1ZDkzrKZMmWLatGlj/Pz8TFhYmLnmmmtybP9sCxcuNCNGjDARERHG29vbhIWFmVatWpk77rjDLFy4MEfZ4gZ2enq6mTx5shk6dKhp0KCBCQgIMKGhoaZVq1Zm0qRJ5tixY7mW+eijj0zbtm1NQECACQsLM4MHDzZr167NN3xLK7CnTJli/vzzT9OnTx9TpUoVExQUZPr06ZPnZ1RQYBvjPFiPGTPGREdHGx8fHxMaGmqaN29urr/+evPTTz8Zh8OR53JZMjIyTNeuXQ1gJk+enGeZUaNGGcDceeedBa4rqz733Xef6dixo6lZs6bx9fU10dHRZtCgQdk/MM+0d+9eM3r0aFOnTh3j5+dnzjvvPPP888+bjIyMMg3s6Ohok5KSYh555BETExNjfHx8THR0tHn00UfzPE4U9L1NTk42b7zxhunWrZsJCQkxPj4+JioqyvTs2dO8+OKLOfadhQsXmttvv920adPGhIWFGT8/P1O/fn0zcuRI89dff+X5Os4WHx9vXn75ZTNgwIDsfT8sLMx06NDBvPrqqyYxMTHP5WbMmGEGDhxoatasaby9vU3NmjVN+/btzfjx483KlStzlc/IyDAfffSRufDCC021atWMt7e3iYiIMF27djWTJk0yW7ZsyVG+uIH98ccf5/pxJ+WT8lp5bYzyOovyOifltfJaPIfyWnltjPI6i/I6J+W18rqoLGPKuHOeSuaee+7htddeY8WKFbRv397d1amQevXqxcKFC4mNjSUmJsbd1akQJk6cyKRJk5gyZYpLfeVJ2bAsi+jo6ByPc4n7XHzxxSxatIg9e/Zkj8Qt5ZfyuvQpr0ue8tozKa89i/K6YlFelz7ldclTXnsm5bVnKeu8Vh/ipezhhx8mKCiI5557zt1VERGRErJq1SrmzZvHfffdp5PrCkJ5LSJS8SivKx7ltYhIxeOOvFaDeCmrWbMmDzzwAN9++y3r1693d3VERKQEPPnkk9SsWZPx48e7uypSQpTXIiIVj/K64lFei4hUPO7IazWIl4HHH38ch8NBy5Yt3V0VEREpAd9//332aOlScSivRUQqFuV1xaS8FhGpWNyR1+pDXEREREREREREREQqBd0hLiIiIiIiIiIiIiKVghrERURERERERERERKRSUIO4iIiIiIiIiIiIiFQKahAXERERERERERERkUpBDeIiIiIiIiIiIiIiUimoQVxEREREREREREREKgU1iIuIiIiIiIiIiIhIpaAGcRERERERERERERGpFNQgLiIiIiIiIiIiIiKVghrERURERERERERERKRSUIO4iIiIiIiIiIiIiFQKahAXERERERERERERkUpBDeIiIiIiIiIiIiIiUimoQVxEREREREREREREKgU1iIuIiIiIiIiIiIhIpaAGcRERERERERERERGpFNQgLiIiIiIiIiIiIiKVghrERURERERERERERKRSUIO4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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "newdf = pd.read_json('scaling_experiment_data2.json')\n", + "figsize = (18,8)\n", + "from matplotlib.legend_handler import HandlerTuple\n", + "from matplotlib.patches import Patch\n", + "import matplotlib.patches as mpatches\n", + "from matplotlib.legend_handler import HandlerTuple\n", + "from copy import copy\n", + "from matplotlib.lines import Line2D\n", + "fig, axes = plt.subplots(nrows=2, ncols=3, constrained_layout=True, figsize=figsize)\n", + "porange = cm.get_cmap('Oranges', 12)\n", + "new_porange = porange(np.linspace(0.5, 1, len(arch_order) ))\n", + "#task = \"imagenet\"\n", + "#task = \"retrieval\"\n", + "# names = {\n", + "# \"imagenet\": ('imagenet1k', 'imagenet_robustness'),\n", + "# \"retrieval\": ('mscoco_captions', 'flickr30k'),\n", + "# }[task]\n", + "names = ('imagenet1k-unverified', 'imagenet1k-unverified', 'imagenet1k-unverified', 'cifar100', 'cifar100', 'cifar100')\n", + "#for ax, tgt in zip(axes, ('imagenet1k', 'mscoco_captions')):\n", + "#for ax, tgt in zip(axes, ('imagenet1k', 'vtab')):\n", + "#for ax, tgt in zip(axes, ('imagenet1k', 'imagenet_robustness')):\n", + "#for ax, tgt in zip(axes, ('imagenet1k', 'mscoco_captions')):\n", + "#for ax, tgt in zip(axes, ('mscoco_captions', 'flickr30k')):\n", + "def get_formula_text(coefs):\n", + " return f\"$E = {10**(coefs[1]):.2f} \\/*\\/ C^{{ {coefs[0]:.2f} }}$\"\n", + "def get_rotn(x0, y0, x1, y1):\n", + " p1 = ax.transData.transform_point((x0, y0))\n", + " p2 = ax.transData.transform_point((x1, y1))\n", + " dy = (p2[-1] - p1[-1])\n", + " dx = (p2[0] - p1[0])\n", + " return np.degrees(np.arctan2(dy, dx))\n", + "\n", + "for ii, tgt in enumerate(names):\n", + " iimod3 = ii % 3\n", + " iidiv3 = ii // 3\n", + " ax = axes[iidiv3, iimod3]\n", + " fewshot_k = [10, 25, -1][iimod3]\n", + "\n", + " d, d_openai, d_openclip, target_pretty, metric_pretty, metric_pretty2, metric = build_df2(tgt, fewshot_k)\n", + " line_fit_loglog_openclip = lstsq(np.log10(d_openclip.gmacs_total), np.log10(d_openclip.err1))\n", + " line_fit_loglog_openai = lstsq(np.log10(d_openai.gmacs_total), np.log10(d_openai.err1))\n", + " print(tgt, line_fit_loglog_openclip, line_fit_loglog_openai)\n", + " d[\"styles\"] = d.upstream_dataset.apply(lambda f:upstream_dataset_styles[f])\n", + " #d = d.sort_values(by=\"gmacs\")\n", + " d = d.sort_values(by=[\"Dataset source\", \"data_scale\"])\n", + " sns.scatterplot(\n", + " #data=d[d.upstream_dataset != \"LAION-80M\"],\n", + " #data=d_openclip.sort_values(by=\"data_scale\"),\n", + " data=d,\n", + " x='gmacs_total',\n", + " y='err1%',\n", + "\n", + " #hue='Dataset',\n", + " #palette=upstream_colors2,\n", + " #hue_order=upstream_order + [\"CLIP-WIT\"],\n", + "\n", + " hue=\"Model\",\n", + " #palette=\"Oranges\",\n", + " palette=new_porange,\n", + " hue_order=arch_order,\n", + "\n", + " #size=\"Dataset\",\n", + " #size_order=upstream_order,\n", + " #sizes=upstream_sizes,\n", + "\n", + " size=\"Samples seen\",\n", + " size_order=samples_seen_order,\n", + " sizes=samples_seen_sizes,\n", + "\n", + " #size=\"Model\",\n", + " #size_order=arch_order,\n", + " #sizes=arch_sizes,\n", + "\n", + " style='Dataset',\n", + " markers=upstream_dataset_styles,\n", + "\n", + " #style=\"Model\",\n", + " #markers=model_styles,\n", + "\n", + " ax=ax,\n", + " #color='blue',\n", + " #alpha=0.5,\n", + " #style='+',\n", + " s=120,\n", + " #alpha=0.8\n", + " )\n", + " def pred(g, params):\n", + " a, b = params\n", + " return 10**(b) * g**a\n", + " d = d.sort_values(by='gmacs_total')\n", + " \n", + " # OpenCLIP line\n", + " x = d_openclip.gmacs_total.values\n", + " y = (100* pred(d_openclip.gmacs_total, line_fit_loglog_openclip)).values\n", + " ax.plot(x, y, color='orange', label='OpenCLIP')#, linestyle='dashed')\n", + " #rotn = get_rotn(x[0], y[0], x[-1], y[-1])+5\n", + " #ax.annotate(get_formula_text(line_fit_loglog_openclip), xy=(x[0],y[0]-1.5), ha='center', va='center', rotation=rotn, fontsize=13)\n", + " xm = x.min()\n", + " ym = y.min()\n", + " shift = (y[-1] - y[-2]) * 0.65\n", + " print(get_formula_text(line_fit_loglog_openclip))\n", + " ax.annotate(get_formula_text(line_fit_loglog_openclip), xy=(xm, ym-shift), rotation=0, fontsize=13, color=new_porange[1])\n", + " #ax.annotate(get_formula_text(line_fit_loglog_openclip), xy=(xm, ym+1), rotation=0, fontsize=13, color=new_porange[1])\n", + " # OpenAI line\n", + " x = d_openai.gmacs_total.values\n", + " y = 100*pred(d_openai.gmacs_total, line_fit_loglog_openai).values\n", + " ax.plot(x, y, color='steelblue', ms=10, label=\"CLIP\")\n", + " openai_cols = cm.get_cmap('Blues')\n", + " openai_cols = [openai_cols(0.4), openai_cols(0.6), openai_cols(1.0)]\n", + " ax.scatter(d_openai.gmacs_total.values, d_openai['err1%'].values, marker='*', s=200, c=openai_cols)\n", + " \n", + " #rotn = get_rotn(x[0], y[0], x[-1], y[-1])+5\n", + " #ax.annotate(get_formula_text(line_fit_loglog_openai), xy=(x[0],y[0]-8), ha='center', va='center', rotation=rotn, fontsize=13)\n", + " ax.annotate(get_formula_text(line_fit_loglog_openai), xy=(xm, ym),rotation=0, fontsize=13, color='steelblue')\n", + "\n", + " ax.set_xscale('log')\n", + " ax.set_yscale('log')\n", + " ax.yaxis.set_major_formatter(mticker.FormatStrFormatter('%d'))\n", + " ax.yaxis.set_minor_formatter(mticker.ScalarFormatter())\n", + " if iimod3 == 0:\n", + " ax.text(.5,.9,'10 examples per class',\n", + " horizontalalignment='center',\n", + " transform=ax.transAxes, fontsize=12)\n", + " elif iimod3 == 1:\n", + " ax.text(.5,.9,'25 examples per class',\n", + " horizontalalignment='center',\n", + " transform=ax.transAxes, fontsize=12)\n", + " elif iimod3 == 2:\n", + " ax.text(.5,.9,'Full dataset',\n", + " horizontalalignment='center',\n", + " transform=ax.transAxes, fontsize=12)\n", + "\n", + " ax.set_ylabel(f\"{target_pretty} {metric_pretty2}\")\n", + " ax.grid(True)\n", + " if ii == 0:\n", + " ax.set_yticks([25, 30, 35, 40] )\n", + " elif ii == 1:\n", + " ax.set_yticks([20, 25, 30, 35] )\n", + "\n", + " elif ii == 2:\n", + " ax.set_yticks([15, 20, 25] )\n", + " elif ii == 3:\n", + " ax.set_yticks([15, 20, 25, 30] )\n", + " elif ii == 4:\n", + " ax.set_yticks([15, 20, 25, 30] )\n", + " elif ii == 5:\n", + " ax.set_yticks([10,15, 20] )\n", + " if ii == 5:\n", + " #ax.legend(bbox_to_anchor=(-1,-0.4), ncol=5, )\n", + " #lab, hand = ax.get_axis_labels_handles()\n", + " #ax.legend(lab, hand, bbox_to_anchor=(0.5,-0.4), ncol=5, )#.legendHandles[-1]._legmarker.set_marker('*')\n", + " handles, labels = ax.get_legend_handles_labels()#\n", + " start = 3-2\n", + " end = 6-2\n", + " for i in range(start, end):\n", + " hnew = copy(handles[i])\n", + " hnew.set_facecolors([openai_cols[i-start], \"none\"])\n", + " hnew.set_edgecolors([openai_cols[i-start], \"none\"])\n", + " handles[i] = (handles[i], hnew)\n", + " #handles[-1] = Line2D([0], [0], color='steelblue',ms=10, label=\"CLIP\", marker='*')\n", + " # handles = handles[-2:] + handles[:-2]\n", + " # labels = labels[-2:] + labels[:-2]\n", + " ax.legend(handles, labels, bbox_to_anchor=(0.5,-0.4), ncol=5, handler_map={tuple: HandlerTuple(ndivide=None)})\n", + " \n", + " #ax.legend(h, l, bbox_to_anchor=(0.5,-0.4), ncol=5, )\n", + " \n", + " else:\n", + " ax.legend().set_visible(False)\n", + " \n", + " # sns.scatterplot(\n", + " # #data=d[d.upstream_dataset != \"LAION-80M\"],\n", + " # data=d_openai.sort_values(by=\"data_scale\"),\n", + " # #data=d,\n", + " # x='gmacs_total',\n", + " # y='err1%',\n", + "\n", + " # #hue='Dataset',\n", + " # #palette=upstream_colors2,\n", + " # #hue_order=upstream_order + [\"CLIP-WIT\"],\n", + "\n", + " # hue=\"Dataset\",\n", + "\n", + " # # size=\"Samples seen\",\n", + " # # size_order=samples_seen_order,\n", + " # # sizes=samples_seen_sizes,\n", + " # s = 400,\n", + "\n", + " # style='Dataset',\n", + " # markers=upstream_dataset_styles,\n", + "\n", + " # ax=ax,\n", + " # legend=False\n", + " # )\n", + " if ii > 2:\n", + " ax.set_xlabel(\"Total compute\\n(GMACS per sample x samples seen)\")\n", + " else:\n", + " ax.set_xlabel(None)\n", + " #ax.legend().set_visible(False)\n", + " \n", + "#plt.yticks(np.arange(int(d[metric].min())-2, int(d[metric].max())+2, 10))\n", + "#plt.legend(loc='best')\n", + "#plt.yticks([50, 45, 40, 30, 25,])\n", + "#plt.legend(bbox_to_anchor=(1,1))\n", + "#plt.legend(loc='none')\n", + "#ax.legend().set_visible(False)\n", + "#h[-1].set_marker('*')\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig(f\"imagenet_cifar_lp.pdf\", bbox_inches='tight')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n", + " dataset lp_acc1 fewshot_k model pretrained upstream_dataset \\\n", + "5 vtab 0.718375 -1 ViT-B-32 laion400m_e32 LAION-400M \n", + "4 vtab 0.715300 -1 ViT-B-32 laion2b_s34b_b79k LAION-2B \n", + "3 vtab 0.714317 -1 ViT-B-32 laion2b_e16 LAION-2B \n", + "6 vtab 0.697139 -1 ViT-B-32 openai CLIP-WIT \n", + "\n", + " gmacs_total samples_seen_pretty data_scale err1 acc1% \\\n", + "5 9.645624e+10 13B 4.000000e+08 0.281625 71.837530 \n", + "4 2.910965e+11 34B 2.000000e+09 0.284700 71.529952 \n", + "3 2.569679e+11 34B 2.000000e+09 0.285683 71.431667 \n", + "6 9.472000e+10 13B 4.000000e+08 0.302861 69.713949 \n", + "\n", + " err1% arch_pretty Model Model Data Dataset \\\n", + "5 28.162470 ViT-B/32 ViT-B/32 ViT-B/32 LAION-400M LAION-400M \n", + "4 28.470048 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "3 28.568333 ViT-B/32 ViT-B/32 ViT-B/32 LAION-2B LAION-2B \n", + "6 30.286051 ViT-B/32 ViT-B/32 ViT-B/32 CLIP-WIT CLIP-WIT \n", + "\n", + " Samples seen Dataset source \n", + "5 13B LAION \n", + "4 34B LAION \n", + "3 34B LAION \n", + "6 13B CLIP-WIT \n", + "11\n", + "vtab [-0.03789119 -0.12800883] [-0.05844628 0.1239923 ]\n", + "$E = 0.74 \\/*\\/ C^{ -0.04 }$\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/private/home/mitchellw/miniconda3/envs/cb/lib/python3.10/site-packages/seaborn/_oldcore.py:200: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " if palette in QUAL_PALETTES:\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "newdf = pd.read_json('scaling_experiment_data_vtab.json')\n", + "figsize = (8,5)\n", + "from matplotlib.legend_handler import HandlerTuple\n", + "from matplotlib.patches import Patch\n", + "import matplotlib.patches as mpatches\n", + "from matplotlib.legend_handler import HandlerTuple\n", + "from copy import copy\n", + "from matplotlib.lines import Line2D\n", + "fig, axes = plt.subplots(nrows=1, ncols=1, constrained_layout=True, figsize=figsize)\n", + "ax = axes\n", + "porange = cm.get_cmap('Oranges', 12)\n", + "new_porange = porange(np.linspace(0.5, 1, len(arch_order) ))\n", + "#task = \"imagenet\"\n", + "#task = \"retrieval\"\n", + "# names = {\n", + "# \"imagenet\": ('imagenet1k', 'imagenet_robustness'),\n", + "# \"retrieval\": ('mscoco_captions', 'flickr30k'),\n", + "# }[task]\n", + "#for ax, tgt in zip(axes, ('imagenet1k', 'mscoco_captions')):\n", + "#for ax, tgt in zip(axes, ('imagenet1k', 'vtab')):\n", + "#for ax, tgt in zip(axes, ('imagenet1k', 'imagenet_robustness')):\n", + "#for ax, tgt in zip(axes, ('imagenet1k', 'mscoco_captions')):\n", + "#for ax, tgt in zip(axes, ('mscoco_captions', 'flickr30k')):\n", + "def get_formula_text(coefs):\n", + " return f\"$E = {10**(coefs[1]):.2f} \\/*\\/ C^{{ {coefs[0]:.2f} }}$\"\n", + "def get_rotn(x0, y0, x1, y1):\n", + " p1 = ax.transData.transform_point((x0, y0))\n", + " p2 = ax.transData.transform_point((x1, y1))\n", + " dy = (p2[-1] - p1[-1])\n", + " dx = (p2[0] - p1[0])\n", + " return np.degrees(np.arctan2(dy, dx))\n", + "\n", + "tgt = 'vtab'\n", + "fewshot_k = -1\n", + "\n", + "d, d_openai, d_openclip, target_pretty, metric_pretty, metric_pretty2, metric = build_df2(tgt, fewshot_k)\n", + "line_fit_loglog_openclip = lstsq(np.log10(d_openclip.gmacs_total), np.log10(d_openclip.err1))\n", + "line_fit_loglog_openai = lstsq(np.log10(d_openai.gmacs_total), np.log10(d_openai.err1))\n", + "print(tgt, line_fit_loglog_openclip, line_fit_loglog_openai)\n", + "d[\"styles\"] = d.upstream_dataset.apply(lambda f:upstream_dataset_styles[f])\n", + "#d = d.sort_values(by=\"gmacs\")\n", + "d = d.sort_values(by=[\"Dataset source\", \"data_scale\"])\n", + "sns.scatterplot(\n", + " #data=d[d.upstream_dataset != \"LAION-80M\"],\n", + " #data=d_openclip.sort_values(by=\"data_scale\"),\n", + " data=d,\n", + " #data=d,\n", + " x='gmacs_total',\n", + " y='err1%',\n", + "\n", + " #hue='Dataset',\n", + " #palette=upstream_colors2,\n", + " #hue_order=upstream_order + [\"CLIP-WIT\"],\n", + "\n", + " hue=\"Model\",\n", + " #palette=\"Oranges\",\n", + " palette=new_porange,\n", + " hue_order=arch_order,\n", + "\n", + " #size=\"Dataset\",\n", + " #size_order=upstream_order,\n", + " #sizes=upstream_sizes,\n", + "\n", + " size=\"Samples seen\",\n", + " size_order=samples_seen_order,\n", + " sizes=samples_seen_sizes,\n", + "\n", + " #size=\"Model\",\n", + " #size_order=arch_order,\n", + " #sizes=arch_sizes,\n", + "\n", + " style='Dataset',\n", + " markers=upstream_dataset_styles,\n", + "\n", + " #style=\"Model\",\n", + " #markers=model_styles,\n", + "\n", + " ax=ax,\n", + " #color='blue',\n", + " #alpha=0.5,\n", + " #style='+',\n", + " s=120,\n", + " #alpha=0.8\n", + ")\n", + "def pred(g, params):\n", + " a, b = params\n", + " return 10**(b) * g**a\n", + "d = d.sort_values(by='gmacs_total')\n", + "\n", + "# OpenCLIP line\n", + "x = d_openclip.gmacs_total.values\n", + "y = (100* pred(d_openclip.gmacs_total, line_fit_loglog_openclip)).values\n", + "ax.plot(x, y, color='orange', label='OpenCLIP')#, linestyle='dashed')\n", + "#rotn = get_rotn(x[0], y[0], x[-1], y[-1])+5\n", + "#ax.annotate(get_formula_text(line_fit_loglog_openclip), xy=(x[0],y[0]-1.5), ha='center', va='center', rotation=rotn, fontsize=13)\n", + "xm = x.min()\n", + "ym = y.min()\n", + "shift = (y[-1] - y[-2]) * 0.65\n", + "print(get_formula_text(line_fit_loglog_openclip))\n", + "ax.annotate(get_formula_text(line_fit_loglog_openclip), xy=(xm, ym-shift), rotation=0, fontsize=13, color=new_porange[1])\n", + "#ax.annotate(get_formula_text(line_fit_loglog_openclip), xy=(xm, ym+1), rotation=0, fontsize=13, color=new_porange[1])\n", + "# OpenAI line\n", + "# x = d_openai.gmacs_total.values\n", + "# y = 100*pred(d_openai.gmacs_total, line_fit_loglog_openai).values\n", + "# ax.plot(x, y, color='steelblue',ms=10, label=\"CLIP\")\n", + "\n", + "# #rotn = get_rotn(x[0], y[0], x[-1], y[-1])+5\n", + "# #ax.annotate(get_formula_text(line_fit_loglog_openai), xy=(x[0],y[0]-8), ha='center', va='center', rotation=rotn, fontsize=13)\n", + "# ax.annotate(get_formula_text(line_fit_loglog_openai), xy=(xm, ym),rotation=0, fontsize=13, color='steelblue')\n", + "\n", + " # OpenAI line\n", + "x = d_openai.gmacs_total.values\n", + "y = 100*pred(d_openai.gmacs_total, line_fit_loglog_openai).values\n", + "ax.plot(x, y, color='steelblue', ms=10, label=\"CLIP\")\n", + "openai_cols = cm.get_cmap('Blues')\n", + "openai_cols = [openai_cols(0.4), openai_cols(0.6), openai_cols(1.0)]\n", + "ax.scatter(d_openai.gmacs_total.values, d_openai['err1%'].values, marker='*', s=200, c=openai_cols)\n", + "#sns.scatter(x='gmacs_total', y='err1%', data=d_openai,ax=ax,fig=fig)\n", + "#ax.scatter(d_openclip.gmacs_total.values, d_openclip['err1%'].values, marker='*', s=150, color='steelblue')\n", + "\n", + "#rotn = get_rotn(x[0], y[0], x[-1], y[-1])+5\n", + "#ax.annotate(get_formula_text(line_fit_loglog_openai), xy=(x[0],y[0]-8), ha='center', va='center', rotation=rotn, fontsize=13)\n", + "ax.annotate(get_formula_text(line_fit_loglog_openai), xy=(xm, ym),rotation=0, fontsize=13, color='steelblue')\n", + "ax.set_xscale('log')\n", + "ax.set_yscale('log')\n", + "ax.yaxis.set_major_formatter(mticker.FormatStrFormatter('%d'))\n", + "ax.yaxis.set_minor_formatter(mticker.ScalarFormatter())\n", + "# if iimod3 == 0:\n", + "# ax.text(.5,.9,'10 examples per class',\n", + "# horizontalalignment='center',\n", + "# transform=ax.transAxes, fontsize=12)\n", + "# elif iimod3 == 1:\n", + "# ax.text(.5,.9,'25 examples per class',\n", + "# horizontalalignment='center',\n", + "# transform=ax.transAxes, fontsize=12)\n", + "# elif iimod3 == 2:\n", + "# ax.text(.5,.9,'Full dataset',\n", + "# horizontalalignment='center',\n", + "# transform=ax.transAxes, fontsize=12)\n", + "\n", + "ax.set_ylabel(f\"Average {target_pretty} {metric_pretty2}\")\n", + "minv = d_openclip['err1%'].min()\n", + "maxv = d_openclip['err1%'].max()\n", + "\n", + "unit = 5\n", + "minv = unit * (minv // unit + 1)\n", + "maxv = unit * (maxv // unit + 1)\n", + "#ax.set_ylim(minv-unit-1,maxv)\n", + "#ax.minorticks_on()\n", + "\n", + "ax.grid(True,)\n", + "ax.set_yticks( np.arange(24, 30, 2) )\n", + "#if ii == 0:\n", + "#ax.legend(bbox_to_anchor=(-1,-0.4), ncol=5, )\n", + "#lab, hand = ax.get_axis_labels_handles()\n", + "#ax.legend(lab, hand, bbox_to_anchor=(0.5,-0.4), ncol=5, )#.legendHandles[-1]._legmarker.set_marker('*')\n", + "#h, l = ax.get_legend_handles_labels()\n", + "#h[-1] = Line2D([0], [0], color='steelblue',ms=10, label=\"CLIP\", marker='*')\n", + "\n", + "from matplotlib.lines import Line2D\n", + "handles, labels = ax.get_legend_handles_labels()#\n", + "start = 3-2\n", + "end = 6-2\n", + "for i in range(start, end):\n", + " hnew = copy(handles[i])\n", + " hnew.set_facecolors([openai_cols[i-start], \"none\"])\n", + " hnew.set_edgecolors([openai_cols[i-start], \"none\"])\n", + " handles[i] = (handles[i], hnew)\n", + "#handles[-1] = Line2D([0], [0], color='steelblue',ms=10, label=\"CLIP\", marker='*')\n", + "handles = handles[-2:] + handles[:-2]\n", + "labels = labels[-2:] + labels[:-2]\n", + "ax.legend(handles, labels, bbox_to_anchor=(1.01,1.03), handler_map={tuple: HandlerTuple(ndivide=None)})\n", + " \n", + "# else:\n", + "# ax.legend().set_visible(False)\n", + "\n", + "# sns.scatterplot(\n", + "# #data=d[d.upstream_dataset != \"LAION-80M\"],\n", + "# data=d_openai.sort_values(by=\"data_scale\"),\n", + "# #data=d,\n", + "# x='gmacs_total',\n", + "# y='err1%',\n", + "\n", + "# #hue='Dataset',\n", + "# #palette=upstream_colors2,\n", + "# #hue_order=upstream_order + [\"CLIP-WIT\"],\n", + "\n", + "# hue=\"Dataset\",\n", + "\n", + "# # size=\"Samples seen\",\n", + "# # size_order=samples_seen_order,\n", + "# # sizes=samples_seen_sizes,\n", + "# s = 400,\n", + "\n", + "# style='Dataset',\n", + "# markers=upstream_dataset_styles,\n", + "\n", + "# ax=ax,\n", + "# legend=False\n", + "# )\n", + "\n", + "ax.set_xlabel(\"Total compute\\n(GMACS per sample x samples seen)\")\n", + "\n", + "#ax.legend().set_visible(False)\n", + " \n", + "#plt.yticks(np.arange(int(d[metric].min())-2, int(d[metric].max())+2, 10))\n", + "#plt.legend(loc='best')\n", + "#plt.yticks([50, 45, 40, 30, 25,])\n", + "#plt.legend(bbox_to_anchor=(1,1))\n", + "#plt.legend(loc='none')\n", + "#ax.legend().set_visible(False)\n", + "#h[-1].set_marker('*')\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig(f\"imagenet_cifar_lp_vtab.pdf\", bbox_inches='tight')\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.10.6 ('cb')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "96ea9643f9b650f6fd53a6f8bb23b3a7544511efe95fce7cd67dbfdc2f4f7544" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/requirements-test.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/requirements-test.txt new file mode 100644 index 0000000000000000000000000000000000000000..e079f8a6038dd2dc8512967540f96ee0de172067 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/requirements-test.txt @@ -0,0 +1 @@ +pytest diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/requirements.txt b/lm-quant-toolkit/.deps/CLIP_benchmark/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..78ba769aeee4228a7ec1245d08fe7521ce93f9da --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/requirements.txt @@ -0,0 +1,8 @@ +torch>=1.8.1 +torchvision>=0.8.9 +tqdm>=2 +scikit-learn>=1.0,<2 +open_clip_torch>=0.2.1 +pycocoevalcap +webdataset>=0.2.31 +transformers diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/setup.cfg b/lm-quant-toolkit/.deps/CLIP_benchmark/setup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..17b098d8fb247824e8fbe62b7be5b8e178f1a6db --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/setup.cfg @@ -0,0 +1,18 @@ +[bumpversion] +current_version = 0.1.0 +commit = True +tag = True + +[bumpversion:file:setup.py] +search = version='{current_version}' +replace = version='{new_version}' + +[bumpversion:file:clip_benchmark/__init__.py] +search = __version__ = '{current_version}' +replace = __version__ = '{new_version}' + +[bdist_wheel] +universal = 1 + +[flake8] +exclude = docs diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/setup.py b/lm-quant-toolkit/.deps/CLIP_benchmark/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..0f167579ea1bd4b44fc0128129b7aaa731512775 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/setup.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +"""The setup script.""" + +from setuptools import setup, find_packages + +with open('README.md') as readme_file: + readme = readme_file.read() + +with open('HISTORY.md') as history_file: + history = history_file.read() + +def load_requirements(f): + return [l.strip() for l in open(f).readlines() ] + +requirements = load_requirements("requirements.txt") + +test_requirements = requirements + ["pytest", "pytest-runner"] + +setup( + author="Mehdi Cherti", + author_email='mehdicherti@gmail.com', + python_requires='>=3.6', + classifiers=[ + 'Development Status :: 2 - Pre-Alpha', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Natural Language :: English', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + ], + description="CLIP-like models benchmarks on various datasets", + entry_points={ + 'console_scripts': [ + 'clip_benchmark=clip_benchmark.cli:main', + 'clip_benchmark_export_wds=clip_benchmark.webdataset_builder:main', + ], + }, + install_requires=requirements, + license="MIT license", + long_description=readme + '\n\n' + history, + long_description_content_type='text/markdown', + include_package_data=True, + keywords='clip_benchmark', + name='clip_benchmark', + packages=find_packages(include=['clip_benchmark', 'clip_benchmark.*']), + test_suite='tests', + tests_require=test_requirements, + url='https://github.com/mehdidc/clip_benchmark', + version='1.6.1', + zip_safe=False, + extra_require = { + "vtab": ["task_adaptation==0.1", "timm>=0.5.4"], + "tfds": ["tfds-nightly", "timm>=0.5.4"], + "coco": ["pycocotools>=2.0.4"], + } +) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/tests/test_clip_benchmark.py b/lm-quant-toolkit/.deps/CLIP_benchmark/tests/test_clip_benchmark.py new file mode 100644 index 0000000000000000000000000000000000000000..69149317852dc5992d7aae9f0f41047d164c066c --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/tests/test_clip_benchmark.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python + +"""Tests for `clip_benchmark` package.""" + +import os +from clip_benchmark.cli import run +import logging +import torch + +class base_args: + dataset="dummy" + split="test" + model="ViT-B-32-quickgelu" + pretrained="laion400m_e32" + task="zeroshot_classification" + amp=False + num_workers=4 + batch_size=64 + dataset_root="root" + output="result.json" + verbose=True + root="root" + annotation_file="" + seed=0 + skip_load=False + language="en" + model_cache_dir=None + save_clf=None + load_clfs=[] + model_type="open_clip" + wds_cache_dir=None + which="eval" + skip_existing=False + custom_template_file=None + custom_classname_file=None + distributed=False + dump_classnames=False + dump_templates=False + +class linear_probe_args: + dataset="dummy" + split="test" + train_split="split" + val_split="val" + val_proportion=None + model="ViT-L-14" + pretrained="openai" + task="linear_probe" + amp=False + num_workers=4 + batch_size=256 + normalize=True + dataset_root="root" + output="result.json" + verbose=True + root="root" + annotation_file="" + seed=0 + feature_root="./" + fewshot_k=-1 + fewshot_epochs=1 + fewshot_lr=0.5 + skip_load=False + language="en" + model_cache_dir=None + save_clf=None + load_clfs=[] + model_type="open_clip" + wds_cache_dir=None + which="eval" + skip_existing=False + custom_template_file=None + custom_classname_file=None + distributed=False + +class linear_probe_args: + dataset="dummy" + split="test" + train_split="split" + val_split="val" + val_proportion=None + model="ViT-L-14" + pretrained="openai" + task="linear_probe" + amp=False + num_workers=4 + batch_size=256 + normalize=True + dataset_root="root" + output="result.json" + verbose=True + root="root" + annotation_file="" + seed=0 + feature_root="./" + fewshot_k=-1 + fewshot_epochs=1 + fewshot_lr=0.5 + skip_load=False + language="en" + model_cache_dir=None + save_clf=None + load_clfs=[] + model_type="open_clip" + wds_cache_dir=None + which="eval" + skip_existing=False + custom_template_file=None + custom_classname_file=None + distributed=False + +def test_base(): + if torch.cuda.is_available(): + run(linear_probe_args) + else: + logging.warning("GPU acceleration is required for linear evaluation to ensure optimal performance and efficiency.") + os.environ["CUDA_VISIBLE_DEVICES"] = "" + run(base_args) diff --git a/lm-quant-toolkit/.deps/CLIP_benchmark/tox.ini b/lm-quant-toolkit/.deps/CLIP_benchmark/tox.ini new file mode 100644 index 0000000000000000000000000000000000000000..340d01328708c5607c8ea9be660ac7a695f9b853 --- /dev/null +++ b/lm-quant-toolkit/.deps/CLIP_benchmark/tox.ini @@ -0,0 +1,19 @@ +[tox] +envlist = py36, py37, py38, flake8 + +[travis] +python = + 3.8: py38 + 3.7: py37 + 3.6: py36 + +[testenv:flake8] +basepython = python +deps = flake8 +commands = flake8 clip_benchmark tests + +[testenv] +setenv = + PYTHONPATH = {toxinidir} + +commands = python setup.py test diff --git a/lm-quant-toolkit/.deps/hqq/.gitignore b/lm-quant-toolkit/.deps/hqq/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0abc18323cbb57ffe154b0932c6905d4f74a9dd5 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/.gitignore @@ -0,0 +1,163 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Excel +*.xlsx + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/lm-quant-toolkit/.deps/hqq/LICENSE b/lm-quant-toolkit/.deps/hqq/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..0cbd30e346dba0d2bdab1959177bc37e1135c16a --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/LICENSE @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/lm-quant-toolkit/.deps/hqq/Readme.md b/lm-quant-toolkit/.deps/hqq/Readme.md new file mode 100644 index 0000000000000000000000000000000000000000..283adc6715361c4957bd32376b8e8826f785c82a --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/Readme.md @@ -0,0 +1,266 @@ +## Half-Quadratic Quantization (HQQ) +This repository contains the official implementation of Half-Quadratic Quantization (HQQ) presented in our articles: +* HQQ: https://mobiusml.github.io/hqq_blog/ +* HQQ+: https://mobiusml.github.io/1bit_blog/ + +### What is HQQ? +HQQ is a fast and accurate model quantizer that skips the need for calibration data. Quantize the largest models, without calibration data, in just a few minutes at most 🚀. + +
+ FAQ + Why should I use HQQ instead of other quantization methods?
+
    +
  • HQQ is very fast to quantize models.
  • +
  • It supports 8,4,3,2,1 bits.
  • +
  • You can use it on any model (LLMs, Vision, etc.).
  • +
  • The dequantization step is a linear operation, this means that HQQ is compatbile with various optimized CUDA/Triton kernels.
  • +
  • HQQ is compatible with peft training.
  • +
  • We try to make HQQ fully compatible `torch.compile` for faster inference and training.
  • +
+ + What is the quality of the quantized models?
+ We have detailed benchmarks on both language and vision models. Please refer to our blog posts: HQQ, HQQ+.
+ + What is the speed of the quantized models?
+ 4-bit models with `axis=1` can use optimized inference fused kernels like torchao's int4_gemm. This is the same kernel used in gpt-fast and based on our benchmarks, it's the fastest kernel available right now. We also support the Marlin kernel. Moreover, we focus on making hqq fully compatible with `torch.compile` which speeds-up both training and inference. For more details, please refer to the backend section below.
+ + What quantization settings should I use?
+ You should start with `nbits=4, group_size=64, axis=1`. These settings offer a good balance between quality, vram usage and speed. If you want better results with the same vram usage, switch to `axis=0` and use the ATEN backend. If you want to use lower like `nbits=2`, you should use `axis=0`with a low group-size via HQQ+, meaning adding low-rank adapters and fine-tune with a small dataset.
+ + What does the `axis` parameter mean?
+ The `axis` parameter is the axis along which grouping is performed. In general `axis=0` gives better results than `axis=1`, especially at lower bits. However, the optimized inference runtime only supports `axis=1` for the moment.
+ + What is the difference between HQQ and HQQ+?
+ HQQ+ is HQQ with trainable low-rank adapters to improve the quantization quality at lower bits.
+ +
+ +### Installation +First, make sure you have a Pytorch 2 version that matches your CUDA version: https://pytorch.org/ + +You can install hqq via ```pip install hqq```. + +To get the latest version, you can install the core library directly via ```pip install git+https://github.com/mobiusml/hqq.git```. + +Alternatively, clone the repo and run ```pip install .``` from this current folder. + +### Basic Usage +To perform quantization with HQQ, you simply need to replace the linear layers ( ```torch.nn.Linear```) as follows: +```Python +from hqq.core.quantize import * +#Quantization settings +quant_config = BaseQuantizeConfig(nbits=4, group_size=64) + +#Replace your linear layer +hqq_layer = HQQLinear(your_linear_layer, #torch.nn.Linear or None + quant_config=quant_config, #quantization configuration + compute_dtype=torch.float16, #compute dtype + device='cuda', #cuda device + initialize=True, #Use False to quantize later + del_orig=True #if True, delete the original layer + ) +``` + +The quantization parameters are set as follows: + +- ```nbits``` (int): supports 8, 4, 3, 2, 1 bits. +- ```group_size``` (int): no restrictions as long as ```weight.numel()``` is divisible by the ```group_size```. +- ```quant_zero``` (bool): if True, it quantizes the zero-point to 8-bit without grouping. +- ```quant_scale``` (bool): if True, it quantizes the scaling factor to 8-bit with a group_size of 128. +- ```offload_meta``` (bool): if True, meta-data is offloaded to the CPU. +- ```view_as_float``` (bool): if True, the quantized parameter is viewed as float instead of a int type. + +Setting ```offload_meta=True``` drastically decreases the GPU memory requirements but makes processing slower for smaller group-sizes. When turned on, you can run Llama2-70B and Mixtral with HQQ 2-bit using only 18.8GB and 13GB VRAM respectively. + +### Backend +#### Native Backends +The following native backends can be used by the `HQQLinear` module: +```Python +HQQLinear.set_backend(HQQBackend.PYTORCH) #Pytorch backend +HQQLinear.set_backend(HQQBackend.PYTORCH_COMPILE) #Compiled Pytorch +HQQLinear.set_backend(HQQBackend.ATEN) #Aten/CUDA backend +``` +The ```HQQBackend.ATEN``` backend is automatically installed and used by default when available. +Note that ```HQQBackend.ATEN``` only supports `axis=0`. For `axis=1` you need to use ```HQQBackend.PYTORCH``` or ```HQQBackend.PYTORCH_COMPILE```. + +Below you can find the speed-up benchmark with various backends, ```HQQBackend.PYTORCH``` being the baseline: + +
+
+ Titan RTX + A100 +
+
+
+ +#### Faster Inference +We support external backends for faster inference with fused kernels. You can enable one of the backends after the model was quantized as follows: +```Python +from hqq.utils.patching import prepare_for_inference + +#Pytorch backend that makes the model compatible with fullgrah torch.compile: works with any settings +#prepare_for_inference(model) + +#Torchao's tiny_gemm backned (fastest): nbits=4, compute_dtype=bfloat16, axis=1 +prepare_for_inference(model, backend="torchao_int4") + +#Marlin backend: nbits=4, axis=1, compute_dtype=float16, group_size=None +#prepare_for_inference(model, backend="marlin", allow_merge=True) +``` +These backends only work with 4-bit quantization and `axis=1`. Additionally, for Marlin, we only support `group_size=None`. Below you can find a comparison between the different backends. The torchao kernel reaches 195 tokens/sec (generation speed) on a 4090. + +

+ backend 4090 +

+ + +### Usage with Models +#### Transformers 🤗 +For usage with HF's transformers, see the example below from the documentation: +```Python +from transformers import AutoModelForCausalLM, HqqConfig + +# All linear layers will use the same quantization config +quant_config = HqqConfig(nbits=4, group_size=64, quant_zero=False, quant_scale=False, axis=1) + +# Load and quantize +model = AutoModelForCausalLM.from_pretrained( + model_id, + torch_dtype=torch.float16, + device_map="cuda", + quantization_config=quant_config +) +``` +Note: You can't save/load quantized models directly via `save_pretrained` with this approach. Use the save/load calls from the hqq lib instead. + +#### HQQ Lib +You can also utilize the HQQ library to quantize transformers models: +```Python +#Load the model on CPU +from transformers import AutoModelForCausalLM +model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=compute_dtype) + +#Quantize +from hqq.models.hf.base import AutoHQQHFModel +quant_config = BaseQuantizeConfig(nbits=4, group_size=64, quant_scale=False, quant_zero=False, axis=1) +AutoHQQHFModel.quantize_model(model, quant_config=quant_config, compute_dtype=compute_dtype, device=device) +``` +#### Save/Load +You can save/load quantized models as follows: +```Python +from hqq.models.hf.base import AutoHQQHFModel + +#Save: Make sure to save the model BEFORE any patching +AutoHQQHFModel.save_quantized(model, save_dir) + +#Load +model = AutoHQQHFModel.from_quantized(save_dir) +``` +#### Setting a backend +You can set a native backned as follows: +```Python +HQQLinear.set_backend(HQQBackend.ATEN if axis==0 else HQQBackend.PYTORCH_COMPILE) +``` + +You can patch for faster inference as explained in the backend section: +```Python +from hqq.utils.patching import prepare_for_inference +prepare_for_inference(model, backend="torchao_int4") +``` + +#### Custom HF Models +`AutoHQQHFModel` is meant to be compatible with any transformers model. However, its adaptability comes with a drawback - it may encounter issues or experience sluggishness when processing layers. If you encounter such problems, you have the option to create a custom model with clearly defined patching logic to replace `AutoHQQHFModel`. Below are examples of popular models you can utilize or expand upon for this purpose: + +```Python +from hqq.models.hf.llama import LlamaHQQ #Llama +from hqq.models.hf.mistral import MistralHQQ #Mistral +from hqq.models.hf.mixtral import MixtralHQQ #Mixtral +``` + +### Custom Quantization Configurations ⚙️ +You can set up various quantization configurations for different layers by specifying the settings for each layer name: +#### Transformers 🤗 +```Python +# Each linear layer with the same tag will use a dedicated quantization config +q4_config = {'nbits':4, 'group_size':64, 'quant_zero':False, 'quant_scale':False} +q3_config = {'nbits':3, 'group_size':32, 'quant_zero':False, 'quant_scale':False} + +quant_config = HqqConfig(dynamic_config={ + 'self_attn.q_proj':q4_config, + 'self_attn.k_proj':q4_config, + 'self_attn.v_proj':q4_config, + 'self_attn.o_proj':q4_config, + + 'mlp.gate_proj':q3_config, + 'mlp.up_proj' :q3_config, + 'mlp.down_proj':q3_config, +}) +``` +#### HQQ lib +```Python +from hqq.core.quantize import * +q4_config = BaseQuantizeConfig(nbits=4, group_size=64, quant_zero=False, quant_scale=False) +q3_config = BaseQuantizeConfig(nbits=3, group_size=32, quant_zero=False, quant_scale=False) + +quant_config = {'self_attn.q_proj':q4_config, + 'self_attn.k_proj':q4_config, + 'self_attn.v_proj':q4_config, + 'self_attn.o_proj':q4_config, + + 'mlp.gate_proj':q3_config, + 'mlp.up_proj' :q3_config, + 'mlp.down_proj':q3_config, +} +``` + +### Peft Training +You can use HQQ for LoRA training as follows: +```Python +#First, quantize/load a quantized HQQ model the +from hqq.core.peft import PeftUtils + +base_lora_params = {'lora_type':'default', 'r':32, 'lora_alpha':64, 'dropout':0.05, 'train_dtype':torch.float32} +lora_params = {'self_attn.q_proj': base_lora_params, + 'self_attn.k_proj': base_lora_params, + 'self_attn.v_proj': base_lora_params, + 'self_attn.o_proj': base_lora_params, + 'mlp.gate_proj' : None, + 'mlp.up_proj' : None, + 'mlp.down_proj' : None} + + +#Add LoRA to linear/HQQ modules +PeftUtils.add_lora(model, lora_params) + +#Optional: set your backend +HQQLinear.set_backend(HQQBackend.ATEN if axis==0 else HQQBackend.PYTORCH_COMPILE) + +#Train .... + +#Convert LoRA weights to the same model dtype for faster inference +model.eval() +PeftUtils.cast_lora_weights(model, dtype=compute_dtype) + +#Save LoRA weights +PeftUtils.save_lora_weights(model, filename) + +#Load LoRA weights: automatically calls add_lora +PeftUtils.load_lora_weights(model, filename) +``` + +We provide a complete example to train a model with HQQ/LoRA that you can find in ```examples/lora/train_hqq_lora_example.py```. + +If you want to use muti-gpu training via FSDP, check out this awesome repo by Answer.AI: https://github.com/AnswerDotAI/fsdp_qlora + +### Examples +We provide a variety of examples demonstrating model quantization across different backends within the ```examples``` directory. + +### Citation 📜 +``` +@misc{badri2023hqq, +title = {Half-Quadratic Quantization of Large Machine Learning Models}, +url = {https://mobiusml.github.io/hqq_blog/}, +author = {Hicham Badri and Appu Shaji}, +month = {November}, +year = {2023} +``` diff --git a/lm-quant-toolkit/.deps/hqq/examples/backends/marlin_int4_demo.py b/lm-quant-toolkit/.deps/hqq/examples/backends/marlin_int4_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..8ac45e094d72aa028262f97c34bbb4ab24149f4a --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/backends/marlin_int4_demo.py @@ -0,0 +1,46 @@ +# pip install git+https://github.com/mobiusml/hqq.git; +# pip install git+https://github.com/IST-DASLab/marlin.git; +# num_threads=12; OMP_NUM_THREADS=$num_threads CUDA_VISIBLE_DEVICES=0 ipython3 +########################################################################################################################################################## +import torch, os + +os.environ["TOKENIZERS_PARALLELISM"] = "1" +torch.backends.cuda.matmul.allow_tf32 = True +torch.backends.cudnn.allow_tf32 = True + +cache_path = '.' +model_id = "meta-llama/Llama-2-7b-chat-hf" +compute_dtype = torch.float16 #int4 kernel only works with float16 +device = 'cuda:0' + +########################################################################################################################################################## +from hqq.engine.hf import HQQModelForCausalLM, AutoTokenizer +from hqq.core.quantize import * + +tokenizer = AutoTokenizer.from_pretrained(model_id, cache_dir=cache_path) +model = HQQModelForCausalLM.from_pretrained(model_id, cache_dir=cache_path, torch_dtype=compute_dtype, attn_implementation="sdpa") +quant_config = BaseQuantizeConfig(nbits=4, group_size=None, quant_scale=False, quant_zero=False, axis=1) + +model.quantize_model(quant_config=quant_config, compute_dtype=compute_dtype, device=device) + +#Set default backends, to compare with int4mm +if(quant_config['weight_quant_params']['axis']==0): + HQQLinear.set_backend(HQQBackend.ATEN) +else: + HQQLinear.set_backend(HQQBackend.PYTORCH) + +########################################################################################################################################################## + +#Replace HQQLinear layers matmuls to support int4 mm +from hqq.utils.patching import prepare_for_inference +prepare_for_inference(model, backend="marlin") + +#Import custom HF generator +from hqq.utils.generation_hf import HFGenerator + +#Generate +gen = HFGenerator(model, tokenizer, max_new_tokens=1000, do_sample=True, compile="partial") + +out = gen.generate("Write an essay about large language models.", print_tokens=True) +out = gen.generate("Tell me a funny joke!", print_tokens=True) +out = gen.generate("How to make a yummy chocolate cake?", print_tokens=True) \ No newline at end of file diff --git a/lm-quant-toolkit/.deps/hqq/examples/hf/llama2_chat_hf_hub_example.py b/lm-quant-toolkit/.deps/hqq/examples/hf/llama2_chat_hf_hub_example.py new file mode 100644 index 0000000000000000000000000000000000000000..112752e3e07466431e210dfb9e506c29a52c01f8 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/hf/llama2_chat_hf_hub_example.py @@ -0,0 +1,65 @@ +model_id = 'mobiuslabsgmbh/Llama-2-7b-chat-hf-4bit_g64-HQQ' +#model_id = 'mobiuslabsgmbh/Llama-2-13b-chat-hf-4bit_g64-HQQ' +#model_id = 'mobiuslabsgmbh/Llama-2-70b-chat-hf-2bit_g16_s128-HQQ' + +from hqq.engine.hf import HQQModelForCausalLM, AutoTokenizer +tokenizer = AutoTokenizer.from_pretrained(model_id) +model = HQQModelForCausalLM.from_quantized(model_id) + +########################################################################################################## +import transformers +from threading import Thread + +from sys import stdout +def print_flush(data): + stdout.write("\r" + data) + stdout.flush() + +#Adapted from https://huggingface.co/spaces/huggingface-projects/llama-2-7b-chat/blob/main/app.py +def process_conversation(chat): + system_prompt = chat['system_prompt'] + chat_history = chat['chat_history'] + message = chat['message'] + + conversation = [] + if system_prompt: + conversation.append({"role": "system", "content": system_prompt}) + for user, assistant in chat_history: + conversation.extend([{"role": "user", "content": user}, {"role": "assistant", "content": assistant}]) + conversation.append({"role": "user", "content": message}) + + return tokenizer.apply_chat_template(conversation, return_tensors="pt").to('cuda') + +def chat_processor(chat, max_new_tokens=100, do_sample=True): + tokenizer.use_default_system_prompt = False + streamer = transformers.TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True) + + generate_params = dict( + {"input_ids": process_conversation(chat)}, + streamer=streamer, + max_new_tokens=max_new_tokens, + do_sample=do_sample, + top_p=0.90, + top_k=50, + temperature= 0.6, + num_beams=1, + repetition_penalty=1.2, + ) + + t = Thread(target=model.generate, kwargs=generate_params) + t.start() + + outputs = [] + for text in streamer: + outputs.append(text) + print_flush("".join(outputs)) + + return outputs + +################################################################################################### + +outputs = chat_processor({'system_prompt':"You are a helpful assistant.", + 'chat_history':[], + 'message':"How can I build a car?" + }, + max_new_tokens=1000, do_sample=False) diff --git a/lm-quant-toolkit/.deps/hqq/examples/hf/llava-v1.6-34b_24GB.py b/lm-quant-toolkit/.deps/hqq/examples/hf/llava-v1.6-34b_24GB.py new file mode 100644 index 0000000000000000000000000000000000000000..7d7c068813139d06e0388243206ee9054d60b6a5 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/hf/llava-v1.6-34b_24GB.py @@ -0,0 +1,115 @@ +# pip install git+https://github.com/mobiusml/hqq.git +# pip install flash-attn --no-build-isolation +# pip install sentencepiece #for lava-next tokenizer +# num_threads=32; OMP_NUM_THREADS=$num_threads CUDA_VISIBLE_DEVICES=0 ipython3 +################################################################################################### +import torch, transformers, os, gc + +model_id = "llava-hf/llava-v1.6-34b-hf" +compute_dtype = torch.float16 +device = 'cuda' +attn_imp = "flash_attention_2" #flash_attention_2 / sdpa / eager +cache_path = '.' +################################################################################################### +#Load model on CPU +processor = transformers.LlavaNextProcessor.from_pretrained(model_id, use_fast=False) +tokenizer = processor.tokenizer +model = transformers.LlavaNextForConditionalGeneration.from_pretrained(model_id, torch_dtype=compute_dtype, attn_implementation=attn_imp) + +#Quantize and offload to GPU +from hqq.core.quantize import * +from hqq.models.hf.llama import LlamaHQQ + +############################################################ +#Faster and better quality | Runtime VRAM ~25GB +#quant_config = BaseQuantizeConfig(nbits=4, group_size=64, quant_zero=False, quant_scale=False, offload_meta=False) + +#Designed to fit a 24GB | Runtime VRAM ~23.4GB +quant_config = BaseQuantizeConfig(nbits=4, group_size=64, quant_zero=True, quant_scale=True, offload_meta=True) +quant_config['scale_quant_params']['group_size'] = 64 +quant_config['zero_quant_params']['group_size'] = 64 + +############################################################ +#Quantize the language model +LlamaHQQ.quantize_model(model.language_model, quant_config=quant_config, compute_dtype=compute_dtype, device=device) + +#Move the rest of the model +model.vision_tower = model.vision_tower.to(device=device, dtype=compute_dtype) +model.multi_modal_projector = model.multi_modal_projector.to(device=device, dtype=compute_dtype) +model.image_newline.data = model.image_newline.data.to(device=device, dtype=compute_dtype) + +#Compile for faster processing +#model = torch.compile(model) + +#Set eval mode +model.generation_config.use_cache = True +model = model.eval(); + +################################################################################################### +#Generation functions +################################################################################################### +from PIL import Image +import requests +import torch +from threading import Thread + +@torch.inference_mode() +def llava_gen(image, prompt, system_prompt="Answer the questions.", assistant_tag="assistant\n", max_new_tokens=256, do_sample=False): + prompt_raw = "<|im_start|>system\n" + system_prompt + "<|im_end|><|im_start|>user\n\n" + prompt + "<|im_end|><|im_start|>assistant\n" + image = Image.open(image) if isinstance(image, str) else image + output = model.generate(**processor(prompt_raw, image, return_tensors='pt').to(device), + max_new_tokens=max_new_tokens, + do_sample=do_sample, + pad_token_id=tokenizer.pad_token_id, + top_p=0.90 if do_sample else None, + top_k=50 if do_sample else None, + temperature= 0.6 if do_sample else None, + num_beams=1, + repetition_penalty=1.2, + ) + response = processor.batch_decode(output, skip_special_tokens=True) + response = response[0].split(assistant_tag)[1].strip() + return response + +@torch.inference_mode() +def llava_chat(image, prompt, system_prompt="Answer the questions.", max_new_tokens=256, do_sample=False): + + streamer = transformers.TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True) + prompt_raw = "<|im_start|>system\n" + system_prompt + "<|im_end|><|im_start|>user\n\n" + prompt + "<|im_end|><|im_start|>assistant\n" + + generate_params = dict( + processor(prompt_raw, image, return_tensors="pt").to(device), + streamer=streamer, + max_new_tokens=max_new_tokens, + do_sample=do_sample, + pad_token_id=tokenizer.pad_token_id, + top_p=0.90 if do_sample else None, + top_k=50 if do_sample else None, + temperature= 0.6 if do_sample else None, + num_beams=1, + repetition_penalty=1.2, + ) + + t = Thread(target=model.generate, kwargs=generate_params) + t.start() + + print('------------------------------------------------------------') + + print("User: ", prompt); + print("Assistant: "); + outputs = "" + for text in streamer: + outputs += text + print(text, end="", flush=True) + + torch.cuda.empty_cache() + + return outputs + +################################################################################################### +#Generate +################################################################################################### + +image = Image.open(requests.get("https://github.com/haotian-liu/LLaVA/blob/1a91fc274d7c35a9b50b3cb29c4247ae5837ce39/images/llava_v1_5_radar.jpg?raw=true", stream=True).raw) + +out = llava_chat(image, prompt="What is shown in this image?", max_new_tokens=256, do_sample=False) diff --git a/lm-quant-toolkit/.deps/hqq/examples/hf/mixtral_13GB_example.py b/lm-quant-toolkit/.deps/hqq/examples/hf/mixtral_13GB_example.py new file mode 100644 index 0000000000000000000000000000000000000000..6a43209825f8f65c629590a589b29f7b5b056c80 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/hf/mixtral_13GB_example.py @@ -0,0 +1,95 @@ +################################################################################################ +# pip install hqq +# pip install flash-attn --no-build-isolation +# pip install transformers --upgrade +# num_threads=8; OMP_NUM_THREADS=$num_threads CUDA_VISIBLE_DEVICES=0 ipython +################################################################################################ + +import torch +from hqq.engine.hf import HQQModelForCausalLM, AutoTokenizer +model_id = "mistralai/Mixtral-8x7B-Instruct-v0.1" +cache_path = '.' +model = HQQModelForCausalLM.from_pretrained(model_id, cache_dir=cache_path, torch_dtype=torch.float16, attn_implementation="flash_attention_2") +tokenizer = AutoTokenizer.from_pretrained(model_id, cache_dir=cache_path) + +#Quantize params +from hqq.core.quantize import * + +# #Mixtral-8x7B-Instruct-v0.1-hf-attn-4bit-moe-2bit-metaoffload-HQQ ~13.5GB +# attn_prams = BaseQuantizeConfig(nbits=4, group_size=64, offload_meta=True) +# experts_params = BaseQuantizeConfig(nbits=2, group_size=16, offload_meta=True) +# zero_scale_group_size = 128 + +#Mixtral-8x7B-Instruct-v0.1-hf-attn-4bit-moe-2bitgs8-metaoffload-HQQ ~13.6GB +attn_prams = BaseQuantizeConfig(nbits=4, group_size=64, offload_meta=True) +experts_params = BaseQuantizeConfig(nbits=2, group_size=8, offload_meta=True) +zero_scale_group_size = 128 + +# #Mixtral-8x7B-Instruct-v0.1-hf-attn-4bit-moe-3bit-metaoffload-HQQ ~22.3GB +# attn_prams = BaseQuantizeConfig(nbits=4, group_size=64, offload_meta=True) +# experts_params = BaseQuantizeConfig(nbits=3, group_size=64, offload_meta=True) +# zero_scale_group_size = 128 + +quant_config = {} +#Attention +quant_config['self_attn.q_proj'] = attn_prams +quant_config['self_attn.k_proj'] = attn_prams +quant_config['self_attn.v_proj'] = attn_prams +quant_config['self_attn.o_proj'] = attn_prams +#Experts +quant_config['block_sparse_moe.experts.w1'] = experts_params +quant_config['block_sparse_moe.experts.w2'] = experts_params +quant_config['block_sparse_moe.experts.w3'] = experts_params + +#Quantize +model.quantize_model(quant_config=quant_config, compute_dtype=torch.float16) +model.eval(); + +################################################################################################ +#Set backend +HQQLinear.set_backend(HQQBackend.ATEN) +model = torch.compile(model) + +#Warmup +for i in range(10): + with torch.no_grad(): + out = model(torch.ones((1, 1024), dtype=torch.int32, device='cuda')) +del out +cleanup() + +################################################################################################ +import transformers +from threading import Thread + +def chat_processor(chat, max_new_tokens=100, do_sample=True): + tokenizer.use_default_system_prompt = False + streamer = transformers.TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True) + + generate_params = dict( + tokenizer(" [INST] " + chat + " [/INST] ", return_tensors="pt").to('cuda'), + streamer=streamer, + max_new_tokens=max_new_tokens, + do_sample=do_sample, + top_p=0.90, + top_k=50, + temperature= 0.6, + num_beams=1, + repetition_penalty=1.2, + ) + + t = Thread(target=model.generate, kwargs=generate_params) + t.start() + + print('------------------------------------------------------------') + cleanup() + print(chat); print(); + outputs = [] + for text in streamer: + outputs.append(text) + print(text, end="", flush=True) + + return outputs + +################################################################################################ +#Generation +outputs = chat_processor("How do I build a car?", max_new_tokens=1000, do_sample=False) diff --git a/lm-quant-toolkit/.deps/hqq/examples/hf/whisper.py b/lm-quant-toolkit/.deps/hqq/examples/hf/whisper.py new file mode 100644 index 0000000000000000000000000000000000000000..c80035d7f1fb9489d530f543a58845a15ebf33f6 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/hf/whisper.py @@ -0,0 +1,98 @@ +# Tested with torch nightly, 4090 +# pip uninstall torch -y; pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu121 +############################################################################################## + +import torch +from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline + +model_id = "openai/whisper-medium" +#model_id = "distil-whisper/distil-large-v3" + +compute_dtype = torch.bfloat16 +device = "cuda:0" + +model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=compute_dtype) +processor = AutoProcessor.from_pretrained(model_id) + + +############################################################################## +#No quantize +#model = model.to(device) + +############################################################################## +#Quantize +from hqq.models.hf.base import AutoHQQHFModel +from hqq.core.quantize import * + +quant_config = BaseQuantizeConfig(nbits=4, group_size=64, quant_scale=False, quant_zero=False, axis=1) +HQQLinear.set_backend(HQQBackend.PYTORCH) + +AutoHQQHFModel.quantize_model(model.model.encoder, quant_config=quant_config, compute_dtype=compute_dtype, device=device) +AutoHQQHFModel.quantize_model(model.model.decoder, quant_config=quant_config, compute_dtype=compute_dtype, device=device) + +from hqq.utils.patching import prepare_for_inference +prepare_for_inference(model.model.encoder) +prepare_for_inference(model.model.decoder, backend="torchao_int4") + +model.model.encoder.forward = torch.compile(model.model.encoder.forward, mode="reduce-overhead", fullgraph=True) +model.model.decoder.forward = torch.compile(model.model.decoder.forward, mode="reduce-overhead", fullgraph=True) +# ############################################################################## + +import time +import numpy as np + +if(model_id=="openai/whisper-medium"): + encoder_input = torch.randn([1, 80, 3000], dtype=compute_dtype, device=device) +if(model_id=="distil-whisper/distil-large-v3"): + encoder_input = torch.randn([1, 128, 3000], dtype=compute_dtype, device=device) + +def run_encoder(): + with torch.no_grad(): + model.model.encoder(encoder_input) + torch.cuda.synchronize() + +t = [] +for _ in range(200): + t1 = time.time() + run_encoder() + t2 = time.time() + t.append(t2-t1) +print("Encoder", np.mean(t[-100:]), "sec / sample") + + +decoder_input = torch.randint(0, 1000, [1, 1], dtype=torch.int64, device=device) +def run_decoder(): + with torch.no_grad(): + out = model.model.decoder(decoder_input) + torch.cuda.synchronize() + + +t = [] +for _ in range(200): + t1 = time.time() + run_decoder() + t2 = time.time() + t.append(t2-t1) +print("Decoder", np.mean(t[-100:]), "sec / sample") + + +#openai/whisper-medium | RTX 4090 +#Encoder: use default backend +#fp16 : 0.0234 sec / sample +#hqq 4-bit (default,compiled) : 0.0124 sec / sample | 1.89x faster + + +#Decoder: use torchao backend to decode 1 token at a time +#fp16 : 0.01080 sec / sample +#hqq 4-bit (ao_int4, compiled): 0.000928 sec / sample | 11.63x faster + + +#distil-whisper/distil-large-v3 | RTX 4090 +#Encoder: use default backend +#fp16 : 0.03738 sec / sample +#hqq 4-bit (default,compiled) : 0.01869 sec / sample | 2x faster + + +#Decoder: use torchao backend to decode 1 token at a time +#fp16 : 0.002592 sec / sample +#hqq 4-bit (ao_int4, compiled): 0.000326 sec / sample | 7.95x faster diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.gitignore b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..61389c7b566e84e231537dd7979bbe2530e60637 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.gitignore @@ -0,0 +1,3 @@ +snapshots/ +snapshots-*/ +results/ diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.gitigore b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.gitigore new file mode 100644 index 0000000000000000000000000000000000000000..333c1e910a3e2bef1b9d0d4587392627d8388974 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.gitigore @@ -0,0 +1 @@ +logs/ diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.pdbrc b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.pdbrc new file mode 100644 index 0000000000000000000000000000000000000000..56747e9dead7b955c091ac7b26c8a67ebe1aa3f2 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/.pdbrc @@ -0,0 +1,10 @@ +# b hqq/core/quantize.py:677 +# c +# b eval_model.py:34 +# b bench.py:221 +# b hqq/models/base.py:132 +# b quant_llama2_hqq_demo.py:30 +# b hqq/models/base.py:265 +# b debug-quant-mem.py:18 +# b hqq/models/hf/llama.py:71 +# b hqq/models/base.py:260 diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/adapter/__init__.py b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/adapter/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/adapter/autogptq.py b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/adapter/autogptq.py new file mode 100644 index 0000000000000000000000000000000000000000..e223b262b78295e9ee49657c73d5ff7e99fef1ce --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/adapter/autogptq.py @@ -0,0 +1,70 @@ +import gc +import os +import random +import time +import torch +import transformers + +from auto_gptq import AutoGPTQForCausalLM +from datasets import load_dataset +from tqdm import tqdm + + +# Adapted from: https://towardsdatascience.com/4-bit-quantization-with-gptq-36b0f4f02c34 +def prepare_model(model, tokenizer, n_samples=1024, max_tokens=512, use_triton=False): + # Load data and tokenize examples + data = load_dataset( + "allenai/c4", + data_files="en/c4-train.00001-of-01024.json.gz", + split=f"train[:{n_samples}]" + ) + # ~536K tokens + tokenized_data = torch.cat( + [tokenizer(data[i]['text'], return_tensors='pt').input_ids + for i in tqdm(range(len(data)))], axis=-1) + + # Format tokenized examples + random.seed(1) + examples_ids = [] + for _ in range(n_samples): + i = random.randint(0, tokenized_data.shape[1] - max_tokens - 1) + j = i + max_tokens + input_ids = tokenized_data[:, i:j] + attention_mask = torch.ones_like(input_ids) + examples_ids.append({'input_ids': input_ids, 'attention_mask': attention_mask}) + + print('Using ' + str(len(examples_ids)) + ' samples for calibration.') + model.quantize(examples_ids, batch_size=1, use_triton=use_triton) + # model = model.cuda() + # with torch.no_grad(): + # x = model(input_ids.to('cuda')) + # del examples_ids, x + del examples_ids + torch.cuda.empty_cache() + gc.collect() + return model + + +def create_autogptq_model(model_id, quant_config, config_id, load_quantized, save_dir): + quantized = False + quant_path = f"{save_dir}/{model_id}-{config_id}-gptq" + if load_quantized and os.path.exists(quant_path): + model = AutoGPTQForCausalLM.from_quantized(quant_path, device="cuda:0") + tokenizer = transformers.AutoTokenizer.from_pretrained(model_id) + quantized = True + else: + tokenizer = transformers.AutoTokenizer.from_pretrained(model_id) + model = AutoGPTQForCausalLM.from_pretrained(model_id, quant_config) + return model, tokenizer, quantized + + +def quantize_autogptq_model(model, tokenizer, quant_config, model_id, config_id, save_dir): + t1 = time.time() + model = prepare_model(model, tokenizer) + t2 = time.time() + print('Took ' + str(t2 - t1) + ' seconds to quantize the model with AutoGPTQ') + quant_path = f"{save_dir}/{model_id}-{config_id}-gptq" + model.save_quantized(quant_path, use_safetensors=True) + return model, t2 - t1 + + diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/adapter/hqq.py b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/adapter/hqq.py new file mode 100644 index 0000000000000000000000000000000000000000..6d73afd7e6b1d411bef17d9d7002d826afa72a14 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/adapter/hqq.py @@ -0,0 +1,30 @@ +import os +import time +from hqq.engine.hf import AutoTokenizer as hggAutoTokenizer +from hqq.engine.hf import HQQModelForCausalLM + + +def create_hqq_model(model_id, quant_config, config_id, load_quantized, save_dir): + quantized = False + quant_path = f"{save_dir}/{model_id}-{config_id}-hqq" + if load_quantized and os.path.exists(quant_path): + model = HQQModelForCausalLM.from_quantized(quant_path) + tokenizer = hggAutoTokenizer.from_pretrained(model_id) + quantized = True + else: + model = HQQModelForCausalLM.from_pretrained(model_id) + tokenizer = hggAutoTokenizer.from_pretrained(model_id) + return model, tokenizer, quantized + + +def quantize_hqq_model(model, tokenizer, quant_config, model_id, config_id, save_dir): + t1 = time.time() + model.quantize_model(quant_config=quant_config) + t2 = time.time() + print('Took ' + str(t2 - t1) + ' seconds to quantize the model with HQQ') + quant_path = f"{save_dir}/{model_id}-{config_id}-hqq" + model.save_quantized(quant_path) + return model, t2 - t1 + + + diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/bench.py b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/bench.py new file mode 100644 index 0000000000000000000000000000000000000000..0a5297fddac4b65fcf722902b303069c88965bec --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/bench.py @@ -0,0 +1,742 @@ +import copy +import gc +import glob +import logging +import os + +# from adapter.awq import create_awq_model +# from adapter.awq import quantize_awq_model +from datetime import datetime + +import pandas as pd +import torch +import transformers +from adapter.autoawq import create_autoawq_model, quantize_autoawq_model +from adapter.autogptq import create_autogptq_model, quantize_autogptq_model +from adapter.hqq import create_hqq_model, quantize_hqq_model +from auto_gptq import BaseQuantizeConfig as GPTQQuantConfig +from eval_model import eval_c4, eval_wikitext2 +from hqq.core.quantize import BaseQuantizeConfig as HQQQuantConfig +from leaderboard import eval_llm_leaderboard +from transformers import AutoModelForCausalLM + +ALL_MODELS = [ + "meta-llama/Llama-2-7b-hf", + "meta-llama/Llama-2-13b-hf", + "meta-llama/Meta-Llama-3-8B", +] + +QUANT_METRICS_FILE_MAP = { + "meta-llama/Llama-2-7b-hf": "data/fnorm-Llama-2-7b-hf.csv", + "meta-llama/Llama-2-13b-hf": "data/fnorm-Llama-2-13b-hf.csv", + "meta-llama/Meta-Llama-3-8B": "data/fnorm-Llama-3-8B.csv", +} + +HHQ_CONFIGS = [ + ("b4g32", HQQQuantConfig(nbits=4, group_size=32)), + ("b4g64", HQQQuantConfig(nbits=4, group_size=64)), + ("b4g128", HQQQuantConfig(nbits=4, group_size=128)), + ("b3g32", HQQQuantConfig(nbits=3, group_size=32)), + ("b3g64", HQQQuantConfig(nbits=3, group_size=64)), + ("b3g128", HQQQuantConfig(nbits=3, group_size=128)), + ("mxq-3_00", HQQQuantConfig(mixed=True, budget=3.00, quant_scale=True)), + ("mxq-4_01", HQQQuantConfig(mixed=True, budget=4.01, quant_scale=True)), + ("mxq-3_76", HQQQuantConfig(mixed=True, budget=3.76, quant_scale=True)), + ("mxq-3_50", HQQQuantConfig(mixed=True, budget=3.50, quant_scale=True)), + ("mxq-2_75", HQQQuantConfig(mixed=True, budget=2.75, quant_scale=True)), + ("mxq-2_48", HQQQuantConfig(mixed=True, budget=2.48, quant_scale=True)), + ("mxq-4_25", HQQQuantConfig(mixed=True, budget=4.25, quant_scale=True)), + ("mxq-4_50", HQQQuantConfig(mixed=True, budget=4.50, quant_scale=True)), + ("mxq-4_75", HQQQuantConfig(mixed=True, budget=4.75, quant_scale=True)), + ("mxq-5_00", HQQQuantConfig(mixed=True, budget=5.00, quant_scale=True)), + ("b2g16", HQQQuantConfig(nbits=2, group_size=16)), + ("b2g32", HQQQuantConfig(nbits=2, group_size=32)), + ("b2g64", HQQQuantConfig(nbits=2, group_size=64)), + ("mxq-3_00", HQQQuantConfig(mixed=True, budget=3.00, quant_scale=True)), +] + +AUTOAWQ_CONFIGS = [ + ("b4g32", {"w_bit": 4, "q_group_size": 32, "zero_point": True, "version": "GEMM"}), + ("b4g64", {"w_bit": 4, "q_group_size": 64, "zero_point": True, "version": "GEMM"}), + ( + "b4g128", + {"w_bit": 4, "q_group_size": 128, "zero_point": True, "version": "GEMM"}, + ), + # 3-bit not supported by AutoAWQ right now + # ("b3g64", {"w_bit": 3, "q_group_size": 64, "zero_point": True, 'version':'gemv_fast'}), + # ("b3g128", {"w_bit": 3, "q_group_size": 128, "zero_point": True, 'version':'gemv_fast'}), +] + +AWQ_CONFIGS = [ + ("b4g32", {"w_bit": 4, "q_group_size": 32, "zero_point": True}), + ("b4g64", {"w_bit": 4, "q_group_size": 64, "zero_point": True}), + ("b4g128", {"w_bit": 4, "q_group_size": 128, "zero_point": True}), + ("b3g32", {"w_bit": 3, "q_group_size": 32, "zero_point": True}), + ("b3g64", {"w_bit": 3, "q_group_size": 64, "zero_point": True}), + ("b3g128", {"w_bit": 3, "q_group_size": 128, "zero_point": True}), +] + +GPTQ_CONFIGS = [ + ( + "b4g32", + GPTQQuantConfig(bits=4, group_size=32, damp_percent=0.01, desc_act=False), + ), + ( + "b4g64", + GPTQQuantConfig(bits=4, group_size=64, damp_percent=0.01, desc_act=False), + ), + ( + "b4g128", + GPTQQuantConfig(bits=4, group_size=128, damp_percent=0.01, desc_act=False), + ), + ( + "b3g32", + GPTQQuantConfig(bits=3, group_size=32, damp_percent=0.01, desc_act=False), + ), + ( + "b3g64", + GPTQQuantConfig(bits=3, group_size=64, damp_percent=0.01, desc_act=False), + ), + ( + "b3g128", + GPTQQuantConfig(bits=3, group_size=128, damp_percent=0.01, desc_act=False), + ), +] + + +def experiment_debug(): + models = [ + "meta-llama/Llama-2-7b-hf", + ] + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[-1:], + }, + } + do_expermient("debug_hqq_auto", models, tasks, save_dir="snapshots-hqq") + + +def experiment_quant_awq(): + models = ALL_MODELS + tasks = { + "awq": { + "create_fn": create_autoawq_model, + "quantize_fn": quantize_autoawq_model, + "configs": AWQ_CONFIGS, + }, + } + do_expermient( + "quant_awq", + models, + tasks, + quantize_only=True, + ) + + +def experiment_redo_autogptq_benchmark(): + models = ALL_MODELS + tasks = { + "gptq": { + "create_fn": create_autogptq_model, + "quantize_fn": quantize_autogptq_model, + "configs": GPTQ_CONFIGS, + }, + } + do_expermient( + "eval_redo_autogptq_benchmark", + models, + tasks, + ) + + +def experiment_quant_autogptq(): + models = ALL_MODELS + tasks = { + "gptq": { + "create_fn": create_autogptq_model, + "quantize_fn": quantize_autogptq_model, + "configs": GPTQ_CONFIGS[3:], + }, + } + do_expermient( + "eval_autogptq_redo_b3", + models, + tasks, + ) + + +def experiment_eval_autogptq(): + models = ALL_MODELS + tasks = { + "gptq": { + "create_fn": create_autogptq_model, + "quantize_fn": quantize_autogptq_model, + "configs": [GPTQ_CONFIGS[1]], + }, + } + do_expermient( + "eval_autogptq", + models, + tasks, + ) + + +# def experiment_eval_autoawq_g32(): +# models = ALL_MODELS[2:] +# tasks = { +# 'AWQ': { +# "create_fn": create_autoawq_model, +# "quantize_fn": quantize_autoawq_model, +# "configs": AUTOAWQ_CONFIGS[0:1], +# }, +# } +# do_expermient( +# "eval_autoawq_g32", +# models, +# tasks, +# ) +# + + +def experiment_eval_g32(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": [HHQ_CONFIGS[0], HHQ_CONFIGS[3]], + }, + "AWQ": { + "create_fn": create_autoawq_model, + "quantize_fn": quantize_autoawq_model, + "configs": AUTOAWQ_CONFIGS[0:1], + }, + # 'GPTQ': { + # "create_fn": create_autogptq_model, + # "quantize_fn": quantize_autogptq_model, + # "configs": [GPTQ_CONFIGS[0], GPTQ_CONFIGS[3]], + # }, + } + do_expermient( + "eval_all_g32", + models, + tasks, + ) + + +def experiment_eval_mix(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[-4:], + }, + } + do_expermient("eval_hqq_mix3", models, tasks) + + +def experiment_quant_mxq_boost(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[-3:], + }, + } + do_expermient( + "quant_mxq_boost", + models, + tasks, + quantize_only=True, + ) + + +def experiment_eval_mxq_boost(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[-3:], + }, + } + do_expermient( + "eval_mxq_boost", + models, + tasks, + ) + + +def experiment_quantize_mxq_extra(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[-4:], + }, + } + do_expermient( + "quant_mxq_extra", + models, + tasks, + quantize_only=True, + ) + + +def calc_bits(b1, g1, b2, g2): + return b1 + 2 * b2 / g1 + 32 / g1 / g2 + + +def experiment_quant_eval_mxq_comprise(): + models = ALL_MODELS + equiv_mxq_configs = [] + nbits = [4.06, 4.10, 4.15, 4.19, 4.24, 4.28, 4.33] + for bits in nbits: + cfg_name = f"mxq-{str(bits).replace('.', '_')}" + equiv_mxq_configs.append( + (cfg_name, HQQQuantConfig(mixed=True, budget=bits, quant_scale=True)) + ) + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": equiv_mxq_configs, + }, + } + do_expermient( + "eval_mxq_compromise", + models, + tasks, + ) + + +# It seems the PPL degrades as we apply mem 1% memory torelance +# def experiment_quant_eval_mxq_torelance(): +# models = ALL_MODELS[0:1] +# equiv_mxq_configs = [ +# ("mxq-2_25", HQQQuantConfig(mixed=True, budget=2.25, quant_scale=True)) +# ] +# tasks = { +# 'HQQ': { +# "create_fn": create_hqq_model, +# "quantize_fn": quantize_hqq_model, +# "configs": equiv_mxq_configs, +# }, +# } +# do_expermient( +# "eval_mxq_torelance", +# models, +# tasks, +# ) + + +def experiment_quant_eval_mxq_equiv(): + models = ALL_MODELS + equiv_mxq_configs = [] + for cfg in HHQ_CONFIGS: + if cfg[0].startswith("b"): + bits = calc_bits( + cfg[1]["weight_quant_params"]["nbits"], + cfg[1]["weight_quant_params"]["group_size"], + 8, + 128, + ) + bits = round(bits, 2) + cfg_name = f"mxq-{str(bits).replace('.', '_')}" + equiv_mxq_configs.append( + (cfg_name, HQQQuantConfig(mixed=True, budget=bits, quant_scale=True)) + ) + + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": equiv_mxq_configs, + }, + } + do_expermient( + "eval_mxq_extra", + models, + tasks, + ) + + +def experiment_eval_mxq_extra(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[-4:], + }, + } + do_expermient( + "eval_mxq_extra", + models, + tasks, + ) + + +def experiment_quantize_405B(): + models = [ + "meta-llama/Meta-Llama-3.1-405B-Instruct", + ] + + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[1:2], + }, + } + do_expermient( + "quant_hqq_405B", + models, + tasks, + quantize_only=True, + save_dir="/data/gqq-eval/snapshots/", + ) + + +def experiment_quantize_mxq(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[6:], + }, + } + do_expermient( + "quant_mxq_fix_storage_error", + models, + tasks, + quantize_only=True, + ) + + +def experiment_eval_mxq(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[6:], + }, + } + do_expermient( + "eval_mxq_fix_storage_error", + models, + tasks, + ) + + +def experiment_llm_leaderboard_autogptq(): + models = ALL_MODELS[:-1] + tasks = { + "GPTQ": { + "create_fn": create_autogptq_model, + "quantize_fn": quantize_autogptq_model, + "configs": GPTQ_CONFIGS, + }, + } + do_expermient( + "gptq_leaderboard", + models, + tasks, + task_type="eval_leaderboard", + save_dir="snapshots", + ) + + +# def experiment_autoawq(): +# models = ALL_MODELS +# tasks = { +# 'AWQ': { +# "create_fn": create_autoawq_model, +# "quantize_fn": quantize_autoawq_model, +# "configs": AUTOAWQ_CONFIGS, +# } +# } +# do_expermient( +# "awq_benchmark", +# models, +# tasks, +# save_dir="snapshots" +# ) +# + + +def experiment_hqq(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS, + }, + } + do_expermient("hqq_benchmark", models, tasks, save_dir="snapshots") + + +def experiment_hqq_mix(): + models = ALL_MODELS + tasks = { + "HQQ": { + "create_fn": create_hqq_model, + "quantize_fn": quantize_hqq_model, + "configs": HHQ_CONFIGS[4:], + }, + } + do_expermient("hqq_benchmark_mix2", models, tasks, save_dir="snapshots") + + +def experiment_fp16_baseline(): + models = ALL_MODELS + tasks = { + "FP16": { + "create_fn": create_fp16_model, + "quantize_fn": None, + "configs": [ + ("base", {}), + ], + }, + } + do_expermient( + "fp16_baseline", + models, + tasks, + ) + + +def _init_metrics(model_id, kind, config): + return { + "model": model_id.split("/")[1], + "method": kind, + "config": config[0], + "config_detail": config[1], + "quant_duration": 0, + "quant_mem_allot": 0, + "quant_mem_reserved": 0, + "fp_mem_allot": 0, + "fp_mem_reserved": 0, + "quant_duration": 0, + "ppl_wikitext": 0, + "ppl_c4": 0, + "duration_wikitext": 0, + "duration_c4": 0, + "ifeval": 0, + "bbh": 0, + "mathlevel5": 0, + "gpqa": 0, + "musr": 0, + "mmlupro": 0, + } + + +def do_expermient( + experiment_name, models, tasks, task_type="quantize_only", save_dir="snapshots" +): + logging.basicConfig( + format="%(asctime)s %(levelname)s [%(name)s] %(message)s", + level=logging.INFO, + datefmt="%Y-%m-%d %H:%M:%S", + ) + + exp_result_name = experiment_name + for kind, spec in tasks.items(): + exp_result_name += "-" + kind + configs = spec["configs"] + for config in configs: + exp_result_name += "_" + config[0] + for model_id in models: + metric = _init_metrics(model_id, kind, config) + print("*" * 72) + if task_type == "quantize_only": + print(f"Quantizing {kind} on {model_id} w/ config: {config[0]}...") + elif task_type == "eval_ppl": + print( + f"Evaluating {kind} PPL on {model_id} w/ config: {config[0]}..." + ) + else: + print( + f"Evaluating {kind} LLM Leaderboard benchmarks on {model_id} w/ config: {config[0]}..." + ) + print("*" * 72) + + if task_type != "eval_leaderboard": + create_fn = spec["create_fn"] + quant_fn = spec["quantize_fn"] + model, tokenizer, quantized = create_fn( + model_id, config[1], config[0], quant_fn is not None, save_dir + ) + if quantized: + metric["quant_mem_allot"], metric["quant_mem_reserved"] = ( + get_memory_metrics() + ) + else: + metric["fp_mem_allot"], metric["fp_mem_reserved"] = ( + get_memory_metrics() + ) + + if not quantized and quant_fn: + metric["fp_mem_allot"], metric["fp_mem_reserved"] = ( + get_memory_metrics() + ) + # avoid interventions between models + quant_config = copy.deepcopy(config[1]) + if ( + config[0].startswith("mxq-") + and model_id in QUANT_METRICS_FILE_MAP + ): + quant_config["quant_metrics_file"] = QUANT_METRICS_FILE_MAP[ + model_id + ] + model, duration = quant_fn( + model, + tokenizer, + quant_config, + model_id, + config[0], + save_dir, + ) + # persistent the quantized model + os.sync() + metric["quant_mem_allot"], metric["quant_mem_reserved"] = ( + get_memory_metrics() + ) + metric["quant_duration"] = duration + # Evaluate the quantized model + if task_type == "eval_ppl": + metric = eval_ppls(model, tokenizer, metric) + cleanup(model) + else: + metric = eval_llm_leaderboard( + experiment_name, model_id, kind, config[0], save_dir, metric + ) + save_partial_metric(experiment_name, kind, model_id, config[0], metric) + + # combine metrics + combine_metrics(experiment_name, exp_result_name) + + +def save_partial_metric(experiment_name, kind, model_id, config, metric): + metrics = [metric] + df = pd.DataFrame(metrics) + result_dir = f"results/{experiment_name}" + os.makedirs(result_dir, exist_ok=True) + model_short_id = model_id.split("/")[1] + file_name = f"{result_dir}/partial-{kind}-{model_short_id}-{config}.csv" + df.to_csv( + file_name, + columns=[ + "method", + "model", + "config", + "quant_duration", + "ppl_wikitext", + "ppl_c4", + "duration_wikitext", + "duration_c4", + "quant_mem_allot", + "quant_mem_reserved", + "fp_mem_allot", + "fp_mem_reserved", + "config_detail", + "ifeval", + "bbh", + "mathlevel5", + "gpqa", + "musr", + "mmlupro", + ], + index=False, + ) + + +def combine_metrics(experiment_name, exp_result_name): + dfs = [] + iters = glob.iglob(f"./results/{experiment_name}/partial-*.csv") + for it in iters: + df = pd.read_csv(it) + dfs.append(df) + combined = pd.concat(dfs) + ts_str = datetime.now().strftime("%Y%m%d%H%M%S") + file_name = f"results/result-{exp_result_name}-{ts_str}.xlsx" + combined.to_excel(file_name, index=False) + + +def eval_ppls(model, tokenizer, metric): + ppl_wikitext, duration_wikitext = eval_wikitext2(model, tokenizer, verbose=True) + ppl_c4, duration_c4 = eval_c4(model, tokenizer, verbose=True) + metric["ppl_wikitext"] = ppl_wikitext + metric["duration_wikitext"] = duration_wikitext + metric["duration_c4"] = duration_c4 + return metric + + +def create_fp16_model(model_id, quant_config, config_id, load_quantized, save_dir): + model = AutoModelForCausalLM.from_pretrained( + model_id, device_map="auto", torch_dtype=torch.float16 + ) + tokenizer = transformers.AutoTokenizer.from_pretrained(model_id) + return model, tokenizer, False + + +def cleanup(model): + del model + torch.cuda.empty_cache() + gc.collect() + + +def get_memory_metrics(): + return torch.cuda.memory_allocated(), torch.cuda.memory_reserved() + + +def main(): + # experiment_eval_all() + # experiment_quantize_all() + # experiment_debug() + # experiment_autoawq() + # experiment_autogptq() + # experiment_hqq() + # experiment_debug() + # experiment_fp16_baseline() + # experiment_quantize_mix() + # experiment_eval_mix() + # experiment_eval_g32() + # experiment_eval_autoawq_g32() + # experiment_eval_autogptq() + # experiment_quant_autogptq() + # experiment_quant_awq() + # experiment_quantize_mxq() + # experiment_eval_mxq() + # experiment_quantize_mxq_extra() + # experiment_eval_mxq_extra() + # experiment_quant_eval_mxq_equiv() + # experiment_quant_eval_mxq_torelance() + # experiment_quant_eval_mxq_comprise() + # experiment_quant_autogptq() + # experiment_redo_autogptq_benchmark() + # experiment_quantize_405B() + experiment_llm_leaderboard_autogptq() + + +if __name__ == "__main__": + # os.environ['HF_DATASETS_OFFLINE'] = '1' + + max_threads = str(min(8, os.cpu_count())) + os.environ["OMP_NUM_THREADS"] = max_threads + os.environ["OPENBLAS_NUM_THREADS"] = max_threads + os.environ["MKL_NUM_THREADS"] = max_threads + os.environ["VECLIB_MAXIMUM_THREADS"] = max_threads + os.environ["NUMEXPR_NUM_THREADS"] = max_threads + os.environ["NUMEXPR_MAX_THREADS"] = max_threads + os.environ["HF_HOME"] = "/data/hugginface/" + + main() diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/combine-quant-orig-weights.py b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/combine-quant-orig-weights.py new file mode 100644 index 0000000000000000000000000000000000000000..c608181ab2435673d8eb75871d5ab8a26775714a --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/combine-quant-orig-weights.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 + +import json +import os +import torch + +from hqq.core.quantize import Quantizer as hQuant +from safetensors import safe_open +from safetensors.torch import save_file as safe_save +from torch import uint8 + +home_dir = os.environ.get("HOME", "/home/justin") +models = { + "meta-llama/Llama-2-7b-hf": { + 'layers': 32, + 'base_dir': f"{home_dir}/.cache/huggingface/hub/models--meta-llama--Llama-2-7b-hf/snapshots/01c7f73d771dfac7d292323805ebc428287df4f9/", + }, + "meta-llama/Llama-2-13b-hf": { + 'layers': 40, + 'base_dir': f"{home_dir}/.cache/huggingface/hub/models--meta-llama--Llama-2-13b-hf/snapshots/5c31dfb671ce7cfe2d7bb7c04375e44c55e815b1/", + }, + "meta-llama/Meta-Llama-3-8B": { + 'layers': 32, + 'base_dir': f"{home_dir}/.cache/huggingface/hub/models--meta-llama--Meta-Llama-3-8B/snapshots/1460c22666392e470910ce3d44ffeb2ab7dbd4df/", + }, + "meta-llama/Meta-Llama-3-70B": { + 'layers': 80, + 'base_dir': "/data/hugginface/hub/models--meta-llama--Meta-Llama-3-70B/snapshots/b4d08b7db49d488da3ac49adf25a6b9ac01ae338/", + }, + "meta-llama/Llama-2-70b-hf": { + 'layers': 80, + 'base_dir': "/data/hugginface/hub/models--meta-llama--Llama-2-70b-hf/snapshots/3aba440b59558f995867ba6e1f58f21d0336b5bb/", + }, + "meta-llama/Meta-Llama-3-70B-Instruct": { + 'layers': 80, + 'base_dir': "/data/hugginface/hub/models--meta-llama--Meta-Llama-3-70B-Instruct/snapshots/7129260dd854a80eb10ace5f61c20324b472b31c/", + }, + "meta-llama/Meta-Llama-3.1-405B-Instruct": { + 'layers': 126, + 'base_dir': "/data/hugginface/hub/models--meta-llama--Meta-Llama-3.1-405B-Instruct/snapshots/e04e3022cdc89bfed0db69f5ac1d249e21ee2d30/", + }, +} + +llama2_7b_base_dir = models['meta-llama/Llama-2-7b-hf']['base_dir'] +llama3_8b_base_dir = models['meta-llama/Meta-Llama-3-8B']['base_dir'] +llama2_13b_base_dir = models['meta-llama/Llama-2-13b-hf']['base_dir'] +llama2_70b_base_dir = models['meta-llama/Llama-2-70b-hf']['base_dir'] +llama3_70b_base_dir = models['meta-llama/Meta-Llama-3-70B']['base_dir'] + + +def load_weight(matrix_name, base_dir, index_json='model.safetensors.index.json'): + m = f"{matrix_name}.weight" + fp = os.path.join(base_dir, index_json) + with open(fp, "r") as fh: + index = json.load(fh) + try: + st_file = index["weight_map"][m] + mp = os.path.join(base_dir, st_file) + with safe_open(mp, framework="pt", device="cpu") as f: + return f.get_tensor(m) + except Exception: + raise ValueError(f"Invalid key {m}") + + +def dequantize(wq, meta): + # Zero/Scale packed together + if "zero_scale" in meta: + zero_scale = meta["zero_scale"] + + if zero_scale.dtype == uint8: + meta["zero_q"], meta["scale_q"] = zero_scale[0], zero_scale[1] + else: + meta["zero"], meta["scale"] = zero_scale[0], zero_scale[1] + + if meta["quant_zero"]: + meta["zero"] = hQuant.dequantize( + meta["zero_q"], meta["meta_zero"] + ) + + if meta["quant_scale"]: + meta["scale"] = hQuant.dequantize( + meta["scale_q"], meta["meta_scale"] + ) + return hQuant.dequantize(wq, meta) + + +def restore_weight(matrix, state_dict): + key = matrix + if key in state_dict: + m_dikt = state_dict[key] + if 'meta' in m_dikt: + meta_dict = m_dikt['meta'] + meta_scale_dict = meta_dict.get('meta_scale', None) + b1 = meta_dict['nbits'] + g1 = meta_dict['group_size'] + b2 = meta_scale_dict['nbits'] if meta_scale_dict else 8 + g2 = meta_scale_dict['group_size'] if meta_scale_dict else 128 + quant_config = { + 'b1': b1, + 'g1': g1, + 'b2': b2, + 'g2': g2, + } + wq = dequantize(m_dikt['W_q'], meta_dict) + return wq, quant_config + else: + return None, None + else: + return None, None + + +def save_compare_pair( + base_dir, quant_base_dir, quant_cfg, model_id, layers, output_dir): + file_path = f"{quant_base_dir}/{model_id}-{quant_cfg}-hqq/qmodel.pt" + state_dict = torch.load(file_path, map_location='cpu') + + tensors = {} + metadata = {} + # walk thru the linear layers + # for each layer + # for each linear module + # load the original weight + # load the quantized weight and dequantized + # save the two matrix into a combined safetensors + for layer in range(layers): + matricies = [ + f"model.layers.{layer}.mlp.down_proj", + f"model.layers.{layer}.mlp.gate_proj", + f"model.layers.{layer}.mlp.up_proj", + f"model.layers.{layer}.self_attn.k_proj", + f"model.layers.{layer}.self_attn.o_proj", + f"model.layers.{layer}.self_attn.q_proj", + f"model.layers.{layer}.self_attn.v_proj", + ] + for matrix in matricies: + wq, quant_cfg = restore_weight(matrix, state_dict) + if wq is None: + # skip unquantized matrix + continue + wo = load_weight(matrix, base_dir) + tensors[f"{matrix}.weight"] = wo + tensors[f"{matrix}.qweight"] = wq + metadata[f"{matrix}.quant_cfg.b1"] = str(quant_cfg["b1"]) + metadata[f"{matrix}.quant_cfg.b2"] = str(quant_cfg["b2"]) + metadata[f"{matrix}.quant_cfg.g1"] = str(quant_cfg["g1"]) + metadata[f"{matrix}.quant_cfg.g2"] = str(quant_cfg["g2"]) + + output_fp = f"{output_dir}/{model_id}-cmp.safetensors" + safe_save(tensors, output_fp, metadata=metadata) + + +if __name__ == "__main__": + + # Llama-2-7b-hf-b3g128-hqq: + # Llama-2-7b-hf-b3g32-hqq: + # Llama-2-7b-hf-b3g64-hqq: + # Llama-2-7b-hf-b4g128-hqq: + # Llama-2-7b-hf-b4g32-hqq: + # Llama-2-7b-hf-b4g64-hqq: + + quant_cfg = "b4g64" + quant_base_dir = '/data/gqq-eval' + output_dir = f'{home_dir}/work/hqq/examples/llama2_benchmark/snapshots/cmp' + model_id = "meta-llama/Llama-2-7b-hf" + model = models[model_id] + save_compare_pair( + model["base_dir"], + quant_base_dir, + quant_cfg, + model_id.split('/')[1], + model["layers"], + output_dir + ) diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/compare.py b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/compare.py new file mode 100644 index 0000000000000000000000000000000000000000..0e1f79cde836153a798aa0c40cc6b5f077e60a71 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/compare.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 + +import os +import torch +from scipy.stats import kurtosis + +from safetensors import safe_open + +home_dir = os.environ.get("HOME", "/home/justin") +models = { + "meta-llama/Llama-2-7b-hf": { + 'layers': 32, + 'base_dir': f"{home_dir}/.cache/huggingface/hub/models--meta-llama--Llama-2-7b-hf/snapshots/01c7f73d771dfac7d292323805ebc428287df4f9/", + }, + "meta-llama/Llama-2-13b-hf": { + 'layers': 40, + 'base_dir': f"{home_dir}/.cache/huggingface/hub/models--meta-llama--Llama-2-13b-hf/snapshots/5c31dfb671ce7cfe2d7bb7c04375e44c55e815b1/", + }, + "meta-llama/Meta-Llama-3-8B": { + 'layers': 32, + 'base_dir': f"{home_dir}/.cache/huggingface/hub/models--meta-llama--Meta-Llama-3-8B/snapshots/1460c22666392e470910ce3d44ffeb2ab7dbd4df/", + } +} + + +def load_weight(prefix, base_dir, st_file): + o = f"{prefix}.weight" + q = f"{prefix}.qweight" + + try: + mp = os.path.join(base_dir, st_file) + with safe_open(mp, framework="pt", device="cpu") as f: + return f.get_tensor(o), f.get_tensor(q) + except Exception: + raise ValueError(f"Invalid key {o}") + + +def compare_pair(model_id, layers, output_dir): + + st_file = f"{output_dir}/{model_id}-cmp.safetensors" + for layer in range(layers): + matricies = [ + f"model.layers.{layer}.mlp.down_proj", + f"model.layers.{layer}.mlp.gate_proj", + f"model.layers.{layer}.mlp.up_proj", + f"model.layers.{layer}.self_attn.k_proj", + f"model.layers.{layer}.self_attn.o_proj", + f"model.layers.{layer}.self_attn.q_proj", + f"model.layers.{layer}.self_attn.v_proj", + ] + for matrix in matricies: + wo, wq = load_weight(matrix, output_dir, st_file) + diff = torch.norm(wo - wq).item() + kurt_peason = kurtosis( + wo.numpy(), + axis=None, + fisher=False, + bias=True, + nan_policy='omit' + ) + kurt_fisher = kurtosis( + wo.numpy(), + axis=None, + fisher=True, + bias=True, + nan_policy='omit' + ) + #print(f"{matrix} FNorm Diff: {diff:.5f} Kurtosis: {kurt:.2f}") + print(f"{matrix},{diff:.5f},{kurt_fisher:.3f},{kurt_peason:.3f}") + + +if __name__ == "__main__": + output_dir = f'{home_dir}/work/hqq/examples/llama2_benchmark/snapshots/cmp' + model_id = "meta-llama/Llama-2-7b-hf" + model = models[model_id] + compare_pair( + model_id.split('/')[1], + model["layers"], + output_dir + ) diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/debug-bench.sh b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/debug-bench.sh new file mode 100644 index 0000000000000000000000000000000000000000..1ac5a69757fc3c2b6af1530180d1e8c391fa025a --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/debug-bench.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python -m pdb bench.py diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/extract-quant-config.py b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/extract-quant-config.py new file mode 100644 index 0000000000000000000000000000000000000000..1f981b8b1b72d0da05836a9755538d8d26d5ec4a --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/extract-quant-config.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + + +import torch +import pandas as pd + + +def is_linear_module(key): + self_attns = ['q_proj', 'v_proj', 'k_proj', 'o_proj'] + mlps = ['gate_proj', 'up_proj', 'down_proj'] + modules = self_attns + mlps + for module in modules: + if module in key: + return True + return False + +def extract_quant_config(base_dir, model_id, config): + file_path = f"{base_dir}/{model_id}-{config}-hqq/qmodel.pt" + dikt = torch.load(file_path, map_location='cpu') + quant_configs = {} + mem_fp16_all_total = 0 + mem_all_total = 0 + mem_quant_total = 0 + # search quantized linear module with meta + for key in dikt.keys(): + m_dikt = dikt[key] + if is_linear_module(key): + if 'meta' in m_dikt: + meta_dict = m_dikt['meta'] + meta_scale_dict = meta_dict.get('meta_scale', None) + shape = meta_dict['shape'] + b1 = meta_dict['nbits'] + g1 = meta_dict['group_size'] + b2 = meta_scale_dict['nbits'] if meta_scale_dict else 8 + g2 = meta_scale_dict['group_size'] if meta_scale_dict else 128 + memmb = (b1+2*b2/(g1*g2))*shape[0]*shape[1]/8/1024/1024 + mem_fp16_all_total += shape[0]*shape[1]*2/1024/1024 + mem_quant_total += memmb + mem_all_total += memmb + quant_configs[key] = { + 'b1': b1, + 'g1': g1, + 'b2': b2, + 'g2': g2, + 'memmb': memmb, + } + else: + w = m_dikt['weight'] + mem_all_total += w.numel()*2/1024/1024 + mem_fp16_all_total += w.numel()*2/1024/1024 + return quant_configs, mem_quant_total, mem_all_total, mem_fp16_all_total + + +def get_mem_usage_df(model_ids, confs, base_dir): + dikts = [] + for model_id in model_ids: + for conf in confs: + configs, mem_quant_total, mem_all_total, mem_fp16_all_total = extract_quant_config(base_dir, model_id, conf) + dikt = { + 'model': model_id.split('/')[1], + 'config': conf, + 'mem_quant_total': mem_quant_total, + 'mem_all_total': mem_all_total, + 'mem_fp16_all_total': mem_fp16_all_total, + } + dikts.append(dikt) + df = pd.DataFrame(dikts) + return df + +def main(): + base_dir='/home/justin/work/hqq/examples/llama2_benchmark/snapshots/' + model_ids=[ + "meta-llama/Llama-2-7b-hf", + "meta-llama/Llama-2-13b-hf", + # "meta-llama/Meta-Llama-3-8B", + ] + confs = [ + #"b4g32", + #"b4g64", + #"b4g128", + #"b3g32", + #"b3g64", + #"b3g128", + "mix-3_74", + "mix-3_52", + "mix-2_74", + "mix-2_50", + ] + df = get_mem_usage_df(model_ids, confs, base_dir) + +if __name__ == "__main__": + main() diff --git a/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/quant_llama2_hqq_demo.py b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/quant_llama2_hqq_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..e21bd940ec92ba46eb17ab414937c4ca3120b48e --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/examples/llama2_benchmark/quant_llama2_hqq_demo.py @@ -0,0 +1,40 @@ +#Settings +###################################################################################### +hf_auth = None #HuggingFace token +cache_path = '' #cache directory to store data + +#Chose a model +# model_id = "meta-llama/Meta-Llama-3-8B" +model_id = "meta-llama/Llama-2-7b-hf" +# model_id = "meta-llama/Llama-2-13b-hf" +#model_id = "meta-llama/Llama-2-70b-hf" + +#Load model on the CPU +###################################################################################### +from hqq.engine.hf import HQQModelForCausalLM, AutoTokenizer +model = HQQModelForCausalLM.from_pretrained(model_id, use_auth_token=hf_auth) +tokenizer = AutoTokenizer.from_pretrained(model_id, use_auth_token=hf_auth) + +#Quantize the model +###################################################################################### +from hqq.core.quantize import * +import time + +#quant_config = BaseQuantizeConfig(nbits=8, group_size=128) +#quant_config = BaseQuantizeConfig(nbits=4, group_size=64) +quant_config = BaseQuantizeConfig(nbits=4, group_size=64) +#quant_config = BaseQuantizeConfig(nbits=2, group_size=16) +#quant_config = BaseQuantizeConfig(nbits=2, group_size=16, quant_scale=True) #scale is quantized to 8-bit/g=128 + +t1 = time.time() +model.quantize_model(quant_config=quant_config) +t2 = time.time() +print('Took ' + str(t2-t1) + ' seconds to quantize the model with HQQ') + +#Evaluate the quantized model +###################################################################################### +from eval_model import eval_wikitext2, eval_c4, eval_ptb +eval_wikitext2(model, tokenizer, verbose=True) +# eval_c4(model, tokenizer, verbose=True) +# eval_ptb(model, tokenizer, verbose=True) + diff --git a/lm-quant-toolkit/.deps/hqq/hqq/models/open_clip/base.py b/lm-quant-toolkit/.deps/hqq/hqq/models/open_clip/base.py new file mode 100644 index 0000000000000000000000000000000000000000..99c772be91f1c33bcd6dbf0a3cc20f4f01c03fdb --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/hqq/models/open_clip/base.py @@ -0,0 +1,135 @@ +import json +import os +from typing import Union + +import torch +from open_clip import create_model as oc_create_model +from torch import float16 + +from ...core.quantize import HQQLinear +from ...utils.optimizer import find_optimal_configs +from ..base import BaseHQQModel + + +class BaseHQQOpenCLIPModel(BaseHQQModel): + @classmethod + def create_model(cls, save_dir, **kwargs): + # check if the first positional argument is an directory that exists + if os.path.exists(save_dir): + # load CLIP model name from config.json + with open(BaseHQQModel.get_config_file(save_dir), "r") as file: + config = json.load(file) + model_name = config["architecture"] + pretrained = None + else: + model_name = kwargs.pop("model_name") + pretrained = kwargs.pop("pretrained") + device = kwargs.pop("device", "cpu") + + model = oc_create_model( + model_name, + pretrained, + device=device, + **kwargs, + ) + model.arch_key = model_name + return model + + @classmethod + def cache_model(cls, model, save_dir): + # save CLIP model name into config.json + with open(BaseHQQModel.get_config_file(save_dir), "w") as file: + config = {"architecture": model.arch_key} + json.dump(config, file, indent=2) + + # Main function to quantize a model. Basically goes through the linear + # layers specfied in the patching function and replaces them with HQQLinear + @classmethod + def quantize_model( + cls, + model, + quant_config: dict, + compute_dtype: torch.dtype = float16, + device: Union[str, list, dict] = "cuda", + ): + # Check if the model was already quantized + if getattr(model, "hqq_quantized", False): + print("Model was already quantized") + return + + # Set linear tags automatically + cls.setup_model(model) + + if "budget" in quant_config: + budget = quant_config.pop("budget") + if "mixed" in quant_config: + mixed = quant_config.pop("mixed") + if mixed: + metrics_file = quant_config.pop("quant_metrics_file") + weight_algo = quant_config.pop("weight_algo", None) + boost_layers = quant_config.pop("boost_layers", None) + decline_layers = quant_config.pop("decline_layers", None) + boost_stop = quant_config.pop("boost_stop", None) + decline_stop = quant_config.pop("decline_stop", None) + top_m_layer = quant_config.pop("top_m_layer", None) + ablation = quant_config.pop("ablation", None) + factor = quant_config.pop("factor", None) + kwargs = { + "weight_algo": weight_algo, + "boost_layers": boost_layers, + "decline_layers": decline_layers, + "boost_stop": boost_stop, + "decline_stop": decline_stop, + "top_m_layer": top_m_layer, + "ablation": ablation, + "factor": factor, + } + optimal_configs, _ = find_optimal_configs( + metrics_file, budget, time_limit=200, verbose=True, **kwargs + ) + model.optimal_configs = optimal_configs + + # Use the same quantization config for all linear layers. + # Use None to skip quantizing a specfic layer. + if True in [(key in model.linear_tags) for key in quant_config.keys()]: + # If the user doesn't specify a key from get_linear_tags, + # the layer is not quantized via (key, None) + patch_params = {key: None for key in model.linear_tags} + patch_params.update(quant_config) + else: + # Same quant_config for all layers + patch_params = {k: quant_config for k in model.linear_tags} + + # We replace the nn.Linear layers with HQQLinear + def _patch_linear(linear_layer, quant_config): + if type(linear_layer) is HQQLinear: + return linear_layer + + current_device = "cuda" + + if quant_config is not None: + out_module = HQQLinear( + linear_layer, + quant_config, + compute_dtype=compute_dtype, + device=current_device, + ) + else: + out_module = linear_layer.to(device=current_device, dtype=compute_dtype) + + out_module.device = current_device + return out_module + + def _patch_other(layer): + current_device = "cuda" + layer.device = current_device + return layer.to(device=current_device, dtype=compute_dtype) + + cls.patch_model(model, _patch_other, _patch_linear, patch_params) + + # Set base class + model.base_class = cls + + model.hqq_quantized = True + + return model diff --git a/lm-quant-toolkit/.deps/hqq/setup.py b/lm-quant-toolkit/.deps/hqq/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..f9b959761bc3f69d4a2f1619b31a3573803bd457 --- /dev/null +++ b/lm-quant-toolkit/.deps/hqq/setup.py @@ -0,0 +1,72 @@ +# Written by Dr. Hicham Badri @Mobius Labs GmbH - 2023 +##################################################### + +from setuptools import setup, find_packages +from setuptools.command.install import install +from setuptools.command.develop import develop +from setuptools.command.egg_info import egg_info +import os + + +def install_cuda_cmd() -> str: + cmd = "cd hqq/kernels; " + cmd += "python setup_cuda.py install; " + cmd += "cd ../..;" + return cmd + + +def run_setup_cuda(): + print("Running setup_cuda.py...") + try: + os.system(install_cuda_cmd()) + except Exception as e: + print("Error while running setup_cuda.py:", e) + + +class InstallCommand(install): + def run(self): + install.run(self) + run_setup_cuda() + + +class DevelopCommand(develop): + def run(self): + develop.run(self) + run_setup_cuda() + + +class EgginfoCommand(egg_info): + def run(self): + egg_info.run(self) + run_setup_cuda() + + +setup( + name="hqq", + version="0.1.7.post2", + description="Half-Quadratic Quantization (HQQ)", + url="https://github.com/mobiusml/hqq/", + author="Dr. Hicham Badri", + author_email="hicham@mobiuslabs.com", + license="Apache 2", + packages=find_packages(include=["hqq", "hqq.*"]), + package_data={ + "hqq": ["kernels/*.cpp", "kernels/*.cu"], + }, + include_package_data=True, + cmdclass={ + "install": InstallCommand, + "develop": DevelopCommand, + "egg_info": EgginfoCommand, + }, + install_requires=[ + "numpy>=1.24.4", + "tqdm>=4.64.1", + "einops", + "accelerate", + "transformers>=4.36.1", + "huggingface_hub", + "termcolor", + #"timm", + ], +) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/.github/workflows/publish.yml b/lm-quant-toolkit/.deps/lm-evaluation-harness/.github/workflows/publish.yml new file mode 100644 index 0000000000000000000000000000000000000000..8d0d386b1f8cb22cee5eae19499b1d03ac21d16c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/.github/workflows/publish.yml @@ -0,0 +1,78 @@ +name: Publish Python distribution to PyPI + +on: + push: + tags: + - '*' + +jobs: + build: + name: Build distribution + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Install pypa/build + run: >- + python3 -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: python3 -m build + - name: Store the distribution packages + uses: actions/upload-artifact@v4 + with: + name: python-package-distributions + path: dist/ + + publish-to-pypi: + name: >- + Publish Python distribution to PyPI + if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes + needs: + - build + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/lm_eval + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + publish-to-testpypi: + name: Publish Python distribution to TestPyPI + needs: + - build + runs-on: ubuntu-latest + + environment: + name: testpypi + url: https://test.pypi.org/p/lm_eval + + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/.github/workflows/unit_tests.yml b/lm-quant-toolkit/.deps/lm-evaluation-harness/.github/workflows/unit_tests.yml new file mode 100644 index 0000000000000000000000000000000000000000..ed09225cb3cb10bac7496da598f428dc69261124 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/.github/workflows/unit_tests.yml @@ -0,0 +1,89 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python +# just comment out unwanted steps to turn off the test. +name: Unit Tests + +on: + push: + branches: + - 'main' + pull_request: + branches: + - 'main' + workflow_dispatch: +# Jobs run concurrently and steps run sequentially within a job. +# jobs: linter and cpu_tests. Add more jobs/steps as required. +jobs: + linter: + name: Linters + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Set up Python 3.8 + uses: actions/setup-python@v5 + with: + python-version: 3.8 + cache: pip + cache-dependency-path: pyproject.toml + - name: Pre-Commit + env: + SKIP: "no-commit-to-branch,mypy" + + uses: pre-commit/action@v3.0.1 +# # mypy turned off for now +# - name: Lint with mypy +# run: mypy . --ignore-missing-imports --check-untyped-defs --explicit-package-bases --warn-unreachable +# Job 2 + testcpu: + name: CPU Tests + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ "3.8", "3.9", "3.10", "3.11" ] + timeout-minutes: 30 + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: pip + cache-dependency-path: pyproject.toml + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -e '.[dev,sentencepiece,api]' --extra-index-url https://download.pytorch.org/whl/cpu +# Install optional git dependencies +# pip install bleurt@https://github.com/google-research/bleurt/archive/b610120347ef22b494b6d69b4316e303f5932516.zip#egg=bleurt +# if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Test with pytest + run: python -m pytest --showlocals -s -vv -n=auto --ignore=tests/models/test_neuralmagic.py --ignore=tests/models/test_openvino.py + - name: Archive artifacts + uses: actions/upload-artifact@v4 + with: + name: output_testcpu${{ matrix.python-version }} + path: | + test_logs/* + testmodels: + name: External LM Tests + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout Code + uses: actions/checkout@v4 + - name: Set up Python 3.8 + uses: actions/setup-python@v5 + with: + python-version: 3.8 + cache: pip + cache-dependency-path: pyproject.toml + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -e '.[dev,optimum,deepsparse,sparseml,api]' --extra-index-url https://download.pytorch.org/whl/cpu + - name: Test with pytest + run: python -m pytest tests/models --showlocals -s -vv diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/.pre-commit-config.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..edeef333a5cba74d4fe20d5a74ce6cf82963802f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/.pre-commit-config.yaml @@ -0,0 +1,54 @@ +# Ignore test linting to avoid conflicting changes to version stability. +exclude: ^tests/testdata/ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-added-large-files + - id: check-ast + - id: check-byte-order-marker + - id: check-case-conflict + - id: check-json + - id: check-merge-conflict + args: [--assume-in-merge] + - id: check-symlinks + - id: check-yaml + args: ["--unsafe"] + - id: destroyed-symlinks + - id: detect-private-key + - id: end-of-file-fixer + - id: no-commit-to-branch + always_run: false + - id: requirements-txt-fixer + - id: trailing-whitespace + args: [--markdown-linebreak-ext=md] + - id: fix-byte-order-marker + exclude: docs/CNAME + - id: fix-encoding-pragma + args: [--remove] + - id: mixed-line-ending + args: [--fix=lf] + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.7.4 + hooks: + # Run the linter. + - id: ruff + args: + - --fix + # Run the formatter. + - id: ruff-format + - repo: https://github.com/codespell-project/codespell + rev: v2.3.0 + hooks: + - id: codespell + exclude: > + (?x)^( + .*\.json|ignore.txt|lm_eval/tasks/.*|.*yaml|.*\.ipynb + )$ + args: [--check-filenames, --check-hidden, --ignore-words=ignore.txt] +# - repo: https://github.com/pre-commit/mirrors-mypy +# rev: v1.5.1 +# hooks: +# - id: mypy +# additional_dependencies: [".[sentencepiece,multilingual,promptsource,gptq]", "types-PyYAML", "types-requests"] +# exclude: ^tests/.*$ diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/CITATION.bib b/lm-quant-toolkit/.deps/lm-evaluation-harness/CITATION.bib new file mode 100644 index 0000000000000000000000000000000000000000..4ec33f139693aad74d2cb89c5edb2a578a315dd2 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/CITATION.bib @@ -0,0 +1,10 @@ +@misc{eval-harness, + author = {Gao, Leo and Tow, Jonathan and Abbasi, Baber and Biderman, Stella and Black, Sid and DiPofi, Anthony and Foster, Charles and Golding, Laurence and Hsu, Jeffrey and Le Noac'h, Alain and Li, Haonan and McDonell, Kyle and Muennighoff, Niklas and Ociepa, Chris and Phang, Jason and Reynolds, Laria and Schoelkopf, Hailey and Skowron, Aviya and Sutawika, Lintang and Tang, Eric and Thite, Anish and Wang, Ben and Wang, Kevin and Zou, Andy}, + title = {A framework for few-shot language model evaluation}, + month = 12, + year = 2023, + publisher = {Zenodo}, + version = {v0.4.0}, + doi = {10.5281/zenodo.10256836}, + url = {https://zenodo.org/records/10256836} +} diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/LICENSE.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/LICENSE.md new file mode 100644 index 0000000000000000000000000000000000000000..12e6063183935e876e232db276568baf4954b492 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 EleutherAI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/README.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c453de30c2906340606d897c5314e0068a3436b6 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/README.md @@ -0,0 +1,506 @@ +# Language Model Evaluation Harness + +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10256836.svg)](https://doi.org/10.5281/zenodo.10256836) + +--- + +*Latest News 📣* + +- [2024/09] We are prototyping allowing users of LM Evaluation Harness to create and evaluate on text+image multimodal input, text output tasks, and have just added the `hf-multimodal` and `vllm-vlm` model types and `mmmu` task as a prototype feature. We welcome users to try out this in-progress feature and stress-test it for themselves, and suggest they check out [`lmms-eval`](https://github.com/EvolvingLMMs-Lab/lmms-eval), a wonderful project originally forking off of the lm-evaluation-harness, for a broader range of multimodal tasks, models, and features. +- [2024/07] [API model](docs/API_guide.md) support has been updated and refactored, introducing support for batched and async requests, and making it significantly easier to customize and use for your own purposes. **To run Llama 405B, we recommend using VLLM's OpenAI-compliant API to host the model, and use the `local-completions` model type to evaluate the model.** +- [2024/07] New Open LLM Leaderboard tasks have been added ! You can find them under the [leaderboard](lm_eval/tasks/leaderboard/README.md) task group. + +--- + +## Announcement +**A new v0.4.0 release of lm-evaluation-harness is available** ! + +New updates and features include: + +- **New Open LLM Leaderboard tasks have been added ! You can find them under the [leaderboard](lm_eval/tasks/leaderboard/README.md) task group.** +- Internal refactoring +- Config-based task creation and configuration +- Easier import and sharing of externally-defined task config YAMLs +- Support for Jinja2 prompt design, easy modification of prompts + prompt imports from Promptsource +- More advanced configuration options, including output post-processing, answer extraction, and multiple LM generations per document, configurable fewshot settings, and more +- Speedups and new modeling libraries supported, including: faster data-parallel HF model usage, vLLM support, MPS support with HuggingFace, and more +- Logging and usability changes +- New tasks including CoT BIG-Bench-Hard, Belebele, user-defined task groupings, and more + +Please see our updated documentation pages in `docs/` for more details. + +Development will be continuing on the `main` branch, and we encourage you to give us feedback on what features are desired and how to improve the library further, or ask questions, either in issues or PRs on GitHub, or in the [EleutherAI discord](https://discord.gg/eleutherai)! + +--- + +## Overview + +This project provides a unified framework to test generative language models on a large number of different evaluation tasks. + +**Features:** +- Over 60 standard academic benchmarks for LLMs, with hundreds of subtasks and variants implemented. +- Support for models loaded via [transformers](https://github.com/huggingface/transformers/) (including quantization via [GPTQModel](https://github.com/ModelCloud/GPTQModel) and [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ)), [GPT-NeoX](https://github.com/EleutherAI/gpt-neox), and [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed/), with a flexible tokenization-agnostic interface. +- Support for fast and memory-efficient inference with [vLLM](https://github.com/vllm-project/vllm). +- Support for commercial APIs including [OpenAI](https://openai.com), and [TextSynth](https://textsynth.com/). +- Support for evaluation on adapters (e.g. LoRA) supported in [HuggingFace's PEFT library](https://github.com/huggingface/peft). +- Support for local models and benchmarks. +- Evaluation with publicly available prompts ensures reproducibility and comparability between papers. +- Easy support for custom prompts and evaluation metrics. + +The Language Model Evaluation Harness is the backend for 🤗 Hugging Face's popular [Open LLM Leaderboard](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard), has been used in [hundreds of papers](https://scholar.google.com/scholar?oi=bibs&hl=en&authuser=2&cites=15052937328817631261,4097184744846514103,1520777361382155671,17476825572045927382,18443729326628441434,14801318227356878622,7890865700763267262,12854182577605049984,15641002901115500560,5104500764547628290), and is used internally by dozens of organizations including NVIDIA, Cohere, BigScience, BigCode, Nous Research, and Mosaic ML. + +## Install + +To install the `lm-eval` package from the github repository, run: + +```bash +git clone --depth 1 https://github.com/EleutherAI/lm-evaluation-harness +cd lm-evaluation-harness +pip install -e . +``` + +We also provide a number of optional dependencies for extended functionality. A detailed table is available at the end of this document. + +## Basic Usage +### User Guide + +A user guide detailing the full list of supported arguments is provided [here](./docs/interface.md), and on the terminal by calling `lm_eval -h`. Alternatively, you can use `lm-eval` instead of `lm_eval`. + +A list of supported tasks (or groupings of tasks) can be viewed with `lm-eval --tasks list`. Task descriptions and links to corresponding subfolders are provided [here](./lm_eval/tasks/README.md). + +### Hugging Face `transformers` + +To evaluate a model hosted on the [HuggingFace Hub](https://huggingface.co/models) (e.g. GPT-J-6B) on `hellaswag` you can use the following command (this assumes you are using a CUDA-compatible GPU): + +```bash +lm_eval --model hf \ + --model_args pretrained=EleutherAI/gpt-j-6B \ + --tasks hellaswag \ + --device cuda:0 \ + --batch_size 8 +``` + +Additional arguments can be provided to the model constructor using the `--model_args` flag. Most notably, this supports the common practice of using the `revisions` feature on the Hub to store partially trained checkpoints, or to specify the datatype for running a model: + +```bash +lm_eval --model hf \ + --model_args pretrained=EleutherAI/pythia-160m,revision=step100000,dtype="float" \ + --tasks lambada_openai,hellaswag \ + --device cuda:0 \ + --batch_size 8 +``` + +Models that are loaded via both `transformers.AutoModelForCausalLM` (autoregressive, decoder-only GPT style models) and `transformers.AutoModelForSeq2SeqLM` (such as encoder-decoder models like T5) in Huggingface are supported. + +Batch size selection can be automated by setting the ```--batch_size``` flag to ```auto```. This will perform automatic detection of the largest batch size that will fit on your device. On tasks where there is a large difference between the longest and shortest example, it can be helpful to periodically recompute the largest batch size, to gain a further speedup. To do this, append ```:N``` to above flag to automatically recompute the largest batch size ```N``` times. For example, to recompute the batch size 4 times, the command would be: + +```bash +lm_eval --model hf \ + --model_args pretrained=EleutherAI/pythia-160m,revision=step100000,dtype="float" \ + --tasks lambada_openai,hellaswag \ + --device cuda:0 \ + --batch_size auto:4 +``` + +> [!Note] +> Just like you can provide a local path to `transformers.AutoModel`, you can also provide a local path to `lm_eval` via `--model_args pretrained=/path/to/model` + +#### Multi-GPU Evaluation with Hugging Face `accelerate` + +We support three main ways of using Hugging Face's [accelerate 🚀](https://github.com/huggingface/accelerate) library for multi-GPU evaluation. + +To perform *data-parallel evaluation* (where each GPU loads a **separate full copy** of the model), we leverage the `accelerate` launcher as follows: + +``` +accelerate launch -m lm_eval --model hf \ + --tasks lambada_openai,arc_easy \ + --batch_size 16 +``` +(or via `accelerate launch --no-python lm_eval`). + +For cases where your model can fit on a single GPU, this allows you to evaluate on K GPUs K times faster than on one. + +**WARNING**: This setup does not work with FSDP model sharding, so in `accelerate config` FSDP must be disabled, or the NO_SHARD FSDP option must be used. + +The second way of using `accelerate` for multi-GPU evaluation is when your model is *too large to fit on a single GPU.* + +In this setting, run the library *outside the `accelerate` launcher*, but passing `parallelize=True` to `--model_args` as follows: + +``` +lm_eval --model hf \ + --tasks lambada_openai,arc_easy \ + --model_args parallelize=True \ + --batch_size 16 +``` + +This means that your model's weights will be split across all available GPUs. + +For more advanced users or even larger models, we allow for the following arguments when `parallelize=True` as well: +- `device_map_option`: How to split model weights across available GPUs. defaults to "auto". +- `max_memory_per_gpu`: the max GPU memory to use per GPU in loading the model. +- `max_cpu_memory`: the max amount of CPU memory to use when offloading the model weights to RAM. +- `offload_folder`: a folder where model weights will be offloaded to disk if needed. + +The third option is to use both at the same time. This will allow you to take advantage of both data parallelism and model sharding, and is especially useful for models that are too large to fit on a single GPU. + +``` +accelerate launch --multi_gpu --num_processes {nb_of_copies_of_your_model} \ + -m lm_eval --model hf \ + --tasks lambada_openai,arc_easy \ + --model_args parallelize=True \ + --batch_size 16 +``` + +To learn more about model parallelism and how to use it with the `accelerate` library, see the [accelerate documentation](https://huggingface.co/docs/transformers/v4.15.0/en/parallelism) + +**Warning: We do not natively support multi-node evaluation using the `hf` model type! Please reference [our GPT-NeoX library integration](https://github.com/EleutherAI/gpt-neox/blob/main/eval.py) for an example of code in which a custom multi-machine evaluation script is written.** + +**Note: we do not currently support multi-node evaluations natively, and advise using either an externally hosted server to run inference requests against, or creating a custom integration with your distributed framework [as is done for the GPT-NeoX library](https://github.com/EleutherAI/gpt-neox/blob/main/eval_tasks/eval_adapter.py).** + +### NVIDIA `nemo` models + +[NVIDIA NeMo Framework](https://github.com/NVIDIA/NeMo) is a generative AI framework built for researchers and pytorch developers working on language models. + +To evaluate a `nemo` model, start by installing NeMo following [the documentation](https://github.com/NVIDIA/NeMo?tab=readme-ov-file#installation). We highly recommended to use the NVIDIA PyTorch or NeMo container, especially if having issues installing Apex or any other dependencies (see [latest released containers](https://github.com/NVIDIA/NeMo/releases)). Please also install the lm evaluation harness library following the instructions in [the Install section](https://github.com/EleutherAI/lm-evaluation-harness/tree/main?tab=readme-ov-file#install). + +NeMo models can be obtained through [NVIDIA NGC Catalog](https://catalog.ngc.nvidia.com/models) or in [NVIDIA's Hugging Face page](https://huggingface.co/nvidia). In [NVIDIA NeMo Framework](https://github.com/NVIDIA/NeMo/tree/main/scripts/nlp_language_modeling) there are conversion scripts to convert the `hf` checkpoints of popular models like llama, falcon, mixtral or mpt to `nemo`. + +Run a `nemo` model on one GPU: +```bash +lm_eval --model nemo_lm \ + --model_args path= \ + --tasks hellaswag \ + --batch_size 32 +``` + +It is recommended to unpack the `nemo` model to avoid the unpacking inside the docker container - it may overflow disk space. For that you can run: + +``` +mkdir MY_MODEL +tar -xvf MY_MODEL.nemo -c MY_MODEL +``` + +#### Multi-GPU evaluation with NVIDIA `nemo` models + +By default, only one GPU is used. But we do support either data replication or tensor/pipeline parallelism during evaluation, on one node. + +1) To enable data replication, set the `model_args` of `devices` to the number of data replicas to run. For example, the command to run 8 data replicas over 8 GPUs is: +```bash +torchrun --nproc-per-node=8 --no-python lm_eval \ + --model nemo_lm \ + --model_args path=,devices=8 \ + --tasks hellaswag \ + --batch_size 32 +``` + +2) To enable tensor and/or pipeline parallelism, set the `model_args` of `tensor_model_parallel_size` and/or `pipeline_model_parallel_size`. In addition, you also have to set up `devices` to be equal to the product of `tensor_model_parallel_size` and/or `pipeline_model_parallel_size`. For example, the command to use one node of 4 GPUs with tensor parallelism of 2 and pipeline parallelism of 2 is: +```bash +torchrun --nproc-per-node=4 --no-python lm_eval \ + --model nemo_lm \ + --model_args path=,devices=4,tensor_model_parallel_size=2,pipeline_model_parallel_size=2 \ + --tasks hellaswag \ + --batch_size 32 +``` +Note that it is recommended to substitute the `python` command by `torchrun --nproc-per-node= --no-python` to facilitate loading the model into the GPUs. This is especially important for large checkpoints loaded into multiple GPUs. + +Not supported yet: multi-node evaluation and combinations of data replication with tensor or pipeline parallelism. + +### Tensor + Data Parallel and Optimized Inference with `vLLM` + +We also support vLLM for faster inference on [supported model types](https://docs.vllm.ai/en/latest/models/supported_models.html), especially faster when splitting a model across multiple GPUs. For single-GPU or multi-GPU — tensor parallel, data parallel, or a combination of both — inference, for example: + +```bash +lm_eval --model vllm \ + --model_args pretrained={model_name},tensor_parallel_size={GPUs_per_model},dtype=auto,gpu_memory_utilization=0.8,data_parallel_size={model_replicas} \ + --tasks lambada_openai \ + --batch_size auto +``` +To use vllm, do `pip install lm_eval[vllm]`. For a full list of supported vLLM configurations, please reference our [vLLM integration](https://github.com/EleutherAI/lm-evaluation-harness/blob/e74ec966556253fbe3d8ecba9de675c77c075bce/lm_eval/models/vllm_causallms.py) and the vLLM documentation. + +vLLM occasionally differs in output from Huggingface. We treat Huggingface as the reference implementation, and provide a [script](./scripts/model_comparator.py) for checking the validity of vllm results against HF. + +> [!Tip] +> For fastest performance, we recommend using `--batch_size auto` for vLLM whenever possible, to leverage its continuous batching functionality! + +> [!Tip] +> Passing `max_model_len=4096` or some other reasonable default to vLLM through model args may cause speedups or prevent out-of-memory errors when trying to use auto batch size, such as for Mistral-7B-v0.1 which defaults to a maximum length of 32k. + +### Model APIs and Inference Servers + +Our library also supports the evaluation of models served via several commercial APIs, and we hope to implement support for the most commonly used performant local/self-hosted inference servers. + +To call a hosted model, use: + +```bash +export OPENAI_API_KEY=YOUR_KEY_HERE +lm_eval --model openai-completions \ + --model_args model=davinci \ + --tasks lambada_openai,hellaswag +``` + +We also support using your own local inference server with servers that mirror the OpenAI Completions and ChatCompletions APIs. + +```bash +lm_eval --model local-completions --tasks gsm8k --model_args model=facebook/opt-125m,base_url=http://{yourip}:8000/v1/completions,num_concurrent=1,max_retries=3,tokenized_requests=False,batch_size=16 +``` +Note that for externally hosted models, configs such as `--device` which relate to where to place a local model should not be used and do not function. Just like you can use `--model_args` to pass arbitrary arguments to the model constructor for local models, you can use it to pass arbitrary arguments to the model API for hosted models. See the documentation of the hosting service for information on what arguments they support. + +| API or Inference Server | Implemented? | `--model ` name | Models supported: | Request Types: | +|---------------------------------------------------------------------------------------------------------------------------|---------------------------------|-----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| +| OpenAI Completions | :heavy_check_mark: | `openai-completions`, `local-completions` | All OpenAI Completions API models | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | +| OpenAI ChatCompletions | :heavy_check_mark: | `openai-chat-completions`, `local-chat-completions` | [All ChatCompletions API models](https://platform.openai.com/docs/guides/gpt) | `generate_until` (no logprobs) | +| Anthropic | :heavy_check_mark: | `anthropic` | [Supported Anthropic Engines](https://docs.anthropic.com/claude/reference/selecting-a-model) | `generate_until` (no logprobs) | +| Anthropic Chat | :heavy_check_mark: | `anthropic-chat`, `anthropic-chat-completions` | [Supported Anthropic Engines](https://docs.anthropic.com/claude/docs/models-overview) | `generate_until` (no logprobs) | +| Textsynth | :heavy_check_mark: | `textsynth` | [All supported engines](https://textsynth.com/documentation.html#engines) | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | +| Cohere | [:hourglass: - blocked on Cohere API bug](https://github.com/EleutherAI/lm-evaluation-harness/pull/395) | N/A | [All `cohere.generate()` engines](https://docs.cohere.com/docs/models) | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | +| [Llama.cpp](https://github.com/ggerganov/llama.cpp) (via [llama-cpp-python](https://github.com/abetlen/llama-cpp-python)) | :heavy_check_mark: | `gguf`, `ggml` | [All models supported by llama.cpp](https://github.com/ggerganov/llama.cpp) | `generate_until`, `loglikelihood`, (perplexity evaluation not yet implemented) | +| vLLM | :heavy_check_mark: | `vllm` | [Most HF Causal Language Models](https://docs.vllm.ai/en/latest/models/supported_models.html) | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | +| Mamba | :heavy_check_mark: | `mamba_ssm` | [Mamba architecture Language Models via the `mamba_ssm` package](https://huggingface.co/state-spaces) | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | +| Huggingface Optimum (Causal LMs) | ✔️ | `openvino` | Any decoder-only AutoModelForCausalLM converted with Huggingface Optimum into OpenVINO™ Intermediate Representation (IR) format | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | ... | +| Neuron via AWS Inf2 (Causal LMs) | ✔️ | `neuronx` | Any decoder-only AutoModelForCausalLM supported to run on [huggingface-ami image for inferentia2](https://aws.amazon.com/marketplace/pp/prodview-gr3e6yiscria2) | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | ... | +| [Neural Magic DeepSparse](https://github.com/neuralmagic/deepsparse) | ✔️ | `deepsparse` | Any LM from [SparseZoo](https://sparsezoo.neuralmagic.com/) or on [HF Hub with the "deepsparse" tag](https://huggingface.co/models?other=deepsparse) | `generate_until`, `loglikelihood` | ... | +| [Neural Magic SparseML](https://github.com/neuralmagic/sparseml) | ✔️ | `sparseml` | Any decoder-only AutoModelForCausalLM from [SparseZoo](https://sparsezoo.neuralmagic.com/) or on [HF Hub](https://huggingface.co/neuralmagic). Especially useful for models with quantization like [`zoo:llama2-7b-gsm8k_llama2_pretrain-pruned60_quantized`](https://sparsezoo.neuralmagic.com/models/llama2-7b-gsm8k_llama2_pretrain-pruned60_quantized) | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | ... | +| Your local inference server! | :heavy_check_mark: | `local-completions` or `local-chat-completions` | Support for OpenAI API-compatible servers, with easy customization for other APIs. | `generate_until`, `loglikelihood`, `loglikelihood_rolling` | | ... | + +Models which do not supply logits or logprobs can be used with tasks of type `generate_until` only, while local models, or APIs that supply logprobs/logits of their prompts, can be run on all task types: `generate_until`, `loglikelihood`, `loglikelihood_rolling`, and `multiple_choice`. + +For more information on the different task `output_types` and model request types, see [our documentation](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/docs/model_guide.md#interface). + +> [!Note] +> For best performance with closed chat model APIs such as Anthropic Claude 3 and GPT-4, we recommend carefully looking at a few sample outputs using `--limit 10` first to confirm answer extraction and scoring on generative tasks is performing as expected. providing `system=""` within `--model_args` for anthropic-chat-completions, to instruct the model what format to respond in, may be useful. + + +### Other Frameworks + +A number of other libraries contain scripts for calling the eval harness through their library. These include [GPT-NeoX](https://github.com/EleutherAI/gpt-neox/blob/main/eval_tasks/eval_adapter.py), [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed/blob/main/examples/MoE/readme_evalharness.md), and [mesh-transformer-jax](https://github.com/kingoflolz/mesh-transformer-jax/blob/master/eval_harness.py). + +To create your own custom integration you can follow instructions from [this tutorial](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/docs/interface.md#external-library-usage). + +### Additional Features +> [!Note] +> For tasks unsuitable for direct evaluation — either due risks associated with executing untrusted code or complexities in the evaluation process — the `--predict_only` flag is available to obtain decoded generations for post-hoc evaluation. + +If you have a Metal compatible Mac, you can run the eval harness using the MPS back-end by replacing `--device cuda:0` with `--device mps` (requires PyTorch version 2.1 or higher). **Note that the PyTorch MPS backend is still in early stages of development, so correctness issues or unsupported operations may exist. If you observe oddities in model performance on the MPS back-end, we recommend first checking that a forward pass of your model on `--device cpu` and `--device mps` match.** + +> [!Note] +> You can inspect what the LM inputs look like by running the following command: +> ```bash +> python write_out.py \ +> --tasks \ +> --num_fewshot 5 \ +> --num_examples 10 \ +> --output_base_path /path/to/output/folder +> ``` +> This will write out one text file for each task. + +To verify the data integrity of the tasks you're performing in addition to running the tasks themselves, you can use the `--check_integrity` flag: + +```bash +lm_eval --model openai \ + --model_args engine=davinci \ + --tasks lambada_openai,hellaswag \ + --check_integrity +``` + +## Advanced Usage Tips + +For models loaded with the HuggingFace `transformers` library, any arguments provided via `--model_args` get passed to the relevant constructor directly. This means that anything you can do with `AutoModel` can be done with our library. For example, you can pass a local path via `pretrained=` or use models finetuned with [PEFT](https://github.com/huggingface/peft) by taking the call you would run to evaluate the base model and add `,peft=PATH` to the `model_args` argument: +```bash +lm_eval --model hf \ + --model_args pretrained=EleutherAI/gpt-j-6b,parallelize=True,load_in_4bit=True,peft=nomic-ai/gpt4all-j-lora \ + --tasks openbookqa,arc_easy,winogrande,hellaswag,arc_challenge,piqa,boolq \ + --device cuda:0 +``` + +Models provided as delta weights can be easily loaded using the Hugging Face transformers library. Within --model_args, set the delta argument to specify the delta weights, and use the pretrained argument to designate the relative base model to which they will be applied: +```bash +lm_eval --model hf \ + --model_args pretrained=Ejafa/llama_7B,delta=lmsys/vicuna-7b-delta-v1.1 \ + --tasks hellaswag +``` + +GPTQ quantized models can be loaded using [GPTQModel](https://github.com/ModelCloud/GPTQModel) (faster) or [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ) + +GPTQModel: add `,gptqmodel=True` to `model_args` +```bash +lm_eval --model hf \ + --model_args pretrained=model-name-or-path,gptqmodel=True \ + --tasks hellaswag +``` + +AutoGPTQ: add `,autogptq=True` to `model_args`: +```bash +lm_eval --model hf \ + --model_args pretrained=model-name-or-path,autogptq=model.safetensors,gptq_use_triton=True \ + --tasks hellaswag +``` + +We support wildcards in task names, for example you can run all of the machine-translated lambada tasks via `--task lambada_openai_mt_*`. + +## Saving Results + +To save evaluation results provide an `--output_path`. We also support logging model responses with the `--log_samples` flag for post-hoc analysis. + +Additionally, one can provide a directory with `--use_cache` to cache the results of prior runs. This allows you to avoid repeated execution of the same (model, task) pairs for re-scoring. + +To push results and samples to the Hugging Face Hub, first ensure an access token with write access is set in the `HF_TOKEN` environment variable. Then, use the `--hf_hub_log_args` flag to specify the organization, repository name, repository visibility, and whether to push results and samples to the Hub - [example dataset on the HF Hub](https://huggingface.co/datasets/KonradSzafer/lm-eval-results-demo). For instance: + +```bash +lm_eval --model hf \ + --model_args pretrained=model-name-or-path,autogptq=model.safetensors,gptq_use_triton=True \ + --tasks hellaswag \ + --log_samples \ + --output_path results \ + --hf_hub_log_args hub_results_org=EleutherAI,hub_repo_name=lm-eval-results,push_results_to_hub=True,push_samples_to_hub=True,public_repo=False \ +``` + +This allows you to easily download the results and samples from the Hub, using: +```python +from datasets import load_dataset + +load_dataset("EleutherAI/lm-eval-results-private", "hellaswag", "latest") +``` + +For a full list of supported arguments, check out the [interface](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/docs/interface.md) guide in our documentation! + +## Visualizing Results + +You can seamlessly visualize and analyze the results of your evaluation harness runs using both Weights & Biases (W&B) and Zeno. + +### Zeno + +You can use [Zeno](https://zenoml.com) to visualize the results of your eval harness runs. + +First, head to [hub.zenoml.com](https://hub.zenoml.com) to create an account and get an API key [on your account page](https://hub.zenoml.com/account). +Add this key as an environment variable: + +```bash +export ZENO_API_KEY=[your api key] +``` + +You'll also need to install the `lm_eval[zeno]` package extra. + +To visualize the results, run the eval harness with the `log_samples` and `output_path` flags. +We expect `output_path` to contain multiple folders that represent individual model names. +You can thus run your evaluation on any number of tasks and models and upload all of the results as projects on Zeno. + +```bash +lm_eval \ + --model hf \ + --model_args pretrained=EleutherAI/gpt-j-6B \ + --tasks hellaswag \ + --device cuda:0 \ + --batch_size 8 \ + --log_samples \ + --output_path output/gpt-j-6B +``` + +Then, you can upload the resulting data using the `zeno_visualize` script: + +```bash +python scripts/zeno_visualize.py \ + --data_path output \ + --project_name "Eleuther Project" +``` + +This will use all subfolders in `data_path` as different models and upload all tasks within these model folders to Zeno. +If you run the eval harness on multiple tasks, the `project_name` will be used as a prefix and one project will be created per task. + +You can find an example of this workflow in [examples/visualize-zeno.ipynb](examples/visualize-zeno.ipynb). + +### Weights and Biases + +With the [Weights and Biases](https://wandb.ai/site) integration, you can now spend more time extracting deeper insights into your evaluation results. The integration is designed to streamline the process of logging and visualizing experiment results using the Weights & Biases (W&B) platform. + +The integration provide functionalities + +- to automatically log the evaluation results, +- log the samples as W&B Tables for easy visualization, +- log the `results.json` file as an artifact for version control, +- log the `_eval_samples.json` file if the samples are logged, +- generate a comprehensive report for analysis and visualization with all the important metric, +- log task and cli specific configs, +- and more out of the box like the command used to run the evaluation, GPU/CPU counts, timestamp, etc. + +First you'll need to install the lm_eval[wandb] package extra. Do `pip install lm_eval[wandb]`. + +Authenticate your machine with an your unique W&B token. Visit https://wandb.ai/authorize to get one. Do `wandb login` in your command line terminal. + +Run eval harness as usual with a `wandb_args` flag. Use this flag to provide arguments for initializing a wandb run ([wandb.init](https://docs.wandb.ai/ref/python/init)) as comma separated string arguments. + +```bash +lm_eval \ + --model hf \ + --model_args pretrained=microsoft/phi-2,trust_remote_code=True \ + --tasks hellaswag,mmlu_abstract_algebra \ + --device cuda:0 \ + --batch_size 8 \ + --output_path output/phi-2 \ + --limit 10 \ + --wandb_args project=lm-eval-harness-integration \ + --log_samples +``` + +In the stdout, you will find the link to the W&B run page as well as link to the generated report. You can find an example of this workflow in [examples/visualize-wandb.ipynb](examples/visualize-wandb.ipynb), and an example of how to integrate it beyond the CLI. + +## How to Contribute or Learn More? + +For more information on the library and how everything fits together, check out all of our [documentation pages](https://github.com/EleutherAI/lm-evaluation-harness/tree/main/docs)! We plan to post a larger roadmap of desired + planned library improvements soon, with more information on how contributors can help. + +### Implementing new tasks + +To implement a new task in the eval harness, see [this guide](./docs/new_task_guide.md). + +In general, we follow this priority list for addressing concerns about prompting and other eval details: +1. If there is widespread agreement among people who train LLMs, use the agreed upon procedure. +2. If there is a clear and unambiguous official implementation, use that procedure. +3. If there is widespread agreement among people who evaluate LLMs, use the agreed upon procedure. +4. If there are multiple common implementations but not universal or widespread agreement, use our preferred option among the common implementations. As before, prioritize choosing from among the implementations found in LLM training papers. + +These are guidelines and not rules, and can be overruled in special circumstances. + +We try to prioritize agreement with the procedures used by other groups to decrease the harm when people inevitably compare runs across different papers despite our discouragement of the practice. Historically, we also prioritized the implementation from [Language Models are Few Shot Learners](https://arxiv.org/abs/2005.14165) as our original goal was specifically to compare results with that paper. + +### Support + +The best way to get support is to open an issue on this repo or join the [EleutherAI Discord server](https://discord.gg/eleutherai). The `#lm-thunderdome` channel is dedicated to developing this project and the `#release-discussion` channel is for receiving support for our releases. If you've used the library and have had a positive (or negative) experience, we'd love to hear from you! + +## Optional Extras +Extras dependencies can be installed via `pip install -e ".[NAME]"` + +| Name | Use | +|-----------------|----------------------------------------------| +| api | For using api models (Anthropic, OpenAI API) | +| deepsparse | For running NM's DeepSparse models | +| dev | For linting PRs and contributions | +| gptq | For loading models with GPTQ | +| hf_transfer | For speeding up HF Hub file downloads | +| ifeval | For running the IFEval task | +| neuronx | For running on AWS inf2 instances | +| mamba | For loading Mamba SSM models | +| math | For running math task answer checking | +| multilingual | For multilingual tokenizers | +| optimum | For running Intel OpenVINO models | +| promptsource | For using PromptSource prompts | +| sentencepiece | For using the sentencepiece tokenizer | +| sparseml | For using NM's SparseML models | +| testing | For running library test suite | +| vllm | For loading models with vLLM | +| zeno | For visualizing results with Zeno | +| --------------- | --------------------------------------- | +| all | Loads all extras (not recommended) | + +## Cite as + +``` +@misc{eval-harness, + author = {Gao, Leo and Tow, Jonathan and Abbasi, Baber and Biderman, Stella and Black, Sid and DiPofi, Anthony and Foster, Charles and Golding, Laurence and Hsu, Jeffrey and Le Noac'h, Alain and Li, Haonan and McDonell, Kyle and Muennighoff, Niklas and Ociepa, Chris and Phang, Jason and Reynolds, Laria and Schoelkopf, Hailey and Skowron, Aviya and Sutawika, Lintang and Tang, Eric and Thite, Anish and Wang, Ben and Wang, Kevin and Zou, Andy}, + title = {A framework for few-shot language model evaluation}, + month = 07, + year = 2024, + publisher = {Zenodo}, + version = {v0.4.3}, + doi = {10.5281/zenodo.12608602}, + url = {https://zenodo.org/records/12608602} +} +``` diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/API_guide.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/API_guide.md new file mode 100644 index 0000000000000000000000000000000000000000..bb8ca2abd510b7e4b812be1837debecfcaf7fced --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/API_guide.md @@ -0,0 +1,202 @@ +# TemplateAPI Usage Guide + +The `TemplateAPI` class is a versatile superclass designed to facilitate the integration of various API-based language models into the lm-evaluation-harness framework. This guide will explain how to use and extend the `TemplateAPI` class to implement your own API models. If your API implements the OpenAI API you can use the `local-completions` or the `local-chat-completions` (defined [here](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/models/openai_completions.py)) model types, which can also serve as examples of how to effectively subclass this template. + +## Overview + +The `TemplateAPI` class provides a template for creating API-based model implementations. It handles common functionalities such as: + +- Tokenization (optional) +- Batch processing +- Caching +- Retrying failed requests +- Parsing API responses + +To use this class, you typically need to subclass it and implement specific methods for your API. + +## Key Methods to Implement + +When subclassing `TemplateAPI`, you need to implement the following methods: + +1. `_create_payload`: Creates the JSON payload for API requests. +2. `parse_logprobs`: Parses log probabilities from API responses. +3. `parse_generations`: Parses generated text from API responses. +4. `headers`: Returns the headers for the API request. + +You may also need to override other methods or properties depending on your API's specific requirements. + +> [!NOTE] +> Currently loglikelihood and MCQ based tasks (such as MMLU) are only supported for completion endpoints. Not for chat-completion — those that expect a list of dicts — endpoints! Completion APIs which support instruct tuned models can be evaluated with the `--apply_chat_template` option in order to simultaneously evaluate models using a chat template format while still being able to access the model logits needed for loglikelihood-based tasks. + +# TemplateAPI Usage Guide + +## TemplateAPI Arguments + +When initializing a `TemplateAPI` instance or a subclass, you can provide several arguments to customize its behavior. Here's a detailed explanation of some important arguments: + +- `model` or `pretrained` (str): + - The name or identifier of the model to use. + - `model` takes precedence over `pretrained` when both are provided. + +- `base_url` (str): + - The base URL for the API endpoint. + +- `tokenizer` (str, optional): + - The name or path of the tokenizer to use. + - If not provided, it defaults to using the same tokenizer name as the model. + +- `num_concurrent` (int): + - Number of concurrent requests to make to the API. + - Useful for APIs that support parallel processing. + - Default is 1 (sequential processing). + +- `tokenized_requests` (bool): + - Determines whether the input is pre-tokenized. Defaults to `True`. + - Requests can be sent in either tokenized form (`list[list[int]]`) or as text (`list[str]`, or `str` for batch_size=1). + - For loglikelihood-based tasks, prompts require tokenization to calculate the context length. If `False` prompts are decoded back to text before being sent to the API. + - Not as important for `generate_until` tasks. + - Ignored for chat formatted inputs (list[dict...]) or if tokenizer_backend is None. + +- `tokenizer_backend` (str, optional): + - Required for loglikelihood-based or MCQ tasks. + - Specifies the tokenizer library to use. Options are "tiktoken", "huggingface", or None. + - Default is "huggingface". + +- `max_length` (int, optional): + - Maximum length of input + output. + - Default is 2048. + +- `max_retries` (int, optional): + - Maximum number of retries for failed API requests. + - Default is 3. + +- `max_gen_toks` (int, optional): + - Maximum number of tokens to generate in completion tasks. + - Default is 256 or set in task yaml. + +- `batch_size` (int or str, optional): + - Number of requests to batch together (if the API supports batching). + - Can be an integer or "auto" (which defaults to 1 for API models). + - Default is 1. + +- `seed` (int, optional): + - Random seed for reproducibility. + - Default is 1234. + +- `add_bos_token` (bool, optional): + - Whether to add the beginning-of-sequence token to inputs (when tokenizing). + - Default is False. + +- `custom_prefix_token_id` (int, optional): + - Custom token ID to use as a prefix for inputs. + - If not provided, uses the model's default BOS or EOS token (if `add_bos_token` is True). + +- `verify_certificate` (bool, optional): + - Whether to validate the certificate of the API endpoint (if HTTPS). + - Default is True. + + +Example usage: + +```python +class MyAPIModel(TemplateAPI): + def __init__(self, **kwargs): + super().__init__( + model="my-model", + base_url="https://api.mymodel.com/v1/completions", + tokenizer_backend="huggingface", + num_concurrent=5, + max_retries=5, + batch_size=10, + **kwargs + ) + + # Implement other required methods... +``` + +When subclassing `TemplateAPI`, you can override these arguments in your `__init__` method to set default values specific to your API. You can also add additional (potentially user-specified) arguments as needed for your specific implementation. + +## Example Implementation: OpenAI API + +The `OpenAICompletionsAPI` and `OpenAIChatCompletion` ([here](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/models/openai_completions.py) classes demonstrate how to implement API models using the `TemplateAPI` class. Here's a breakdown of the key components: + +### 1. Subclassing and Initialization + +```python +@register_model("openai-completions") +class OpenAICompletionsAPI(LocalCompletionsAPI): + def __init__( + self, + base_url="https://api.openai.com/v1/completions", + tokenizer_backend="tiktoken", + **kwargs, + ): + super().__init__( + base_url=base_url, tokenizer_backend=tokenizer_backend, **kwargs + ) +``` + +### 2. Implementing API Key Retrieval + +```python +@cached_property +def api_key(self): + key = os.environ.get("OPENAI_API_KEY", None) + if key is None: + raise ValueError( + "API key not found. Please set the OPENAI_API_KEY environment variable." + ) + return key +``` + +### 3. Creating the Payload + +```python +def _create_payload( + self, + messages: Union[List[List[int]], List[dict], List[str], str], + generate=False, + gen_kwargs: Optional[dict] = None, + **kwargs, +) -> dict: + if generate: + # ... (implementation for generation) + else: + # ... (implementation for log likelihood) +``` + +### 4. Parsing API Responses + +```python +@staticmethod +def parse_logprobs( + outputs: Union[Dict, List[Dict]], + tokens: List[List[int]] = None, + ctxlens: List[int] = None, + **kwargs, +) -> List[Tuple[float, bool]]: + # ... (implementation) + +@staticmethod +def parse_generations(outputs: Union[Dict, List[Dict]], **kwargs) -> List[str]: + # ... (implementation) +``` + +The requests are initiated in the `model_call` or the `amodel_call` methods. + +## Implementing Your Own API Model + +To implement your own API model: + +1. Subclass `TemplateAPI` or one of its subclasses (e.g., `LocalCompletionsAPI`). +2. Override the `__init__` method if you need to set specific parameters. +3. Implement the `_create_payload` and `header` methods to create the appropriate payload for your API. +4. Implement the `parse_logprobs` and `parse_generations` methods to parse your API's responses. +5. Override the `api_key` property if your API requires authentication. +6. Override any other methods as necessary to match your API's behavior. + +## Best Practices + +1. Use the `@register_model` decorator to register your model with the framework (and import it in `lm_eval/models/__init__.py`!). +3. Use environment variables for sensitive information like API keys. +4. Properly handle batching and concurrent requests if supported by your API. diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/CONTRIBUTING.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..48b5c332c22c50306f00f36bd3004db4393a49df --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/CONTRIBUTING.md @@ -0,0 +1,79 @@ +# Contributing to LM Evaluation Harness + +Welcome and thank you for your interest in the LM Evaluation Harness! We welcome contributions and feedback and appreciate your time spent with our library, and hope you find it useful! + +## Important Resources + +There are several places information about LM Evaluation Harness is located: + +- Our [documentation pages](https://github.com/EleutherAI/lm-evaluation-harness/tree/main/docs) +- We occasionally use [GitHub Milestones](https://github.com/EleutherAI/lm-evaluation-harness/milestones) to track progress toward specific near-term version releases. +- We maintain a [Project Board](https://github.com/orgs/EleutherAI/projects/25) for tracking current work items and PRs, and for future roadmap items or feature requests. +- Further discussion and support conversations are located in the #lm-thunderdome channel of the [EleutherAI discord](https://discord.gg/eleutherai). + +## Code Style + +LM Evaluation Harness uses [ruff](https://github.com/astral-sh/ruff) for linting via [pre-commit](https://pre-commit.com/). + +You can install linters and dev tools via + +```pip install lm_eval[dev]``` or ```pip install -e ".[dev]"``` + +Then, run + +```pre-commit install``` + +in order to ensure linters and other checks will be run upon committing. + +## Testing + +We use [pytest](https://docs.pytest.org/en/latest/) for running unit tests. All library unit tests can be run via: + +``` +python -m pytest --showlocals -s -vv -n=auto --ignore=tests/models/test_neuralmagic.py --ignore=tests/models/test_openvino.py +``` + +## Contributor License Agreement + +We ask that new contributors agree to a Contributor License Agreement affirming that EleutherAI has the rights to use your contribution to our library. +First-time pull requests will have a reply added by @CLAassistant containing instructions for how to confirm this, and we require it before merging your PR. + + +## Contribution Best Practices + +We recommend a few best practices to make your contributions or reported errors easier to assist with. + +**For Pull Requests:** +- PRs should be titled descriptively, and be opened with a brief description of the scope and intent of the new contribution. +- New features should have appropriate documentation added alongside them. +- Aim for code maintainability, and minimize code copying. +- If opening a task, try to share test results on the task using a publicly-available model, and if any public results are available on the task, compare to them. + +**For Feature Requests:** +- Provide a short paragraph's worth of description. What is the feature you are requesting? What is its motivation, and an example use case of it? How does this differ from what is currently supported? + +**For Bug Reports**: +- Provide a short description of the bug. +- Provide a *reproducible example*--what is the command you run with our library that results in this error? Have you tried any other steps to resolve it? +- Provide a *full error traceback* of the error that occurs, if applicable. A one-line error message or small screenshot snippet is unhelpful without the surrounding context. +- Note what version of the codebase you are using, and any specifics of your environment and setup that may be relevant. + +**For Requesting New Tasks**: +- Provide a 1-2 sentence description of what the task is and what it evaluates. +- Provide a link to the paper introducing the task. +- Provide a link to where the dataset can be found. +- Provide a link to a paper containing results on an open-source model on the task, for use in comparisons and implementation validation. +- If applicable, link to any codebase that has implemented the task (especially the original publication's codebase, if existent). + +## How Can I Get Involved? + +To quickly get started, we maintain a list of good first issues, which can be found [on our project board](https://github.com/orgs/EleutherAI/projects/25/views/8) or by [filtering GH Issues](https://github.com/EleutherAI/lm-evaluation-harness/issues?q=is%3Aopen+label%3A%22good+first+issue%22+label%3A%22help+wanted%22). These are typically smaller code changes or self-contained features which can be added without extensive familiarity with library internals, and we recommend new contributors consider taking a stab at one of these first if they are feeling uncertain where to begin. + +There are a number of distinct ways to contribute to LM Evaluation Harness, and all are extremely helpful! A sampling of ways to contribute include: +- **Implementing and verifying new evaluation tasks**: Is there a task you'd like to see LM Evaluation Harness support? Consider opening an issue requesting it, or helping add it! Verifying and cross-checking task implementations with their original versions is also a very valuable form of assistance in ensuring standardized evaluation. +- **Improving documentation** - Improvements to the documentation, or noting pain points / gaps in documentation, are helpful in order for us to improve the user experience of the library and clarity + coverage of documentation. +- **Testing and devops** - We are very grateful for any assistance in adding tests for the library that can be run for new PRs, and other devops workflows. +- **Adding new modeling / inference library integrations** - We hope to support a broad range of commonly-used inference libraries popular among the community, and welcome PRs for new integrations, so long as they are documented properly and maintainable. +- **Proposing or Contributing New Features** - We want LM Evaluation Harness to support a broad range of evaluation usecases. If you have a feature that is not currently supported but desired, feel free to open an issue describing the feature and, if applicable, how you intend to implement it. We would be happy to give feedback on the cleanest way to implement new functionalities and are happy to coordinate with interested contributors via GH discussions or via discord. + +We hope that this has been helpful, and appreciate your interest in contributing! Further questions can be directed to [our Discord](discord.gg/eleutherai). diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/README.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f040eabaef41b55e9bd8297f3f4653fbc16bf0bc --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/README.md @@ -0,0 +1,11 @@ +# Eval Harness Documentation + +Welcome to the docs for the LM Evaluation Harness! + +## Table of Contents + +* To learn about the public interface of the library, as well as how to evaluate via the command line or as integrated into an external library, see the [Interface](./interface.md). +* To learn how to add a new library, API, or model type to the library, as well as a quick explainer on the types of ways to evaluate an LM, see the [Model Guide](./model_guide.md). + * For an extended description of how to extend the library to new model classes served over an API, see the [API Guide](./API_guide.md). +* For a crash course on adding new tasks to the library, see our [New Task Guide](./new_task_guide.md). +* To learn more about pushing the limits of task configuration that the Eval Harness supports, see the [Task Configuration Guide](./task_guide.md). diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/decontamination.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/decontamination.md new file mode 100644 index 0000000000000000000000000000000000000000..cdda0e21846c06cad2d2e5f4552938d934b12a0e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/decontamination.md @@ -0,0 +1,71 @@ +# Decontamination + +## Usage + +The provided directory should contain +the ngram files and info.json produced in "Pile Ngram Generation" further down. + +```bash +python -m lm_eval \ + --model gpt2 \ + --device 0 \ + --tasks sciq +``` + +## Background +Downstream evaluations test model generalization, and are less useful when test set data also exists in the training set, referred to as leakage or contamination. + +Filtering your training set against the test set is a good first step, however this isn't always possible, as in the case of a new benchmark or one that wasn't considered prior to model training. When training set filtering isn't possible, it is useful to measure the impact of test set leakage by detecting the contaminated test examples and producing a clean version of the benchmark. + +The basis for our decontamination procedure can be found in Appendix C of "Language Models are Few-Shot Learners". OpenAI defined a test document as contaminated if any N-gram overlap existed with any training document. They used a range of N values between 8 and 13 depending on dataset, while we just used 13 for simplicity. + +## Implementation +Contamination detection can be found in `lm_eval/decontaminate.py` with supporting code in `lm_eval/decontamination/`. + +decontaminate.py does the following: +1. Build dictionaries of all ngrams and their corresponding evaluation/document ids. +2. Scan through sorted files containing training set n-grams. +3. If a match is found, the corresponding evaluation/document combinations are marked as contaminated. + +`lm_eval/evaluator.py` can then produce a clean version of the benchmark by excluding the results of contaminated documents. For each metric, a clean version will be shown in the results with a "decontaminate" suffix. + +This is disabled by default for new tasks, to support decontamination on a task override the "should_decontaminate" and "doc_to_decontamination_query" methods. For more details see the [task guide](task_guide.md). + +## Pile Ngram Generation +The relevant scripts can be found in `scripts/clean_training_data`, which also import from +`lm_eval/decontamination/` + +1. git clone https://github.com/EleutherAI/lm-evaluation-harness.git +2. pip install -r requirements.txt +3. Download The Pile from [The Eye](https://the-eye.eu/public/AI/pile/train/) +4. Place pile files in "pile" directory under "lm-evaluation-harness" (or create a symlink) +5. Run generate_13_grams. + +```bash +export PYTHONHASHSEED=0 +python -m scripts/clean_training_data/generate_13_grams \ + -dir path/to/working/directory \ + -n 13 \ + -buckets 500 +``` + +Took approximately 4 days for us. We had the time to wait, but this could be scaled out by doing partial pile scans on multiple instances of this script and merging the relevant buckets. We fixed PYTHONHASHSEED to ensure reproducibility of bucket hashing in case you need to stop and start. + +6. Sort the generated 13-grams. +```bash +python -m scripts/clean_training_data/sort_13_gram_buckets \ + -dir path/to/working/directory/output +``` + +Took approximately 5 days for us. You could speed this up by spreading the files around to different machines and running the sort script before gathering them together. + +7. Compress the sorted 13 grams files and place them together with info.json. + +This step only takes a few hours. + +```bash +python -m scripts/clean_training_data/compress_and_package \ + -dir path/to/working/directory \ + -output path/to/final/directory \ + -procs 8 +``` diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/interface.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/interface.md new file mode 100644 index 0000000000000000000000000000000000000000..47cf00b49694bdbdd86a431c318f0497a2cb4f5a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/interface.md @@ -0,0 +1,166 @@ +# User Guide + +This document details the interface exposed by `lm-eval` and provides details on what flags are available to users. + +## Command-line Interface + +A majority of users run the library by cloning it from Github, installing the package as editable, and running the `python -m lm_eval` script. + +Equivalently, running the library can be done via the `lm-eval` entrypoint at the command line. + +This mode supports a number of command-line arguments, the details of which can be also be seen via running with `-h` or `--help`: + +- `--model` : Selects which model type or provider is evaluated. Must be a string corresponding to the name of the model type/provider being used. See [the main README](https://github.com/EleutherAI/lm-evaluation-harness/tree/main#model-apis-and-inference-servers) for a full list of enabled model names and supported libraries or APIs. + +- `--model_args` : Controls parameters passed to the model constructor. Accepts a string containing comma-separated keyword arguments to the model class of the format `"arg1=val1,arg2=val2,..."`, such as, for example `--model_args pretrained=EleutherAI/pythia-160m,dtype=float32`. For a full list of what keyword arguments, see the initialization of the `lm_eval.api.model.LM` subclass, e.g. [`HFLM`](https://github.com/EleutherAI/lm-evaluation-harness/blob/365fcda9b85bbb6e0572d91976b8daf409164500/lm_eval/models/huggingface.py#L66) + +- `--tasks` : Determines which tasks or task groups are evaluated. Accepts a comma-separated list of task names or task group names. Must be solely comprised of valid tasks/groups. A list of supported tasks can be viewed with `--tasks list`. + +- `--num_fewshot` : Sets the number of few-shot examples to place in context. Must be an integer. + +- `--gen_kwargs` : takes an arg string in same format as `--model_args` and creates a dictionary of keyword arguments. These will be passed to the models for all called `generate_until` (free-form or greedy generation task) tasks, to set options such as the sampling temperature or `top_p` / `top_k`. For a list of what args are supported for each model type, reference the respective library's documentation (for example, the documentation for `transformers.AutoModelForCausalLM.generate()`.) These kwargs will be applied to all `generate_until` tasks called--we do not currently support unique gen_kwargs or batch_size values per task in a single run of the library. To control these on a per-task level, set them in that task's YAML file. + +- `--batch_size` : Sets the batch size used for evaluation. Can be a positive integer or `"auto"` to automatically select the largest batch size that will fit in memory, speeding up evaluation. One can pass `--batch_size auto:N` to re-select the maximum batch size `N` times during evaluation. This can help accelerate evaluation further, since `lm-eval` sorts documents in descending order of context length. + +- `--max_batch_size` : Sets the maximum batch size to try to fit in memory, if `--batch_size auto` is passed. + +- `--device` : Sets which device to place the model onto. Must be a string, for example, `"cuda", "cuda:0", "cpu", "mps"`. Defaults to "cuda", and can be ignored if running multi-GPU or running a non-local model type. + +- `--output_path` : A string of the form `dir/file.jsonl` or `dir/`. Provides a path where high-level results will be saved, either into the file named or into the directory named. If `--log_samples` is passed as well, then per-document outputs and metrics will be saved into the directory as well. + +- `--log_samples` : If this flag is passed, then the model's outputs, and the text fed into the model, will be saved at per-document granularity. Must be used with `--output_path`. + +- `--limit` : Accepts an integer, or a float between 0.0 and 1.0 . If passed, will limit the number of documents to evaluate to the first X documents (if an integer) per task or first X% of documents per task. Useful for debugging, especially on costly API models. + +- `--use_cache` : Should be a path where a sqlite db file can be written to. Takes a string of format `/path/to/sqlite_cache_` in order to create a cache db at `/path/to/sqlite_cache_rank{i}.db` for each process (0-NUM_GPUS). This allows results of prior runs to be cached, so that there is no need to re-run results in order to re-score or re-run a given (model, task) pair again. + +- `--cache_requests` : Can be "true", "refresh", or "delete". "true" means that the cache should be used. "refresh" means that you wish to regenerate the cache, which you should run if you change your dataset configuration for a given task. "delete" will delete the cache. Cached files are stored under lm_eval/cache/.cache unless you specify a different path via the environment variable: `LM_HARNESS_CACHE_PATH`. e.g. `LM_HARNESS_CACHE_PATH=~/Documents/cache_for_lm_harness`. + +- `--check_integrity` : If this flag is used, the library tests for each task selected are run to confirm task integrity. + +- `--write_out` : Used for diagnostic purposes to observe the format of task documents passed to a model. If this flag is used, then prints the prompt and gold target string for the first document of each task. + +- `--show_config` : If used, prints the full `lm_eval.api.task.TaskConfig` contents (non-default settings the task YAML file) for each task which was run, at the completion of an evaluation. Useful for when one is modifying a task's configuration YAML locally to transmit the exact configurations used for debugging or for reproducibility purposes. + +- `--include_path` : Accepts a path to a folder. If passed, then all YAML files containing `lm-eval` compatible task configurations will be added to the task registry as available tasks. Used for when one is writing config files for their own task in a folder other than `lm_eval/tasks/`. + +- `--system_instruction`: Specifies a system instruction string to prepend to the prompt. + +- `--apply_chat_template` : This flag specifies whether to apply a chat template to the prompt. It can be used in the following ways: + - `--apply_chat_template` : When used without an argument, applies the only available chat template to the prompt. For Hugging Face models, if no dedicated chat template exists, the default chat template will be applied. + - `--apply_chat_template template_name` : If the model has multiple chat templates, apply the specified template to the prompt. + + For Hugging Face models, the default chat template can be found in the [`default_chat_template`](https://github.com/huggingface/transformers/blob/fc35907f95459d7a6c5281dfadd680b6f7b620e3/src/transformers/tokenization_utils_base.py#L1912) property of the Transformers Tokenizer. + +- `--fewshot_as_multiturn` : If this flag is on, the Fewshot examples are treated as a multi-turn conversation. Questions are provided as user content and answers are provided as assistant responses. Requires `--num_fewshot` to be set to be greater than 0, and `--apply_chat_template` to be on. + +- `--predict_only`: Generates the model outputs without computing metrics. Use with `--log_samples` to retrieve decoded results. + +* `--seed`: Set seed for python's random, numpy and torch. Accepts a comma-separated list of 3 values for python's random, numpy, and torch seeds, respectively, or a single integer to set the same seed for all three. The values are either an integer or 'None' to not set the seed. Default is `0,1234,1234` (for backward compatibility). E.g. `--seed 0,None,8` sets `random.seed(0)` and `torch.manual_seed(8)`. Here numpy's seed is not set since the second value is `None`. E.g, `--seed 42` sets all three seeds to 42. + +* `--wandb_args`: Tracks logging to Weights and Biases for evaluation runs and includes args passed to `wandb.init`, such as `project` and `job_type`. Full list [here](https://docs.wandb.ai/ref/python/init). e.g., ```--wandb_args project=test-project,name=test-run``` + +* `--hf_hub_log_args` : Logs evaluation results to Hugging Face Hub. Accepts a string with the arguments separated by commas. Available arguments: + * `hub_results_org` - organization name on Hugging Face Hub, e.g., `EleutherAI`. If not provided, the results will be pushed to the owner of the Hugging Face token, + * `hub_repo_name` - repository name on Hugging Face Hub (deprecated, `details_repo_name` and `results_repo_name` should be used instead), e.g., `lm-eval-results`, + * `details_repo_name` - repository name on Hugging Face Hub to store details, e.g., `lm-eval-results`, + * `results_repo_name` - repository name on Hugging Face Hub to store results, e.g., `lm-eval-results`, + * `push_results_to_hub` - whether to push results to Hugging Face Hub, can be `True` or `False`, + * `push_samples_to_hub` - whether to push samples results to Hugging Face Hub, can be `True` or `False`. Requires `--log_samples` to be set, + * `public_repo` - whether the repository is public, can be `True` or `False`, + * `leaderboard_url` - URL to the leaderboard, e.g., `https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard`. + * `point_of_contact` - Point of contact for the results dataset, e.g., `yourname@example.com`. + * `gated` - whether to gate the details dataset, can be `True` or `False`. + +## External Library Usage + +We also support using the library's external API for use within model training loops or other scripts. + +`lm_eval` supplies two functions for external import and use: `lm_eval.evaluate()` and `lm_eval.simple_evaluate()`. + +`simple_evaluate()` can be used by simply creating an `lm_eval.api.model.LM` subclass that implements the methods described in the [Model Guide](https://github.com/EleutherAI/lm-evaluation-harness/tree/main/docs/model_guide.md), and wrapping your custom model in that class as follows: + +```python +import lm_eval +... + +my_model = initialize_my_model() # create your model (could be running finetuning with some custom modeling code) +... +# instantiate an LM subclass that takes your initialized model and can run +# - `Your_LM.loglikelihood()` +# - `Your_LM.loglikelihood_rolling()` +# - `Your_LM.generate_until()` +lm_obj = Your_LM(model=my_model, batch_size=16) + +# indexes all tasks from the `lm_eval/tasks` subdirectory. +# Alternatively, you can set `TaskManager(include_path="path/to/my/custom/task/configs")` +# to include a set of tasks in a separate directory. +task_manager = lm_eval.tasks.TaskManager() + +# Setting `task_manager` to the one above is optional and should generally be done +# if you want to include tasks from paths other than ones in `lm_eval/tasks`. +# `simple_evaluate` will instantiate its own task_manager if it is set to None here. +results = lm_eval.simple_evaluate( # call simple_evaluate + model=lm_obj, + tasks=["taskname1", "taskname2"], + num_fewshot=0, + task_manager=task_manager, + ... +) +``` + +See the `simple_evaluate()` and `evaluate()` functions in [lm_eval/evaluator.py](../lm_eval/evaluator.py#:~:text=simple_evaluate) for a full description of all arguments available. All keyword arguments to simple_evaluate share the same role as the command-line flags described previously. + +Additionally, the `evaluate()` function offers the core evaluation functionality provided by the library, but without some of the special handling and simplification + abstraction provided by `simple_evaluate()`. + +As a brief example usage of `evaluate()`: + +```python +import lm_eval + +# suppose you've defined a custom lm_eval.api.Task subclass in your own external codebase +from my_tasks import MyTask1 +... + +# create your model (could be running finetuning with some custom modeling code) +my_model = initialize_my_model() +... + +# instantiate an LM subclass that takes your initialized model and can run +# - `Your_LM.loglikelihood()` +# - `Your_LM.loglikelihood_rolling()` +# - `Your_LM.generate_until()` +lm_obj = Your_LM(model=my_model, batch_size=16) + +# optional: the task_manager indexes tasks including ones +# specified by the user through `include_path`. +task_manager = lm_eval.tasks.TaskManager( + include_path="/path/to/custom/yaml" + ) + +# To get a task dict for `evaluate` +task_dict = lm_eval.tasks.get_task_dict( + [ + "mmlu", # A stock task + "my_custom_task", # A custom task + { + "task": ..., # A dict that configures a task + "doc_to_text": ..., + }, + MyTask1 # A task object from `lm_eval.task.Task` + ], + task_manager # A task manager that allows lm_eval to + # load the task during evaluation. + # If none is provided, `get_task_dict` + # will instantiate one itself, but this + # only includes the stock tasks so users + # will need to set this if including + # custom paths is required. + ) + +results = evaluate( + lm=lm_obj, + task_dict=task_dict, + ... +) +``` diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/model_guide.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/model_guide.md new file mode 100644 index 0000000000000000000000000000000000000000..810801cbfa47294a5c02ca0d0c38da02975dd713 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/model_guide.md @@ -0,0 +1,191 @@ +# New Model Guide + +This guide may be of special interest to users who are using the library outside of the repository, via installing the library via pypi and calling `lm_eval.evaluator.evaluate()` to evaluate an existing model. + +In order to properly evaluate a given LM, we require implementation of a wrapper class subclassing the `lm_eval.api.model.LM` class, that defines how the Evaluation Harness should interface with your model. This guide walks through how to write this `LM` subclass via adding it to the library! + +## Setup + +To get started contributing, go ahead and fork the main repo, clone it, create a branch with the name of your model, and install the project requirements in your environment: + +```sh +# After forking... +git clone https://github.com//lm-evaluation-harness.git +cd lm-evaluation-harness +git checkout -b +pip install -e ".[dev]" +``` + +Now, we'll create a new file where we'll be adding our model: + +```sh +touch lm_eval/models/.py +``` + +**Tip: this filename should not shadow package names! For example, naming your file `anthropic.py` is disallowed since the API's name on pypi is `anthropic`, but naming it `anthropic_llms.py` works with no problems.** + +## Interface + +All models must subclass the `lm_eval.api.model.LM` class. + +The LM class enforces a common interface via which we can extract responses from a model: + +```python +class MyCustomLM(LM): + #... + def loglikelihood(self, requests: list[Instance]) -> list[tuple[float, bool]]: + #... + + + def loglikelihood_rolling(self, requests: list[Instance]) -> list[tuple[float, bool]]: + #... + + + def generate_until(self, requests: list[Instance]) -> list[str]: + #... + #... +``` +Where `Instance` is a dataclass defined in [`lm_eval.api.instance`](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/api/instance.py) with property `args` of request-dependent type signature described below. + +We support three types of requests, consisting of different interactions / measurements with an autoregressive LM. + +All three request types take as input `requests` of type `list[Instance]` that have a matching `Instance.request_type` to the method name. + +- `generate_until` + - Each request contains `Instance.args : Tuple[str, dict]` containing 1. an input string to the LM and 2. a dictionary of keyword arguments used to control generation parameters. + - Using this input and these generation parameters, text will be sampled from the language model (typically until a maximum output length or specific stopping string sequences--for example, `{"until": ["\n\n", "."], "max_gen_toks": 128}`). + - The generated input+output text from the model will then be returned. + +- `loglikelihood` + - Each request contains `Instance.args : Tuple[str, str]` containing 1. an input string to the LM and 2. a target string on which the loglikelihood of the LM producing this target, conditioned on the input, will be returned. + - Each request will have, as result, `(ll, is_greedy): Tuple[float, int]` returned, where `ll` is a floating point number representing the log probability of generating the target string conditioned on the input, and `is_greedy` being either the value `0` or `1`, with it being `1` if and only if the target string *would be generated by greedy sampling from the LM* (that is, if the target string is the *most likely* N-token string to be output by the LM given the input. ) + +- `loglikelihood_rolling` + - Each request contains `Instance.args : Tuple[str]`, which is an input string to the model whose *entire* loglikelihood, conditioned on purely the EOT token, will be calculated. + - This is used to evaluate *perplexity* on a data distribution. + - It should return `(ll,) : Tuple[float]` , a.k.a. solely the *loglikelihood* of producing each piece of text given no starting input. + + +To allow a model to be evaluated on all types of tasks, you will need to implement these three types of measurements (note that `loglikelihood_rolling` is a special case of `loglikelihood`). For a reference implementation, check out `lm_eval/models/huggingface.py` ! Additionally, check out `lm_eval.api.model.TemplateLM` for a class that abstracts away some commonly used functions across LM subclasses, or see if your model would lend itself well to subclassing the `lm_eval.models.huggingface.HFLM` class and overriding just the initialization or a couple methods! + +**Tip: be careful of indexing in loglikelihood!** + + +LMs take in tokens in position `[0 1 2 ... N]` and output a probability distribution for token position `N+1`. We provide a simplified graphic here, excerpted from `huggingface.py`: + +``` +# how this all works (illustrated on a causal decoder-only setup): +# CTX CONT +# inp 0 1 2 3|4 5 6 7 8 9 <- last token is deleted by inp[:, :-1] +# model \ \ +# logits 1 2 3|4 5 6 7 8 9 <- the ctx half gets tossed out by the +# cont_toks 4 5 6 7 8 9 [:, -len(continuation_enc):, :self.vocab_size] slice +``` + +The final token of the target is not passed into the LM, because we want the LM's predictions *up to but not past* that final target token. For more information, check out https://github.com/EleutherAI/lm-evaluation-harness/issues/942 . + +## Registration + +Congrats on implementing your model! Now it's time to test it out. + +To make your model usable via the command line interface to `lm-eval` using `python -m lm_eval`, you'll need to tell `lm-eval` what your model's name is. + +This is done via a *decorator*, `lm_eval.api.registry.register_model`. Using `register_model()`, one can both tell the package what the model's name(s) to be used are when invoking it with `python -m lm_eval --model ` and alert `lm-eval` to the model's existence. + +```python +from lm_eval.api.registry import register_model + +@register_model("", "") +class MyCustomLM(LM): +``` + +Using this decorator results in the class being added to an accounting of the usable LM types maintained internally to the library at `lm_eval.api.registry.MODEL_REGISTRY`. See `lm_eval.api.registry` for more detail on what sorts of registries and decorators exist in the library! + +**Tip: be sure to import your model in `lm_eval/models/__init__.py!`** + +## Testing + +We also recommend that new model contributions be accompanied by short tests of their 3 core functionalities, at minimum. To see an example of such tests, look at https://github.com/EleutherAI/lm-evaluation-harness/blob/35bdecd379c0cefad6897e67db892f4a6026a128/tests/test_ggml.py . + +## Chat Templating + +Many models are fine-tuned with a [Chat Template](https://huggingface.co/docs/transformers/main/en/chat_templating) in order to enable back-and-forth interaction between a "User"'s queries and the model (often called "Assistant")'s responses. It can be desirable to evaluate fine-tuned models on evaluation tasks while wrapped in the conversational format they expect. + +In order to make your model optionally compatible with a chat format, three additional methods must be implemented: + +```python +class MyCustomLM(LM): + #... + @property + def tokenizer_name(self) -> str: + """ + Return the name of the model's tokenizer and/or the accompanying chat template. + The returned string is used to cache requests. + + Returns: + str: The name of the model's tokenizer and/or chat template. + """ + + def chat_template(self, chat_template: Union[bool, str] = False) -> str: + """ + Get the appropriate chat template for the model based on the `chat_template` argument. + + This method returns the chat template string to build the prompt from a chat history. + The chat template is saved in the evaluation results for reproducibility. + Boolean arguments should be used with models that have only one chat template, + while string arguments are used with models that have multiple chat templates. + For the reference implementation, see HFLM class in `lm_eval.models.huggingface`. + + Args: + chat_template (Union[bool, str]): Specifies whether to apply a chat template: + - If False: Do not apply any chat template. + - If True: Apply the default chat template. + - If str: Apply the specified chat template by name. + + Returns: + str: The selected chat template in Jinja format. + """ + + def apply_chat_template(self, chat_history: List[Dict[str, str]]) -> str: + """ + Process a chat history to create a string that can be tokenized and input into the model. + + Args: + chat_history (List[Dict[str, str]]): A list of dictionaries representing the chat history, + where each dictionary has "role" and "content" keys. + + Returns: + str: A string representing the chat history that can be tokenized and fed into the model. + """ +``` + +- `apply_chat_template` + - This method performs the bulk of the work required for chat-formatting. + - As input, a `chat_history: List[Dict[str, str]]` is passed in. This is a transcript of a conversation of a form similar to + ``` + [ + {"system": }, + {"user": } + {"assistant": }, + # ... more few-shot examples, potentially + {"user": }, + ] + ``` + which can then be converted into a string input. + - The output is a string representing this conversation that can be fed into the model. + - For example, this consists of simply calling `tokenizer.apply_chat_template` for HFLM--see the implementation there for reference. +- `tokenizer_name` + - LM Eval Harness supports [caching requests](https://github.com/EleutherAI/lm-evaluation-harness/blob/4902aaaf1f374682f95ac25fe2e13b23faddc91a/lm_eval/__main__.py#L140) that are sent to a model, for faster setup when repeating an already-performed evaluation. + - However, we don't want to use the cache of chat transcripts rendered using one chat template or system prompt to send to a model with a different template! So, we use this `lm.tokenizer_name` string to distinguish caches for a given model (and chat template) from one another. +- `chat_template` + - Chat templates are typically provided as a Jinja template string or a string formatted with str.format to include user and assistant messages in a single prompt. This template string is saved in the evaluation results to ensure reproducibility. + +If not implemented for a given model type, the flags `--apply_chat_template` , `--fewshot_as_multiturn`, and `--system_instruction` cannot be used. + +## Other + +**Pro tip**: In order to make the Evaluation Harness overestimate total runtimes rather than underestimate it, HuggingFace models come in-built with the ability to provide responses on data points in *descending order by total input length* via `lm_eval.utils.Reorderer`. Take a look at `lm_eval.models.hf_causal.HFLM` to see how this is done, and see if you can implement it in your own model! + +## Conclusion + +After reading this guide, you should be able to add new model APIs or implementations to the Eval Harness library! diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/new_task_guide.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/new_task_guide.md new file mode 100644 index 0000000000000000000000000000000000000000..dac8541e82e5175ac602c440f2be4b7eb8abd18a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/new_task_guide.md @@ -0,0 +1,492 @@ +# New Task Guide + +`lm-evaluation-harness` is a framework that strives to support a wide range of zero- and few-shot evaluation tasks on autoregressive language models (LMs). + +This documentation page provides a walkthrough to get started creating your own task, in `lm-eval` versions v0.4.0 and later. + +A more interactive tutorial is available as a Jupyter notebook [here](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/examples/lm-eval-overview.ipynb). + +## Setup + +If you haven't already, go ahead and fork the main repo, clone it, create a branch with the name of your task, and install the project requirements in your environment: + +```sh +# After forking... +git clone https://github.com//lm-evaluation-harness.git +cd lm-evaluation-harness +git checkout -b +pip install -e ".[dev]" +``` + +In this document, we'll walk through the basics of implementing a static benchmark evaluation in two formats: a *generative* task which requires sampling text from a model, such as [`gsm8k`](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/gsm8k/gsm8k.yaml), and a *discriminative*, or *multiple choice*, task where the model picks the most likely of several fixed answer choices, such as [`sciq`](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/sciq/sciq.yaml). + +## Creating a YAML file + +To implement a new standard task, we'll need to write a YAML file which configures our task logic. We start by making a new empty YAML file. This file can have any name, but we recommend placing it in a subfolder of `lm_eval/tasks` titled by the dataset or task's shorthand name: for example, + +```sh +touch lm_eval/tasks//.yaml +``` +Or, copy the template subfolder we provide from `templates/new_yaml_task`: +```sh +cp -r templates/new_yaml_task lm_eval/tasks/ +``` +and rename the folders and YAML file(s) as desired. + +### Selecting and configuring a dataset + +All data downloading and management is handled through the HuggingFace (**HF**) [`datasets`](https://github.com/huggingface/datasets) API. So, the first thing you should do is check to see if your task's dataset is already provided in their catalog [here](https://huggingface.co/datasets). If it's not in there, please consider adding it to their Hub to make it accessible to a wider user base by following their [new dataset guide](https://github.com/huggingface/datasets/blob/main/ADD_NEW_DATASET.md) +. + +Once you have a HuggingFace dataset prepared for your task, we want to assign our new YAML to use this dataset: + +```yaml +dataset_path: ... # the name of the dataset on the HF Hub. +dataset_name: ... # the dataset configuration to use. Leave `null` if your dataset does not require a config to be passed. See https://huggingface.co/docs/datasets/load_hub#configurations for more info. +dataset_kwargs: null # any extra keyword arguments that should be passed to the dataset constructor, e.g. `data_dir`. +``` + +Next, we'd like to tell our task what the dataset's train, validation, and test splits are named, if they exist: + +```yaml +training_split: +validation_split: +test_split: +``` +Tests will run on the `test_split` if it is available, and otherwise evaluate on the `validation_split`. + +We can also specify from which split the task should retrieve few-shot examples via: +```yaml +fewshot_split: +``` +or by hardcoding them, either using the following in the yaml file: +```yaml +fewshot_config: + sampler: first_n + samples: [ + {}, + {}, + ] +``` +or by adding the function `list_fewshot_samples` in the associated utils.py file: +```python +def list_fewshot_samples() -> list[dict]: + return [{}, {}] +``` +See `lm_eval/tasks/minerva_math/minerva_math_algebra.yaml` for an example of the latter, and `lm_eval/tasks/gsm8k/gsm8k-cot.yaml` for an example of the former. + +In this case, each sample must contain the same fields as the samples in the above sets--for example, if `doc_to_text` expects an `input` field when rendering input prompts, these provided samples must include an `input` key. + +If neither above options are not set, we will default to train/validation/test sets, in that order. + + +Finally, our dataset may not be already in the exact format we want. Maybe we have to strip whitespace and special characters via a regex from our dataset's "question" field! Or maybe we just want to rename its columns to match a convention we'll be using for our prompts. + +Let's create a python file in the directory where we're writing our YAML file: +```bash +touch lm_eval/tasks//utils.py +``` +Now, in `utils.py` we'll write a function to process each split of our dataset (the following example is drawn from [the `hellaswag` task](../lm_eval/tasks/hellaswag/utils.py)): + +```python +def process_docs(dataset: datasets.Dataset) -> datasets.Dataset: + def _process_doc(doc): + ctx = doc["ctx_a"] + " " + doc["ctx_b"].capitalize() + out_doc = { + "query": preprocess(doc["activity_label"] + ": " + ctx), + "choices": [preprocess(ending) for ending in doc["endings"]], + "gold": int(doc["label"]), + } + return out_doc + + return dataset.map(_process_doc) +``` + +Now, in our YAML config file we'll use the `!function` constructor, and tell the config where our imported Python function will come from. At runtime, before doing anything else we will preprocess our dataset according to this function! +```yaml +process_docs: !function utils.process_docs +``` + +### Using Local Datasets + +To load a local dataset for evaluation, you can specify data files in the `dataset_kwargs` field, such as the following for JSON files: + +``` +dataset_path: json +dataset_name: null +dataset_kwargs: + data_files: /path/to/my/json +``` +Or with files already split into separate directories: + +``` +dataset_path: arrow +dataset_kwargs: + data_files: + train: /path/to/arrow/train/data-00000-of-00001.arrow + validation: /path/to/arrow/validation/data-00000-of-00001.arrow +``` + +Alternatively, if you have previously downloaded a dataset from huggingface hub (using `save_to_disk()`) and wish to use the local files, you will need to use `data_dir` under `dataset_kwargs` to point to where the directory is. + +``` +dataset_path: hellaswag +dataset_kwargs: + data_dir: hellaswag_local/ +``` + +You can also set `dataset_path` as a directory path in your local system. This will assume that there is a loading script with the same name as the directory. [See datasets docs](https://huggingface.co/docs/datasets/loading#local-loading-script). + +## Writing a Prompt Template + +The next thing we need to do is decide what format to use when presenting the data to the LM. This is our **prompt**, where we'll define both an input and output format. + +To write a prompt, users will use `doc_to_text`, `doc_to_target`, and `doc_to_choice` (Optional when certain conditions are met). + +`doc_to_text` defines the input string a model will be given while `doc_to_target` and `doc_to_choice` will be used to generate the target text. `doc_to_target` can be either a text string that refers to the target string or an integer that refers to the index of the correct label. When it is set as an index, `doc_to_choice` must be also be set with the appropriate list of possible choice strings. + +### Basic prompts + +If a dataset is straightforward enough, users can enter the feature name directly. This assumes that no preprocessing is required. For example in [Swag](https://github.com/EleutherAI/lm-evaluation-harness/blob/1710b42d52d0f327cb0eb3cb1bfbbeca992836ca/lm_eval/tasks/swag/swag.yaml#L10-L11), `doc_to_text` and `doc_to_target` given the name of one of the feature each. +```yaml +doc_to_text: startphrase +doc_to_target: label +``` +Hard-coding is also possible as is the case in [SciQ](https://github.com/EleutherAI/lm-evaluation-harness/blob/1710b42d52d0f327cb0eb3cb1bfbbeca992836ca/lm_eval/tasks/sciq/sciq.yaml#L11). +```yaml +doc_to_target: 3 +``` +`doc_to_choice` can be directly given a list of text as option (See [Toxigen](https://github.com/EleutherAI/lm-evaluation-harness/blob/1710b42d52d0f327cb0eb3cb1bfbbeca992836ca/lm_eval/tasks/toxigen/toxigen.yaml#L11)) +```yaml +doc_to_choice: ['No', 'Yes'] +``` + +if a dataset feature is already a list, you can set the name of the feature as `doc_to_choice` (See [Hellaswag](https://github.com/EleutherAI/lm-evaluation-harness/blob/e0eda4d3ffa10e5f65e0976161cd134bec61983a/lm_eval/tasks/hellaswag/hellaswag.yaml#L13)) +``` +doc_to_choice: choices +``` + + + +### Writing a prompt with Jinja 2 + +We support the [Jinja 2](https://jinja.palletsprojects.com/en/3.1.x/) templating language for writing prompts. In practice, this means you can take your dataset's columns and do many basic string manipulations to place each document into prompted format. + +Take for example the dataset `super_glue/boolq`. As input, we'd like to use the features `passage` and `question` and string them together so that for a a sample line `doc`, the model sees something the format of: +``` +doc["passage"] +Question: doc["question"]? +Answer: +``` +We do this by [writing](https://github.com/EleutherAI/lm-evaluation-harness/blob/1710b42d52d0f327cb0eb3cb1bfbbeca992836ca/lm_eval/tasks/super_glue/boolq/default.yaml#L9C1-L9C61) +```yaml +doc_to_text: "{{passage}}\nQuestion: {{question}}?\nAnswer:" +``` +Such that `{{passage}}` will be replaced by `doc["passage"]` and `{{question}}` with `doc["question"]` when rendering the prompt template. + +Our intended output is for the model to predict a single whitespace, and then the answer to the question. We do this via: +```yaml +doc_to_target: "{{answer}}" +``` + + +**Important**: we now add `target_delimiter` between input and target which defaults to " ", such that the full input-output string is `doc_to_target(doc) + target_delimiter + doc_to_text(doc)`. `doc_to_text` and `doc_to_target` should not contain trailing right or left whitespace, respectively. + + +#### Multiple choice format + +For tasks which are multiple choice (a fixed, finite set of label words per each document) and evaluated via comparing loglikelihoods of all label words (the `multiple_choice` task output type) we enforce a particular convention on prompt format. + +An annotated example in the case of SciQ is as follows: + +```yaml +doc_to_text: "{{support.lstrip()}}\nQuestion: {{question}}\nAnswer:" # This is the input portion of the prompt for this doc. It will have " {{choice}}" appended to it as target for each choice in answer_choices. +doc_to_target: 3 # this contains the index into the answer choice list of the correct answer. +doc_to_choice: "{{[distractor1, distractor2, distractor3, correct_answer]}}" +``` +Task implementers are thus able to decide what the answer choices should be for a document, and what prompt format to use. + +The label index can also be sourced from a feature directly. For example in `superglue/boolq`, the label index if defined in the feature `label`. We can set `doc_to_target` as simply `label`. The options or verbalizers can be written in a the form of a list `["no", "yes"]` that will correspond to the label index. + +```yaml +doc_to_text: "{{passage}}\nQuestion: {{question}}?\nAnswer:" +doc_to_target: label +doc_to_choice: ["no", "yes"] +``` + +### Using Python Functions for Prompts + +There may be cases where the prompt we want to implement is easier expressed in Python instead of Jinja 2. For this, we can use Python helper functions that are defined in the YAML config. It should be noted that the function script must be in the same directory as the yaml. + +A good example is WikiText that requires a lot of regex rules to clean the samples. +``` +def wikitext_detokenizer(doc): + string = doc["page"] + # contractions + string = string.replace("s '", "s'") + string = re.sub(r"/' [0-9]/", r"/'[0-9]/", string) + ... + string = string.replace(" 's", "'s") + + return string +``` + +We can load this function in `doc_to_target` by using a `!function` operator after `doc_to_target` and followed by `.`. In the file [wikitext.yaml](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/wikitext/wikitext.yaml) we write: +``` +doc_to_target: !function preprocess_wikitext.wikitext_detokenizer +``` + +### Importing a Prompt from Promptsource + +[Promptsource](https://github.com/bigscience-workshop/promptsource/tree/main/promptsource) is a great repository for crowdsourced prompts for many datasets. We can load these prompts easily by using the `use_prompt` argument and filling it with the format `"promptsource:"`. To use this, `doc_to_text` and `doc_to_target` should be left undefined. This will fetch the template of the dataset defined in the YAML file. + +For example, For Super Glue BoolQ, if we want to use the prompt template `GPT-3 Style` we can add this to the YAML file. +``` +use_prompt: "promptsource:GPT-3 Style" +``` + +If you would like to run evaluation on all prompt templates, you can simply call it this way. +``` +use_prompt: "promptsource:*" +``` + +### Setting metrics + +You're almost done! Now we need to choose how to score our task. +- *If this is a multiple choice task:* do you just want to check your model's accuracy in choosing the correct answer choice? +- *If this is a generation task:* do you just want to check how often your model outputs *exactly the ground-truth output string provided*? + + +If the answer to the above is no: you'll need to record what scoring metrics to use! Metrics can be listed in the following format: + +```yaml +metric_list: + - metric: + aggregation: + higher_is_better: + - metric: !function script.function + aggregation: ... + higher_is_better: ... +``` +`aggregation` and `higher_is_better` can optionally be left out to default to the manually-set defaults if using a natively supported metric, otherwise it must be defined explicitly (for example, when using a custom metric implemented as a function). + +For a full list of natively supported metrics and aggregation functions see [`docs/task_guide.md`](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/docs/task_guide.md). All metrics supported in [HuggingFace Evaluate](https://github.com/huggingface/evaluate/tree/main/metrics) can also be used, and will be loaded if a given metric name is not one natively supported in `lm-eval` or `hf_evaluate` is set to `true`. + +### Optional, More Advanced Setup + +Some tasks may require more advanced processing logic than is described in this guide. + +As a heuristic check: +* Does your task require generating multiple free-form outputs per input document? +* Does your task require complex, multi-step post-processing of generated model outputs? +* Does your task require subsetting documents on the fly based on their content? +* Do you expect to compute metrics after applying multiple such processing steps on your model outputs? +* Does your task rely on metrics that need a custom implementation? + +For more detail on the task system and advanced features, see [`docs/task_guide.md`](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/docs/task_guide.md) . If none of the above sound like they apply to your task, it's time to continue onto checking your task performance! + +### Task name + tags (registering a task) + +To test a task conveniently, it helps to *register* the task--that is, to give it a name and make the `lm-eval` library aware it exists! + +If you're writing your YAML file inside the `lm_eval/tasks` folder, you just need to give your task a name! You can do this inside your YAML file: + +```yaml +task: +``` +Including a task name is mandatory. + +It is often also convenient to label your task with several `tag` values, though this field is optional: + +```yaml +tag: + - tag1 + - tag2 +``` +This will add your task to the `tag1` and `tag2` tags, enabling people to know how to categorize your task, and if desired run all tasks in one of these groups at once, your task along with them. + + +If your task is not in the `lm_eval/tasks` folder, you'll need to tell the Eval Harness where to look for YAML files. + +You can do this via the `--include_path` argument in `__main__.py`. This command will be used to initialize the `TaskManager` object which you can also use for your custom scripts. + +```python +task_manager = TaskManager(args.verbosity, include_path=args.include_path) +``` + +Passing `--tasks /path/to/yaml/file` is also accepted. + + +### Advanced Group Configs + +While `tag` values are helpful when you want to be able to quickly and conveniently run a set of related tasks via `--tasks my_tag_name`, often, we wish to implement more complex logic. For example, the MMLU benchmark contains 57 *subtasks* that must all be *averaged* together in order to report a final 'MMLU score'. + +Groupings of tasks might also use particular variants of a task--for example, we might want to default to evaluating a task as 5-shot when called as part of a given grouping, but not have a preference for number of shots when evaluating it as a standalone. + +We implement this via **groups**, which are distinct from tags. Groups can be implemented via *group config* YAML files, which are laid out similarly but slightly differently to tasks' YAML configs. + +The most basic form of group can be defined via a YAML config similar to the following: + +```yaml +group: nli_tasks +task: + - cb + - anli_r1 + - rte +metadata: + version: 1.0 +``` + +This will behave almost identically to a `tag` that includes these 3 tasks, but with one key distinction: we'll print the `nli_tasks` group as a row (with no associated metrics) in our table of outputs, and visually show that these 3 tasks appear under its subheader. + + +Now, let's assume we actually want to report an aggregate score for `nli_tasks`. We would instead use a YAML config like the following: + +```yaml +group: nli_tasks +task: + - cb + - anli_r1 + - rte +aggregate_metric_list: + - metric: acc + aggregation: mean + weight_by_size: true # defaults to `true`. Set this to `false` to do a "macro" average (taking each subtask's average accuracy, and summing those accuracies and dividing by 3)--by default we do a "micro" average (retain all subtasks' per-document accuracies, and take the mean over all documents' accuracies to get our aggregate mean). +metadata: + version: 1.0 +``` + +Similar to our `metric_list` for listing out the metrics we want to calculate for a given task, we use an `aggregate_metric_list` field to specify which metric name to aggregate across subtasks, what aggregation function to use, and whether we should micro- or macro- average these metrics. See [./task_guide.md](./task_guide.md) for a full list of related sub-keys. + +**[!Tip]: currently, we predominantly only support the aggregation of group metrics that use `mean` (either micro- or macro- averaged) over their subtasks. If you require even more complex aggregation rules, you may want to perform aggregation offline.** + +Group configs can be fairly complex! We can do various operations, such as defining new subtask(s) inline in our group YAML, overriding an existing task's specific config value, or nesting existing groups within our + +For example, let's build a config for evaluating MMLU and a few natural language inference tasks. For MMLU, we can write the name for the benchmark as a subtask written under `task`. You can configure the parameters such as `num_fewshot`. If the task being configured is a group such as `mmlu` or `super_glue`, the parameter set will be applied to all of the subtasks. + +```yaml +group: nli_and_mmlu +task: + - group: nli_tasks + task: + - cb + - anli_r1 + - rte + aggregate_metric_list: + - metric: acc + aggregation: mean + higher_is_better: true + - task: mmlu + num_fewshot: 2 +``` + +### Configuring python classes + +There can occasions when yaml-based tasks cannot accommodate how a task is handled. LM-Eval supports the manually implementing tasks as was previously done before `0.4.x`. To register the task, you can simply make a yaml with the name of the task in `task` and the class object in `class` using the `!function` prefix. + +```yaml +task: squadv2 +class: !function task.SQuAD2 +``` + +This also applies to building group configurations with subtasks that are python classes. + +```yaml +group: scrolls +task: + - task: scrolls_qasper + class: !function task.Qasper + - task: scrolls_quality + class: !function task.QuALITY + - task: scrolls_narrativeqa + class: !function task.NarrativeQA + ... +``` + +You can also pass a custom argument to your class by accepting `config` in the custom class constructor. +Here's how to do it: + +```yaml +task: 20_newsgroups +class: !function task.Unitxt +recipe: card=cards.20_newsgroups,template=templates.classification.multi_class.title +``` + +In this example, `recipe` is the custom argument for the `Unitxt` class. + +## Beautifying Table Display + +To avoid conflict, each task needs to be registered with a unique name. Because of this, slight variations of task are still counted as unique tasks and need to be named uniquely. This could be done by appending an additional naming that may refer to the variation such as in MMLU where the template used to evaluated for flan are differentiated from the default by the prefix `mmlu_flan_*`. Printing the full task names can easily clutter the results table at the end of the evaluation especially when you have a long list of tasks or are using a benchmark that comprises of many tasks. To make it more legible, you can use `task_alias` and `group_alias` to provide an alternative task name and group name that will be printed. For example in `mmlu_abstract_algebra.yaml` we set `task_alias` to `abstract_algebra`. In group configs, a `group_alias` for a group can also be set. + +``` +"dataset_name": "abstract_algebra" +"description": "The following are multiple choice questions (with answers) about abstract\ + \ algebra.\n\n" +"include": "_default_template_yaml" +"task": "mmlu_abstract_algebra" +"task_alias": "abstract_algebra" +``` + +## Checking validity + +After registering your task, you can now check on your data downloading and verify that the few-shot samples look as intended. Run the following command with your desired args: + +```bash +python -m scripts.write_out \ + --output_base_path \ + --tasks \ + --sets \ + --num_fewshot K \ + --num_examples N \ +``` + +Open the file specified at the `--output_base_path ` and ensure it passes +a simple eye test. + +## Versioning + +One key feature in LM Evaluation Harness is the ability to version tasks and groups--that is, mark them with a specific version number that can be bumped whenever a breaking change is made. + +This version info can be provided by adding the following to your new task or group config file: + +``` +metadata: + version: 0 +``` + +Now, whenever a change needs to be made to your task in the future, please increase the version number by 1 so that users can differentiate the different task iterations and versions. + +If you are incrementing a task's version, please also consider adding a changelog to the task's README.md noting the date, PR number, what version you have updated to, and a one-liner describing the change. + +for example, + +* \[Dec 25, 2023\] (PR #999) Version 0.0 -> 1.0: Fixed a bug with answer extraction that led to underestimated performance. + +## Checking performance + equivalence + +It's now time to check models' performance on your task! In the evaluation harness, we intend to support a wide range of evaluation tasks and setups, but prioritize the inclusion of already-proven benchmarks following the precise evaluation setups in the literature where possible. + +To enable this, we provide a checklist that should be completed when contributing a new task, to enable accurate book-keeping and to ensure that tasks added to the library are well-tested and, where applicable, precedented. + +### Task Validity Checklist + +The checklist is the following: + +For adding novel benchmarks/datasets to the library: +* [ ] Is the task an existing benchmark in the literature? + * [ ] Have you referenced the original paper that introduced the task? + * [ ] If yes, does the original paper provide a reference implementation? If so, have you checked against the reference implementation and documented how to run such a test? + + +If other tasks on this dataset are already supported: +* [ ] Is the "Main" variant of this task clearly denoted? +* [ ] Have you provided a short sentence in a README on what each new variant adds / evaluates? +* [ ] Have you noted which, if any, published evaluation setups are matched by this variant? + +It is recommended to include a filled-out copy of this checklist in the README.md for the subfolder you are creating, if you have created a new subfolder in `lm_eval/tasks`. + +**Finally, please add a short description of your task(s), along with a link to its subfolder in lm_eval/tasks , to [`lm_eval/tasks/README.md`](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/README.md) so that users can discover your task in the library, and follow the link to your README for more information about the variants supported, their task names, and the original source of the dataset and/or evaluation setup.** + +## Submitting your task + +You're all set! Now push your work and make a pull request to the `main` branch! Thanks for the contribution :). If there are any questions, please leave a message in the `#lm-thunderdome` channel on the EAI discord! diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/task_guide.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/task_guide.md new file mode 100644 index 0000000000000000000000000000000000000000..34e47c413694eeb8da2d3dc5c743eaba2740e0b0 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/docs/task_guide.md @@ -0,0 +1,317 @@ +# Task Configuration + +The `lm-evaluation-harness` is meant to be an extensible and flexible framework within which many different evaluation tasks can be defined. All tasks in the new version of the harness are built around a YAML configuration file format. + +These YAML configuration files, along with the current codebase commit hash, are intended to be shareable such that providing the YAML config enables another researcher to precisely replicate the evaluation setup used by another, in the case that the prompt or setup differs from standard `lm-eval` task implementations. + +While adding a standard evaluation task on a new dataset can be occasionally as simple as swapping out a Hugging Face dataset path in an existing file, more specialized evaluation setups also exist. Here we'll provide a crash course on the more advanced logic implementable in YAML form available to users. + +If your intended task relies on features beyond what are described in this guide, we'd love to hear about it! Feel free to open an issue describing the scenario on Github, create a PR to the project with a proposed implementation, or ask in the `#lm-thunderdome` channel on the EleutherAI discord. + +## Configurations + +Tasks are configured via the `TaskConfig` object. Below, we describe all fields usable within the object, and their role in defining a task. + +### Parameters + +Task naming + registration: +- **task** (`str`, defaults to None) — name of the task. +- **task_alias** (`str`, defaults to None) - Alias of the task name that will be printed in the final table results. +- **tag** (`str`, *optional*) — name of the task tags(s) a task belongs to. Enables one to run all tasks with a specified tag name at once. + +Dataset configuration options: +- **dataset_path** (`str`) — The name of the dataset as listed by HF in the datasets Hub. +- **dataset_name** (`str`, *optional*, defaults to None) — The name of what HF calls a “data instance” or sub-task of the benchmark. If your task does not contain any data instances, just leave this to default to None. (If you're familiar with the HF `datasets.load_dataset` function, these are just the first 2 arguments to it.) +- **dataset_kwargs** (`dict`, *optional*) — Auxiliary arguments that `datasets.load_dataset` accepts. This can be used to specify arguments such as `data_files` or `data_dir` if you want to use local datafiles such as json or csv. +- **training_split** (`str`, *optional*) — Split in the dataset to use as the training split. +- **validation_split** (`str`, *optional*) — Split in the dataset to use as the validation split. +- **test_split** (`str`, *optional*) — Split in the dataset to use as the test split. +- **fewshot_split** (`str`, *optional*) — Split in the dataset to draw few-shot exemplars from. assert that this not None if num_fewshot > 0. +- **process_docs** (`Callable`, *optional*) — Optionally define a function to apply to each HF dataset split, to preprocess all documents before being fed into prompt template rendering or other evaluation steps. Can be used to rename dataset columns, or to process documents into a format closer to the expected format expected by a prompt template. + +Prompting / in-context formatting options: +- **use_prompt** (`str`, *optional*) — Name of prompt in promptsource to use. if defined, will overwrite doc_to_text, doc_to_target, and doc_to_choice. +- **description** (`str`, *optional*) — An optional prepended Jinja2 template or string which will be prepended to the few-shot examples passed into the model, often describing the task or providing instructions to a model, such as `"The following are questions (with answers) about {{subject}}.\n\n"`. No delimiters or spacing are inserted between the description and the first few-shot example. +- **doc_to_text** (`Union[Callable, str]`, *optional*) — Jinja2 template, string, or function to process a sample into the appropriate input for the model. +- **doc_to_target** (`Union[Callable, str]`, *optional*) — Jinja2 template, string, or function to process a sample into the appropriate target output for the model. For multiple choice tasks, this should return an index into the answer choice list of the correct answer. +- **doc_to_choice** (`Union[Callable, str]`, *optional*) — Jinja2 template, string, or function to process a sample into a list of possible string choices for `multiple_choice` tasks. Left undefined for `generate_until` tasks. +- **fewshot_delimiter** (`str`, *optional*, defaults to "\n\n") — String to insert between few-shot examples. +- **target_delimiter** (`str`, *optional*, defaults to `" "`) — String to insert between input and target output for the datapoint being tested. + +Runtime configuration options: +- **num_fewshot** (`int`, *optional*, defaults to 0) — Number of few-shot examples before the input. +- **batch_size** (`int`, *optional*, defaults to 1) — Batch size. + +Scoring details: +- **metric_list** (`str`, *optional*, defaults to None) — A list of metrics to use for evaluation. See docs for expected format. +- **output_type** (`str`, *optional*, defaults to "generate_until") — Selects the type of model output for the given task. Options are `generate_until`, `loglikelihood`, `loglikelihood_rolling`, and `multiple_choice`. +- **generation_kwargs** (`dict`, *optional*) — Auxiliary arguments for the `generate` function from HF transformers library. Advanced keyword arguments may not be supported for non-HF LM classes. +- **repeats** (`int`, *optional*, defaults to 1) — Number of repeated runs through model for each sample. can be used for cases such as self-consistency. +- **filter_list** (`Union[str, list]`, *optional*) — List of filters to postprocess model outputs. See below for further detail on the filter API. +- **should_decontaminate** (`bool`, *optional*, defaults to False) - Whether to decontaminate or not. +- **doc_to_decontamination_query** (`str`, *optional*) — Query for decontamination if `should_decontaminate` is True. If `should_decontaminate` is True but `doc_to_decontamination_query` is `None`, `doc_to_decontamination_query` will follow `doc_to_text`. + +Other: +- **metadata** (`dict`, *optional*) — An optional field where arbitrary metadata can be passed. Most tasks should include a `version` key in this field that is used to denote the version of the yaml config. Other special metadata keys are: `num_fewshot`, to override the printed `n-shot` table column for a task. + +## Filters + +A key component of the `lm-evaluation-harness` library is the `Filter` object. In a typical evaluation run of the harness, we take the formatted inputs and run them through our LM, with the appropriate output type (greedy or free-form generation, or loglikelihood-based comparative scoring). + +After getting scores or output text from our LM on each `Instance` or document in the dataset, we then need to feed these responses into a metric or scoring function to return scores to a user. + +However, certain tasks may require more complex behavior than directly turning over model outputs to a metric function. For example, we may want to post-process our output text by truncating it or extracting a model's answer, we may want to ensemble over multiple "takes" on a different document, et cetera. + +**Detailed Aside**: +We do such post-processing by operating on *responses*, which are stored after running an LM on an `Instance` from the task in `Instance.resps`. + +`resps` is a `List[str]` for each instance, and we pass a `List[List[]]` to our filters that is a list of `[instance.resps for instance in instances]`. + +Our filters, after completing a pipeline, must return a `List[]` which we then unpack and store each element of in `Instance.filtered_resps` for the corresponding instance. Thus, we take as input a list of returns from our model for each doc, and must return a return from our model *without it being wrapped in a list* for each doc. + +**End Aside** + + +A full list of supported filter operations can be found in `lm_eval/filters/__init__.py`. Contributions of new filter types are welcome! + +### Multiple Filter Pipelines + +Tasks need not be limited to a single filter pipeline. We enable users to run multiple, distinct, filter pipelines on *the same model outputs* generated in one run on a task. + +As a case study, let's look at an implementation of solving the Gsm8k math word problem benchmark in `lm_eval/tasks/gsm8k/gsm8k-cot-self-consistency.yaml`. Here, we are emulating the setup used by [Self-Consistency Improves Chain of Thought Prompting](https://arxiv.org/abs/2203.11171), in which evaluation is performed by generating N chain-of-thought outputs from a model via temperature-based sampling, then selecting the answers output by the model at the end of the chains of thought, then majority voting across all those numeric answers. + +Within our YAML file: + +```yaml +... +repeats: 64 +filter_list: + - name: "score-first" + filter: + - function: "regex" + regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" + - function: "take_first" + - name: "maj@64" + filter: + - function: "regex" + regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" + - function: "majority_vote" + - function: "take_first" + - name: "maj@8" + filter: + - function: "take_first_k" + k: 8 + - function: "regex" + regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" + - function: "majority_vote" + - function: "take_first" +``` + +We are able to provide multiple different filter pipelines, each with their own name and list of filters to apply in sequence. + +Our first filter pipeline implements +- applying a regex to the model generations (extracting the number within the phrase "The answer is (number)") +- selecting only the first out of the 64 model answers + +Then scoring this single answer. + +```yaml +- name: "score-first" + filter: + - function: "regex" + regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" + - function: "take_first" +``` + +Our second filter pipeline, "maj@64", does majority voting across all 64 answers via: +- applying the same regex to all responses, to get the numerical answer from the model for each of the 64 responses per problem +- applying majority voting to all responses, which then returns a length-1 `[]` list for each +- taking the first element of this length-1 list, to then score the sole response `` for each document. + +```yaml +- name: "maj@64" + filter: + - function: "regex" + regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" + - function: "majority_vote" + - function: "take_first" +``` + +Our final filter pipeline, "maj@8", does majority voting across the first 8 of the model's responses per document via: +- subsetting the len-64 list of responses `[answer1, answer2, ..., answer64]` to `[answer1, answer2, ..., answer8]` for each document +- performing the same sequence of filters on these new sets of 8 responses, for each document. +```yaml +- name: "maj@8" + filter: + - function: "take_first_k" + k: 8 + - function: "regex" + regex_pattern: "The answer is (\\-?[0-9\\.\\,]*[0-9]+)" + - function: "majority_vote" + - function: "take_first" +``` + +Thus, given the 64 responses from our LM on each document, we can report metrics on these responses in these 3 different ways, as defined by our filter pipelines. + + +### Adding a custom filter + +Just like adding a custom model with `register_model` decorator one is able to do the same with filters, for example + +```python +from lm_eval.api.filter import Filter +from lm_eval.api.registry import register_filter + +@register_filter("new_filter") +class NewFilter(Filter) + ... +``` + + + +## Embedded Python Code + +Use can use python functions for certain arguments by using the `!function` operator after the argument name followed by `.`. This feature can be used for the following arguments: +1. `doc_to_text` +2. `doc_to_target` +3. `doc_to_choice` +4. `aggregation` for a `metric` in `metric_list` + +## (No Longer Recommended) Direct `Task` Subclassing + +The prior implementation method of new tasks was to subclass `Task`. While we intend to migrate all tasks to the new YAML implementation option going forward, it remains possible to subclass the Task class and implement custom logic. For more information, see `docs/task_guide.md` in v0.3.0 of the `lm-evaluation-harness`. + + +## Including a Base YAML + +You can base a YAML on another YAML file as a template. This can be handy when you need to just change the prompt for `doc_to_text` but keep the rest the same or change `filters` to compare which is better. Simply use `include` in the YAML file and write the name of the template you want to base from. This assumes that the base temeplate is in the same directory. Otherwise, You will need to define the full path. +``` +include: +... +``` +You can find an example of how to use this feature at [gsm8k-cot-self-consistency.yaml](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/gsm8k/gsm8k-cot-self-consistency.yaml) where it is based off [gsm8k-cot.yaml](https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/tasks/gsm8k/gsm8k-cot.yaml) + + +## Passing Arguments to Metrics + +Metrics can be defined in the `metric_list` argument when building the YAML config. Multiple metrics can be listed along with any auxiliary arguments. For example, setting the [`exact_match` metric](https://github.com/huggingface/evaluate/tree/main/metrics/exact_match), auxiliary arguments such as `ignore_case`, `ignore_punctuation`, `regexes_to_ignore` can be listed as well. They will be added to the metric function as `kwargs`. Some metrics have predefined values for `aggregation` and `higher_is_better` so listing the metric name only can be sufficient. + +``` +metric_list: + - metric: acc + - metric: exact_match + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: false + regexes_to_ignore: + - "," + - "\\$" +``` + +### Natively Supported Metrics + +Here we list all metrics currently supported natively in `lm-eval`: + +Metrics: +* `acc` (accuracy) +* `acc_norm` (length-normalized accuracy) +* `acc_mutual_info` (baseline loglikelihood - normalized accuracy) +* `perplexity` +* `word_perplexity` (perplexity per word) +* `byte_perplexity` (perplexity per byte) +* `bits_per_byte` +* `matthews_corrcoef` (Matthews correlation coefficient) +* `f1` (F1 score) +* `bleu` +* `chrf` +* `ter` + +Aggregation functions: +* `mean` +* `median` +* `perplexity` +* `weighted_perplexity` +* `bits_per_byte` + +### Adding a Multiple Choice Metric + +Adding a multiple choice metric has a few steps. To get it working you need to: + +1. register a metric function +2. register an aggregation function +3. update the `Task` definition to make sure the correct arguments are passed + +The default metric and aggregation functions are in `lm_eval/api/metrics.py`, and you can add a function there if it's for general use. The metrics are towards the bottom of the file and look like this: + + + @register_metric( + metric="mcc", + higher_is_better=True, + output_type="multiple_choice", + aggregation="matthews_corrcoef", + ) + def mcc_fn(items): # This is a passthrough function + return items + +Note that many of these are passthrough functions, and for multiple choice (at least) this function is never actually called. + +Aggregation functions are defined towards the top of the file, here's an example: + + @register_aggregation("matthews_corrcoef") + def matthews_corrcoef(items): + unzipped_list = list(zip(*items)) + golds = unzipped_list[0] + preds = unzipped_list[1] + return sklearn.metrics.matthews_corrcoef(golds, preds) + +This function returns a single numeric value. The input is defined in `Task.process_results` in `lm_eval/api/task.py`. There's a section that looks like this: + + + result_dict = { + **({"acc": acc} if "acc" in use_metric else {}), + **({"f1": (gold, pred)} if "f1" in use_metric else {}), + **({"mcc": (gold, pred)} if "mcc" in use_metric else {}), + **({"acc_norm": acc_norm} if "acc_norm" in use_metric else {}), + **({"exact_match": exact_match} if "exact_match" in use_metric else {}), + } + +The value here determines the input to the aggregation function, though the name used matches the metric function. These metrics all have simple needs and just need the accuracy or gold and predicted values, but immediately below this there are examples of metrics with more complicated needs you can use as reference. + +## Good Reference Tasks + +Contributing a new task can be daunting! Luckily, much of the work has often been done for you in a different, similarly evaluated task. Good examples of task implementations to study include: + +Multiple choice tasks: +- SciQ (`lm_eval/tasks/sciq/sciq.yaml`) + +Corpus perplexity evaluations: +- Wikitext (`lm_eval/tasks/wikitext/wikitext.yaml`) + +Generative tasks: +- GSM8k (`lm_eval/tasks/gsm8k/gsm8k.yaml`) + +Tasks using complex filtering: +- GSM8k with CoT (+ with Self-Consistency): (`lm_eval/tasks/gsm8k/gsm8k-cot.yaml` ; `lm_eval/tasks/gsm8k/gsm8k-cot-self-consistency.yaml`) + +# Group Configuration + +When evaluating a language model, it's is not unusual to test across a number of tasks that may not be related to one another in order to assess a variety of capabilities. To this end, it may be combursome to have to list the set of tasks or add a new group name to each yaml of each individual task. + +To solve this, we can create a **group** yaml config. This is a config that contains the names of the tasks that should be included in a particular group. The config consists of two main keys: a `group` key which denotes the name of the group (as it would be called from the command line, e.g. `mmlu`) and a `task` key which is where we can list the tasks. The tasks listed in `task` are the task names that have been registered. A good example of a group yaml config can be found at [../lm_eval/tasks/mmlu/default/_mmlu.yaml]. See also the [New Task Guide](./new_task_guide.md) for a more in-depth and tutorial-esque explanation of how to write complex GroupConfigs. + +## Configurations + +Groups are configured via the `GroupConfig` object. Below, we describe all fields usable within the object, and their role in defining a task. + +### Parameters + +- **group** (`str`, defaults to `None`) — name of the group. Used to invoke it from the command line. +- **group_alias** (`str`, defaults to `None`) - Alternative name for the group that will be printed in the table output. +- **task** (`Union[str, list]`, defaults to `None`) - List of tasks that constitute the group. +- **aggregate_metric_list** (`list`, defaults to `None`) - similar to `metric_list` in TaskConfigs, provide a list of configurations for metrics that should be aggregated across subtasks. Leaving empty will result in no aggregation being performed for this group. Keys for each list entry are: + - `metric: str` - the name of the metric to aggregate over (all subtasks must report a metric holding this name.) + - `aggregation: str` - what aggregation function to apply to aggregate these per-subtask metrics. **currently, only `mean` is supported.** + - `weight_by_size: bool = True` whether to perform micro- averaging (`True`) or macro- (`False`) averaging of subtasks' accuracy scores when reporting the group's metric. MMLU, for example, averages over per-document accuracies (the *micro average*), resulting in the same accuracy as if one simply concatenated all 57 subjects into a single dataset and evaluated accuracy on that dataset. + - `filter_list: Union[str, List[str]] = "none"` - what filter keys one should match on to aggregate results. For example, if trying to aggregate over the `exact_match` metric using `strict-match` filter for `bbh_cot_zeroshot`, then set this to be `filter_list: "strict-match"`. +- **metadata** (`dict`, *optional*) - As with TaskConfigs, a field where extra config metadata can be passed. set the `num_fewshot` key within this to override the printed n_shot value in a results table for your group, for example. diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/lm-eval-overview.ipynb b/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/lm-eval-overview.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..9cb1f5e26a798074a300457e135940cf2dbc9172 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/lm-eval-overview.ipynb @@ -0,0 +1,1232 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Qw83KAePAhaS" + }, + "source": [ + "# Releasing LM-Evaluation-Harness v0.4.0" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Z7k2vq1iAdqr" + }, + "source": [ + "With the vast amount of work done in the field today, it helps to have a tool that people can use easily to share their results and use to check others to ensure reported numbers are valid. The LM Evaluation Harness is one such tool the community has used extensively. We want to continue to support the community and with that in mind, we’re excited to announce a major update on the LM Evaluation Harness to further our goal for open and accessible AI research." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0gDoM0AJAvEc" + }, + "source": [ + "Our refactor stems from our desires to make the following believed best practices easier to carry out. \n", + "\n", + "1. Never copy results from other papers\n", + "2. Always share your exact prompts\n", + "3. Always provide model outputs\n", + "4. Qualitatively review a small batch of outputs before running evaluation jobs at scale\n", + "\n", + "We also wanted to make the library a better experience to use and to contribute or design evaluations within. New features in the new release that serve this purpose include:\n", + "\n", + "1. Faster Evaluation Runtimes (accelerated data-parallel inference with HF Transformers + Accelerate, and commonly used or faster inference libraries such as vLLM and Llama-CPP)\n", + "2. Easier addition and sharing of new tasks (YAML-based task config formats, allowing single-file sharing of custom tasks)\n", + "3. More configurability, for more advanced workflows and easier operation with modifying prompts\n", + "4. Better logging of data at runtime and post-hoc" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nnwsOpjda_YW" + }, + "source": [ + "In this notebook we will be going through a short tutorial on how things work." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zAov81vTbL2K" + }, + "source": [ + "## Install LM-Eval" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8hiosGzq_qZg", + "outputId": "6ab73e5e-1f54-417e-a388-07e0d870b132" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting git+https://github.com/EleutherAI/lm-evaluation-harness.git@big-refactor\n", + " Cloning https://github.com/EleutherAI/lm-evaluation-harness.git (to revision big-refactor) to /tmp/pip-req-build-tnssql5s\n", + " Running command git clone --filter=blob:none --quiet https://github.com/EleutherAI/lm-evaluation-harness.git /tmp/pip-req-build-tnssql5s\n", + " Running command git checkout -b big-refactor --track origin/big-refactor\n", + " Switched to a new branch 'big-refactor'\n", + " Branch 'big-refactor' set up to track remote branch 'big-refactor' from 'origin'.\n", + " Resolved https://github.com/EleutherAI/lm-evaluation-harness.git to commit 42f486ee49b65926a444cb0620870a39a5b4b0a8\n", + " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", + " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + "Collecting accelerate>=0.21.0 (from lm-eval==1.0.0)\n", + " Downloading accelerate-0.24.1-py3-none-any.whl (261 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m261.4/261.4 kB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting evaluate (from lm-eval==1.0.0)\n", + " Downloading evaluate-0.4.1-py3-none-any.whl (84 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m84.1/84.1 kB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting datasets>=2.0.0 (from lm-eval==1.0.0)\n", + " Downloading datasets-2.15.0-py3-none-any.whl (521 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m521.2/521.2 kB\u001b[0m \u001b[31m9.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting jsonlines (from lm-eval==1.0.0)\n", + " Downloading jsonlines-4.0.0-py3-none-any.whl (8.7 kB)\n", + "Requirement already satisfied: numexpr in /usr/local/lib/python3.10/dist-packages (from lm-eval==1.0.0) (2.8.7)\n", + "Collecting peft>=0.2.0 (from lm-eval==1.0.0)\n", + " Downloading peft-0.6.2-py3-none-any.whl (174 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m174.7/174.7 kB\u001b[0m \u001b[31m7.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting pybind11>=2.6.2 (from lm-eval==1.0.0)\n", + " Downloading pybind11-2.11.1-py3-none-any.whl (227 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m227.7/227.7 kB\u001b[0m \u001b[31m12.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting pytablewriter (from lm-eval==1.0.0)\n", + " Downloading pytablewriter-1.2.0-py3-none-any.whl (111 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.1/111.1 kB\u001b[0m \u001b[31m8.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting rouge-score>=0.0.4 (from lm-eval==1.0.0)\n", + " Downloading rouge_score-0.1.2.tar.gz (17 kB)\n", + " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Collecting sacrebleu>=1.5.0 (from lm-eval==1.0.0)\n", + " Downloading sacrebleu-2.3.2-py3-none-any.whl (119 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m119.7/119.7 kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: scikit-learn>=0.24.1 in /usr/local/lib/python3.10/dist-packages (from lm-eval==1.0.0) (1.2.2)\n", + "Collecting sqlitedict (from lm-eval==1.0.0)\n", + " Downloading sqlitedict-2.1.0.tar.gz (21 kB)\n", + " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: torch>=1.8 in /usr/local/lib/python3.10/dist-packages (from lm-eval==1.0.0) (2.1.0+cu118)\n", + "Collecting tqdm-multiprocess (from lm-eval==1.0.0)\n", + " Downloading tqdm_multiprocess-0.0.11-py3-none-any.whl (9.8 kB)\n", + "Requirement already satisfied: transformers>=4.1 in /usr/local/lib/python3.10/dist-packages (from lm-eval==1.0.0) (4.35.2)\n", + "Collecting zstandard (from lm-eval==1.0.0)\n", + " Downloading zstandard-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.4 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.4/5.4 MB\u001b[0m \u001b[31m29.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from accelerate>=0.21.0->lm-eval==1.0.0) (1.23.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from accelerate>=0.21.0->lm-eval==1.0.0) (23.2)\n", + "Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from accelerate>=0.21.0->lm-eval==1.0.0) (5.9.5)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from accelerate>=0.21.0->lm-eval==1.0.0) (6.0.1)\n", + "Requirement already satisfied: huggingface-hub in /usr/local/lib/python3.10/dist-packages (from accelerate>=0.21.0->lm-eval==1.0.0) (0.19.4)\n", + "Requirement already satisfied: pyarrow>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets>=2.0.0->lm-eval==1.0.0) (9.0.0)\n", + "Collecting pyarrow-hotfix (from datasets>=2.0.0->lm-eval==1.0.0)\n", + " Downloading pyarrow_hotfix-0.6-py3-none-any.whl (7.9 kB)\n", + "Collecting dill<0.3.8,>=0.3.0 (from datasets>=2.0.0->lm-eval==1.0.0)\n", + " Downloading dill-0.3.7-py3-none-any.whl (115 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m115.3/115.3 kB\u001b[0m \u001b[31m14.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets>=2.0.0->lm-eval==1.0.0) (1.5.3)\n", + "Requirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from datasets>=2.0.0->lm-eval==1.0.0) (2.31.0)\n", + "Requirement already satisfied: tqdm>=4.62.1 in /usr/local/lib/python3.10/dist-packages (from datasets>=2.0.0->lm-eval==1.0.0) (4.66.1)\n", + "Requirement already satisfied: xxhash in /usr/local/lib/python3.10/dist-packages (from datasets>=2.0.0->lm-eval==1.0.0) (3.4.1)\n", + "Collecting multiprocess (from datasets>=2.0.0->lm-eval==1.0.0)\n", + " Downloading multiprocess-0.70.15-py310-none-any.whl (134 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.8/134.8 kB\u001b[0m \u001b[31m19.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: fsspec[http]<=2023.10.0,>=2023.1.0 in /usr/local/lib/python3.10/dist-packages (from datasets>=2.0.0->lm-eval==1.0.0) (2023.6.0)\n", + "Requirement already satisfied: aiohttp in /usr/local/lib/python3.10/dist-packages (from datasets>=2.0.0->lm-eval==1.0.0) (3.8.6)\n", + "Collecting responses<0.19 (from evaluate->lm-eval==1.0.0)\n", + " Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n", + "Requirement already satisfied: safetensors in /usr/local/lib/python3.10/dist-packages (from peft>=0.2.0->lm-eval==1.0.0) (0.4.0)\n", + "Requirement already satisfied: absl-py in /usr/local/lib/python3.10/dist-packages (from rouge-score>=0.0.4->lm-eval==1.0.0) (1.4.0)\n", + "Requirement already satisfied: nltk in /usr/local/lib/python3.10/dist-packages (from rouge-score>=0.0.4->lm-eval==1.0.0) (3.8.1)\n", + "Requirement already satisfied: six>=1.14.0 in /usr/local/lib/python3.10/dist-packages (from rouge-score>=0.0.4->lm-eval==1.0.0) (1.16.0)\n", + "Collecting portalocker (from sacrebleu>=1.5.0->lm-eval==1.0.0)\n", + " Downloading portalocker-2.8.2-py3-none-any.whl (17 kB)\n", + "Requirement already satisfied: regex in /usr/local/lib/python3.10/dist-packages (from sacrebleu>=1.5.0->lm-eval==1.0.0) (2023.6.3)\n", + "Requirement already satisfied: tabulate>=0.8.9 in /usr/local/lib/python3.10/dist-packages (from sacrebleu>=1.5.0->lm-eval==1.0.0) (0.9.0)\n", + "Collecting colorama (from sacrebleu>=1.5.0->lm-eval==1.0.0)\n", + " Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", + "Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from sacrebleu>=1.5.0->lm-eval==1.0.0) (4.9.3)\n", + "Requirement already satisfied: scipy>=1.3.2 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.24.1->lm-eval==1.0.0) (1.11.3)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.24.1->lm-eval==1.0.0) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.24.1->lm-eval==1.0.0) (3.2.0)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from torch>=1.8->lm-eval==1.0.0) (3.13.1)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from torch>=1.8->lm-eval==1.0.0) (4.5.0)\n", + "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch>=1.8->lm-eval==1.0.0) (1.12)\n", + "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch>=1.8->lm-eval==1.0.0) (3.2.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch>=1.8->lm-eval==1.0.0) (3.1.2)\n", + "Requirement already satisfied: triton==2.1.0 in /usr/local/lib/python3.10/dist-packages (from torch>=1.8->lm-eval==1.0.0) (2.1.0)\n", + "Requirement already satisfied: tokenizers<0.19,>=0.14 in /usr/local/lib/python3.10/dist-packages (from transformers>=4.1->lm-eval==1.0.0) (0.15.0)\n", + "Requirement already satisfied: attrs>=19.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonlines->lm-eval==1.0.0) (23.1.0)\n", + "Requirement already satisfied: setuptools>=38.3.0 in /usr/local/lib/python3.10/dist-packages (from pytablewriter->lm-eval==1.0.0) (67.7.2)\n", + "Collecting DataProperty<2,>=1.0.1 (from pytablewriter->lm-eval==1.0.0)\n", + " Downloading DataProperty-1.0.1-py3-none-any.whl (27 kB)\n", + "Collecting mbstrdecoder<2,>=1.0.0 (from pytablewriter->lm-eval==1.0.0)\n", + " Downloading mbstrdecoder-1.1.3-py3-none-any.whl (7.8 kB)\n", + "Collecting pathvalidate<4,>=2.3.0 (from pytablewriter->lm-eval==1.0.0)\n", + " Downloading pathvalidate-3.2.0-py3-none-any.whl (23 kB)\n", + "Collecting tabledata<2,>=1.3.1 (from pytablewriter->lm-eval==1.0.0)\n", + " Downloading tabledata-1.3.3-py3-none-any.whl (11 kB)\n", + "Collecting tcolorpy<1,>=0.0.5 (from pytablewriter->lm-eval==1.0.0)\n", + " Downloading tcolorpy-0.1.4-py3-none-any.whl (7.9 kB)\n", + "Collecting typepy[datetime]<2,>=1.3.2 (from pytablewriter->lm-eval==1.0.0)\n", + " Downloading typepy-1.3.2-py3-none-any.whl (31 kB)\n", + "Requirement already satisfied: charset-normalizer<4.0,>=2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets>=2.0.0->lm-eval==1.0.0) (3.3.2)\n", + "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets>=2.0.0->lm-eval==1.0.0) (6.0.4)\n", + "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets>=2.0.0->lm-eval==1.0.0) (4.0.3)\n", + "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets>=2.0.0->lm-eval==1.0.0) (1.9.2)\n", + "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets>=2.0.0->lm-eval==1.0.0) (1.4.0)\n", + "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets>=2.0.0->lm-eval==1.0.0) (1.3.1)\n", + "Requirement already satisfied: chardet<6,>=3.0.4 in /usr/local/lib/python3.10/dist-packages (from mbstrdecoder<2,>=1.0.0->pytablewriter->lm-eval==1.0.0) (5.2.0)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets>=2.0.0->lm-eval==1.0.0) (3.4)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets>=2.0.0->lm-eval==1.0.0) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets>=2.0.0->lm-eval==1.0.0) (2023.7.22)\n", + "Requirement already satisfied: python-dateutil<3.0.0,>=2.8.0 in /usr/local/lib/python3.10/dist-packages (from typepy[datetime]<2,>=1.3.2->pytablewriter->lm-eval==1.0.0) (2.8.2)\n", + "Requirement already satisfied: pytz>=2018.9 in /usr/local/lib/python3.10/dist-packages (from typepy[datetime]<2,>=1.3.2->pytablewriter->lm-eval==1.0.0) (2023.3.post1)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch>=1.8->lm-eval==1.0.0) (2.1.3)\n", + "Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from nltk->rouge-score>=0.0.4->lm-eval==1.0.0) (8.1.7)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch>=1.8->lm-eval==1.0.0) (1.3.0)\n", + "Building wheels for collected packages: lm-eval, rouge-score, sqlitedict\n", + " Building wheel for lm-eval (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for lm-eval: filename=lm_eval-1.0.0-py3-none-any.whl size=994254 sha256=88356155b19f2891981ecef948326ad6ce8ca40a6009378410ec20d0e225995a\n", + " Stored in directory: /tmp/pip-ephem-wheel-cache-9v6ye7h3/wheels/17/01/26/599c0779e9858a70a73fa8a306699b5b9a868f820c225457b0\n", + " Building wheel for rouge-score (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for rouge-score: filename=rouge_score-0.1.2-py3-none-any.whl size=24933 sha256=6bb0d44e4881972c43ce194e7cb65233d309758cb15f0dec54590d3d2efcfc36\n", + " Stored in directory: /root/.cache/pip/wheels/5f/dd/89/461065a73be61a532ff8599a28e9beef17985c9e9c31e541b4\n", + " Building wheel for sqlitedict (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for sqlitedict: filename=sqlitedict-2.1.0-py3-none-any.whl size=16863 sha256=5747f7dd73ddf3d8fbcebf51b5e4f718fabe1e94bccdf16d2f22a2e65ee7fdf4\n", + " Stored in directory: /root/.cache/pip/wheels/79/d6/e7/304e0e6cb2221022c26d8161f7c23cd4f259a9e41e8bbcfabd\n", + "Successfully built lm-eval rouge-score sqlitedict\n", + "Installing collected packages: sqlitedict, zstandard, tcolorpy, pybind11, pyarrow-hotfix, portalocker, pathvalidate, mbstrdecoder, jsonlines, dill, colorama, typepy, tqdm-multiprocess, sacrebleu, rouge-score, responses, multiprocess, accelerate, datasets, DataProperty, tabledata, peft, evaluate, pytablewriter, lm-eval\n", + "Successfully installed DataProperty-1.0.1 accelerate-0.24.1 colorama-0.4.6 datasets-2.15.0 dill-0.3.7 evaluate-0.4.1 jsonlines-4.0.0 lm-eval-1.0.0 mbstrdecoder-1.1.3 multiprocess-0.70.15 pathvalidate-3.2.0 peft-0.6.2 portalocker-2.8.2 pyarrow-hotfix-0.6 pybind11-2.11.1 pytablewriter-1.2.0 responses-0.18.0 rouge-score-0.1.2 sacrebleu-2.3.2 sqlitedict-2.1.0 tabledata-1.3.3 tcolorpy-0.1.4 tqdm-multiprocess-0.0.11 typepy-1.3.2 zstandard-0.22.0\n" + ] + } + ], + "source": [ + "# Install LM-Eval\n", + "!pip install git+https://github.com/EleutherAI/lm-evaluation-harness.git" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 0, + "referenced_widgets": [ + "a1d3a8aa016544a78e8821c8f6199e06", + "f61ed33fad754146bdd2ac9db1ba1c48", + "bfa0af6aeff344c6845e1080a878e92e", + "fd1ad9e0367d4004aae853b91c3a7617", + "6b2d90209ec14230b3d58a74ac9b83bf", + "a73f357065d34d7baf0453ae4a8d75e2", + "46f521b73fd943c081c648fd873ebc0a", + "7c5689bc13684db8a22681f41863dddd", + "48763b6233374554ae76035c0483066f", + "4986a21eb560448fa79f4b25cde48951", + "aed3acd2f2d74003b44079c333a0698e" + ] + }, + "id": "uyO5MaKkZyah", + "outputId": "d46e8096-5086-4e49-967e-ea33d4a2a335" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a1d3a8aa016544a78e8821c8f6199e06", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading builder script: 0%| | 0.00/5.67k [00:00\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "fthNg3ywO-kA" + }, + "outputs": [], + "source": [ + "YAML_cola_string = \"\"\"\n", + "tag: yes_or_no_tasks\n", + "task: demo_cola\n", + "dataset_path: glue\n", + "dataset_name: cola\n", + "output_type: multiple_choice\n", + "training_split: train\n", + "validation_split: validation\n", + "doc_to_text: \"{{sentence}}\\nQuestion: Does this sentence make sense?\\nAnswer:\"\n", + "doc_to_target: label\n", + "doc_to_choice: [\"no\", \"yes\"]\n", + "should_decontaminate: true\n", + "doc_to_decontamination_query: sentence\n", + "metric_list:\n", + " - metric: acc\n", + "\"\"\"\n", + "with open(\"cola.yaml\", \"w\") as f:\n", + " f.write(YAML_cola_string)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "XceRKCuuDtbn" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-11-29:11:56:33,016 INFO [utils.py:160] NumExpr defaulting to 2 threads.\n", + "2023-11-29 11:56:33.852995: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-11-29 11:56:33.853050: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-11-29 11:56:33.853087: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-11-29 11:56:35.129047: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2023-11-29:11:56:38,546 INFO [__main__.py:132] Verbosity set to INFO\n", + "2023-11-29:11:56:47,509 WARNING [__main__.py:138] --limit SHOULD ONLY BE USED FOR TESTING.REAL METRICS SHOULD NOT BE COMPUTED USING LIMIT.\n", + "2023-11-29:11:56:47,509 INFO [__main__.py:143] Including path: ./\n", + "2023-11-29:11:56:47,517 INFO [__main__.py:205] Selected Tasks: ['yes_or_no_tasks']\n", + "2023-11-29:11:56:47,520 WARNING [evaluator.py:93] generation_kwargs specified through cli, these settings will be used over set parameters in yaml tasks.\n", + "2023-11-29:11:56:47,550 INFO [huggingface.py:120] Using device 'cuda'\n", + "2023-11-29:11:57:08,743 WARNING [task.py:614] [Task: demo_cola] metric acc is defined, but aggregation is not. using default aggregation=mean\n", + "2023-11-29:11:57:08,743 WARNING [task.py:626] [Task: demo_cola] metric acc is defined, but higher_is_better is not. using default higher_is_better=True\n", + "Downloading builder script: 100% 28.8k/28.8k [00:00<00:00, 52.7MB/s]\n", + "Downloading metadata: 100% 28.7k/28.7k [00:00<00:00, 51.9MB/s]\n", + "Downloading readme: 100% 27.9k/27.9k [00:00<00:00, 48.0MB/s]\n", + "Downloading data: 100% 377k/377k [00:00<00:00, 12.0MB/s]\n", + "Generating train split: 100% 8551/8551 [00:00<00:00, 19744.58 examples/s]\n", + "Generating validation split: 100% 1043/1043 [00:00<00:00, 27057.01 examples/s]\n", + "Generating test split: 100% 1063/1063 [00:00<00:00, 22705.17 examples/s]\n", + "2023-11-29:11:57:11,698 INFO [task.py:355] Building contexts for task on rank 0...\n", + "2023-11-29:11:57:11,704 INFO [evaluator.py:319] Running loglikelihood requests\n", + "100% 20/20 [00:03<00:00, 5.15it/s]\n", + "fatal: not a git repository (or any of the parent directories): .git\n", + "hf (pretrained=EleutherAI/pythia-2.8b), gen_kwargs: (), limit: 10.0, num_fewshot: None, batch_size: 1\n", + "| Tasks |Version|Filter|n-shot|Metric|Value| |Stderr|\n", + "|---------------|-------|------|-----:|------|----:|---|-----:|\n", + "|yes_or_no_tasks|N/A |none | 0|acc | 0.7|± |0.1528|\n", + "| - demo_cola |Yaml |none | 0|acc | 0.7|± |0.1528|\n", + "\n", + "| Groups |Version|Filter|n-shot|Metric|Value| |Stderr|\n", + "|---------------|-------|------|-----:|------|----:|---|-----:|\n", + "|yes_or_no_tasks|N/A |none | 0|acc | 0.7|± |0.1528|\n", + "\n" + ] + } + ], + "source": [ + "# !accelerate launch --no_python\n", + "!lm_eval \\\n", + " --model hf \\\n", + " --model_args pretrained=EleutherAI/pythia-2.8b \\\n", + " --include_path ./ \\\n", + " --tasks yes_or_no_tasks \\\n", + " --limit 10 \\\n", + " --output output/yes_or_no_tasks/ \\\n", + " --log_samples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XceRKCuuDtbn" + }, + "source": [ + "## Edit Prompt Templates Quickly\n", + "\n", + "The following is a yaml made to evaluate the specific subtask of `high_school_geography` from MMLU. It uses the standard prompt where the we choose the letters from the options with most likelihood as the model's prediction." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "GTFvdt9kSlBG" + }, + "outputs": [], + "source": [ + "YAML_mmlu_geo_string = \"\"\"\n", + "task: demo_mmlu_high_school_geography\n", + "dataset_path: cais/mmlu\n", + "dataset_name: high_school_geography\n", + "description: \"The following are multiple choice questions (with answers) about high school geography.\\n\\n\"\n", + "test_split: test\n", + "fewshot_split: dev\n", + "fewshot_config:\n", + " sampler: first_n\n", + "output_type: multiple_choice\n", + "doc_to_text: \"{{question.strip()}}\\nA. {{choices[0]}}\\nB. {{choices[1]}}\\nC. {{choices[2]}}\\nD. {{choices[3]}}\\nAnswer:\"\n", + "doc_to_choice: [\"A\", \"B\", \"C\", \"D\"]\n", + "doc_to_target: answer\n", + "metric_list:\n", + " - metric: acc\n", + " aggregation: mean\n", + " higher_is_better: true\n", + " - metric: acc_norm\n", + " aggregation: mean\n", + " higher_is_better: true\n", + "\"\"\"\n", + "with open(\"mmlu_high_school_geography.yaml\", \"w\") as f:\n", + " f.write(YAML_mmlu_geo_string)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "jyKOfCsKb-xy" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-11-29:11:57:23,598 INFO [utils.py:160] NumExpr defaulting to 2 threads.\n", + "2023-11-29 11:57:24.719750: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-11-29 11:57:24.719806: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-11-29 11:57:24.719847: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-11-29 11:57:26.656125: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2023-11-29:11:57:31,563 INFO [__main__.py:132] Verbosity set to INFO\n", + "2023-11-29:11:57:40,541 WARNING [__main__.py:138] --limit SHOULD ONLY BE USED FOR TESTING.REAL METRICS SHOULD NOT BE COMPUTED USING LIMIT.\n", + "2023-11-29:11:57:40,541 INFO [__main__.py:143] Including path: ./\n", + "2023-11-29:11:57:40,558 INFO [__main__.py:205] Selected Tasks: ['demo_mmlu_high_school_geography']\n", + "2023-11-29:11:57:40,559 WARNING [evaluator.py:93] generation_kwargs specified through cli, these settings will be used over set parameters in yaml tasks.\n", + "2023-11-29:11:57:40,589 INFO [huggingface.py:120] Using device 'cuda'\n", + "Downloading builder script: 100% 5.84k/5.84k [00:00<00:00, 17.7MB/s]\n", + "Downloading metadata: 100% 106k/106k [00:00<00:00, 892kB/s] \n", + "Downloading readme: 100% 39.7k/39.7k [00:00<00:00, 631kB/s]\n", + "Downloading data: 100% 166M/166M [00:01<00:00, 89.0MB/s]\n", + "Generating auxiliary_train split: 100% 99842/99842 [00:07<00:00, 12536.83 examples/s]\n", + "Generating test split: 100% 198/198 [00:00<00:00, 1439.20 examples/s]\n", + "Generating validation split: 100% 22/22 [00:00<00:00, 4181.76 examples/s]\n", + "Generating dev split: 100% 5/5 [00:00<00:00, 36.25 examples/s]\n", + "2023-11-29:11:58:09,798 INFO [task.py:355] Building contexts for task on rank 0...\n", + "2023-11-29:11:58:09,822 INFO [evaluator.py:319] Running loglikelihood requests\n", + "100% 40/40 [00:05<00:00, 7.86it/s]\n", + "fatal: not a git repository (or any of the parent directories): .git\n", + "hf (pretrained=EleutherAI/pythia-2.8b), gen_kwargs: (), limit: 10.0, num_fewshot: None, batch_size: 1\n", + "| Tasks |Version|Filter|n-shot| Metric |Value| |Stderr|\n", + "|-------------------------------|-------|------|-----:|--------|----:|---|-----:|\n", + "|demo_mmlu_high_school_geography|Yaml |none | 0|acc | 0.3|± |0.1528|\n", + "| | |none | 0|acc_norm| 0.3|± |0.1528|\n", + "\n" + ] + } + ], + "source": [ + "# !accelerate launch --no_python\n", + "!lm_eval \\\n", + " --model hf \\\n", + " --model_args pretrained=EleutherAI/pythia-2.8b \\\n", + " --include_path ./ \\\n", + " --tasks demo_mmlu_high_school_geography \\\n", + " --limit 10 \\\n", + " --output output/mmlu_high_school_geography/ \\\n", + " --log_samples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jyKOfCsKb-xy" + }, + "source": [ + "We could also evaluate this task in a different way. For example, instead of observing the loglikelihood of the letters, we can instead evaluate on the choices themselves as the continuation. This is done by simply changing `doc_to_choice` from a list of letters to the corresponding `choices` field from the HF dataset. We write `\"{{choices}}\"` so that the string field is interpreted as jinja string that acquires the list from the HF dataset directly.\n", + "\n", + "Another convenient feature here is since we're only modifying the `doc_to_choice` and the rest of config is the same as the task above, we can use the above configuration as a template by using `include: mmlu_high_school_geography.yaml` to load the config from that file. We'll need to add a unique task name as to not colide with the existing yaml config we're including. For this case we'll simply name this one `mmlu_high_school_geography_continuation`. `doc_to_text` is added here just for sake of clarity." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "lqElwU54TaK-" + }, + "outputs": [], + "source": [ + "YAML_mmlu_geo_string = \"\"\"\n", + "include: mmlu_high_school_geography.yaml\n", + "task: demo_mmlu_high_school_geography_continuation\n", + "doc_to_text: \"{{question.strip()}}\\nA. {{choices[0]}}\\nB. {{choices[1]}}\\nC. {{choices[2]}}\\nD. {{choices[3]}}\\nAnswer:\"\n", + "doc_to_choice: \"{{choices}}\"\n", + "\"\"\"\n", + "with open(\"mmlu_high_school_geography_continuation.yaml\", \"w\") as f:\n", + " f.write(YAML_mmlu_geo_string)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "-_CVnDirdy7j" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-11-29:11:58:21,284 INFO [utils.py:160] NumExpr defaulting to 2 threads.\n", + "2023-11-29 11:58:22.850159: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-11-29 11:58:22.850219: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-11-29 11:58:22.850254: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-11-29 11:58:24.948103: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2023-11-29:11:58:28,460 INFO [__main__.py:132] Verbosity set to INFO\n", + "2023-11-29:11:58:37,935 WARNING [__main__.py:138] --limit SHOULD ONLY BE USED FOR TESTING.REAL METRICS SHOULD NOT BE COMPUTED USING LIMIT.\n", + "2023-11-29:11:58:37,935 INFO [__main__.py:143] Including path: ./\n", + "2023-11-29:11:58:37,969 INFO [__main__.py:205] Selected Tasks: ['demo_mmlu_high_school_geography_continuation']\n", + "2023-11-29:11:58:37,972 WARNING [evaluator.py:93] generation_kwargs specified through cli, these settings will be used over set parameters in yaml tasks.\n", + "2023-11-29:11:58:38,008 INFO [huggingface.py:120] Using device 'cuda'\n", + "2023-11-29:11:58:59,758 INFO [task.py:355] Building contexts for task on rank 0...\n", + "2023-11-29:11:58:59,777 INFO [evaluator.py:319] Running loglikelihood requests\n", + "100% 40/40 [00:02<00:00, 16.23it/s]\n", + "fatal: not a git repository (or any of the parent directories): .git\n", + "hf (pretrained=EleutherAI/pythia-2.8b), gen_kwargs: (), limit: 10.0, num_fewshot: None, batch_size: 1\n", + "| Tasks |Version|Filter|n-shot| Metric |Value| |Stderr|\n", + "|--------------------------------------------|-------|------|-----:|--------|----:|---|-----:|\n", + "|demo_mmlu_high_school_geography_continuation|Yaml |none | 0|acc | 0.1|± |0.1000|\n", + "| | |none | 0|acc_norm| 0.2|± |0.1333|\n", + "\n" + ] + } + ], + "source": [ + "# !accelerate launch --no_python\n", + "!lm_eval \\\n", + " --model hf \\\n", + " --model_args pretrained=EleutherAI/pythia-2.8b \\\n", + " --include_path ./ \\\n", + " --tasks demo_mmlu_high_school_geography_continuation \\\n", + " --limit 10 \\\n", + " --output output/mmlu_high_school_geography_continuation/ \\\n", + " --log_samples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-_CVnDirdy7j" + }, + "source": [ + "If we take a look at the samples, we can see that it is in fact evaluating the continuation based on the choices rather than the letters." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "duBDqC6PAdjL" + }, + "outputs": [ + { + "data": { + "application/javascript": "\n ((filepath) => {{\n if (!google.colab.kernel.accessAllowed) {{\n return;\n }}\n google.colab.files.view(filepath);\n }})(\"/content/output/mmlu_high_school_geography_continuation/pretrained__EleutherAI__pythia-2.8b_demo_mmlu_high_school_geography_continuation.jsonl\")", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from google.colab import files\n", + "\n", + "\n", + "files.view(\n", + " \"output/mmlu_high_school_geography_continuation/pretrained__EleutherAI__pythia-2.8b_demo_mmlu_high_school_geography_continuation.jsonl\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6p0-KPwAgK5j" + }, + "source": [ + "## Closer Look at YAML Fields\n", + "\n", + "To prepare a task we can simply fill in a YAML config with the relevant information.\n", + "\n", + "`output_type`\n", + "The current provided evaluation types comprise of the following:\n", + "1. `loglikelihood`: Evaluates the loglikelihood of a continuation, conditioned on some input string.\n", + "2. `loglikelihood_rolling`: evaluate the loglikelihood of producing a string, conditioned on the empty string. (Used for perplexity evaluations)\n", + "3. `multiple_choice`: Evaluates loglikelihood among the a number of choices predicted by the model.\n", + "4. `greedy_until`: Model outputs greedy generation (can be configured to to use beam search and other generation-related parameters)\n", + "\n", + "The core prompt revolves around 3 fields.\n", + "1. `doc_to_text`: Denotes the prompt template that will be used as input to the model.\n", + "2. `doc_to_choice`: Available choices that will be used as continuation for the model. This is used when the `output_type` is `multiple_choice`, and otherwise can be left as `None`.\n", + "3. `doc_to_target`: When `output_type` is `multiple_choice`, this can be an index that corresponds to the correct answer, or the answer string itself (must be a subset of `doc_to_choice`). For other tasks, this is expected to be a string. You can fill this field with a feature name from the HF dataset so long as the resulting feature follows the conditioned described.\n", + "\n", + "These three fields can be expressed as strings, column names from the source dataset, or as Jinja2 templates that can use fields from the source dataset as variables.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6p0-KPwAgK5j" + }, + "source": [ + "## What if Jinja is not Sufficient?\n", + "\n", + "There can be times where the Jinja2 templating language is not enough to make the prompt we had in mind. There are a few ways to circumvent this limitation:\n", + "\n", + "1. Use `!function` operator for the prompt-related fields to pass a python function that takes as input the dataset row, and will output the prompt template component.\n", + "2. Perform a transformation on the dataset beforehand." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below, we show an example of using `!function` to create `doc_to_text` from a python function:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DYZ5c0JhR1lJ", + "outputId": "ca945235-fb9e-4f17-8bfa-78e7d6ec1490" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-11-29:11:59:08,312 INFO [utils.py:160] NumExpr defaulting to 2 threads.\n", + "2023-11-29 11:59:09.348327: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-11-29 11:59:09.348387: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-11-29 11:59:09.348421: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-11-29 11:59:10.573752: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2023-11-29:11:59:14,044 INFO [__main__.py:132] Verbosity set to INFO\n", + "2023-11-29:11:59:23,654 WARNING [__main__.py:138] --limit SHOULD ONLY BE USED FOR TESTING.REAL METRICS SHOULD NOT BE COMPUTED USING LIMIT.\n", + "2023-11-29:11:59:23,654 INFO [__main__.py:143] Including path: ./\n", + "2023-11-29:11:59:23,678 INFO [__main__.py:205] Selected Tasks: ['demo_mmlu_high_school_geography_function_prompt']\n", + "2023-11-29:11:59:23,679 WARNING [evaluator.py:93] generation_kwargs specified through cli, these settings will be used over set parameters in yaml tasks.\n", + "2023-11-29:11:59:23,708 INFO [huggingface.py:120] Using device 'cuda'\n", + "2023-11-29:11:59:44,516 INFO [task.py:355] Building contexts for task on rank 0...\n", + "2023-11-29:11:59:44,524 INFO [evaluator.py:319] Running loglikelihood requests\n", + "100% 40/40 [00:02<00:00, 15.41it/s]\n", + "fatal: not a git repository (or any of the parent directories): .git\n", + "hf (pretrained=EleutherAI/pythia-2.8b), gen_kwargs: (), limit: 10.0, num_fewshot: None, batch_size: 1\n", + "| Tasks |Version|Filter|n-shot| Metric |Value| |Stderr|\n", + "|-----------------------------------------------|-------|------|-----:|--------|----:|---|-----:|\n", + "|demo_mmlu_high_school_geography_function_prompt|Yaml |none | 0|acc | 0.1|± |0.1000|\n", + "| | |none | 0|acc_norm| 0.2|± |0.1333|\n", + "\n" + ] + } + ], + "source": [ + "YAML_mmlu_geo_string = \"\"\"\n", + "include: mmlu_high_school_geography.yaml\n", + "task: demo_mmlu_high_school_geography_function_prompt\n", + "doc_to_text: !function utils.doc_to_text\n", + "doc_to_choice: \"{{choices}}\"\n", + "\"\"\"\n", + "with open(\"demo_mmlu_high_school_geography_function_prompt.yaml\", \"w\") as f:\n", + " f.write(YAML_mmlu_geo_string)\n", + "\n", + "DOC_TO_TEXT = \"\"\"\n", + "def doc_to_text(x):\n", + " question = x[\"question\"].strip()\n", + " choices = x[\"choices\"]\n", + " option_a = choices[0]\n", + " option_b = choices[1]\n", + " option_c = choices[2]\n", + " option_d = choices[3]\n", + " return f\"{question}\\\\nA. {option_a}\\\\nB. {option_b}\\\\nC. {option_c}\\\\nD. {option_d}\\\\nAnswer:\"\n", + "\"\"\"\n", + "with open(\"utils.py\", \"w\") as f:\n", + " f.write(DOC_TO_TEXT)\n", + "\n", + "!lm_eval \\\n", + " --model hf \\\n", + " --model_args pretrained=EleutherAI/pythia-2.8b \\\n", + " --include_path ./ \\\n", + " --tasks demo_mmlu_high_school_geography_function_prompt \\\n", + " --limit 10 \\\n", + " --output output/demo_mmlu_high_school_geography_function_prompt/ \\\n", + " --log_samples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we'll also show how to do this via preprocessing the dataset as necessary using the `process_docs` config field:\n", + "\n", + "We will write a function that will modify each document in our evaluation dataset's split to add a field that is suitable for us to use in `doc_to_text`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "YAML_mmlu_geo_string = \"\"\"\n", + "include: mmlu_high_school_geography.yaml\n", + "task: demo_mmlu_high_school_geography_function_prompt_2\n", + "process_docs: !function utils_process_docs.process_docs\n", + "doc_to_text: \"{{input}}\"\n", + "doc_to_choice: \"{{choices}}\"\n", + "\"\"\"\n", + "with open(\"demo_mmlu_high_school_geography_process_docs.yaml\", \"w\") as f:\n", + " f.write(YAML_mmlu_geo_string)\n", + "\n", + "DOC_TO_TEXT = \"\"\"\n", + "def process_docs(dataset):\n", + " def _process_doc(x):\n", + " question = x[\"question\"].strip()\n", + " choices = x[\"choices\"]\n", + " option_a = choices[0]\n", + " option_b = choices[1]\n", + " option_c = choices[2]\n", + " option_d = choices[3]\n", + " doc[\"input\"] = f\"{question}\\\\nA. {option_a}\\\\nB. {option_b}\\\\nC. {option_c}\\\\nD. {option_d}\\\\nAnswer:\"\n", + " return out_doc\n", + "\n", + " return dataset.map(_process_doc)\n", + "\"\"\"\n", + "\n", + "with open(\"utils_process_docs.py\", \"w\") as f:\n", + " f.write(DOC_TO_TEXT)\n", + "\n", + "!lm_eval \\\n", + " --model hf \\\n", + " --model_args pretrained=EleutherAI/pythia-2.8b \\\n", + " --include_path ./ \\\n", + " --tasks demo_mmlu_high_school_geography_function_prompt_2 \\\n", + " --limit 10 \\\n", + " --output output/demo_mmlu_high_school_geography_function_prompt_2/ \\\n", + " --log_samples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We hope that this explainer gives you a sense of what can be done with and how to work with LM-Evaluation-Harnes v0.4.0 ! \n", + "\n", + "For more information, check out our documentation pages in the `docs/` folder, and if you have questions, please raise them in GitHub issues, or in #lm-thunderdome or #release-discussion on the EleutherAI discord server." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [ + "zAov81vTbL2K" + ], + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "46f521b73fd943c081c648fd873ebc0a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "48763b6233374554ae76035c0483066f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4986a21eb560448fa79f4b25cde48951": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b2d90209ec14230b3d58a74ac9b83bf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7c5689bc13684db8a22681f41863dddd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a1d3a8aa016544a78e8821c8f6199e06": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f61ed33fad754146bdd2ac9db1ba1c48", + "IPY_MODEL_bfa0af6aeff344c6845e1080a878e92e", + "IPY_MODEL_fd1ad9e0367d4004aae853b91c3a7617" + ], + "layout": "IPY_MODEL_6b2d90209ec14230b3d58a74ac9b83bf" + } + }, + "a73f357065d34d7baf0453ae4a8d75e2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aed3acd2f2d74003b44079c333a0698e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bfa0af6aeff344c6845e1080a878e92e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7c5689bc13684db8a22681f41863dddd", + "max": 5669, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_48763b6233374554ae76035c0483066f", + "value": 5669 + } + }, + "f61ed33fad754146bdd2ac9db1ba1c48": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a73f357065d34d7baf0453ae4a8d75e2", + "placeholder": "​", + "style": "IPY_MODEL_46f521b73fd943c081c648fd873ebc0a", + "value": "Downloading builder script: 100%" + } + }, + "fd1ad9e0367d4004aae853b91c3a7617": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4986a21eb560448fa79f4b25cde48951", + "placeholder": "​", + "style": "IPY_MODEL_aed3acd2f2d74003b44079c333a0698e", + "value": " 5.67k/5.67k [00:00<00:00, 205kB/s]" + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/visualize-wandb.ipynb b/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/visualize-wandb.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..70d25fe608bba91199d12737b55054079d007c2d --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/visualize-wandb.ipynb @@ -0,0 +1,172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fc477b96-adee-4829-a9d7-a5eb990df358", + "metadata": {}, + "source": [ + "# Visualizing Results in Weights and Biases\n", + "\n", + "With the Weights and Biases integration, you can now spend more time extracting deeper insights into your evaluation results. The integration is designed to streamline the process of logging and visualizing experiment results using the Weights & Biases (W&B) platform.\n", + "\n", + "The integration provide functionalities\n", + "\n", + "- to automatically log the evaluation results,\n", + "- log the samples as W&B Tables for easy visualization,\n", + "- log the `results.json` file as an artifact for version control,\n", + "- log the `_eval_samples.json` file if the samples are logged,\n", + "- generate a comprehensive report for analysis and visualization with all the important metric,\n", + "- log task and cli configs,\n", + "- and more out of the box like the command used to run the evaluation, GPU/CPU counts, timestamp, etc.\n", + "\n", + "The integration is super easy to use with the eval harness. Let's see how!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3851439a-bff4-41f2-bf21-1b3d8704913b", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Install this project if you did not already have it.\n", + "# This is all that is needed to be installed to start using Weights and Biases\n", + "\n", + "!pip -qq install -e ..[wandb]" + ] + }, + { + "cell_type": "markdown", + "id": "8507fd7e-3b99-4a92-89fa-9eaada74ba91", + "metadata": {}, + "source": [ + "# Run the Eval Harness\n", + "\n", + "Run the eval harness as usual with a `wandb_args` flag. This flag is used to provide arguments for initializing a wandb run ([wandb.init](https://docs.wandb.ai/ref/python/init)) as comma separated string arguments.\n", + "\n", + "If `wandb_args` flag is used, the metrics and all other goodness will be automatically logged to Weights and Biases. In the stdout, you will find the link to the W&B run page as well as link to the generated report." + ] + }, + { + "cell_type": "markdown", + "id": "eec5866e-f01e-42f8-8803-9d77472ef991", + "metadata": {}, + "source": [ + "## Set your API Key\n", + "\n", + "Before you can use W&B, you need to authenticate your machine with an authentication key. Visit https://wandb.ai/authorize to get one." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d824d163-71a9-4313-935d-f1d56397841c", + "metadata": {}, + "outputs": [], + "source": [ + "import wandb\n", + "\n", + "\n", + "wandb.login()" + ] + }, + { + "cell_type": "markdown", + "id": "124e4a34-1547-4bed-bc09-db012bacbda6", + "metadata": {}, + "source": [ + "> Note that if you are using command line you can simply authenticate your machine by doing `wandb login` in your terminal. For more info check out the [documentation](https://docs.wandb.ai/quickstart#2-log-in-to-wb)." + ] + }, + { + "cell_type": "markdown", + "id": "abc6f6b6-179a-4aff-ada9-f380fb74df6e", + "metadata": {}, + "source": [ + "## Run and log to W&B" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd0a8130-a97b-451a-acd2-3f9885b88643", + "metadata": {}, + "outputs": [], + "source": [ + "!lm_eval \\\n", + " --model hf \\\n", + " --model_args pretrained=microsoft/phi-2,trust_remote_code=True \\\n", + " --tasks hellaswag,mmlu_abstract_algebra \\\n", + " --device cuda:0 \\\n", + " --batch_size 8 \\\n", + " --output_path output/phi-2 \\\n", + " --limit 10 \\\n", + " --wandb_args project=lm-eval-harness-integration \\\n", + " --log_samples" + ] + }, + { + "cell_type": "markdown", + "id": "e974cabdbe70b667", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "id": "5178ca9445b844e4", + "metadata": {}, + "source": [ + "W&B can also be initialized programmatically for use outside the CLI to parse and log the results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6a421b2cf3ddac5", + "metadata": {}, + "outputs": [], + "source": [ + "import lm_eval\n", + "from lm_eval.loggers import WandbLogger\n", + "\n", + "\n", + "results = lm_eval.simple_evaluate(\n", + " model=\"hf\",\n", + " model_args=\"pretrained=microsoft/phi-2,trust_remote_code=True\",\n", + " tasks=\"hellaswag,mmlu_abstract_algebra\",\n", + " log_samples=True,\n", + ")\n", + "\n", + "wandb_logger = WandbLogger(\n", + " project=\"lm-eval-harness-integration\", job_type=\"eval\"\n", + ") # or empty if wandb.init(...) already called before\n", + "wandb_logger.post_init(results)\n", + "wandb_logger.log_eval_result()\n", + "wandb_logger.log_eval_samples(results[\"samples\"]) # if log_samples" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/visualize-zeno.ipynb b/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/visualize-zeno.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..4ceabbf4253fde9e14d4cff5e088e1cbe66f457f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/examples/visualize-zeno.ipynb @@ -0,0 +1,115 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Visualizing Results in Zeno\n", + "\n", + "Benchmarking your models is the first step towards making sure your model performs well.\n", + "However, looking at the data behind the benchmark, slicing the data into subsets, and comparing models on individual instances can help you even more in evaluating and quantifying the behavior of your AI system.\n", + "\n", + "All of this can be done in [Zeno](https://zenoml.com)!\n", + "Zeno is super easy to use with the eval harness, let's explore how you can easily upload and visualize your eval results.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Install this project if you did not already do that. This is all that needs to be installed for you to be able to visualize your data in Zeno!\n", + "!pip install -e ..\n", + "!pip install -e ..[zeno]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Run the Eval Harness\n", + "\n", + "To visualize the results, run the eval harness with the `log_samples` and `output_path` flags. We expect `output_path` to contain multiple folders that represent individual model names. You can thus run your evaluation on any number of tasks and models and upload all of the results as projects on Zeno.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!lm_eval \\\n", + " --model hf \\\n", + " --model_args pretrained=EleutherAI/gpt-neo-2.7B \\\n", + " --tasks hellaswag,wikitext \\\n", + " --batch_size 8 \\\n", + " --device mps \\\n", + " --log_samples \\\n", + " --output_path output/gpt-neo-2.7B \\\n", + " --limit 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Set your API Key\n", + "\n", + "This is so you can be authenticated with Zeno.\n", + "If you don't already have a Zeno account, first create an account on [Zeno Hub](https://hub.zenoml.com).\n", + "After logging in to Zeno Hub, generate your API key by clicking on your profile at the bottom left to navigate to your account page.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%env ZENO_API_KEY=YOUR_API_KEY" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Visualize Eval Results\n", + "\n", + "You can now use the `zeno_visualize` script to upload the results to Zeno.\n", + "\n", + "This will use all subfolders in `data_path` as different models and upload all tasks within these model folders to Zeno. If you run the eval harness on multiple tasks, the `project_name` will be used as a prefix and one project will be created per task.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!python ../scripts/zeno_visualize.py --data_path output --project_name \"Zeno Upload Test\"" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "zeno_projects", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/ignore.txt b/lm-quant-toolkit/.deps/lm-evaluation-harness/ignore.txt new file mode 100644 index 0000000000000000000000000000000000000000..de10b539b98c9e500d2d838ed3eb9bece95c00e2 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/ignore.txt @@ -0,0 +1,8 @@ +ROUGE +rouge +nin +maka +mor +te +ond +extraversion diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/__init__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..317c0291b96f68e5dafe73fa0d704bd33e0eaa9a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/__init__.py @@ -0,0 +1 @@ +from .evaluator import evaluate, simple_evaluate diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/__main__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..ab68781939599c9fe959c5b642ff385db1067510 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/__main__.py @@ -0,0 +1,461 @@ +import argparse +import json +import logging +import os +import sys +from functools import partial +from typing import Union + +from lm_eval import evaluator, utils +from lm_eval.evaluator import request_caching_arg_to_dict +from lm_eval.loggers import EvaluationTracker, WandbLogger +from lm_eval.tasks import TaskManager +from lm_eval.utils import handle_non_serializable, make_table, simple_parse_args_string + + +def _int_or_none_list_arg_type( + min_len: int, max_len: int, defaults: str, value: str, split_char: str = "," +): + def parse_value(item): + item = item.strip().lower() + if item == "none": + return None + try: + return int(item) + except ValueError: + raise argparse.ArgumentTypeError(f"{item} is not an integer or None") + + items = [parse_value(v) for v in value.split(split_char)] + num_items = len(items) + + if num_items == 1: + # Makes downstream handling the same for single and multiple values + items = items * max_len + elif num_items < min_len or num_items > max_len: + raise argparse.ArgumentTypeError( + f"Argument requires {max_len} integers or None, separated by '{split_char}'" + ) + elif num_items != max_len: + logging.warning( + f"Argument requires {max_len} integers or None, separated by '{split_char}'. " + "Missing values will be filled with defaults." + ) + default_items = [parse_value(v) for v in defaults.split(split_char)] + items.extend( + default_items[num_items:] + ) # extend items list with missing defaults + + return items + + +def check_argument_types(parser: argparse.ArgumentParser): + """ + Check to make sure all CLI args are typed, raises error if not + """ + for action in parser._actions: + if action.dest != "help" and not action.const: + if action.type is None: + raise ValueError( + f"Argument '{action.dest}' doesn't have a type specified." + ) + else: + continue + + +def setup_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter) + parser.add_argument( + "--model", "-m", type=str, default="hf", help="Name of model e.g. `hf`" + ) + parser.add_argument( + "--tasks", + "-t", + default=None, + type=str, + metavar="task1,task2", + help="Comma-separated list of task names or task groupings to evaluate on.\nTo get full list of tasks, use one of the commands `lm-eval --tasks {{list_groups,list_subtasks,list_tags,list}}` to list out all available names for task groupings; only (sub)tasks; tags; or all of the above", + ) + parser.add_argument( + "--model_args", + "-a", + default="", + type=str, + help="Comma separated string arguments for model, e.g. `pretrained=EleutherAI/pythia-160m,dtype=float32`", + ) + parser.add_argument( + "--num_fewshot", + "-f", + type=int, + default=None, + metavar="N", + help="Number of examples in few-shot context", + ) + parser.add_argument( + "--batch_size", + "-b", + type=str, + default=1, + metavar="auto|auto:N|N", + help="Acceptable values are 'auto', 'auto:N' or N, where N is an integer. Default 1.", + ) + parser.add_argument( + "--max_batch_size", + type=int, + default=None, + metavar="N", + help="Maximal batch size to try with --batch_size auto.", + ) + parser.add_argument( + "--device", + type=str, + default=None, + help="Device to use (e.g. cuda, cuda:0, cpu).", + ) + parser.add_argument( + "--output_path", + "-o", + default=None, + type=str, + metavar="DIR|DIR/file.json", + help="The path to the output file where the result metrics will be saved. If the path is a directory and log_samples is true, the results will be saved in the directory. Else the parent directory will be used.", + ) + parser.add_argument( + "--limit", + "-L", + type=float, + default=None, + metavar="N|0 argparse.Namespace: + check_argument_types(parser) + return parser.parse_args() + + +def cli_evaluate(args: Union[argparse.Namespace, None] = None) -> None: + if not args: + # we allow for args to be passed externally, else we parse them ourselves + parser = setup_parser() + args = parse_eval_args(parser) + + if args.wandb_args: + wandb_logger = WandbLogger(**simple_parse_args_string(args.wandb_args)) + + eval_logger = utils.eval_logger + eval_logger.setLevel(getattr(logging, f"{args.verbosity}")) + eval_logger.info(f"Verbosity set to {args.verbosity}") + os.environ["TOKENIZERS_PARALLELISM"] = "false" + + # update the evaluation tracker args with the output path and the HF token + if args.output_path: + args.hf_hub_log_args += f",output_path={args.output_path}" + if os.environ.get("HF_TOKEN", None): + args.hf_hub_log_args += f",token={os.environ.get('HF_TOKEN')}" + evaluation_tracker_args = simple_parse_args_string(args.hf_hub_log_args) + evaluation_tracker = EvaluationTracker(**evaluation_tracker_args) + + if args.predict_only: + args.log_samples = True + if (args.log_samples or args.predict_only) and not args.output_path: + raise ValueError( + "Specify --output_path if providing --log_samples or --predict_only" + ) + + if args.fewshot_as_multiturn and args.apply_chat_template is False: + raise ValueError( + "When `fewshot_as_multiturn` is selected, `apply_chat_template` must be set (either to `True` or to the chosen template name)." + ) + + if args.include_path is not None: + eval_logger.info(f"Including path: {args.include_path}") + task_manager = TaskManager(args.verbosity, include_path=args.include_path) + + if "push_samples_to_hub" in evaluation_tracker_args and not args.log_samples: + eval_logger.warning( + "Pushing samples to the Hub requires --log_samples to be set. Samples will not be pushed to the Hub." + ) + + if args.limit: + eval_logger.warning( + " --limit SHOULD ONLY BE USED FOR TESTING." + "REAL METRICS SHOULD NOT BE COMPUTED USING LIMIT." + ) + + if args.tasks is None: + eval_logger.error("Need to specify task to evaluate.") + sys.exit() + elif args.tasks == "list": + print(task_manager.list_all_tasks()) + sys.exit() + elif args.tasks == "list_groups": + print(task_manager.list_all_tasks(list_subtasks=False, list_tags=False)) + sys.exit() + elif args.tasks == "list_tags": + print(task_manager.list_all_tasks(list_groups=False, list_subtasks=False)) + sys.exit() + elif args.tasks == "list_subtasks": + print(task_manager.list_all_tasks(list_groups=False, list_tags=False)) + sys.exit() + else: + if os.path.isdir(args.tasks): + import glob + + task_names = [] + yaml_path = os.path.join(args.tasks, "*.yaml") + for yaml_file in glob.glob(yaml_path): + config = utils.load_yaml_config(yaml_file) + task_names.append(config) + else: + task_list = args.tasks.split(",") + task_names = task_manager.match_tasks(task_list) + for task in [task for task in task_list if task not in task_names]: + if os.path.isfile(task): + config = utils.load_yaml_config(task) + task_names.append(config) + task_missing = [ + task for task in task_list if task not in task_names and "*" not in task + ] # we don't want errors if a wildcard ("*") task name was used + + if task_missing: + missing = ", ".join(task_missing) + eval_logger.error( + f"Tasks were not found: {missing}\n" + f"{utils.SPACING}Try `lm-eval --tasks list` for list of available tasks", + ) + raise ValueError( + f"Tasks not found: {missing}. Try `lm-eval --tasks {{list_groups,list_subtasks,list_tags,list}}` to list out all available names for task groupings; only (sub)tasks; tags; or all of the above, or pass '--verbosity DEBUG' to troubleshoot task registration issues." + ) + + # Respect user's value passed in via CLI, otherwise default to True and add to comma-separated model args + if args.trust_remote_code: + eval_logger.info( + "Passed `--trust_remote_code`, setting environment variable `HF_DATASETS_TRUST_REMOTE_CODE=true`" + ) + # HACK: import datasets and override its HF_DATASETS_TRUST_REMOTE_CODE value internally, + # because it's already been determined based on the prior env var before launching our + # script--`datasets` gets imported by lm_eval internally before these lines can update the env. + import datasets + + datasets.config.HF_DATASETS_TRUST_REMOTE_CODE = True + + args.model_args = args.model_args + ",trust_remote_code=True" + + eval_logger.info(f"Selected Tasks: {task_names}") + + request_caching_args = request_caching_arg_to_dict( + cache_requests=args.cache_requests + ) + + results = evaluator.simple_evaluate( + model=args.model, + model_args=args.model_args, + tasks=task_names, + num_fewshot=args.num_fewshot, + batch_size=args.batch_size, + max_batch_size=args.max_batch_size, + device=args.device, + use_cache=args.use_cache, + limit=args.limit, + check_integrity=args.check_integrity, + write_out=args.write_out, + log_samples=args.log_samples, + evaluation_tracker=evaluation_tracker, + system_instruction=args.system_instruction, + apply_chat_template=args.apply_chat_template, + fewshot_as_multiturn=args.fewshot_as_multiturn, + gen_kwargs=args.gen_kwargs, + task_manager=task_manager, + verbosity=args.verbosity, + predict_only=args.predict_only, + random_seed=args.seed[0], + numpy_random_seed=args.seed[1], + torch_random_seed=args.seed[2], + fewshot_random_seed=args.seed[3], + **request_caching_args, + ) + + if results is not None: + if args.log_samples: + samples = results.pop("samples") + dumped = json.dumps( + results, indent=2, default=handle_non_serializable, ensure_ascii=False + ) + if args.show_config: + print(dumped) + + batch_sizes = ",".join(map(str, results["config"]["batch_sizes"])) + + # Add W&B logging + if args.wandb_args: + try: + wandb_logger.post_init(results) + wandb_logger.log_eval_result() + if args.log_samples: + wandb_logger.log_eval_samples(samples) + except Exception as e: + eval_logger.info(f"Logging to Weights and Biases failed due to {e}") + + evaluation_tracker.save_results_aggregated( + results=results, samples=samples if args.log_samples else None + ) + + if args.log_samples: + for task_name, config in results["configs"].items(): + evaluation_tracker.save_results_samples( + task_name=task_name, samples=samples[task_name] + ) + + if ( + evaluation_tracker.push_results_to_hub + or evaluation_tracker.push_samples_to_hub + ): + evaluation_tracker.recreate_metadata_card() + + print( + f"{args.model} ({args.model_args}), gen_kwargs: ({args.gen_kwargs}), limit: {args.limit}, num_fewshot: {args.num_fewshot}, " + f"batch_size: {args.batch_size}{f' ({batch_sizes})' if batch_sizes else ''}" + ) + print(make_table(results)) + if "groups" in results: + print(make_table(results, "groups")) + + if args.wandb_args: + # Tear down wandb run once all the logging is done. + wandb_logger.run.finish() + + +if __name__ == "__main__": + cli_evaluate() diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/__init__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/filter.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/filter.py new file mode 100644 index 0000000000000000000000000000000000000000..8d9db6821724c497c4a27116a1238e3b8d32ae29 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/filter.py @@ -0,0 +1,56 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Callable, Iterable, List, Union + +from lm_eval.api.instance import Instance + + +class Filter(ABC): + """ + Filter classes operate on a per-task level. + They take all model outputs (`instance.resps` for all `task.instances`) + across all instances of a task, and perform operations. + In a single run, one can configure any number of separate filters or lists of filters. + + """ + + def __init__(self, **kwargs) -> None: + """ + Can define custom behavior here, if an individual instantiation of a Filter class should have state. + """ + + @abstractmethod + def apply(self, resps: Union[List, Iterable], docs: List[dict]) -> Iterable: + """ + Defines the operation to perform on a list of the `inst.resps` properties of `Instance` objects. + Should return the list of (filtered) response lists *in the same order as they were input*, e.g. + if pass in [, ] should return + [, ] + """ + return resps + + +@dataclass +class FilterEnsemble: + """ + FilterEnsemble creates a pipeline applying multiple filters. + Its intended usage is to stack multiple post-processing steps in order. + `task.apply_filters` should use a list of FilterEnsemble classes that it stores, to apply each + pipeline separately. + """ + + name: str + filters: List[Callable[[], Filter]] + + def apply(self, instances: List[Instance]) -> None: + resps, docs = zip(*((inst.resps, inst.doc) for inst in instances)) + resps, docs = list(resps), list(docs) + + for f in self.filters: + # apply filters in sequence + resps = f().apply(resps, docs) + + # add the end results after filtering to filtered_requests of their respective source instances. + # has key `self.name`: each FilterEnsemble applied in a given run should use a different name. + for inst, resp in zip(instances, resps): + inst.filtered_resps[self.name] = resp diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/group.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/group.py new file mode 100644 index 0000000000000000000000000000000000000000..e258692b9fad1cf570a2423c05d25d1604885d7e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/group.py @@ -0,0 +1,117 @@ +import abc +from dataclasses import asdict, dataclass +from inspect import getsource +from typing import Any, Callable, List, Optional, Union + + +@dataclass +class AggMetricConfig(dict): + metric: Optional[str] = None + aggregation: Optional[str] = "mean" + weight_by_size: Optional[str] = False + # list of filter names which should be incorporated into the aggregated metric. + filter_list: Optional[Union[str, list]] = "none" + + def __post_init__(self): + if self.aggregation != "mean" and not callable(self.aggregation): + raise ValueError( + f"Currently, 'mean' is the only pre-defined aggregation across groups' subtasks. Got '{self.aggregation}'." + ) + + if isinstance(self.filter_list, str): + self.filter_list = [self.filter_list] + + +@dataclass +class GroupConfig(dict): + group: Optional[str] = None + group_alias: Optional[str] = None + task: Optional[Union[str, list]] = None + aggregate_metric_list: Optional[ + Union[List[AggMetricConfig], AggMetricConfig, dict] + ] = None + metadata: Optional[dict] = ( + None # by default, not used in the code. allows for users to pass arbitrary info to tasks + ) + + def __getitem__(self, item): + return getattr(self, item) + + def __setitem__(self, item, value): + return setattr(self, item, value) + + def __post_init__(self): + if self.aggregate_metric_list is not None: + if isinstance(self.aggregate_metric_list, dict): + self.aggregate_metric_list = [self.aggregate_metric_list] + + self.aggregate_metric_list = [ + AggMetricConfig(**item) if isinstance(item, dict) else item + for item in self.aggregate_metric_list + ] + + def to_dict(self, keep_callable: bool = False) -> dict: + """dumps the current config as a dictionary object, as a printable format. + null fields will not be printed. + Used for dumping results alongside full task configuration + + :return: dict + A printable dictionary version of the TaskConfig object. + + # TODO: should any default value in the TaskConfig not be printed? + """ + cfg_dict = asdict(self) + # remove values that are `None` + for k, v in list(cfg_dict.items()): + if callable(v): + cfg_dict[k] = self.serialize_function(v, keep_callable=keep_callable) + return cfg_dict + + def serialize_function( + self, value: Union[Callable, str], keep_callable=False + ) -> Union[Callable, str]: + """Serializes a given function or string. + + If 'keep_callable' is True, the original callable is returned. + Otherwise, attempts to return the source code of the callable using 'getsource'. + """ + if keep_callable: + return value + else: + try: + return getsource(value) + except (TypeError, OSError): + return str(value) + + +class ConfigurableGroup(abc.ABC): + def __init__( + self, + config: Optional[dict] = None, + ) -> None: + self._config = GroupConfig(**config) + + @property + def group(self): + return self._config.group + + @property + def group_alias(self): + return self._config.group_alias + + @property + def version(self): + return self._config.version + + @property + def config(self): + return self._config.to_dict() + + @property + def group_name(self) -> Any: + return self._config.group + + def __repr__(self): + return ( + f"ConfigurableGroup(group={self.group}," f"group_alias={self.group_alias})" + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/instance.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/instance.py new file mode 100644 index 0000000000000000000000000000000000000000..d3c6afa0644e729ba441728c72a2469fdad07b8f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/instance.py @@ -0,0 +1,38 @@ +from dataclasses import dataclass, field +from typing import Literal, Optional, Tuple + + +OutputType = Literal[ + "loglikelihood", "loglikelihood_rolling", "generate_until", "multiple_choice" +] + + +@dataclass +class Instance: + request_type: OutputType + doc: dict + arguments: tuple + idx: int + metadata: Tuple[Optional[str], Optional[int], Optional[int]] = field( + default_factory=lambda: (None, None, None) + ) + resps: list = field(default_factory=list) + filtered_resps: dict = field(default_factory=dict) + + # initialized after init + task_name: Optional[str] = None + doc_id: Optional[int] = None + repeats: Optional[int] = None + + def __post_init__(self) -> None: + # unpack metadata field + self.task_name, self.doc_id, self.repeats = self.metadata + + @property + def args(self): + """ + Returns (string,) where `string` is the string to calculate loglikelihood over + """ + return ( + self.arguments if isinstance(self.arguments, tuple) else (self.arguments,) + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/metrics.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..a8459aa7397fd02947917dad616520bb4cb777bd --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/metrics.py @@ -0,0 +1,570 @@ +import logging +import math +import random +import re +import string +from collections.abc import Iterable +from typing import List + +import numpy as np +import sacrebleu + +from lm_eval.api.registry import register_aggregation, register_metric + + +eval_logger = logging.getLogger("lm-eval") + + +# Register Aggregations First +@register_aggregation("bypass") +def bypass_agg(arr): + return 999 + + +@register_aggregation("mean") +def mean(arr): + return sum(arr) / len(arr) + + +@register_aggregation("median") +def median(arr): + return arr[len(arr) // 2] + + +# Certain metrics must be calculated across all documents in a benchmark. +# We use them as aggregation metrics, paired with no-op passthrough metric fns. +@register_aggregation("perplexity") +def perplexity(items): + return math.exp(-mean(items)) + + +@register_aggregation("weighted_perplexity") +def weighted_perplexity(items): + return math.exp(-weighted_mean(items)) + + +@register_aggregation("bits_per_byte") +def bits_per_byte(items): + return -weighted_mean(items) / math.log(2) + + +@register_aggregation("f1") +def f1_score(items): + from sklearn.metrics import f1_score + + unzipped_list = list(zip(*items)) + golds = unzipped_list[0] + preds = unzipped_list[1] + fscore = f1_score(golds, preds) + + return np.max(fscore) + + +@register_aggregation("matthews_corrcoef") +def matthews_corrcoef(items): + from sklearn.metrics import matthews_corrcoef + + unzipped_list = list(zip(*items)) + golds = unzipped_list[0] + preds = unzipped_list[1] + return matthews_corrcoef(golds, preds) + + +@register_aggregation("bleu") +def bleu(items): + """The Bilingual Evaluation Understudy Score, or BLEU for short, is a metric + for evaluating a generated sentence to a reference sentence. It counts matching + n-grams in the candidate translation to n-grams in the reference text, where + 1-gram or unigram would be each token and a bigram comparison would be each + word pair. The comparison is made regardless of word order + Source: https://machinelearningmastery.com/calculate-bleu-score-for-text-python/ + Paper: https://www.aclweb.org/anthology/P02-1040/ + + Higher is better + """ + refs = list(zip(*items))[0] + preds = list(zip(*items))[1] + refs, preds = _sacreformat(refs, preds) + return sacrebleu.corpus_bleu(preds, refs).score + + +@register_aggregation("chrf") +def chrf(items): + """chrF++ is a tool for automatic evaluation of machine translation output + based on character n-gram precision and recall enhanced with word n-grams. + Source: https://github.com/m-popovic/chrF + Paper: https://www.aclweb.org/anthology/W15-3049.pdf + + Higher is better # TODO I think + """ + refs = list(zip(*items))[0] + preds = list(zip(*items))[1] + refs, preds = _sacreformat(refs, preds) + return sacrebleu.corpus_chrf(preds, refs).score + + +@register_aggregation("ter") +def ter(items): + """Translation Error Rate is an error metric for machine translation that + measures the number of edits required to change a system output into one + of the references + Source: http://www.cs.umd.edu/~snover/tercom/ + Paper: http://mt-archive.info/AMTA-2006-Snover.pdf + + Lower is better + """ + refs = list(zip(*items))[0] + preds = list(zip(*items))[1] + refs, preds = _sacreformat(refs, preds) + return sacrebleu.corpus_ter(preds, refs).score + + +@register_aggregation("brier_score") +def brier_score(items): # This is a passthrough function + gold, predictions = list(zip(*items)) + bs, num_class = np.array(predictions).shape + + gold = list(gold) + gold_one_hot = np.eye(num_class)[gold] + return np.mean(np.sum((predictions - gold_one_hot) ** 2, axis=1)) + + +@register_metric( + metric="brier_score", + higher_is_better=False, + output_type=["multiple_choice"], + aggregation="brier_score", +) +def brier_score_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="acc", + higher_is_better=True, + output_type=["loglikelihood", "multiple_choice"], + aggregation="mean", +) +def acc_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="acc_norm", + higher_is_better=True, + output_type=["loglikelihood", "multiple_choice"], + aggregation="mean", +) +def acc_norm_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="acc_mutual_info", + higher_is_better=True, + output_type="multiple_choice", + aggregation="mean", +) +def acc_mutual_info_fn(items): # This is a passthrough function + return items + + +### the code used in the `exact_match_hf_evaluate` function is ported from +### https://github.com/huggingface/evaluate/blob/main/metrics/exact_match/exact_match.py +### which is under the apache license. + +# Copyright 2020 The HuggingFace Datasets Authors and the current dataset script contributor. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +def exact_match_hf_evaluate( + predictions, + references, + regexes_to_ignore=None, + ignore_case=False, + ignore_punctuation=False, + ignore_numbers=False, +): + if regexes_to_ignore is not None: + for s in regexes_to_ignore: + predictions = np.array([re.sub(s, "", x) for x in predictions]) + references = np.array([re.sub(s, "", x) for x in references]) + else: + predictions = np.asarray(predictions) + references = np.asarray(references) + + if ignore_case: + predictions = np.char.lower(predictions) + references = np.char.lower(references) + + if ignore_punctuation: + repl_table = string.punctuation.maketrans("", "", string.punctuation) + predictions = np.char.translate(predictions, table=repl_table) + references = np.char.translate(references, table=repl_table) + + if ignore_numbers: + repl_table = string.digits.maketrans("", "", string.digits) + predictions = np.char.translate(predictions, table=repl_table) + references = np.char.translate(references, table=repl_table) + + score_list = predictions == references + + return {"exact_match": np.mean(score_list)} + + +### + + +@register_metric( + metric="exact_match", + higher_is_better=True, + output_type="generate_until", + aggregation="mean", +) +def exact_match_fn(**kwargs): + return exact_match_hf_evaluate(**kwargs) + + +@register_metric( + metric="perplexity", + higher_is_better=False, + output_type="loglikelihood", + aggregation="perplexity", +) +def perplexity_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="word_perplexity", + higher_is_better=False, + output_type="loglikelihood_rolling", + aggregation="weighted_perplexity", +) +def word_perplexity_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="byte_perplexity", + higher_is_better=False, + output_type="loglikelihood_rolling", + aggregation="weighted_perplexity", +) +def byte_perplexity_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="bits_per_byte", + higher_is_better=False, + output_type="loglikelihood_rolling", + aggregation="bits_per_byte", +) +def bits_per_byte_fn(items): # This is a passthrough function + return items + + +def pop_stddev(arr): + mu = mean(arr) + return math.sqrt(sum([(x - mu) ** 2 for x in arr]) / len(arr)) + + +def sample_stddev(arr): + mu = mean(arr) + return math.sqrt(sum([(x - mu) ** 2 for x in arr]) / (len(arr) - 1)) + + +def mean_stderr(arr): + return sample_stddev(arr) / math.sqrt(len(arr)) + + +@register_metric( + metric="bypass", + higher_is_better=True, + output_type=["loglikelihood", "multiple_choice", "generate_until"], + aggregation="bypass", +) +def bypass(items): + return None + + +@register_metric( + metric="mcc", + higher_is_better=True, + output_type="multiple_choice", + aggregation="matthews_corrcoef", +) +def mcc_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="f1", + higher_is_better=True, + output_type="multiple_choice", + aggregation="f1", +) +def f1_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="bleu", + higher_is_better=True, + output_type="generate_until", + aggregation="bleu", +) +def bleu_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="chrf", + higher_is_better=True, + output_type="generate_until", + aggregation="chrf", +) +def chrf_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="ter", + higher_is_better=True, + output_type="generate_until", + aggregation="ter", +) +def ter_fn(items): # This is a passthrough function + return items + + +@register_metric( + metric="acc_all", + higher_is_better=True, + output_type="loglikelihood", + aggregation="mean", +) +def acc_all(items): + # Only count as correct if all answers are labeled correctly for each question + question_scoring_dict = {} + preds = list(zip(*items))[0] + docs = list(zip(*items))[1] + + for doc, pred in zip(docs, preds): + paragraph_id = doc["idx"]["paragraph"] + question_id = doc["idx"]["question"] + if (paragraph_id, question_id) not in question_scoring_dict: + question_scoring_dict[(paragraph_id, question_id)] = [] + + gold_label = doc["label"] == 1 + + question_scoring_dict[(paragraph_id, question_id)].append(gold_label == pred) + acc = np.mean([int(all(x)) for x in question_scoring_dict.values()]) + return acc + + +def acc_all_stderr(items): + # Only count as correct if all answers are labeled correctly for each question + question_scoring_dict = {} + preds = list(zip(*items))[0] + docs = list(zip(*items))[1] + + for doc, pred in zip(docs, preds): + question_id = doc["idx"]["question"] + if question_id not in question_scoring_dict: + question_scoring_dict[question_id] = [] + + gold_label = doc["label"] == 1 + question_scoring_dict[question_id].append(gold_label == pred) + + acc = mean_stderr([int(all(x)) for x in question_scoring_dict.values()]) + return acc + + +def metric_max_over_ground_truths(metric_fn, prediction, ground_truths): + """Compute max metric between prediction and each ground truth.""" + scores_for_ground_truths = [] + for ground_truth in ground_truths: + score = metric_fn(prediction, ground_truth) + scores_for_ground_truths.append(score) + return max(scores_for_ground_truths) + + +def weighted_mean(items): + a, b = zip(*items) + return sum(a) / sum(b) + + +def is_non_str_iterable(obj): + return isinstance(obj, Iterable) and not isinstance(obj, str) + + +def _sacreformat(refs, preds): + """Format refs and preds for sacrebleu corpus calculation. It is very particular""" + # Sacrebleu expects (List[str], List[List[str]) + # e.g. sacrebleu.corpus_bleu([pred_t], [[ref1_stream], [ref2_stream], ...]) + + # Note [ref1_stream] is the first reference for each pred. + # So lists are size N and (M, N) for N preds and M possible refs for each pred + # This is a different order of dimensions that I would expect + + # We expect refs to be List[str] or List[List[str]], the outer list corresponding to preds + # Must become List[List[str]] with the inner list corresponding to preds + if not is_non_str_iterable(refs): + refs = list(refs) + if not is_non_str_iterable(refs[0]): + refs = [[ref] for ref in refs] + refs = list(zip(*refs)) + # Note the number of refs in each ref list much match the number of preds + + # We expect preds to be List[str] or List[List[str]]. Must become List[str] + if not is_non_str_iterable(preds): + preds = list(preds) + if is_non_str_iterable(preds[0]): + assert len(preds[0]) == 1, f"Pred must be a str, was {preds[0]}" + preds = [pred[0] for pred in preds] + + return refs, preds + + +# stderr stuff + + +class _bootstrap_internal: + def __init__(self, f, n) -> None: + self.f = f + self.n = n + + def __call__(self, v): + i, xs = v + rnd = random.Random() + rnd.seed(i) + res = [] + for _ in range(self.n): + res.append(self.f(rnd.choices(xs, k=len(xs)))) + return res + + +def bootstrap_stderr(f, xs, iters): + import multiprocessing as mp + + pool = mp.Pool(mp.cpu_count()) + # this gives a biased estimate of the stderr (i.e w/ the mean, it gives something + # equivalent to stderr calculated without Bessel's correction in the stddev. + # Unfortunately, I haven't been able to figure out what the right correction is + # to make the bootstrap unbiased - i considered multiplying by sqrt(n/(n-1)) but + # that would be ad-hoc and I can't prove that that would actually be an unbiased estimator) + # Thankfully, shouldn't matter because our samples are pretty big usually anyways + res = [] + chunk_size = min(1000, iters) + from tqdm import tqdm + + print("bootstrapping for stddev:", f.__name__) + for bootstrap in tqdm( + pool.imap( + _bootstrap_internal(f, chunk_size), + [(i, xs) for i in range(iters // chunk_size)], + ), + total=iters // chunk_size, + ): + # sample w replacement + res.extend(bootstrap) + + pool.close() + return sample_stddev(res) + + +def stderr_for_metric(metric, bootstrap_iters: int): + if bootstrap_iters <= 0: + # return no function (don't compute stderr) if bootstrap iters = 0 + return None + + bootstrappable = [ + median, + matthews_corrcoef, + f1_score, + perplexity, + bleu, + chrf, + ter, + ] + + if metric in bootstrappable: + return lambda x: bootstrap_stderr(metric, x, iters=bootstrap_iters) + + stderr = {mean: mean_stderr, acc_all: acc_all_stderr} + + return stderr.get(metric, None) + + +def pooled_sample_stderr(stderrs: List[float], sizes: List[int]): + # Used to aggregate bootstrapped stderrs across subtasks in a group, + # when we are weighting by the size of each subtask. + # + + assert len(stderrs) == len(sizes) + + # formula source: https://en.wikipedia.org/wiki/Pooled_variance + # and: https://stats.stackexchange.com/a/4841331 + # this empirically seems to match running `stderr_for_metric` on all instances + # from the subtasks concatenated with each other. + pooled_sample_var = ( + sum([(size - 1) * stderr**2 * size for size, stderr in zip(sizes, stderrs)]) + ) / (sum(sizes) - len(sizes)) + + return np.sqrt(pooled_sample_var / sum(sizes)) + + +def combined_sample_stderr(stderrs: List[float], sizes: List[int], metrics=None): + assert ( + metrics is not None + ), "Need to pass a list of each subtask's metric for this stderr aggregation" + assert len(stderrs) == len(sizes) and len(sizes) == len(metrics) + + # See https://github.com/EleutherAI/lm-evaluation-harness/pull/1390 for more documentation. + # This formula depends on sample means. + # removed because it seems to give erroneously huge stderrs for groupings of tasks + # and does not seem to match up with bootstrap-calculated stderrs for groups. + + ### don't use this unless a statistician has told you it's the right thing to do ### + + # accumulators: we'll aggregate pairwise N - 1 times + variance = stderrs[0] ** 2 + curr_size = sizes[0] + curr_score = metrics[0] + + for stderr, size, score in zip(stderrs[1:], sizes[1:], metrics[1:]): + curr_score = ((curr_score * curr_size) + (score * size)) / ( + curr_size + size + ) # NOTE: this assumes our aggregation fn is "mean" + + variance = ((curr_size - 1) * variance + (size - 1) * (stderr**2)) / ( + curr_size + size - 1 + ) + curr_size * size / ((curr_size + size) * (curr_size + size - 1)) * ( + curr_score - score + ) ** 2 + + return np.sqrt(variance) + + +def aggregate_subtask_metrics(metrics, sizes, weight_by_size=True): + # A helper function that is used to aggregate + # subtask scores cross-task. + # TODO: does not hold for non-mean aggregations + if not weight_by_size: + sizes = [1] * len(sizes) + + assert len(metrics) == len(sizes) + + return sum([metric * size for metric, size in zip(metrics, sizes)]) / sum(sizes) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/model.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/model.py new file mode 100644 index 0000000000000000000000000000000000000000..b5c2999336471107dc7e4aac7cce6b725e33506e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/model.py @@ -0,0 +1,489 @@ +import abc +import hashlib +import json +import logging +import os +from typing import Dict, List, Optional, Tuple, Type, TypeVar, Union + +import transformers +from sqlitedict import SqliteDict +from tqdm import tqdm + +from lm_eval import utils + + +eval_logger = logging.getLogger("lm-eval") + +T = TypeVar("T", bound="LM") + + +class LM(abc.ABC): + def __init__(self) -> None: + """Defines the interface that should be implemented by all LM subclasses. + LMs are assumed to take text (strings) as input and yield strings as output + (inputs/outputs should be tokenization-agnostic.) + + """ + # set rank and world size to a single process, by default. + self._rank = 0 + self._world_size = 1 + self.cache_hook = CacheHook(None) + + @abc.abstractmethod + def loglikelihood(self, requests) -> List[Tuple[float, bool]]: + """Compute log-likelihood of generating a continuation from a context. + Downstream tasks should attempt to use loglikelihood instead of other + LM calls whenever possible. + + :param requests: list[Instance] + A list of Instance objects, with property `args` which returns a tuple (context, continuation). + `context: str` + Context string. Implementations of LM must be able to handle an + empty context string. + `continuation: str` + The continuation over which log likelihood will be calculated. If + there is a word boundary, the space should be in the continuation. + For example, context="hello" continuation=" world" is correct. + + :return: list[tuple[float, bool]] + A list of pairs (logprob, isgreedy) + `logprob: float` + The log probability of `continuation`. + `isgreedy`: + Whether `continuation` would be generated by greedy sampling from `context`. + """ + pass + + @abc.abstractmethod + def loglikelihood_rolling(self, requests) -> List[float]: + """Compute full log-likelihood of a string, with no truncation, for perplexity computation + - We will use the full max context length of the model. + - For inputs that exceed the max context length, we divide the tokenized string into chunks of up to + the max context length. + - IMPORTANT: Each document's loglikelihood/perplexity is computed *separately*, unlike other implementations + which may simply concatenate multiple documents together. + - IMPORTANT: We maximize the amount of context for each prediction. Specifically, for inputs that we break into + multiple chunks, the last input will still a full-sized context. + Example: + Input tokens: [ 0 1 2 3 4 5 6 7 8 9 ] + Prefix: BOS/EOS + Max context length: 4 + Resulting input/prediction pairs: + + INPUT: BOS 0 1 2 + PRED: 0 1 2 3 + + INPUT: 3 4 5 6 + PRED: 4 5 6 7 + + INPUT: 5 6 7 8 + PRED: 8 9 + + Observe that: + 1. Each token is predicted exactly once + 2. For the last pair, we provide the full context, but only score the last two tokens + + :param requests: list[Instance] + A list of Instance objects with property `args` which returns a tuple (context,). + string: str + String for which we are computing overall loglikelihood + :return: list[tuple[float]] + A list of tuples (logprob,) + logprob: float + The log probability of `context` conditioned on the BOS/EOS token. + Can also be overridden for custom cases by `prefix_token_id`. + """ + pass + + # TODO: Add an optional max length + @abc.abstractmethod + def generate_until(self, requests) -> List[str]: + """Generate greedily until a stopping sequence + + :param requests: list[Instance] + A list of Instance objects with property `args` which returns a tuple (context, gen_kwargs). + context: str + Context string + gen_kwargs: dict + A dictionary of keyword arguments to pass to the generation function e.g. top_k, until, etc. + :return: list[str] + A list of model generated continuations. + continuation: str + The generated continuation. + """ + pass + + def apply_chat_template(self, chat_history: List[Dict[str, str]]) -> str: + """ + Defines how to transform few-shot examples provided as chat history into a format that can be used as input to the LM. + + :param chat_history: list[dict[str, str]] + A list of dictionaries with keys 'role' and 'content'. + Values are strings representing the role name and the content of the message, respectively. + :return: str + A string representing the chat history in a format that can be used as input to the LM. + """ + raise NotImplementedError( + "To use this model with chat templates, please implement the 'apply_chat_template' method for your model type." + ) + + @classmethod + def create_from_arg_string( + cls: Type[T], arg_string: str, additional_config: Optional[dict] = None + ) -> T: + """ + Creates an instance of the LM class using the given argument string and additional config. + + Parameters: + - arg_string: A string containing arguments in the format key1=value1,key2=value2. + - additional_config: Optional dictionary containing additional configuration parameters. + + Returns: + - Instance of the LM class. + """ + additional_config = {} if additional_config is None else additional_config + args = utils.simple_parse_args_string(arg_string) + args2 = {k: v for k, v in additional_config.items() if v is not None} + return cls(**args, **args2) + + @classmethod + def create_from_arg_obj( + cls: Type[T], arg_dict: dict, additional_config: Optional[dict] = None + ) -> T: + """ + Creates an instance of the LM class using the given arg_obj + + Parameters: + - arg_obj: A dict containing arguments in the format key1=value1,key2=value2. + - additional_config: Optional dictionary containing additional configuration parameters. + + Returns: + - Instance of the LM class. + """ + + additional_config = {} if additional_config is None else additional_config + additional_config = { + k: v for k, v in additional_config.items() if v is not None + } + + return cls(**arg_dict, **additional_config) + + @property + def rank(self): + # used in the case of parallelism. Hardcoded to + # ensure no errors arise using API models which do + # not support multi-device parallelism nor expect it. + return self._rank + + @property + def world_size(self): + # used in the case of parallelism. Hardcoded to + # ensure no errors arise using API models which do + # not support multi-device parallelism nor expect it. + return self._world_size + + @property + def tokenizer_name(self) -> str: + """Must be defined for LM subclasses which implement Chat Templating. + Should return the name of the tokenizer or chat template used. + Used only to properly fingerprint caches when requests are being cached with `--cache_requests`, otherwise not used. + """ + raise NotImplementedError( + "To use this model with chat templates, please implement the 'tokenizer_name' property." + ) + + def chat_template(self, chat_template: Union[bool, str] = False) -> Optional[str]: + """Returns the chat template structure for user/assistant messages if a template is provided. + This method is intended to be overridden in a subclass to define a specific chat template format. + For models that do not support chat templates, this method returns None by default. + """ + + return "" + + def set_cache_hook(self, cache_hook) -> None: + self.cache_hook = cache_hook + + +### SQLite-based caching of LM responses +def hash_args(attr, args): + dat = json.dumps([attr] + list(args)) + return hashlib.sha256(dat.encode("utf-8")).hexdigest() + + +class CacheHook: + def __init__(self, cachinglm) -> None: + if cachinglm is None: + self.dbdict = None + return + + self.dbdict = cachinglm.dbdict + + def add_partial(self, attr, req, res) -> None: + if self.dbdict is None: + return + hsh = hash_args(attr, req) + self.dbdict[hsh] = res + + +class CachingLM: + def __init__(self, lm, cache_db) -> None: + """LM wrapper that returns cached results if they exist, and uses the underlying LM if not. + + :param lm: LM + Underlying LM + :param cache_db: str + Path to cache db + """ + self.lm = lm + self.cache_db = cache_db + if os.path.dirname(cache_db): + os.makedirs(os.path.dirname(cache_db), exist_ok=True) + self.dbdict = SqliteDict(cache_db, autocommit=True) + + # add hook to lm + lm.set_cache_hook(self.get_cache_hook()) + + def __getattr__(self, attr: str): + lm_attr = getattr(self.lm, attr) + if attr not in ["loglikelihood", "loglikelihood_rolling", "generate_until"]: + eval_logger.debug(f"Passing through attribute '{attr}' to underlying LM") + return lm_attr + + def fn(requests): + res = [] + remaining_reqs = [] + warned = False + # figure out which ones are cached and which ones are new + eval_logger.info( + f"Loading '{attr}' responses from cache '{self.cache_db}' where possible..." + ) + for req in tqdm(requests, desc="Checking cached requests"): + hsh = hash_args(attr, req.args) + if attr == "generate_until" and req.args[1].get("do_sample", False): + # when we are doing non-greedy generation, don't use the cache + # (else every "randomly sampled" generation would be identical for repeats > 1). + if not warned: + eval_logger.warning( + f"Arguments to lm.generate_until() '{req.args[1]}' include non-deterministic sampling. Caching will not be performed for such requests." + ) + warned = True + res.append(None) + remaining_reqs.append(req) + elif hsh in self.dbdict: + ob = self.dbdict[hsh] + + assert ob is not None + + res.append(ob) + else: + res.append(None) + remaining_reqs.append(req) + eval_logger.info( + f"Cached requests: {len(requests) - len(remaining_reqs)}, Requests remaining: {len(remaining_reqs)}" + ) + if remaining_reqs: + # actually run the LM on the requests that do not have cached results + rem_res = getattr(self.lm, attr)(remaining_reqs) + else: + rem_res = [] + + # stick the new ones back into the list and also cache any of the new ones + resptr = 0 + for req, r in zip(remaining_reqs, rem_res): + while res[resptr] is not None: + resptr += 1 + + res[resptr] = r + + # caching + hsh = hash_args(attr, req.args) + self.dbdict[hsh] = r + self.dbdict.commit() + + return res + + return fn + + def get_cache_hook(self): + return CacheHook(self) + + +class TemplateLM(LM): + """ + A class acting as intermediary between the LM base class + and boilerplate often included in other LM subclasses. + """ + + tokenizer = None + + @property + @abc.abstractmethod + def eot_token_id(self): + pass + + @property + def prefix_token_id(self): + # it is used as prefix for loglikelihood + return self.eot_token_id + + @abc.abstractmethod + def tok_encode(self, string: str, **kwargs) -> List[int]: + """ + Tokenize a string using the model's tokenizer and return a list of token IDs. + """ + pass + + @abc.abstractmethod + def _loglikelihood_tokens(self, requests, **kwargs) -> List[Tuple[float, bool]]: + pass + + def _encode_pair( + self, context: str, continuation: str + ) -> Tuple[List[int], List[int]]: + n_spaces = len(context) - len(context.rstrip()) + if n_spaces > 0: + continuation = context[-n_spaces:] + continuation + context = context[:-n_spaces] + + model_class = getattr(self, "AUTO_MODEL_CLASS", None) + + if model_class == transformers.AutoModelForSeq2SeqLM: + context_enc = self.tok_encode(context) + continuation_enc = self.tok_encode(continuation, add_special_tokens=False) + else: + whole_enc = self.tok_encode(context + continuation) + context_enc = self.tok_encode(context) + + context_enc_len = len(context_enc) + continuation_enc = whole_enc[context_enc_len:] + + return context_enc, continuation_enc + + def loglikelihood( + self, requests, disable_tqdm: bool = False + ) -> List[Tuple[float, bool]]: + new_reqs = [] + for context, continuation in [req.args for req in requests]: + if context == "": + # BOS or EOS as context + context_enc, continuation_enc = ( + [self.prefix_token_id], + self.tok_encode(continuation), + ) + else: + context_enc, continuation_enc = self._encode_pair(context, continuation) + + new_reqs.append(((context, continuation), context_enc, continuation_enc)) + + return self._loglikelihood_tokens(new_reqs, disable_tqdm=disable_tqdm) + + @abc.abstractmethod + def loglikelihood_rolling( + self, requests, disable_tqdm: bool = False + ) -> List[float]: + pass + + @abc.abstractmethod + def generate_until(self, requests, disable_tqdm: bool = False) -> List[str]: + pass + + def chat_template(self, chat_template: Union[bool, str] = False) -> Optional[str]: + """ + Set and get the appropriate chat template for the model. + This method sets the tokenizer's chat_template and returns the template string for reproducibility. + + The template selection logic is adapted from the Transformers library's `apply_chat_template` + method in the Tokenizer class. The original implementation can be found at: + https://github.com/huggingface/transformers/blob/fc35907f95459d7a6c5281dfadd680b6f7b620e3/src/transformers/tokenization_utils_base.py#L1687 + + This method ensures that the right template is chosen based on the following: + 0. If the model has no 'tokenizer' attribute: assumes that there is only a single possible chat template, handled on the model provider side internally. Returns the empty string. + 1. If the model's tokenizer has multiple templates: + a. Use the specified template if it exists in the dictionary. + b. Use the default template from the list if no specific template is provided. + c. Raise an error if no default template exists and no specific template is provided. + 2. If the model's tokenizer has a single template or no template: + a. Use the tokenizer's chat template if available. + b. Fall back to the default chat template if no tokenizer chat template exists. + + Args: + chat_template (Union[bool, str]): Specifies the chat template to use. + - If False or None, no template is applied. + - If True, the default or only available template is used. + - If a string, the template with the matching name is used. + + Returns: + Optional[str]: The selected chat template, or None if no template is applied. + """ + if self.tokenizer is None: + return "" + + if chat_template is False or chat_template is None: + eval_logger.warning( + "model.chat_template was called with the chat_template set to False or None. " + "Therefore no chat template will be applied. Make sure this is an intended behavior." + ) + return None + + # Convert boolean chat_template to None to ensure compatibility with the adapted logic + if isinstance(chat_template, bool): + chat_template = None + using_default_template = False + + # First, handle the cases when the model has a dict of multiple templates + try: + template = ( + self.tokenizer.chat_template or self.tokenizer.default_chat_template + ) + except AttributeError: + return None + + if isinstance(template, dict): + using_default_dict = self.tokenizer.chat_template is None + + if chat_template is not None: + if chat_template in template: + selected_template = template[chat_template] + if using_default_dict: + using_default_template = True + else: + raise ValueError( + f"The specified chat template '{chat_template}' is not available. " + f"Available template names are {sorted(template.keys())}." + ) + else: + # If user didn't pass a chat template, use the default template from the dict + if "default" in template: + selected_template = template["default"] + using_default_template = True + else: + raise ValueError( + "This model has multiple chat templates with no default specified! Please either pass a chat " + "template or the name of the template you wish to use to the `chat_template` argument. Available " + f"template names are {sorted(template.keys())}." + ) + + # Cases when the model has a single template or no template + else: + # priority: `chat_template` argument > `tokenizer.chat_template` > `tokenizer.default_chat_template + if isinstance(chat_template, str): + eval_logger.warning( + "Chat template name provided, but the tokenizer's chat template is not a dictionary. " + "Using the tokenizer's chat template or the default template instead." + ) + if self.tokenizer.chat_template is not None: + selected_template = self.tokenizer.chat_template + else: + selected_template = self.tokenizer.default_chat_template + using_default_template = True + + if using_default_template: + eval_logger.warning( + "No chat template is set for this tokenizer, falling back to a default class-level template. This is " + "very error-prone, because models are often trained with templates different from the class default! " + "Default chat templates are a legacy feature and will be removed in Transformers v4.43, at which " + "point any code depending on them will stop working. We recommend setting a valid chat template before " + "then to ensure that this model continues working without issues." + ) + + return selected_template diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/registry.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/registry.py new file mode 100644 index 0000000000000000000000000000000000000000..7446a429e61d9b287c384b5be5db2a258ea83ae8 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/registry.py @@ -0,0 +1,192 @@ +import logging +from typing import Callable, Dict + +import evaluate as hf_evaluate + +from lm_eval.api.model import LM + + +eval_logger = logging.getLogger("lm-eval") + +MODEL_REGISTRY = {} + + +def register_model(*names): + # either pass a list or a single alias. + # function receives them as a tuple of strings + + def decorate(cls): + for name in names: + assert issubclass( + cls, LM + ), f"Model '{name}' ({cls.__name__}) must extend LM class" + + assert ( + name not in MODEL_REGISTRY + ), f"Model named '{name}' conflicts with existing model! Please register with a non-conflicting alias instead." + + MODEL_REGISTRY[name] = cls + return cls + + return decorate + + +def get_model(model_name): + try: + return MODEL_REGISTRY[model_name] + except KeyError: + raise ValueError( + f"Attempted to load model '{model_name}', but no model for this name found! Supported model names: {', '.join(MODEL_REGISTRY.keys())}" + ) + + +TASK_REGISTRY = {} +GROUP_REGISTRY = {} +ALL_TASKS = set() +func2task_index = {} + + +def register_task(name): + def decorate(fn): + assert ( + name not in TASK_REGISTRY + ), f"task named '{name}' conflicts with existing registered task!" + + TASK_REGISTRY[name] = fn + ALL_TASKS.add(name) + func2task_index[fn.__name__] = name + return fn + + return decorate + + +def register_group(name): + def decorate(fn): + func_name = func2task_index[fn.__name__] + if name in GROUP_REGISTRY: + GROUP_REGISTRY[name].append(func_name) + else: + GROUP_REGISTRY[name] = [func_name] + ALL_TASKS.add(name) + return fn + + return decorate + + +OUTPUT_TYPE_REGISTRY = {} +METRIC_REGISTRY = {} +METRIC_AGGREGATION_REGISTRY = {} +AGGREGATION_REGISTRY: Dict[str, Callable[[], Dict[str, Callable]]] = {} +HIGHER_IS_BETTER_REGISTRY = {} +FILTER_REGISTRY = {} + +DEFAULT_METRIC_REGISTRY = { + "loglikelihood": [ + "perplexity", + "acc", + ], + "loglikelihood_rolling": ["word_perplexity", "byte_perplexity", "bits_per_byte"], + "multiple_choice": ["acc", "acc_norm"], + "generate_until": ["exact_match"], +} + + +def register_metric(**args): + # TODO: do we want to enforce a certain interface to registered metrics? + def decorate(fn): + assert "metric" in args + name = args["metric"] + + for key, registry in [ + ("metric", METRIC_REGISTRY), + ("higher_is_better", HIGHER_IS_BETTER_REGISTRY), + ("aggregation", METRIC_AGGREGATION_REGISTRY), + ]: + if key in args: + value = args[key] + assert ( + value not in registry + ), f"{key} named '{value}' conflicts with existing registered {key}!" + + if key == "metric": + registry[name] = fn + elif key == "aggregation": + registry[name] = AGGREGATION_REGISTRY[value] + else: + registry[name] = value + + return fn + + return decorate + + +def get_metric(name: str, hf_evaluate_metric=False) -> Callable: + if not hf_evaluate_metric: + if name in METRIC_REGISTRY: + return METRIC_REGISTRY[name] + else: + eval_logger.warning( + f"Could not find registered metric '{name}' in lm-eval, searching in HF Evaluate library..." + ) + + try: + metric_object = hf_evaluate.load(name) + return metric_object.compute + except Exception: + eval_logger.error( + f"{name} not found in the evaluate library! Please check https://huggingface.co/evaluate-metric", + ) + + +def register_aggregation(name: str): + def decorate(fn): + assert ( + name not in AGGREGATION_REGISTRY + ), f"aggregation named '{name}' conflicts with existing registered aggregation!" + + AGGREGATION_REGISTRY[name] = fn + return fn + + return decorate + + +def get_aggregation(name: str) -> Callable[[], Dict[str, Callable]]: + try: + return AGGREGATION_REGISTRY[name] + except KeyError: + eval_logger.warning(f"{name} not a registered aggregation metric!") + + +def get_metric_aggregation(name: str) -> Callable[[], Dict[str, Callable]]: + try: + return METRIC_AGGREGATION_REGISTRY[name] + except KeyError: + eval_logger.warning(f"{name} metric is not assigned a default aggregation!") + + +def is_higher_better(metric_name) -> bool: + try: + return HIGHER_IS_BETTER_REGISTRY[metric_name] + except KeyError: + eval_logger.warning( + f"higher_is_better not specified for metric '{metric_name}'!" + ) + + +def register_filter(name): + def decorate(cls): + if name in FILTER_REGISTRY: + eval_logger.info( + f"Registering filter `{name}` that is already in Registry {FILTER_REGISTRY}" + ) + FILTER_REGISTRY[name] = cls + return cls + + return decorate + + +def get_filter(filter_name: str) -> type: + try: + return FILTER_REGISTRY[filter_name] + except KeyError: + eval_logger.warning(f"filter `{filter_name}` is not registered!") diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/samplers.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/samplers.py new file mode 100644 index 0000000000000000000000000000000000000000..2cdc4e43e7f73065b1df554f729d7bd92c4398b5 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/samplers.py @@ -0,0 +1,199 @@ +from functools import partial + +import datasets + + +class ContextSampler: + def __init__(self, docs, task, fewshot_indices=None, rnd=None) -> None: + self.rnd = rnd + if not self.rnd: + raise ValueError( + "A `random.Random` generator argument must be provided to `rnd` of FewShotSampler!" + ) + + self.task = task + self.config = task._config + + self.target_delimiter = self.config.target_delimiter + self.fewshot_delimiter = self.config.fewshot_delimiter + + if ( + self.config.fewshot_config is not None + and self.config.fewshot_config.get("doc_to_text", None) is not None + ): + self.doc_to_text = partial( + self.task.doc_to_text, + doc_to_text=self.config.fewshot_config.get("doc_to_text", None), + ) + else: + self.doc_to_text = self.task.doc_to_text + + if ( + self.config.fewshot_config is not None + and self.config.fewshot_config.get("doc_to_target", None) is not None + ): + self.doc_to_target = partial( + self.task.doc_to_target, + doc_to_target=self.config.fewshot_config.get("doc_to_target", None), + ) + else: + self.doc_to_target = self.task.doc_to_target + + if ( + self.config.fewshot_config is not None + and self.config.fewshot_config.get("doc_to_choice", None) is not None + ): + self.doc_to_choice = partial( + self.task.doc_to_choice, + doc_to_choice=self.config.fewshot_config.get("doc_to_choice", None), + ) + else: + self.doc_to_choice = self.task.doc_to_choice + + self.docs = docs # HF dataset split, provided by task._fewshot_docs() + if fewshot_indices: # subset few-shot docs from + if not isinstance(self.docs, datasets.Dataset): + raise ValueError( + "Got `fewshot_indices` but fewshot_docs are not a HF dataset. Don't use both `fewshot_indices` and a user-defined few-shot sample list simultaneously" + ) + self.docs = self.docs.select(fewshot_indices) + + def get_context(self, doc, num_fewshot): + # draw an extra fewshot sample if using same split as evaluating on + n_samples = ( + num_fewshot + 1 + if self.config.fewshot_split == self.config.test_split + else num_fewshot + ) + + # draw `n_samples` docs from fewshot_docs + fewshotex = self.sample(n_samples) + + # get rid of the doc that's the one we're evaluating, if it's in the fewshot + # TODO: should we just stop people from using fewshot from same split as evaluating? + selected_docs = [x for x in fewshotex if x != doc][:num_fewshot] + + labeled_examples = "" + for doc in selected_docs: + doc_content = self.doc_to_text(doc) + doc_target = self.doc_to_target(doc) + labeled_examples += ( + doc_content + if self.config.doc_to_choice is None or isinstance(doc_content, str) + else self.doc_to_choice(doc)[doc_content] + ) + + if doc_target != "": + labeled_examples += self.target_delimiter + labeled_examples += ( + str(doc_target[0]) + if isinstance(doc_target, list) + else doc_target + if self.config.doc_to_choice is None or isinstance(doc_target, str) + else str(self.doc_to_choice(doc)[doc_target]) + ) + labeled_examples += self.fewshot_delimiter + + return labeled_examples + + def get_chat_context( + self, + doc, + num_fewshot, + fewshot_as_multiturn: bool = False, + ): + chat_history = [] + # draw an extra fewshot sample if using same split as evaluating on + n_samples = ( + num_fewshot + 1 + if self.config.fewshot_split == self.config.test_split + else num_fewshot + ) + # draw `n_samples` docs from fewshot_docs + fewshotex = self.sample(n_samples) + + # get rid of the doc that's the one we're evaluating, if it's in the fewshot + # TODO: should we just stop people from using fewshot from same split as evaluating? + selected_docs = [x for x in fewshotex if x != doc][:num_fewshot] + + if fewshot_as_multiturn: + for doc in selected_docs: + doc_content = self.doc_to_text(doc) + doc_target = self.doc_to_target(doc) + chat_history.append( + { + "role": "user", + "content": doc_content + if self.config.doc_to_choice is None + or isinstance(doc_content, str) + else self.doc_to_choice(doc)[doc_content], + } + ) + chat_history.append( + { + "role": "assistant", + "content": str(doc_target[0]) + if isinstance(doc_target, list) + else doc_target + if self.config.doc_to_choice is None + or isinstance(doc_target, str) + else str(self.doc_to_choice(doc)[doc_target]), + } + ) + else: + # get fewshot context as one user turn + chat_history.append( + {"role": "user", "content": self.get_context(doc, num_fewshot)} + ) + + return chat_history + + def sample(self, n): + """ + Draw `n` samples from our fewshot docs. This method should be overridden by subclasses. + """ + + return self.rnd.sample(self.docs, n) + + +class FirstNSampler(ContextSampler): + def sample(self, n) -> None: + """ + Draw the first `n` samples in order from the specified split. + Used for tasks with "canonical" ordered fewshot examples, such as MMLU and CMMLU. + """ + assert ( + n <= len(self.docs) + ), f"Error: number of fewshot samples requested exceeds the {len(self.docs)} that are available." + return self.docs[:n] + + +class BalancedSampler(ContextSampler): + def sample(self, n) -> None: + """ + TODO: this should return approximately class-balanced samples from our fewshot examples. + TODO: what order should they be in? maybe random? + """ + + pass + + +class ManualSampler(ContextSampler): + def sample(self, n) -> None: + """ """ + pass + + +SAMPLER_REGISTRY = { + "default": ContextSampler, + "first_n": FirstNSampler, +} + + +def get_sampler(name): + try: + return SAMPLER_REGISTRY[name] + except KeyError: + raise ValueError( + f"Attempted to use contextsampler '{name}', but no sampling strategy for this name found! Supported model names: {', '.join(SAMPLER_REGISTRY.keys())}" + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/task.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/task.py new file mode 100644 index 0000000000000000000000000000000000000000..56a1ad16016d130b9f3e030d5dbb7de42c8f5839 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/api/task.py @@ -0,0 +1,1713 @@ +import abc +import ast +import logging +import random +import re +from collections.abc import Callable +from copy import deepcopy +from dataclasses import asdict, dataclass +from inspect import getsource +from typing import ( + Any, + Dict, + Iterable, + Iterator, + List, + Literal, + Mapping, + Optional, + Tuple, + Union, +) + +import datasets +import numpy as np +from tqdm import tqdm + +from lm_eval import utils +from lm_eval.api import samplers +from lm_eval.api.instance import Instance, OutputType +from lm_eval.api.metrics import bits_per_byte, mean, weighted_perplexity +from lm_eval.api.registry import ( + AGGREGATION_REGISTRY, + DEFAULT_METRIC_REGISTRY, + get_aggregation, + get_metric, + get_metric_aggregation, + is_higher_better, +) +from lm_eval.caching.cache import load_from_cache, save_to_cache +from lm_eval.filters import build_filter_ensemble +from lm_eval.prompts import get_prompt + + +ALL_OUTPUT_TYPES = [ + "loglikelihood", + "multiple_choice", + "loglikelihood_rolling", + "generate_until", +] + +eval_logger = logging.getLogger("lm-eval") + + +@dataclass +class TaskConfig(dict): + # task naming/registry + task: Optional[str] = None + task_alias: Optional[str] = None + tag: Optional[Union[str, list]] = None + # HF dataset options. + # which dataset to use, + # and what splits for what purpose + dataset_path: Optional[str] = None + dataset_name: Optional[str] = None + dataset_kwargs: Optional[dict] = None + training_split: Optional[str] = None + validation_split: Optional[str] = None + test_split: Optional[str] = None + fewshot_split: Optional[str] = ( + None # TODO: assert that this not None if num_fewshot > 0. (?) assert if this is same split as one evaluating (?) + ) + # formatting / prompting options. + # see docs/advanced_task_guide.md for more info + process_docs: Optional[Callable] = None + doc_to_text: Optional[Union[Callable, str]] = None + doc_to_target: Optional[Union[Callable, str]] = None + doc_to_image: Union[Callable, str] = None + doc_to_choice: Optional[Union[Callable, str, dict, list]] = None + process_results: Optional[Union[Callable, str]] = None + use_prompt: Optional[str] = None + description: str = "" + target_delimiter: str = " " + fewshot_delimiter: str = "\n\n" + fewshot_config: Optional[dict] = None + # runtime configuration options + num_fewshot: Optional[int] = None + # scoring options + metric_list: Optional[list] = None + output_type: OutputType = "generate_until" + generation_kwargs: Optional[dict] = None + repeats: int = 1 + filter_list: Optional[Union[str, list]] = None + should_decontaminate: bool = False + doc_to_decontamination_query: Optional[str] = None + metadata: Optional[dict] = ( + None # by default, not used in the code. allows for users to pass arbitrary info to tasks + ) + + def __post_init__(self) -> None: + if self.generation_kwargs is not None: + if self.output_type != "generate_until": + eval_logger.warning( + f"[{self.task}] passed `generation_kwargs`, but not using `output_type: generate_until`!" + ) + + if "temperature" in self.generation_kwargs: + self.generation_kwargs["temperature"] = float( + self.generation_kwargs["temperature"] + ) + + if "until" not in self.generation_kwargs: + self.generation_kwargs["until"] = [self.fewshot_delimiter] + else: + if self.output_type == "generate_until": + # ensure that we greedily generate in absence of explicit arguments otherwise + self.generation_kwargs = { + "until": ( + None + if self.fewshot_delimiter is None + else [self.fewshot_delimiter] + ), + "do_sample": False, + } + + def __getitem__(self, item): + return getattr(self, item) + + def __setitem__(self, item, value): + return setattr(self, item, value) + + def to_dict(self, keep_callable: bool = False) -> dict: + """dumps the current config as a dictionary object, as a printable format. + null fields will not be printed. + Used for dumping results alongside full task configuration + + :return: dict + A printable dictionary version of the TaskConfig object. + + # TODO: should any default value in the TaskConfig not be printed? + """ + cfg_dict = asdict(self) + # remove values that are `None` + for k, v in list(cfg_dict.items()): + if v is None: + cfg_dict.pop(k) + elif k == "metric_list": + for metric_dict in v: + for metric_key, metric_value in metric_dict.items(): + if callable(metric_value): + metric_dict[metric_key] = self.serialize_function( + metric_value, keep_callable=keep_callable + ) + cfg_dict[k] = v + elif callable(v): + cfg_dict[k] = self.serialize_function(v, keep_callable=keep_callable) + return cfg_dict + + def serialize_function( + self, value: Union[Callable, str], keep_callable=False + ) -> Union[Callable, str]: + """Serializes a given function or string. + + If 'keep_callable' is True, the original callable is returned. + Otherwise, attempts to return the source code of the callable using 'getsource'. + """ + if keep_callable: + return value + else: + try: + return getsource(value) + except (TypeError, OSError): + return str(value) + + +class Task(abc.ABC): + """A task represents an entire benchmark including its dataset, problems, + answers, and evaluation methods. See BoolQ for a simple example implementation + + A `doc` can be any python object which represents one instance of evaluation. + This is usually a dictionary e.g. + {"question": ..., "answer": ...} or + {"question": ..., question, answer) + """ + + VERSION: Optional[Union[int, str]] = None + + # The name of the `Task` benchmark as denoted in the HuggingFace datasets Hub + # or a path to a custom `datasets` loading script. + DATASET_PATH: Optional[str] = None + + # The name of a subset within `DATASET_PATH`. + DATASET_NAME: Optional[str] = None + + OUTPUT_TYPE: Optional[OutputType] = None + + def __init__( + self, + data_dir: Optional[str] = None, + cache_dir: Optional[str] = None, + download_mode: Optional[datasets.DownloadMode] = None, + config: Optional[Mapping] = None, # Union[dict, TaskConfig] + ) -> None: + """ + :param data_dir: str + Stores the path to a local folder containing the `Task`'s data files. + Use this to specify the path to manually downloaded data (usually when + the dataset is not publicly accessible). + :param cache_dir: str + The directory to read/write the `Task` dataset. This follows the + HuggingFace `datasets` API with the default cache directory located at: + `~/.cache/huggingface/datasets` + NOTE: You can change the cache location globally for a given process + to another directory: + `export HF_DATASETS_CACHE="/path/to/another/directory"` + :param download_mode: datasets.DownloadMode + How to treat pre-existing `Task` downloads and data. + - `datasets.DownloadMode.REUSE_DATASET_IF_EXISTS` + Reuse download and reuse dataset. + - `datasets.DownloadMode.REUSE_CACHE_IF_EXISTS` + Reuse download with fresh dataset. + - `datasets.DownloadMode.FORCE_REDOWNLOAD` + Fresh download and fresh dataset. + """ + self.download(data_dir, cache_dir, download_mode) + self._training_docs: Optional[list] = None + self._fewshot_docs: Optional[list] = None + self._instances: Optional[List[Instance]] = None + + self._config: TaskConfig = TaskConfig({**config}) if config else TaskConfig() + + self._filters = [build_filter_ensemble("none", [["take_first", None]])] + self.fewshot_rnd: Optional[random.Random] = ( + None # purposely induce errors in case of improper usage + ) + + def download( + self, + data_dir: Optional[str] = None, + cache_dir: Optional[str] = None, + download_mode=None, + ) -> None: + """Downloads and returns the task dataset. + Override this method to download the dataset from a custom API. + + :param data_dir: str + Stores the path to a local folder containing the `Task`'s data files. + Use this to specify the path to manually downloaded data (usually when + the dataset is not publicly accessible). + :param cache_dir: str + The directory to read/write the `Task` dataset. This follows the + HuggingFace `datasets` API with the default cache directory located at: + `~/.cache/huggingface/datasets` + NOTE: You can change the cache location globally for a given process + by setting the shell environment variable, `HF_DATASETS_CACHE`, + to another directory: + `export HF_DATASETS_CACHE="/path/to/another/directory"` + :param download_mode: datasets.DownloadMode + How to treat pre-existing `Task` downloads and data. + - `datasets.DownloadMode.REUSE_DATASET_IF_EXISTS` + Reuse download and reuse dataset. + - `datasets.DownloadMode.REUSE_CACHE_IF_EXISTS` + Reuse download with fresh dataset. + - `datasets.DownloadMode.FORCE_REDOWNLOAD` + Fresh download and fresh dataset. + """ + self.dataset = datasets.load_dataset( + path=self.DATASET_PATH, + name=self.DATASET_NAME, + data_dir=data_dir, + cache_dir=cache_dir, + download_mode=download_mode, + ) + + @property + def config(self) -> TaskConfig: + """Returns the TaskConfig associated with this class.""" + return self._config + + @abc.abstractmethod + def has_training_docs(self): + """Whether the task has a training set""" + pass + + @abc.abstractmethod + def has_validation_docs(self): + """Whether the task has a validation set""" + pass + + @abc.abstractmethod + def has_test_docs(self): + """Whether the task has a test set""" + pass + + def training_docs(self) -> Iterable: + """ + :return: Iterable[obj] + A iterable of any object, that doc_to_text can handle + """ + return [] + + def validation_docs(self) -> Iterable: + """ + :return: Iterable[obj] + A iterable of any object, that doc_to_text can handle + """ + return [] + + def test_docs(self) -> Iterable: + """ + :return: Iterable[obj] + A iterable of any object, that doc_to_text can handle + """ + return [] + + def fewshot_docs(self) -> Iterable: + """ + :return: Iterable[obj] + A iterable of any object, that doc_to_text can handle + """ + if self.has_training_docs(): + return self.training_docs() + elif self.has_validation_docs(): + return self.validation_docs() + else: + eval_logger.warning( + f"[Task: {self.config.task}] has_training_docs and has_validation_docs are False" + ", using test_docs as fewshot_docs but this is not recommended." + ) + return self.test_docs() + + def _process_doc(self, doc: dict) -> dict: + """ + Override this to process (detokenize, strip, replace, etc.) individual + documents. This can be used in a map over documents of a data split. + E.g. `map(self._process_doc, self.dataset["validation"])` + + :return: dict + The processed version of the specified `doc`. + """ + return doc + + @property + def instances(self) -> List[Instance]: + """After calling `task.build_all_requests()`, tasks + maintain a list of the dataset instances which will be evaluated. + """ + return self._instances + + def fewshot_examples(self, k, rnd): + if self._training_docs is None: + self._training_docs = list(self.training_docs()) + + return rnd.sample(self._training_docs, k) + + def doc_to_decontamination_query(self, doc): + raise NotImplementedError( + "Override doc_to_decontamination_query with document specific decontamination query." + ) + + @abc.abstractmethod + def doc_to_text(self, doc): + pass + + @abc.abstractmethod + def doc_to_target(self, doc): + pass + + # not an abstractmethod because not every language-only task has to implement this + def doc_to_image(self, doc): + raise NotImplementedError + + def build_all_requests( + self, + *, + limit: Union[int, None] = None, + rank: int = 0, + world_size: int = 1, + cache_requests: bool = False, + rewrite_requests_cache: bool = False, + system_instruction: Optional[str] = None, + apply_chat_template: bool = False, + fewshot_as_multiturn: bool = False, + chat_template: Optional[Callable] = None, + tokenizer_name: str = "", + ) -> None: + """Build a set of Instances for a task, and store them in task.instances""" + + # used with caching + og_limit = limit + + cache_key = f"requests-{self._config.task}-{self.config.num_fewshot}shot-rank{rank}-world_size{world_size}" + cache_key += "-chat_template" if apply_chat_template else "" + cache_key += "-fewshot_as_multiturn" if fewshot_as_multiturn else "" + cache_key += ( + f"-system_prompt_hash{utils.hash_string(system_instruction)}" + if system_instruction is not None + else "" + ) + cache_key += f"-tokenizer{tokenizer_name}" + + cached_instances = load_from_cache(file_name=cache_key) + + if cache_requests and cached_instances and not rewrite_requests_cache: + cached_instances = cached_instances[:limit] + + flattened_instances = [ + instance + for instance_group in cached_instances + for instance in instance_group + ] + + self._instances = flattened_instances + return + + eval_logger.info(f"Building contexts for {self.config.task} on rank {rank}...") + + instances = [] + + # process all documents when caching is specified for simplicity + if ( + cache_requests + and (not cached_instances or rewrite_requests_cache) + and limit is not None + ): + limit = None + + doc_id_docs = list( + self.doc_iterator(rank=rank, limit=limit, world_size=world_size) + ) + + num_docs = len(doc_id_docs) + + for doc_id, doc in tqdm( + doc_id_docs, + total=num_docs, + ): + # sample fewshot context #TODO: need to offset doc_id by rank now! + fewshot_ctx = self.fewshot_context( + doc, + 0 if self.config.num_fewshot is None else self.config.num_fewshot, + system_instruction, + apply_chat_template, + fewshot_as_multiturn, + chat_template, + ) + + # TODO: we should override self.config.repeats if doing greedy gen so users don't waste time+compute + inst = self.construct_requests( + doc=doc, + ctx=fewshot_ctx, + metadata=(self.config["task"], doc_id, self.config.repeats), + apply_chat_template=apply_chat_template, + ) + + if not isinstance(inst, list): + inst = [inst] + + instances.append(inst) + + # now flatten, this is to allow slicing to work with pickles + + sliced_instances = instances[:og_limit] + + flattened_instances = [ + instance + for instance_group in sliced_instances + for instance in instance_group + ] + + self._instances = flattened_instances + + if len(self._instances) == 0: + raise ValueError("task.build_requests() did not find any docs!") + + if cache_requests and (not cached_instances or rewrite_requests_cache): + save_to_cache(file_name=cache_key, obj=instances) + + @abc.abstractmethod + def construct_requests(self, doc, ctx, **kwargs): + """Uses RequestFactory to construct Requests and returns an iterable of + Requests which will be sent to the LM. + + :param doc: + The document as returned from training_docs, validation_docs, or test_docs. + :param ctx: str + The context string, generated by fewshot_context. This includes the natural + language description, as well as the few shot examples, and the question + part of the document for `doc`. + :param doc_idx: int + The index of a document within `self.test_docs()` or `self.validation_docs()`, + whichever is the main split used. + :param repeats: int + TODO: update this docstring + The number of times each instance in a dataset is inferred on. Defaults to 1, + can be increased for techniques like majority voting. + """ + pass + + @abc.abstractmethod + def process_results(self, doc, results): + """Take a single document and the LM results and evaluates, returning a + dict where keys are the names of submetrics and values are the values of + the metric for that one document + + :param doc: + The document as returned from training_docs, validation_docs, or test_docs. + :param results: + The results of the requests created in construct_requests. + """ + pass + + @abc.abstractmethod + def aggregation(self): + """ + :returns: {str: [metric_score] -> float} + A dictionary where keys are the names of submetrics and values are + functions that aggregate a list of metric scores + """ + pass + + @abc.abstractmethod + def higher_is_better(self): + """ + :returns: {str: bool} + A dictionary where keys are the names of submetrics and values are + whether a higher value of the submetric is better + """ + pass + + def get_config(self, key: str) -> Any: + return getattr(self._config, key, None) + + @classmethod + def count_bytes(cls, doc): + """Used for byte-level perplexity metrics in rolling loglikelihood""" + return len(doc.encode("utf-8")) + + @classmethod + def count_words(cls, doc): + """Downstream loglikelihood_rolling perplexity tasks with custom word boundaries should override this!""" + return len(re.split(r"\s+", doc)) + + @utils.positional_deprecated + def fewshot_context( + self, + doc, + num_fewshot, + rnd=None, + description=None, + ): + """Returns a fewshot context string that is made up of a prepended description + (if provided), the `num_fewshot` number of examples, and an appended prompt example. + + :param doc: str + The document as returned from training_docs, validation_docs, or test_docs. + :param num_fewshot: int + The number of fewshot examples to provide in the returned context string. + :param rnd: random.Random + The pseudo-random number generator used to randomly sample examples. + WARNING: This is currently a required arg although it's optionalized with a default `None`. + :param description: str + The task's description that will be prepended to the fewshot examples. + :returns: str + The fewshot context. + """ + if rnd is None: + if self.fewshot_rnd is not None: + rnd = self.fewshot_rnd + else: + raise ValueError( + "A `random.Random` generator argument must be provided to `rnd`" + ) + + description = description if description else "" + + if num_fewshot == 0: + labeled_examples = "" + else: + # for sets with no training docs, draw from other set *but ensure no overlap with current doc* + if self.has_training_docs(): + fewshotex = self.fewshot_examples(k=num_fewshot, rnd=rnd) + else: + if self._fewshot_docs is None: + self._fewshot_docs = list( + self.validation_docs() + if self.has_validation_docs() + else self.test_docs() + ) + + fewshotex = rnd.sample(self._fewshot_docs, num_fewshot + 1) + + # get rid of the doc that's the one we're evaluating, if it's in the fewshot + fewshotex = [x for x in fewshotex if x != doc][:num_fewshot] + + labeled_examples = ( + "\n\n".join( + [ + self.doc_to_text(doc) + self.doc_to_target(doc) + for doc in fewshotex + ] + ) + + "\n\n" + ) + + example = self.doc_to_text(doc) + return description + labeled_examples + example + + def apply_filters(self) -> Optional[List[Instance]]: + """Iterates over FilterEnsembles and applies them to instances""" + if hasattr(self, "_filters"): + for f in self._filters: + f.apply(self._instances) + else: + eval_logger.warning("No filter defined, passing through instances") + return self._instances + + def dump_config(self) -> dict: + """Returns the config as a dictionary.""" + # TODO: this should only return the overrides applied to a non-YAML task's configuration. + # (num_fewshot) + return self.config.to_dict() + + def set_config(self, key: str, value: Any, update: bool = False) -> None: + """Set or update the configuration for a given key.""" + if key is None: + raise ValueError("Key must be provided.") + + if update: + current_value = getattr(self._config, key, {}) + if not isinstance(current_value, dict): + raise TypeError( + f"Expected a dict for key '{key}', got {type(current_value).__name__} instead." + ) + current_value.update(value) + else: + setattr(self._config, key, value) + + def override_metric(self, metric_name: str) -> None: + """ + Override the default metrics used for evaluation with custom metrics. + + Parameters: + - metric_name (str): The name of the custom metric to override. Should be registered in api.metrics. + """ + ( + self._metric_fn_list, + self._aggregation_list, + self._metric_fn_kwargs, + self._higher_is_better, + ) = ({}, {}, {}, {}) + self._metric_fn_list[metric_name] = get_metric(metric_name) + self._aggregation_list[metric_name] = get_metric_aggregation(metric_name) + self._higher_is_better[metric_name] = is_higher_better(metric_name) + self._metric_fn_kwargs[metric_name] = {} + if not isinstance(self, ConfigurableTask): + self.process_results = lambda x, y: {metric_name: get_metric(metric_name)} + self.aggregation = lambda: { + metric_name: get_metric_aggregation(metric_name) + } + setattr(self._config, "metric_list", [{"metric": metric_name}]) + setattr(self._config, "process_results", None) + + def set_fewshot_seed(self, seed: Optional[int] = None) -> None: + self.fewshot_rnd = random.Random(seed) + if hasattr(self, "sampler"): + self.sampler.rnd = self.fewshot_rnd + + @property + def eval_docs(self) -> Union[datasets.Dataset, List[dict]]: + if self.has_test_docs(): + return self.test_docs() + elif self.has_validation_docs(): + return self.validation_docs() + else: + raise ValueError( + f"Task dataset (path={self.DATASET_PATH}, name={self.DATASET_NAME}) must have valid or test docs!" + ) + + def doc_iterator( + self, *, rank: int = 0, limit: Union[int, None] = None, world_size: int = 1 + ) -> Iterator[Tuple[int, Any]]: + limit = int(limit) if limit else None + doc_iterator = utils.create_iterator( + enumerate(self.eval_docs), + rank=int(rank), + limit=limit, + world_size=int(world_size), + ) + return doc_iterator + + +class ConfigurableTask(Task): + VERSION = "Yaml" + OUTPUT_TYPE = None + CONFIG = None + + def __init__( + self, + data_dir=None, + cache_dir=None, + download_mode=None, + config: Optional[dict] = None, + ) -> None: # TODO no super() call here + # Get pre-configured attributes + self._config = self.CONFIG + + # Use new configurations if there was no preconfiguration + if self.config is None: + self._config = TaskConfig(**config) + # Overwrite configs + else: + if config is not None: + self._config.__dict__.update(config) + + if self.config is None: + raise ValueError( + "Must pass a config to ConfigurableTask, either in cls.CONFIG or `config` kwarg" + ) + + if isinstance(self.config.metadata, dict): + if "version" in self.config.metadata: + self.VERSION = self.config.metadata["version"] + + if self.config.output_type is not None: + if self.config.output_type not in ALL_OUTPUT_TYPES: + raise ValueError( + f"Got invalid output_type '{self.config.output_type}', must be in '{','.join(ALL_OUTPUT_TYPES)}'" + ) + self.OUTPUT_TYPE = self.config.output_type + + if self.config.doc_to_image is not None: + # mark the task as requiring multimodality. + self.MULTIMODAL = True + + if self.config.dataset_path is not None: + self.DATASET_PATH = self.config.dataset_path + + if self.config.dataset_name is not None: + self.DATASET_NAME = self.config.dataset_name + + self._metric_fn_list = {} + self._metric_fn_kwargs = {} + self._aggregation_list = {} + self._higher_is_better = {} + + if self.config.metric_list is None: + # TODO: handle this in TaskConfig.__post_init__ ? + _metric_list = DEFAULT_METRIC_REGISTRY[self.config.output_type] + + for metric_name in _metric_list: + self._metric_fn_list[metric_name] = get_metric(metric_name) + self._metric_fn_kwargs[metric_name] = {} + self._aggregation_list[metric_name] = get_metric_aggregation( + metric_name + ) + self._higher_is_better[metric_name] = is_higher_better(metric_name) + else: + for metric_config in self.config.metric_list: + if "metric" not in metric_config: + raise ValueError( + "'metric' key not provided for an entry in 'metric_list', must be specified!" + ) + metric_name = metric_config["metric"] + kwargs = { + key: metric_config[key] + for key in metric_config + if key + not in ["metric", "aggregation", "higher_is_better", "hf_evaluate"] + } + hf_evaluate_metric = ( + "hf_evaluate" in metric_config + and metric_config["hf_evaluate"] is True + ) + + if self.config.process_results is not None: + self._metric_fn_list[metric_name] = None + self._metric_fn_kwargs[metric_name] = {} + elif callable(metric_name): + metric_fn = metric_name.__call__ + metric_name = metric_name.__name__ + self._metric_fn_list[metric_name] = metric_fn + self._metric_fn_kwargs[metric_name] = kwargs + else: + self._metric_fn_list[metric_name] = get_metric( + metric_name, hf_evaluate_metric + ) + self._metric_fn_kwargs[metric_name] = kwargs + + if "aggregation" in metric_config: + agg_name = metric_config["aggregation"] + if isinstance(agg_name, str): + self._aggregation_list[metric_name] = get_aggregation(agg_name) + elif callable(agg_name): # noqa: E721 + self._aggregation_list[metric_name] = metric_config[ + "aggregation" + ] + else: + INV_AGG_REGISTRY = {v: k for k, v in AGGREGATION_REGISTRY.items()} + metric_agg = get_metric_aggregation(metric_name) + eval_logger.warning( + f"[Task: {self.config.task}] metric {metric_name} is defined, but aggregation is not. " + f"using default " + f"aggregation={INV_AGG_REGISTRY[metric_agg]}" + ) + self._aggregation_list[metric_name] = metric_agg + + if "higher_is_better" in metric_config: + self._higher_is_better[metric_name] = metric_config[ + "higher_is_better" + ] + else: + eval_logger.warning( + f"[Task: {self.config.task}] metric {metric_name} is defined, but higher_is_better is not. " + f"using default " + f"higher_is_better={is_higher_better(metric_name)}" + ) + self._higher_is_better[metric_name] = is_higher_better(metric_name) + + self.download(self.config.dataset_kwargs) + self._training_docs = None + self._fewshot_docs = None + + if self.config.filter_list is not None: + self._filters = [] + for filter_config in self.config.filter_list: + filter_name = filter_config["name"] + filter_functions = filter_config["filter"] + components = [] + for function in filter_functions: + kwargs = { + key: function[key] for key in function if key != "function" + } + components.append([function["function"], kwargs]) + filter_pipeline = build_filter_ensemble(filter_name, components) + self._filters.append(filter_pipeline) + else: + self._filters = [build_filter_ensemble("none", [["take_first", None]])] + + if self.config.use_prompt is not None: + eval_logger.info(f"loading prompt {self.config.use_prompt}") + self.prompt = get_prompt( + self.config.use_prompt, self.DATASET_PATH, self.DATASET_NAME + ) + else: + self.prompt = None + + if self.fewshot_docs() is not None: + self.fewshot_rnd = ( + random.Random() + ) # setting with no seed, to be overridden at a later time + config_sampler: Union[str, Callable] = ( + self.config.fewshot_config.get("sampler", "default") + if self.config.fewshot_config + else "default" + ) + if isinstance(config_sampler, str): + self.sampler = samplers.get_sampler(config_sampler)( + list(self.fewshot_docs()), self, rnd=self.fewshot_rnd + ) + elif callable(config_sampler) and issubclass( + config_sampler, samplers.ContextSampler + ): + self.sampler = config_sampler( + docs=list(self.fewshot_docs()), task=self, rnd=self.fewshot_rnd + ) + else: + raise TypeError( + f"fewshot_config.sampler should be a string or callable of ContextSampler type, " + f"not {type(config_sampler)}" + ) + + self.task_docs = self.eval_docs + + # Test One Doc + self.features = list(self.task_docs.features.keys()) + self.multiple_input = 0 + self.multiple_target = 0 + test_doc = self.task_docs[0] + test_text = self.doc_to_text(test_doc) + test_target = self.doc_to_target(test_doc) + + if self.config.doc_to_choice is not None: + test_choice = self.doc_to_choice(test_doc) + if not isinstance(test_choice, list): + eval_logger.error("doc_to_choice must return list") + else: + num_choice = len(test_choice) + + if isinstance(test_text, int): + self.multiple_input = num_choice + else: + test_choice = None + + if isinstance(test_target, list): + self.multiple_target = len(test_target) + else: + if (isinstance(test_target, int)) and (test_choice is not None): + test_target = test_choice[test_target] + else: + test_target = str(test_target) + + if test_choice is not None: + check_choices = test_choice + else: + check_choices = [test_target] + if self.config.doc_to_choice is not None: + for choice in check_choices: + choice_has_whitespace = True if choice[0].isspace() else False + delimiter_has_whitespace = ( + True + if self.config.target_delimiter.rstrip() + != self.config.target_delimiter + else False + ) + + if delimiter_has_whitespace and choice_has_whitespace: + eval_logger.debug( + f'Both target_delimiter "{self.config.target_delimiter}" and target choice: "{choice}" have whitespace' + ) + elif (not delimiter_has_whitespace) and (not choice_has_whitespace): + eval_logger.debug( + f'Both target_delimiter "{self.config.target_delimiter}" and target choice: "{choice}" do not have whitespace, ignore if the language you are evaluating on does not require/use whitespace' + ) + + def download(self, dataset_kwargs: Optional[Dict[str, Any]] = None) -> None: + self.dataset = datasets.load_dataset( + path=self.DATASET_PATH, + name=self.DATASET_NAME, + **dataset_kwargs if dataset_kwargs is not None else {}, + ) + + def has_training_docs(self) -> bool: + if self.config.training_split is not None: + return True + else: + return False + + def has_validation_docs(self) -> bool: + if self.config.validation_split is not None: + return True + else: + return False + + def has_test_docs(self) -> bool: + if self.config.test_split is not None: + return True + else: + return False + + def training_docs(self) -> datasets.Dataset: + if self.has_training_docs(): + if self.config.process_docs is not None: + return self.config.process_docs( + self.dataset[self.config.training_split] + ) + return self.dataset[self.config.training_split] + + def validation_docs(self) -> datasets.Dataset: + if self.has_validation_docs(): + if self.config.process_docs is not None: + return self.config.process_docs( + self.dataset[self.config.validation_split] + ) + return self.dataset[self.config.validation_split] + + def test_docs(self) -> datasets.Dataset: + if self.has_test_docs(): + if self.config.process_docs is not None: + return self.config.process_docs(self.dataset[self.config.test_split]) + return self.dataset[self.config.test_split] + + def fewshot_docs(self): + if self.config.fewshot_split is not None: + if self.config.process_docs is not None: + return self.config.process_docs(self.dataset[self.config.fewshot_split]) + return self.dataset[self.config.fewshot_split] + elif ( + self.config.fewshot_config is not None + and self.config.fewshot_config.get("samples", None) is not None + ): + if isinstance(self.config.fewshot_config["samples"], list): + return self.config.fewshot_config["samples"] + elif callable(self.config.fewshot_config["samples"]): + return self.config.fewshot_config["samples"]() + else: + raise Exception( + "`fewshot_config['samples']` was incorrectly defined in the configuration. It should be either a list of samples as a dict, or function returning this list." + ) + else: + if (self.config.num_fewshot is not None) and (self.config.num_fewshot > 0): + eval_logger.warning( + f"[Task: {self.config.task}] " + "num_fewshot > 0 but fewshot_split is None. " + "using preconfigured rule." + ) + return super().fewshot_docs() + + @staticmethod + def append_target_question( + labeled_examples: List[Dict[str, str]], + question: str, + fewshot_as_multiturn: bool = False, + ) -> None: + """Adds a target question to the labeled examples list. + If fewshot_as_multiturn is True, or labeled_examples is empty, or the last entry is a system turn, appends the question as a new user entry. + Otherwise, it is appended to the last user entry, ensuring that the conversation alternates between the user and the assistant. + """ + if not fewshot_as_multiturn: + # if no messages or last message is system, append as new user entry + if len(labeled_examples) == 0 or labeled_examples[-1]["role"] == "system": + labeled_examples.append({"role": "user", "content": question}) + # if last message is user, append to it to avoid two user messages in a row + else: + labeled_examples[-1]["content"] += question + else: + # if fewshot_as_multiturn is True, append as next user entry (last is always assistant) + labeled_examples.append({"role": "user", "content": question}) + + @utils.positional_deprecated + def fewshot_context( + self, + doc: str, + num_fewshot: int, + system_instruction: Optional[str] = None, + apply_chat_template: bool = False, + fewshot_as_multiturn: bool = False, + chat_template: Optional[Callable] = None, + ) -> str: + """Returns a fewshot context string that is made up of a prepended description + (if provided), the `num_fewshot` number of examples, and an appended prompt example. + + :param doc: str + The document as returned from training_docs, validation_docs, or test_docs. + :param num_fewshot: int + The number of fewshot examples to provide in the returned context string. + :param system_instruction: str + System instruction to be applied to the prompt. + :param apply_chat_template: bool + Whether to apply the chat template to the fewshot context. + :param fewshot_as_multiturn: bool + Whether to provide the fewshot examples as a multiturn conversation or a single user turn. + :param chat_template: + callable (from lm.apply_chat_template) that takes in a list[Dict] chat transcript and renders it into a string. + :returns: str + The fewshot context. + """ + + if apply_chat_template: + labeled_examples = [] + else: + labeled_examples = "" + + # get task description + if description := self.config.description: + description = utils.apply_template(self.config.description, doc) + + # create system prompt based on the provided system instruction and description + if system_instruction is not None and description: + system_prompt = ( + f"{system_instruction}{self.sampler.fewshot_delimiter}{description}" + ) + elif system_instruction is not None: + system_prompt = system_instruction + elif description: + system_prompt = description + else: + system_prompt = "" + + # add system prompt if specified + if system_prompt: + if apply_chat_template: + labeled_examples.append({"role": "system", "content": system_prompt}) + else: + labeled_examples = system_prompt + + # if few-shot - append examples after the system prompt + if num_fewshot > 0: + if apply_chat_template: + labeled_examples.extend( + self.sampler.get_chat_context( + doc, num_fewshot, fewshot_as_multiturn + ) + ) + else: + labeled_examples += self.sampler.get_context(doc, num_fewshot) + + example = self.doc_to_text(doc) + if apply_chat_template: + if self.multiple_input: + return chat_template(labeled_examples) + if isinstance(example, str): + self.append_target_question( + labeled_examples, example, fewshot_as_multiturn + ) + # for loglikelihood create a list of questions with appended choices + elif isinstance(example, list): + labeled_examples_list = [] + # copy chat history for each example and append the answer + for ex in example: + chat = deepcopy(labeled_examples) + self.append_target_question(chat, ex, fewshot_as_multiturn) + labeled_examples_list.append(chat_template(chat)) + return labeled_examples_list + # if example is an integer, append the choice or convert to string + elif isinstance(example, int): + if self.config.doc_to_choice is not None: + choices = self.doc_to_choice(doc) + self.append_target_question( + labeled_examples, choices[example], fewshot_as_multiturn + ) + else: + self.append_target_question( + labeled_examples, str(example), fewshot_as_multiturn + ) + # return lm.apply_chat_template(labeled_examples) + return chat_template(labeled_examples) + else: + if self.multiple_input: + return labeled_examples + if isinstance(example, str): + return labeled_examples + example + elif isinstance(example, list): + return [labeled_examples + ex for ex in example] + elif isinstance(example, int): + if self.config.doc_to_choice is not None: + choices = self.doc_to_choice(doc) + return labeled_examples + choices[example] + else: + return labeled_examples + str(example) + + def apply_filters(self): + """Iterates over FilterEnsembles and applies them to instances""" + if hasattr(self, "_filters"): + for f in self._filters: + f.apply(self._instances) + else: + eval_logger.warning("No filter defined, passing through instances") + return self._instances + + def should_decontaminate(self): + return self.config.should_decontaminate + + def doc_to_decontamination_query(self, doc): + if self.config.should_decontaminate: + if self.config.doc_to_decontamination_query is None: + return self.doc_to_text(doc) + else: + doc_to_decontamination_query = self.config.doc_to_decontamination_query + if doc_to_decontamination_query in self.features: + return doc[doc_to_decontamination_query] + elif callable(doc_to_decontamination_query): + return doc_to_decontamination_query(doc) + else: + return ast.literal_eval( + utils.apply_template( + self.config.doc_to_decontamination_query, doc + ) + ) + + def _process_doc(self, doc: dict) -> dict: + """ + Override this to process (detokenize, strip, replace, etc.) individual + documents. This can be used in a map over documents of a data split. + E.g. `map(self._process_doc, self.dataset["validation"])` + + :return: dict + The processed version of the specified `doc`. + """ + return doc + + def doc_to_text(self, doc, doc_to_text=None): + if self.prompt is not None: + doc_to_text = self.prompt + elif doc_to_text is not None: + doc_to_text = doc_to_text + else: + doc_to_text = self.config.doc_to_text + + if isinstance(doc_to_text, int): + return doc_to_text + elif isinstance(doc_to_text, str): + if doc_to_text in self.features: + # if self.config.doc_to_choice is not None: + # return self.doc_to_choice(doc)[doc[doc_to_text]] + # else: + return doc[doc_to_text] + else: + text_string = utils.apply_template(doc_to_text, doc) + if text_string.isdigit() and self._config.doc_to_choice is not None: + return ast.literal_eval(text_string) + else: + return text_string + elif callable(doc_to_text): + return doc_to_text(doc) + # Used when applying a Promptsource template + elif hasattr(doc_to_text, "apply"): + applied_prompt = doc_to_text.apply(doc) + if len(applied_prompt) == 2: + return applied_prompt[0] + else: + eval_logger.warning("Applied prompt returns empty string") + return self.config.fewshot_delimiter + else: + print(type(doc_to_text)) + raise TypeError + + def doc_to_target(self, doc: Mapping, doc_to_target=None) -> Union[int, str, list]: + if self.prompt is not None: + doc_to_target = self.prompt + elif doc_to_target is not None: + doc_to_target = doc_to_target + else: + doc_to_target = self.config.doc_to_target + + if isinstance(doc_to_target, int): + return doc_to_target + elif isinstance(doc_to_target, str): + if doc_to_target in self.features: + # if self.config.doc_to_choice is not None: + # return self.doc_to_choice(doc)[doc[doc_to_target]] + # else: + return doc[doc_to_target] + else: + target_string = utils.apply_template(doc_to_target, doc) + if target_string.isdigit() and self._config.doc_to_choice is not None: + return ast.literal_eval(target_string) + elif ( + len(target_string) >= 2 + and (target_string[0] == "[") + and (target_string[-1] == "]") + ): + try: + return ast.literal_eval(target_string) + except (SyntaxError, ValueError): + return target_string + else: + return target_string + elif isinstance(doc_to_target, list): + return doc_to_target + elif callable(doc_to_target): + return doc_to_target(doc) + # Used when applying a Promptsource template + elif hasattr(doc_to_target, "apply"): + applied_prompt = doc_to_target.apply(doc) + if len(applied_prompt) == 2: + return applied_prompt[1] + else: + eval_logger.warning("Applied prompt returns empty string") + return self.config.fewshot_delimiter + else: + raise TypeError + + def doc_to_choice(self, doc: Any, doc_to_choice=None) -> List[str]: + if self.prompt is not None: + doc_to_choice = self.prompt + elif doc_to_choice is not None: + doc_to_choice = doc_to_choice + elif self.config.doc_to_choice is None: + eval_logger.error("doc_to_choice was called but not set in config") + else: + doc_to_choice = self.config.doc_to_choice + + if isinstance(doc_to_choice, str): + if doc_to_choice in self.features: + return doc[doc_to_choice] + else: + return ast.literal_eval(utils.apply_template(doc_to_choice, doc)) + elif isinstance(doc_to_choice, list): + return doc_to_choice + elif isinstance(doc_to_choice, dict): + return list(doc_to_choice.values()) + elif callable(doc_to_choice): + return doc_to_choice(doc) + elif hasattr(doc_to_choice, "get_answer_choices_list"): + return doc_to_choice.get_answer_choices_list(doc) + else: + raise TypeError + + def doc_to_image(self, doc: Any, doc_to_image=None) -> Union[int, str, list]: + if doc_to_image is not None: + doc_to_image = doc_to_image + elif self.config.doc_to_image is not None: + doc_to_image = self.config.doc_to_image + else: + return None + + if isinstance(doc_to_image, list): + image_feature = [ + self.doc_to_image(doc, feature) for feature in doc_to_image + ] + return [feature for feature in image_feature if feature is not None] + elif isinstance(doc_to_image, str): + if doc_to_image in self.features: + return doc[doc_to_image] + else: + return ast.literal_eval(utils.apply_template(doc_to_image, doc)) + elif callable(doc_to_image): + return doc_to_image(doc) + else: + return None + + def construct_requests( + self, doc: dict, ctx: str, **kwargs + ) -> Union[List[Instance], Instance]: + apply_chat_template = kwargs.pop("apply_chat_template", False) + + aux_arguments = None + + if self.OUTPUT_TYPE == "loglikelihood": + arguments = (ctx, self.doc_to_target(doc)) + elif self.OUTPUT_TYPE == "loglikelihood_rolling": + arguments = (self.doc_to_target(doc),) + elif self.OUTPUT_TYPE == "multiple_choice": + choices = self.doc_to_choice(doc) + target_delimiter = self.config.target_delimiter + if apply_chat_template: + target_delimiter = "" + if self.multiple_input: + # If there are multiple inputs, choices are placed in the ctx + cont = self.doc_to_target(doc) + arguments = [ + (ctx + choice, f"{target_delimiter}{cont}") for choice in choices + ] + else: + # Otherwise they are placed in the continuation + arguments = [(ctx, f"{target_delimiter}{cont}") for cont in choices] + + # TODO: we should raise a warning telling users this will at most ~2x runtime. + if "acc_mutual_info" in self._metric_fn_list.keys(): + # if we are calculating multiple choice accuracy + # using mutual information instead of raw loglikelihood as metric, need unconditional lls. + + # here mutual info refers to calculating + # log(P(choice|ctx) / P(choice)) = log(P(choice|ctx)) - log(P(choice)) + # in other words normalizing by subtracting the unconditional logprob of each choice. + aux_arguments = [("", f"{choice}") for choice in choices] + + arguments.extend(aux_arguments) + + elif self.OUTPUT_TYPE == "generate_until": + arguments = (ctx, deepcopy(self.config.generation_kwargs)) + + multimodal_arg = {} + if ( + self.config.doc_to_image + ): # TODO: ensure that non-multimodal tasks aren't getting visual args + multimodal_arg = { + **multimodal_arg, + **{"visual": self.doc_to_image(doc)}, + } + + if bool(multimodal_arg): + if isinstance(arguments, list): + arguments = [arg + (multimodal_arg,) for arg in arguments] + else: + arguments = arguments + (multimodal_arg,) + + if self.OUTPUT_TYPE == "multiple_choice": + request_list = [ + Instance( + request_type="loglikelihood", + doc=doc, + arguments=arg, + idx=i, + **kwargs, + ) + for i, arg in enumerate(arguments) + ] + + return request_list + + return Instance( + request_type=self.OUTPUT_TYPE, + doc=doc, + arguments=arguments, + idx=0, + **kwargs, + ) + + def process_results(self, doc, results): + if callable(self.config.process_results): + return self.config.process_results(doc, results) + + result_dict = {} + use_metric = list(self._metric_fn_list.keys()) + if self.OUTPUT_TYPE == "loglikelihood": + results = results[0] + ll, is_greedy = results + return { + **({"perplexity": ll} if "perplexity" in use_metric else {}), + **({"acc": int(is_greedy)} if "acc" in use_metric else {}), + } + elif self.OUTPUT_TYPE == "loglikelihood_rolling": + (loglikelihood,) = results + _words = self.count_words(self.doc_to_target(doc)) + _bytes = self.count_bytes(self.doc_to_target(doc)) + return { + **( + {"word_perplexity": (loglikelihood, _words)} + if "word_perplexity" in use_metric + else {} + ), + **( + {"byte_perplexity": (loglikelihood, _bytes)} + if "byte_perplexity" in use_metric + else {} + ), + **( + {"bits_per_byte": (loglikelihood, _bytes)} + if "bits_per_byte" in use_metric + else {} + ), + } + elif self.OUTPUT_TYPE == "multiple_choice": + lls, is_greedy = zip(*results) + + # retrieve choices in List[str] form, to compute choice lengths, etc. + choices = self.doc_to_choice(doc) + completion_len = np.array([float(len(i)) for i in choices]) + + if ( + 2 * len(choices) == len(lls) + and "acc_mutual_info" in self._metric_fn_list.keys() + ): + # then we are doing mutual info. + # this stores the "dryrun" / unconditional answer loglikelihoods + lls_unconditional = lls[1::2] + if len(lls_unconditional) != len(choices): + raise ValueError + # and this stores our "regular" conditional loglikelihoods + lls = lls[::2] + + pred = np.argmax(lls) + pred_norm = np.argmax(lls / completion_len) + + if self.multiple_input: + gold = self.doc_to_text(doc) + else: + gold = self.doc_to_target(doc) + + gold_index_error = False + if isinstance(gold, list): + gold = [i if i < len(choices) else -100 for i in gold] + if -100 in gold: + gold_index_error = True + else: + if isinstance(gold, int): + gold = gold if gold < len(choices) else -100 + elif isinstance(gold, str): + gold = choices.index(gold) if gold in choices else -100 + + if gold == -100: + gold_index_error = True + + if gold_index_error: + eval_logger.warning( + f"Label index was not in within range of available choices," + f"Sample:\n\n{doc}\n\n" + ) + + if self.multiple_target: + acc = 1.0 if pred in gold else 0.0 + acc_norm = 1.0 if pred_norm in gold else 0.0 + exact_match = int(any([is_greedy[i] if i != -100 else 0 for i in gold])) + else: + acc = 1.0 if pred == gold else 0.0 + acc_norm = 1.0 if pred_norm == gold else 0.0 + # TODO: this gets score of 0 on arc_challenge for pythia-70m. need to test that this works properly + exact_match = int(is_greedy[gold]) if gold != -100 else 0 + + prob_norm = utils.softmax(lls) + + # TODO use keyword arguments to the metric? + # gold, pred, norm stuff, the original lls, + result_dict = { + **({"acc": acc} if "acc" in use_metric else {}), + **({"f1": (gold, pred)} if "f1" in use_metric else {}), + **({"mcc": (gold, pred)} if "mcc" in use_metric else {}), + **({"acc_norm": acc_norm} if "acc_norm" in use_metric else {}), + **({"exact_match": exact_match} if "exact_match" in use_metric else {}), + **( + {"brier_score": (gold, prob_norm)} + if "brier_score" in use_metric + else {} + ), + } + + if "acc_mutual_info" in use_metric: + lls_mutual_info = [ + ll_c - ll_u for ll_c, ll_u in zip(lls, lls_unconditional) + ] + acc_mutual_info = 1.0 if np.argmax(lls_mutual_info) == gold else 0.0 + result_dict["acc_mutual_info"] = acc_mutual_info + + elif self.OUTPUT_TYPE == "generate_until": + gold = self.doc_to_target(doc) + result = results[0] + if self.config.doc_to_choice is not None: + # If you set doc_to_choice, + # it assumes that doc_to_target returns a number. + choices = self.doc_to_choice(doc) + gold = choices[gold] + # we expect multiple_targets to be a list. + elif self.multiple_target: + gold = list(gold) + elif type(gold) is not type(result): + # cast gold to the same type as result + gold = type(result)(gold) + + for metric in self._metric_fn_list.keys(): + if self.multiple_target: + # in the case where we have multiple targets, + # return true if any are true + # TODO: this may break for multipLe_target, non zero-or-1 metrics + scores = [] + if not isinstance(gold, list): + # sometimes, a multiple_target dataset has exceptions where one doc has only one string answer + # print(gold) + gold = [gold] + if metric == "exact_match": + result = [result for _ in range(len(gold))] + scores = self._metric_fn_list[metric]( + references=gold, + predictions=result, + **self._metric_fn_kwargs[metric], + )[metric] + result_score = 1.0 if scores > 0.0 else 0.0 + else: + for gold_option in gold: + try: + result_score = self._metric_fn_list[metric]( + references=[gold_option], + predictions=[result], + **self._metric_fn_kwargs[metric], + ) + except ( + TypeError + ): # TODO: this is hacky and I don't want to do it + result_score = self._metric_fn_list[metric]( + [gold_option, result] + ) + if isinstance(result_score, dict): + # TODO: this handles the case where HF evaluate returns a dict. + result_score = result_score[metric] + scores.append(result_score) + if any(scores): + result_score = 1.0 + else: + result_score = 0.0 + else: + try: + result_score = self._metric_fn_list[metric]( + references=[gold], + predictions=[result], + **self._metric_fn_kwargs[metric], + ) + except TypeError: # needed for now in order to use a different interface between our own metrics and HF Evaluate metrics + result_score = self._metric_fn_list[metric]([gold, result]) + if isinstance(result_score, dict): + # TODO: this handles the case where HF evaluate returns a dict. + result_score = result_score[metric] + result_dict[metric] = result_score + else: + raise ValueError( + f"Passed invalid output_type '{self.OUTPUT_TYPE}' ! Please use one of ", + "'loglikelihood', 'loglikelihood_rolling', 'generate_until' or 'multiple_choice'", + ) + + return result_dict + + def aggregation(self) -> dict: + return self._aggregation_list + + def higher_is_better(self) -> dict: + return self._higher_is_better + + def get_config(self, key: str) -> Any: + return getattr(self._config, key, None) + + @property + def task_name(self) -> Any: + return getattr(self.config, "task", None) + + def __repr__(self): + return ( + f"ConfigurableTask(task_name={getattr(self.config, 'task', None)}," + f"output_type={self.OUTPUT_TYPE}," + f"num_fewshot={getattr(self.config, 'num_fewshot', None)}," + f"num_samples={len(self.eval_docs)})" + ) + + +class MultipleChoiceTask(Task): + OUTPUT_TYPE = "loglikelihood" + + def doc_to_target(self, doc: dict) -> str: + return " " + doc["choices"][doc["gold"]] + + def construct_requests(self, doc: dict, ctx: str, **kwargs) -> List[Instance]: + # TODO: add mutual info here? + return [ + Instance( + request_type="loglikelihood", + doc=doc, + arguments=(ctx, " {}".format(choice)), + idx=i, + **kwargs, + ) + for i, choice in enumerate(doc["choices"]) + ] + + def process_results(self, doc: dict, results: Iterable[Tuple[float, bool]]) -> dict: + results = [ + res[0] for res in results + ] # only retain loglikelihoods, discard is_greedy TODO: do we need is_greedy anywhere? + gold = doc["gold"] + + acc = 1.0 if np.argmax(results) == gold else 0.0 + completion_len = np.array([float(len(i)) for i in doc["choices"]]) + acc_norm = 1.0 if np.argmax(results / completion_len) == gold else 0.0 + + return { + "acc": acc, + "acc_norm": acc_norm, + } + + def higher_is_better(self) -> dict: + return { + "acc": True, + "acc_norm": True, + } + + def aggregation(self) -> dict: + return { + "acc": mean, + "acc_norm": mean, + } + + +class PerplexityTask(Task): + OUTPUT_TYPE = "loglikelihood_rolling" + + def has_training_docs(self) -> bool: + return False + + def fewshot_examples(self, k: int, rnd) -> List: + if k != 0: + raise ValueError( + "The number of fewshot examples must be 0 for perplexity tasks." + ) + return [] + + def fewshot_context(self, doc: dict, num_fewshot: int) -> Literal[""]: + if num_fewshot != 0: + raise ValueError( + "The number of fewshot examples must be 0 for perplexity tasks." + ) + + return "" + + def higher_is_better(self) -> dict: + return { + "word_perplexity": False, + "byte_perplexity": False, + "bits_per_byte": False, + } + + def doc_to_decontamination_query(self, doc): + return doc + + def doc_to_text(self, doc) -> str: + return "" + + def doc_to_target(self, doc): + return doc + + def construct_requests(self, doc: dict, ctx: Optional[str], **kwargs): + if bool(ctx): + raise ValueError + + return Instance( + request_type=self.OUTPUT_TYPE, + doc=doc, + arguments=(self.doc_to_target(doc),), + idx=0, + **kwargs, + ) + + def process_results(self, doc: dict, results: Tuple[float]) -> dict: + (loglikelihood,) = results + words = self.count_words(self.doc_to_target(doc)) + bytes_ = self.count_bytes(self.doc_to_target(doc)) + return { + "word_perplexity": (loglikelihood, words), + "byte_perplexity": (loglikelihood, bytes_), + "bits_per_byte": (loglikelihood, bytes_), + } + + def aggregation(self) -> dict: + return { + "word_perplexity": weighted_perplexity, + "byte_perplexity": weighted_perplexity, + "bits_per_byte": bits_per_byte, + } + + @classmethod + def count_bytes(cls, doc) -> int: + return len(doc.encode("utf-8")) + + @classmethod + def count_words(cls, doc) -> int: + """Downstream tasks with custom word boundaries should override this!""" + return len(re.split(r"\s+", doc)) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/caching/__init__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/caching/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/caching/cache.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/caching/cache.py new file mode 100644 index 0000000000000000000000000000000000000000..63691435215a05894d206f3f8218ab23c5d2e250 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/caching/cache.py @@ -0,0 +1,55 @@ +import hashlib +import os + +import dill + +from lm_eval.utils import eval_logger + + +MODULE_DIR = os.path.dirname(os.path.realpath(__file__)) + +OVERRIDE_PATH = os.getenv("LM_HARNESS_CACHE_PATH") + + +PATH = OVERRIDE_PATH if OVERRIDE_PATH else f"{MODULE_DIR}/.cache" + +# This should be sufficient for uniqueness +HASH_INPUT = "EleutherAI-lm-evaluation-harness" + +HASH_PREFIX = hashlib.sha256(HASH_INPUT.encode("utf-8")).hexdigest() + +FILE_SUFFIX = f".{HASH_PREFIX}.pickle" + + +def load_from_cache(file_name): + try: + path = f"{PATH}/{file_name}{FILE_SUFFIX}" + + with open(path, "rb") as file: + cached_task_dict = dill.loads(file.read()) + return cached_task_dict + + except Exception: + eval_logger.debug(f"{file_name} is not cached, generating...") + pass + + +def save_to_cache(file_name, obj): + if not os.path.exists(PATH): + os.mkdir(PATH) + + file_path = f"{PATH}/{file_name}{FILE_SUFFIX}" + + eval_logger.debug(f"Saving {file_path} to cache...") + with open(file_path, "wb") as file: + file.write(dill.dumps(obj)) + + +# NOTE the "key" param is to allow for flexibility +def delete_cache(key: str = ""): + files = os.listdir(PATH) + + for file in files: + if file.startswith(key) and file.endswith(FILE_SUFFIX): + file_path = f"{PATH}/{file}" + os.unlink(file_path) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/__init__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/archiver.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/archiver.py new file mode 100644 index 0000000000000000000000000000000000000000..fa8a715f78e4cccef9f930e5cf448c4481730c2d --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/archiver.py @@ -0,0 +1,171 @@ +import datetime +import io +import json +import mmap +import os +from pathlib import Path +from typing import Any + +import jsonlines +import tqdm +import zstandard + + +def json_serial(obj: Any) -> str: + """JSON serializer for objects not serializable by default json code""" + + if isinstance(obj, (datetime.datetime,)): + return obj.isoformat() + raise TypeError("Type %s not serializable" % type(obj)) + + +# Modified version of lm_dataformat Archive for single file. +class Archive: + def __init__(self, file_path: str, compression_level: int = 3) -> None: + self.file_path = file_path + dir_name = os.path.dirname(file_path) + if dir_name: + os.makedirs(dir_name, exist_ok=True) + self.fh = open(self.file_path, "wb") + self.cctx = zstandard.ZstdCompressor(level=compression_level) + self.compressor = self.cctx.stream_writer(self.fh) + + def add_data(self, data, meta=None) -> None: + if meta is None: + meta = {} + self.compressor.write( + json.dumps({"text": data, "meta": meta}, default=json_serial).encode( + "UTF-8" + ) + + b"\n" + ) + + def commit(self) -> None: + self.compressor.flush(zstandard.FLUSH_FRAME) + self.fh.flush() + self.fh.close() + + +# Modified version of lm_dataformat Reader with self.fh set, allowing peeking for tqdm. +class Reader: + def __init__(self) -> None: + pass + + def read( + self, + file, + get_meta: bool = False, + autojoin_paragraphs: bool = True, + para_joiner: str = "\n\n", + ): + with open(file, "rb") as fh: + self.fh = fh + cctx = zstandard.ZstdDecompressor() + reader = io.BufferedReader(cctx.stream_reader(fh)) + rdr = jsonlines.Reader(reader) + for ob in rdr: + # naive jsonl where each object is just the string itself, with no meta. For legacy compatibility. + if isinstance(ob, str): + assert not get_meta + yield ob + continue + + text = ob["text"] + + if autojoin_paragraphs and isinstance(text, list): + text = para_joiner.join(text) + + if get_meta: + yield text, (ob["meta"] if "meta" in ob else {}) + else: + yield text + + +class TextArchive: + def __init__(self, file_path, mode: str = "rb+") -> None: + self.file_path = file_path + dir_name = os.path.dirname(file_path) + if dir_name: + os.makedirs(dir_name, exist_ok=True) + + if not os.path.exists(file_path): + Path(file_path).touch() + + self.fh = open(self.file_path, mode) + + def add_data(self, data) -> None: + self.fh.write(data.encode("UTF-8") + b"\n") + + def commit(self) -> None: + self.fh.flush() + self.fh.close() + + +class TextReader: + def __init__(self, file_path) -> None: + self.file_path = file_path + + # Optimized mmap read with infrequent tqdm updates to maintain speed + # Tested up to 250MB/s. + def read_tqdm(self, update_frequency: int = 10000): + current_file_position = 0 + line_counter = 0 + with open(self.file_path, "r", encoding="utf-8") as fh, tqdm.tqdm( + total=os.path.getsize(self.file_path), + dynamic_ncols=True, + unit="byte", + unit_scale=1, + ) as progress: + with mmap.mmap(fh.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj: + for line in iter(mmap_obj.readline, b""): + line = line.decode("utf-8") + line_counter += 1 + if line_counter == update_frequency: + new_file_pos = mmap_obj.tell() + bytes_read = new_file_pos - current_file_position + current_file_position = new_file_pos + progress.update(bytes_read) + line_counter = 0 + yield line[:-1] + + def read_and_tell(self): + current_file_position = 0 + with open(self.file_path, "r", encoding="utf8") as fh: + with mmap.mmap(fh.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj: + for line in iter(mmap_obj.readline, b""): + line = line.decode("utf-8") + new_file_pos = mmap_obj.tell() + raw_bytes_read = new_file_pos - current_file_position + current_file_position = new_file_pos + yield line[:-1], raw_bytes_read + + def read(self): + with open(self.file_path, "r", encoding="utf8") as fh: + with mmap.mmap(fh.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj: + for line in iter(mmap_obj.readline, b""): + line = line.decode("utf-8") + yield line[:-1] + + def read_slow(self): + with open(self.file_path, "r", encoding="utf8") as fh: + while True: + line = fh.readline() + if line == -1 or line == "": + break + else: + yield line[:-1] + + +# Optimized for speed. Decompresses the archive in shell before +# using the mmap'd TextReader. +class ZStdTextReader: + def __init__(self, file) -> None: + self.file = file + + def read_tqdm(self): + decompressed_file = self.file[:-4] + print("Decompressing file, please wait...") + os.system(f"zstd -d {self.file}") # linux decompress is faster + reader = TextReader(decompressed_file) + yield from reader.read_tqdm() + os.remove(decompressed_file) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/decontaminate.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/decontaminate.py new file mode 100644 index 0000000000000000000000000000000000000000..3874eb58be99aebd2736aeede76c13145231434f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/decontaminate.py @@ -0,0 +1,166 @@ +import collections +import glob +import json +import os +import pickle +import random +import time + +from .archiver import ZStdTextReader +from .janitor import Janitor, word_ngrams + + +# Was used for testing the evaluator decoupled from the full logic below +def get_train_overlap_stub(docs: dict, ngrams_path: str, ngrams_n_size: str): + simulated_overlap = 0.1 + contaminated = int(len(docs) * simulated_overlap) + return random.sample(range(len(docs)), contaminated) + + +# Returns a dictionary containing all overlapping documents in each +# task. In the standard use case, an overlap occurs when any of the 13-grams +# found in the task document exist in the training set documents. +# +# To generate 13-grams for the pile see scripts/clean_training_data. The final output of these +# scripts are an info.json file containing the n_gram_size (13) and a bunch of "ngrams_{x}.bkt.txt.sorted.zst" +# files. These should exist in the "ngrams_path" provided to this function. + + +# Algorithm: +# 1. Build lookups for each dataset {ngram: list(document_ids)} +# 2. Merge into an overall lookup {ngram: [(task_name, task_set, doc_ids),]} +# 3. Full scan the 13-grams from the training set against the merged lookup, +# saving matches in the "duplicates" dictionary {(task_name, task_set): set(doc_ids)} +# 4. Strip the task_set from the dictionary keys and return +# +# We cache the task+set lookups as well as the overlaps. +def get_train_overlap(docs_by_task_set: dict, ngrams_path: str, limit: int) -> dict: + # return get_train_overlap_stub(docs, ngrams_path, ngrams_n_size) + + info_dict_path = os.path.join(ngrams_path, "info.json") + info_dict = json.load(open(info_dict_path, "r", encoding="utf-8")) + ngrams_n_size = info_dict["ngram_size"] + + janitor = Janitor() + + # Build lookup for each dataset first in case we use different task combinations later + print("Building Lookups...") + start = time.perf_counter() + + def get_overlaps_dump_path(task_name, task_set, ngrams_n_size, limit) -> str: + return f"data/{task_name}/{task_set}_{ngrams_n_size}grams_limit{limit}.overlaps" + + lookups = {} + duplicates = {} # (task_name, task_set): set(doc_ids)} + sets_to_decontaminate = len(docs_by_task_set.keys()) + + for (task_name, task_set), docs in docs_by_task_set.items(): + if not os.path.exists(f"data/{task_name}"): + os.mkdir(f"data/{task_name}") + + # Check if we've decontaminated this combination before + overlaps_dump_path = get_overlaps_dump_path( + task_name, task_set, ngrams_n_size, limit + ) + if os.path.exists(overlaps_dump_path): + duplicates[(task_name, task_set)] = pickle.load( + open(overlaps_dump_path, "rb") + ) + sets_to_decontaminate -= 1 + continue + else: + duplicates[(task_name, task_set)] = set() + + # Build/load the task lookup {ngram: set(documents)}. + task_set_lookup_path = ( + f"data/{task_name}/{task_set}_{ngrams_n_size}grams_limit{limit}.lookup" + ) + if os.path.exists(task_set_lookup_path): + print(f"{task_set_lookup_path} available, loading...") + lookups[(task_name, task_set)] = pickle.load( + open(task_set_lookup_path, "rb") + ) + else: + print(f"{task_set_lookup_path} not available, building...") + lookup = collections.defaultdict(set) + + for doc_id, document in enumerate(docs): + ngrams = word_ngrams(janitor.normalize_string(document), ngrams_n_size) + for ngram in ngrams: + lookup[ngram].add(doc_id) + + pickle.dump(lookup, open(task_set_lookup_path, "wb")) + lookups[(task_name, task_set)] = lookup + + elapsed = time.perf_counter() - start + print(f"Building lookups took {elapsed:0.5f} seconds.") + + matched_ngrams = [] + + if sets_to_decontaminate > 0: + print("Merging lookups...") + start = time.perf_counter() + merged_lookup = collections.defaultdict(list) + for (task_name, task_set), lookup in lookups.items(): + for ngram, doc_ids in lookup.items(): + merged_lookup[ngram].append((task_name, task_set, doc_ids)) + + elapsed = time.perf_counter() - start + print(f"Merging lookups took {elapsed:0.5f} seconds.") + + print(f"{ngrams_n_size} grams files found in {ngrams_path}:") + files = glob.glob(os.path.join(ngrams_path, "*.sorted.zst")) + print(files) + + for file in files: + start = time.perf_counter() + print(f"Scanning {file}") + reader = ZStdTextReader(file) + total_ngrams = 0 + unique_ngrams = 0 + matching_unique = 0 + non_matching_unique = 0 + + current_ngram = "" + for line in reader.read_tqdm(): # Scan training set ngrams file + total_ngrams += 1 + [ngram, document_id] = line.rsplit(" ", 1) + if ( + ngram != current_ngram + ): # Only need to match the ngram once in training set + unique_ngrams += 1 + current_ngram = ngram + if ngram in merged_lookup: + matched_ngrams.append(ngram) # For logging + matching_unique += 1 + for task_name, task_set, doc_ids in merged_lookup[ngram]: + task_doc_set = duplicates[(task_name, task_set)] + for doc_id in doc_ids: # Record contamination across all relevant task/set combos + task_doc_set.add(doc_id) + del merged_lookup[ngram] # No point matching again + else: + non_matching_unique += 1 + + print(f"Total Ngrams: {total_ngrams}") + print(f"Unique Ngrams: {unique_ngrams}") + print(f"Unique Matching: {matching_unique}") + print(f"Unique Non Matching: {non_matching_unique}") + print("Matched ngrams:") + for ngram in matched_ngrams: + print(ngram) + + elapsed = time.perf_counter() - start + print(f"Read took {elapsed:0.5f} seconds.") + print(f"Speed: {(os.path.getsize(file)/1000000.0)/elapsed}MB/second") + + print(duplicates) + + # Dump overlaps separately + for (task_name, task_set), doc_ids in duplicates.items(): + overlaps_dump_path = get_overlaps_dump_path( + task_name, task_set, ngrams_n_size, limit + ) + pickle.dump(doc_ids, open(overlaps_dump_path, "wb")) + + # Strip task set and return + return {task_name: doc_ids for (task_name, task_set), doc_ids in duplicates.items()} diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/janitor.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/janitor.py new file mode 100644 index 0000000000000000000000000000000000000000..cedf8a5717aa8156674836ba236fdcabf36e0487 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/decontamination/janitor.py @@ -0,0 +1,328 @@ +import pickle +import re +import string +import traceback +from typing import Iterator, List, Sequence, Tuple, TypeVar + + +# This is a cpp module. Compile janitor_util.cpp with: +# c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) janitor_util.cpp -o janitor_util$(python3-config --extension-suffix) -undefined dynamic_lookup +try: + import janitor_util + + JANITOR_CPP = True +except Exception: + print("WARNING: C++ module could not be loaded. Janitor running in python mode") + traceback.print_exc() + JANITOR_CPP = False + +T = TypeVar("T") + + +# Implementation from nltk source +# https://www.nltk.org/_modules/nltk/util.html +def form_ngrams(sequence: Iterator[T], n: int) -> Iterator[Tuple[T, ...]]: + history = [] + while n > 1: + # PEP 479, prevent RuntimeError from being raised when StopIteration bubbles out of generator + try: + next_item = next(sequence) + except StopIteration: + # no more data, terminate the generator + return + history.append(next_item) + n -= 1 + for item in sequence: + history.append(item) + yield tuple(history) + del history[0] + + +def word_ngrams(s: str, n: int) -> Iterator[str]: + """Splits a string into ngram words""" + tokens = s.split() # not a generator :( + ngram_seqs = form_ngrams(iter(tokens), n) + return (" ".join(ngram) for ngram in ngram_seqs) + + +# Does character sequences only - combined faster function to play around with later +# def word_ngrams_indices_combined(sequence, n): +# current_word = "" +# history = [] +# gap = False; +# start = 0 +# end = 0 +# for character in sequence: +# if character == " ": +# if not gap: +# gap = True +# history.append(current_word) +# end += len(current_word) - 1 +# current_word = "" +# if len(history) == n: +# yield (tuple(history), start, end) +# del history[0] +# start = end + 1 +# end = start +# else: +# gap = False +# current_word += character + + +# https://stackoverflow.com/questions/13734451/string-split-with-indices-in-python +def split_indices(s: str) -> Iterator[Tuple[str, Tuple[int, int]]]: + """Splits a string on whitespaces and records the indices of each in the original string. + @:return generator((word, (start_idx, end_idx)), ...) + """ + return ((m.group(0), (m.start(), m.end() - 1)) for m in re.finditer(r"\S+", s)) + + +def word_ngrams_indices(s: str, n: int) -> Iterator[Tuple[str, Tuple[int, int]]]: + """Splits a string into pairs of (ngram words, their start/end indices)""" + tokens_with_indices = split_indices(s) + + # Generator of ngrams of (word, idx_pairs) + # ( + # [(word, (start,end)), (word, (start, end))...], + # [(word, (start, end)), ...], + # ... + # ) + ngram_seqs_with_indices = form_ngrams(tokens_with_indices, n) + + # Generator of pairs of word and index ngrams + # ( + # ([word, word, ...], [(start,end), (start,end), ...]), + # ... + # ) + ngram_indices_pairs = ( + zip(*ngram_with_indices) for ngram_with_indices in ngram_seqs_with_indices + ) + + # Generator of ( (word_ngram, (start, end)), (word_ngram, start, end)), ...) + return ( + (" ".join(ngram_seq), (indices[0][0], indices[-1][1])) + for ngram_seq, indices in ngram_indices_pairs + ) + + +class Janitor: + # FIXME delete_chars: Should anything else go here? Special chars? + def __init__( + self, + ngram_n: int = 13, + window_to_remove: int = 200, + too_dirty_cutoff: int = 10, + minimum_slice_length: int = 200, + delete_chars: str = string.punctuation, + ) -> None: + self.ngram_n = ngram_n + self.window_to_remove = window_to_remove + self.too_dirty_cutoff = too_dirty_cutoff + self.minimum_slice_length = minimum_slice_length + self.delete_chars = delete_chars + + self.dirt_ngrams = set() + + # If in python, we'll translate uppercase to lowercase and delete naughty characters. + # This is fast by python standards + # https://stackoverflow.com/questions/638893/what-is-the-most-efficient-way-in-python-to-convert-a-string-to-all-lowercase-st + self.translation_table = str.maketrans( + string.ascii_lowercase + string.ascii_uppercase, # These characters + string.ascii_lowercase * 2, # Become these characters + self.delete_chars, # These are deleted + ) + + ############## + # I/O for saving contamination ngrams + ############## + + def save_contamination_ngrams(self, filename: str) -> None: + with open(filename, "wb") as fp: + pickle.dump(filename, fp) + + def load_contamination_ngrams(self, filename: str) -> None: + with open(filename, "rb") as fp: + self.dirt_ngrams = pickle.load(fp) + + ############## + # Call these :) + ############## + + def register_contaminant(self, dirt_string: str) -> None: + """Register a string as contamination to be removed, e.g. a test set + This breaks the dirt_string into ngrams to store for future cleaning""" + if JANITOR_CPP: + return self.register_contaminant_cpp(dirt_string) + else: + print("WARNING: Janitor running in python mode") + return self.register_contaminant_python(dirt_string) + + def clean(self, dirty_string: str) -> List[str]: + """Clean a string (e.g. a training set) by removing all ngrams previously + registered as contaminants. Returns a list of clean chunks, or empty if + the string was too dirty""" + if JANITOR_CPP: + return self.clean_cpp(dirty_string) + else: + print("WARNING: Janitor running in python mode") + return self.clean_python(dirty_string) + + def _split_chunks( + self, dirty_string: str, dirty_parts: Sequence[Tuple] + ) -> List[str]: + clean_chunks = [] + splice_idx = 0 + end = -1 + for i, (ngram, start, end) in enumerate(dirty_parts): + if i >= self.too_dirty_cutoff: + return [] + start = max(0, start - self.window_to_remove) + end = min(len(dirty_string), end + self.window_to_remove) + + if start - splice_idx > self.minimum_slice_length: + clean_chunks.append(dirty_string[splice_idx:start]) + splice_idx = end + + if end < len(dirty_string) - self.minimum_slice_length: + clean_chunks.append(dirty_string[end + 1 :]) + + return clean_chunks + + ############## + # Fast C++ + ############## + + def register_contaminant_cpp(self, dirt_string) -> None: + self.dirt_ngrams.update( + janitor_util.clean_ngram(dirt_string, self.delete_chars, self.ngram_n) + ) + + def clean_cpp(self, dirty_string: str) -> List[str]: + contamination_indices = janitor_util.clean_ngram_with_indices( + dirty_string, self.delete_chars, self.ngram_n + ) + return self._split_chunks(dirty_string, contamination_indices) + + ############## + # Slow python + ############## + + def normalize_string(self, s: str) -> str: + return s.translate(self.translation_table) + + def register_contaminant_python(self, dirt_string: str) -> None: + self.dirt_ngrams.update( + word_ngrams(self.normalize_string(dirt_string), self.ngram_n) + ) + + def clean_python(self, dirty_string: str) -> List[str]: + contamination_indices = ( + (None, *idx_pair) + for dirty_ngram, idx_pair in word_ngrams_indices(dirty_string, self.ngram_n) + if self.normalize_string(dirty_ngram) in self.dirt_ngrams + ) + return self._split_chunks(dirty_string, contamination_indices) + + +################################################################## +# Tests +################################################################# + +# def print_cpp(): +# source = """ ,, I'm a very !dirty,, ,, dirty boy. Clean me daddy. \n\nhe he he hehe heh. lastword """ * 2 + +# for i in range(1, 10, 2): +# pprint(janitor_util.clean_ngram(source, string.punctuation, i)) +# for ngram, start, end in \ +# janitor_util.clean_ngram_with_indices(source, string.punctuation, i): +# print(ngram, "\t", start, end, source[start:end].replace("\n", "\\n")) + + +# def test_cpp(): +# source = """ ,, I'm a very !dirty,, ,, dirty boy. Clean me daddy. \n\nhe he he hehe heh. lastword """ * 2 +# contaminant = "dirty boy. Clean he he" + +# jan_python = Janitor() +# jan_cpp = Janitor() + +# jan_python.register_contaminant_python(contaminant) +# jan_cpp.register_contaminant(contaminant) + +# assert jan_python.dirt_ngrams == jan_cpp.dirt_ngrams, (jan_python.dirt_ngrams, jan_cpp.dirt_ngrams) + +# assert jan_python.clean_python(source) == jan_cpp.clean(source), \ +# (jan_python.clean_python(source), jan_cpp.clean(source)) + +# print("Passed test, python==cpp") + + +# def benchmark(): +# # Download and put in data folder: enwik8 (100 MB) from https://cs.fit.edu/~mmahoney/compression/textdata.html +# setup = \ +# """ +# with open("data/enwik8", "r") as f: +# data = f.read() +# jan = Janitor(too_dirty_cutoff=1000) +# jan.register_contaminant(''' +# theories is that there is a connection between "geekdom" and autism. +# This is hinted, for instance, by a ''Wired Magazine'' article in 2001 entitled " +# The [[Geek]] Syndrome", which is a point argued by many in the autism rights +# movement{{ref|Wired}}. This article, many professionals assert, is just one example of +# the media's application of mental disease labels to what is actually variant normal behavior +# &mdash;they argue that shyness, lack of athletic ability or social skills, and intellectual +# interests, even when they seem unusual to others, are not in themselves signs of autism or +# Asperger's syndrome. Others assert that it is actually the medical profession which is applying +# mental disease labels to children who in the past would have simply been accepted as a little +# different or even labeled 'gifted'. See [[clinomorphism]] for further discussion of this issue. +# Due to the recent publicity surrounding autism and autis +# ultan Al Nahyan]] granted [[Petroleum]] concessions, and oil was first found in 1958. At first, +# oil money had a marginal impact. A few lowrise concete buildings were erected, and the first +# paved road was completed in 1961, but Sheikh Shakbut, uncertain whether the new oil royalties +# would last, took a cautious approach, preferring to save the revenue rather than investing it in +# development. His brother, [[Zayed bin Sultan Al Nahayan]], saw that oil wealth had the potential +# to transform Abu Dhabi. The ruling Al Nahayan family decided that Sheikh Zayed should replace his +# brother as Ruler and carry out his vision of developing the country. On [[August 6]], [[1966]], +# with the assistance of the British, Sheikh Zayed became the new ruler. See generally, Al-Fahim, M, +# ''From Rags to Riches: A Story of Abu Dhabi'', Chapter Six (London Centre of Arab Studies, 1995), +# ISBN 1 900404 00 1. With the announcement by Britain in 1968 that it would withdraw from the +# Gulf area by 1971, Sheikh Zayed became the main driving force behind the formation of the +# [[United Arab Emirates]]. After the Emirates gained independence in 1971, +# ''') +# """ + +# n = 1 +# print(f"Timing {n} run on 100 MB") +# print("Register contaminant") +# # print("\tPython", timeit.timeit("jan.register_contaminant_python(data)", setup=setup, globals=globals(), number=n)) +# print("\tCpp", timeit.timeit("jan.register_contaminant(data)", setup=setup, globals=globals(), number=n)) + +# print("Clean") +# # print("\tPython", timeit.timeit("jan.clean_python(data)", setup=setup, globals=globals(), number=n)) +# print("\tCpp", timeit.timeit("jan.clean(data)", setup=setup, globals=globals(), number=n)) + + +# def test_janitor_general(): +# source = """ ,, I'm a very !dirty,, ,, dirty boy. Clean me daddy. \n\nhe he he hehe heh. lastword """ * 2 +# contaminant = "dirty boy. Clean he he" + +# jan = Janitor(ngram_n=3) +# jan.register_contaminant(contaminant) +# cleaned = " ".join(jan.clean(source)) +# for contam in jan.dirt_ngrams: +# assert contam not in cleaned, contam + +# filename = "data/saved_contam" +# jan.save_contamination_ngrams(filename) + +# jan = Janitor(ngram_n=3) +# jan.load_contamination_ngrams(filename) +# cleaned = " ".join(jan.clean(source)) +# for contam in jan.dirt_ngrams: +# assert contam not in cleaned, contam + + +# if __name__ == "__main__": +# test() +# # print_cpp() +# # test_cpp() +# # benchmark() diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/evaluator.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/evaluator.py new file mode 100644 index 0000000000000000000000000000000000000000..9ca64af64d5c5e3588d730ebec8fa86781effe06 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/evaluator.py @@ -0,0 +1,688 @@ +import itertools +import json +import logging +import random +import time +from collections import defaultdict +from typing import TYPE_CHECKING, List, Optional, Union + +import numpy as np +import torch + +import lm_eval.api.metrics +import lm_eval.api.registry +import lm_eval.api.task +import lm_eval.models +from lm_eval.caching.cache import delete_cache +from lm_eval.evaluator_utils import ( + consolidate_group_results, + consolidate_results, + get_sample_size, + get_subtask_list, + get_task_list, + prepare_print_tasks, + print_writeout, + run_task_tests, +) +from lm_eval.loggers import EvaluationTracker +from lm_eval.loggers.utils import add_env_info, add_tokenizer_info, get_git_commit_hash +from lm_eval.tasks import ( + TaskManager, + get_task_dict, +) +from lm_eval.utils import ( + eval_logger, + handle_non_serializable, + hash_string, + positional_deprecated, + simple_parse_args_string, +) + + +if TYPE_CHECKING: + from lm_eval.api.model import LM + from lm_eval.api.task import Task + + +@positional_deprecated +def simple_evaluate( + model, + model_args: Optional[Union[str, dict]] = None, + tasks: Optional[List[Union[str, dict, object]]] = None, + num_fewshot: Optional[int] = None, + batch_size: Optional[Union[int, str]] = None, + max_batch_size: Optional[int] = None, + device: Optional[str] = None, + use_cache: Optional[str] = None, + cache_requests: bool = False, + rewrite_requests_cache: bool = False, + delete_requests_cache: bool = False, + limit: Optional[Union[int, float]] = None, + bootstrap_iters: int = 100000, + check_integrity: bool = False, + write_out: bool = False, + log_samples: bool = True, + evaluation_tracker: Optional[EvaluationTracker] = None, + system_instruction: Optional[str] = None, + apply_chat_template: Union[bool, str] = False, + fewshot_as_multiturn: bool = False, + gen_kwargs: Optional[str] = None, + task_manager: Optional[TaskManager] = None, + verbosity: str = "INFO", + predict_only: bool = False, + random_seed: int = 0, + numpy_random_seed: int = 1234, + torch_random_seed: int = 1234, + fewshot_random_seed: int = 1234, +): + """Instantiate and evaluate a model on a list of tasks. + + :param model: Union[str, LM] + Name of model or LM object, see lm_eval.models.get_model + :param model_args: Optional[str, dict] + String or dict arguments for each model class, see LM.create_from_arg_string and LM.create_from_arg_object. + Ignored if `model` argument is a LM object. + :param tasks: list[Union[str, dict, Task]] + List of task names or Task objects. Task objects will be taken to have name task.EVAL_HARNESS_NAME if defined and type(task).__name__ otherwise. + :param num_fewshot: int + Number of examples in few-shot context + :param batch_size: int or str, optional + Batch size for model + :param max_batch_size: int, optional + Maximal batch size to try with automatic batch size detection + :param device: str, optional + PyTorch device (e.g. "cpu" or "cuda:0") for running models + :param use_cache: str, optional + A path to a sqlite db file for caching model responses. `None` if not caching. + :param cache_requests: bool, optional + Speed up evaluation by caching the building of dataset requests. `None` if not caching. + :param rewrite_requests_cache: bool, optional + Rewrites all of the request cache if set to `True`. `None` if not desired. + :param delete_requests_cache: bool, optional + Deletes all of the request cache if set to `True`. `None` if not desired. + :param limit: int or float, optional + Limit the number of examples per task (only use this for testing), If <1, limit is a percentage of the total number of examples. + :param bootstrap_iters: + Number of iterations for bootstrap statistics, used when calculating stderrs. set to 0 for no stderr calculations to be performed. + :param check_integrity: bool + Whether to run the relevant part of the test suite for the tasks + :param write_out: bool + If True, write out an example document and model input for checking task integrity + :param log_samples: bool + If True, write out all model outputs and documents for per-sample measurement and post-hoc analysis + :param system_instruction: str + System instruction to be applied to the prompt + :param apply_chat_template: Union[bool, str] + Specifies whether to apply a chat template to the prompt. + - If set to True, the default chat template is applied. + - If set to a string, applies the specified chat template by name. + Defaults to False (no chat template applied). + :param fewshot_as_multiturn: bool + Whether to provide the fewshot examples as a multiturn conversation or a single user turn. + :param gen_kwargs: str + String arguments for model generation + Ignored for all tasks with loglikelihood output_type + :param predict_only: bool + If true only model outputs will be generated and returned. Metrics will not be evaluated + :param random_seed: int + Random seed for python's random module. If set to None, the seed will not be set. + :param numpy_random_seed: int + Random seed for numpy. If set to None, the seed will not be set. + :param torch_random_seed: int + Random seed for torch. If set to None, the seed will not be set. + :param fewshot_random_seed: int + Random seed for fewshot sampler random generator. If set to None, the seed of generator will be set to None. + + :return + Dictionary of results + """ + eval_logger.setLevel(getattr(logging, f"{verbosity}")) + start_date = time.time() + + if delete_requests_cache: + eval_logger.info("Deleting requests cache...") + delete_cache() + + seed_message = [] + if random_seed is not None: + # See https://github.com/EleutherAI/lm-evaluation-harness/pull/1412 + seed_message.append(f"Setting random seed to {random_seed}") + random.seed(random_seed) + + if numpy_random_seed is not None: + seed_message.append(f"Setting numpy seed to {numpy_random_seed}") + np.random.seed(numpy_random_seed) + + if torch_random_seed is not None: + seed_message.append(f"Setting torch manual seed to {torch_random_seed}") + torch.manual_seed(torch_random_seed) + + if fewshot_random_seed is not None: + seed_message.append(f"Setting fewshot manual seed to {fewshot_random_seed}") + + if seed_message: + eval_logger.info(" | ".join(seed_message)) + + if tasks is None: + tasks = [] + if len(tasks) == 0: + raise ValueError( + "No tasks specified, or no tasks found. Please verify the task names." + ) + + if gen_kwargs is not None: + gen_kwargs = simple_parse_args_string(gen_kwargs) + eval_logger.warning( + "generation_kwargs specified through cli, these settings will update set parameters in yaml tasks. " + "Ensure 'do_sample=True' for non-greedy decoding!" + ) + if gen_kwargs == "": + gen_kwargs = None + + if isinstance(model, str): + if model_args is None: + eval_logger.warning("model_args not specified. Using defaults.") + model_args = "" + + if isinstance(model_args, dict): + eval_logger.info( + f"Initializing {model} model, with arguments: {model_args}" + ) + lm = lm_eval.api.registry.get_model(model).create_from_arg_obj( + model_args, + { + "batch_size": batch_size, + "max_batch_size": max_batch_size, + "device": device, + }, + ) + + else: + eval_logger.info( + f"Initializing {model} model, with arguments: {simple_parse_args_string(model_args)}" + ) + lm = lm_eval.api.registry.get_model(model).create_from_arg_string( + model_args, + { + "batch_size": batch_size, + "max_batch_size": max_batch_size, + "device": device, + }, + ) + else: + if not isinstance(model, lm_eval.api.model.LM): + raise TypeError( + f"The value of `model` passed to simple_evaluate() was of type {type(model)}, but is required to be a subclass of lm_eval.api.model.LM . This may be because you are passing an initialized Hugging Face PreTrainedModel without having wrapped it in `lm_eval.models.huggingface.HFLM(pretrained=my_model)` first." + ) + eval_logger.info("Using pre-initialized model") + lm = model + + if use_cache is not None: + eval_logger.info(f"Using cache at {use_cache + '_rank' + str(lm.rank) + '.db'}") + lm = lm_eval.api.model.CachingLM( + lm, + use_cache + # each rank receives a different cache db. + # necessary to avoid multiple writes to cache at once + + "_rank" + + str(lm.rank) + + ".db", + ) + + if task_manager is None: + task_manager = TaskManager(verbosity) + + task_dict = get_task_dict(tasks, task_manager) + + # helper function to recursively apply config overrides to leaf subtasks, skipping their constituent groups. + # (setting of num_fewshot ; bypassing metric calculation ; setting fewshot seed) + def _adjust_config(task_dict): + adjusted_task_dict = {} + for task_name, task_obj in task_dict.items(): + if isinstance(task_obj, dict): + adjusted_task_dict = { + **adjusted_task_dict, + **{task_name: _adjust_config(task_obj)}, + } + + else: + if task_obj.get_config("output_type") == "generate_until": + if gen_kwargs is not None: + task_obj.set_config( + key="generation_kwargs", value=gen_kwargs, update=True + ) + + if predict_only: + eval_logger.info( + f"Processing {task_name} in output-only mode. Metrics will not be calculated!" + ) + # we have to change the class properties post-hoc. This is pretty hacky. + task_obj.override_metric(metric_name="bypass") + + # override tasks' fewshot values to the provided num_fewshot arg value + # except if tasks have it set to 0 manually in their configs--then we should never overwrite that + if num_fewshot is not None: + if (default_num_fewshot := task_obj.get_config("num_fewshot")) == 0: + eval_logger.info( + f"num_fewshot has been set to 0 for {task_name} in its config. Manual configuration will be ignored." + ) + else: + eval_logger.warning( + f"Overwriting default num_fewshot of {task_name} from {default_num_fewshot} to {num_fewshot}" + ) + task_obj.set_config(key="num_fewshot", value=num_fewshot) + else: + # if num_fewshot not provided, and the task does not define a default one, default to 0 + if ( + default_num_fewshot := task_obj.get_config("num_fewshot") + ) is None: + task_obj.set_config(key="num_fewshot", value=0) + # fewshot_random_seed set for tasks, even with a default num_fewshot (e.g. in the YAML file) + task_obj.set_fewshot_seed(seed=fewshot_random_seed) + + adjusted_task_dict[task_name] = task_obj + + return adjusted_task_dict + + task_dict = _adjust_config(task_dict) + + if check_integrity: + run_task_tests(task_list=tasks) + + if evaluation_tracker is not None: + evaluation_tracker.general_config_tracker.log_experiment_args( + model_source=model, + model_args=model_args, + system_instruction=system_instruction, + chat_template=lm.chat_template(apply_chat_template) + if apply_chat_template + else None, + fewshot_as_multiturn=fewshot_as_multiturn, + ) + + results = evaluate( + lm=lm, + task_dict=task_dict, + limit=limit, + cache_requests=cache_requests, + rewrite_requests_cache=rewrite_requests_cache, + bootstrap_iters=bootstrap_iters, + write_out=write_out, + log_samples=True if predict_only else log_samples, + system_instruction=system_instruction, + apply_chat_template=apply_chat_template, + fewshot_as_multiturn=fewshot_as_multiturn, + verbosity=verbosity, + ) + + if lm.rank == 0: + if isinstance(model, str): + model_name = model + elif hasattr(model, "config") and hasattr(model.config, "_name_or_path"): + model_name = model.config._name_or_path + else: + model_name = type(model).__name__ + + # add info about the model and few shot config + results["config"] = { + "model": model_name, + "model_args": model_args, + } + # add more detailed model info if available + if isinstance(lm, lm_eval.models.huggingface.HFLM): + results["config"].update(lm.get_model_info()) + # add info about execution + results["config"].update( + { + "batch_size": batch_size, + "batch_sizes": ( + list(lm.batch_sizes.values()) if hasattr(lm, "batch_sizes") else [] + ), + "device": device, + "use_cache": use_cache, + "limit": limit, + "bootstrap_iters": bootstrap_iters, + "gen_kwargs": gen_kwargs, + "random_seed": random_seed, + "numpy_seed": numpy_random_seed, + "torch_seed": torch_random_seed, + "fewshot_seed": fewshot_random_seed, + } + ) + results["git_hash"] = get_git_commit_hash() + results["date"] = start_date + add_env_info(results) # additional environment info to results + add_tokenizer_info(results, lm) # additional info about tokenizer + return results + else: + return None + + +@positional_deprecated +def evaluate( + lm: "LM", + task_dict, + limit: Optional[int] = None, + cache_requests: bool = False, + rewrite_requests_cache: bool = False, + bootstrap_iters: Optional[int] = 100000, + write_out: bool = False, + log_samples: bool = True, + system_instruction: Optional[str] = None, + apply_chat_template: Union[bool, str] = False, + fewshot_as_multiturn: bool = False, + verbosity: str = "INFO", +): + """Instantiate and evaluate a model on a list of tasks. + + :param lm: obj + Language Model + :param task_dict: dict[str, Task] + Dictionary of tasks. Tasks will be taken to have name type(task).config.task . + :param limit: int, optional + Limit the number of examples per task (only use this for testing) + :param bootstrap_iters: + Number of iterations for bootstrap statistics, used when calculating stderr. Set to 0 for skipping all stderr calculations. + :param write_out: bool + If True, write out an example document and model input for checking task integrity + :param log_samples: bool + If True, write out all model outputs and documents for per-sample measurement and post-hoc analysis + :param system_instruction: str + System instruction to be applied to the prompt + :param apply_chat_template: Union[bool, str] + Specifies whether to apply a chat template to the prompt. + - If set to True, the default chat template is applied. + - If set to a string, applies the specified chat template by name. + Defaults to False (no chat template applied). + :param fewshot_as_multiturn: bool + Whether to provide the fewshot examples as a multiturn conversation or a single user turn. + :return + Dictionary of results + """ + + eval_logger.setLevel(getattr(logging, f"{verbosity}")) + + if apply_chat_template: + eval_logger.warning( + "Chat template formatting change affects loglikelihood and multiple-choice tasks. See docs/chat-template-readme.md for details." + ) + + # tracks all Instances/requests a model must generate output on. + requests = defaultdict(list) + # stores the amount to pad out reqs per req. type so that + # number of fwd passes per distributed rank is equal + padding_requests = defaultdict(int) + + # get lists of group hierarchy and each type of request + eval_tasks = get_task_list(task_dict) + if not log_samples: + if not all( + "bypass" not in getattr(task_output.task, "_metric_fn_list", {}).keys() + for task_output in eval_tasks + ): + raise ValueError("log_samples must be True for 'bypass' metric-only tasks") + + # validation check: are we running multimodal task <-> non-multimodal model class, or vice-versa. + incompatible_tasks = [] + for task_output in eval_tasks: + task: Task = task_output.task + + if getattr(lm, "MULTIMODAL", False) != getattr(task, "MULTIMODAL", False): + incompatible_tasks.append(task_output.task_name) + if len(incompatible_tasks) > 0: + if not getattr(lm, "MULTIMODAL", False): + raise ValueError( + f"Attempted to run tasks: {incompatible_tasks} which require multimodal input, but the selected model type does not currently implement this. Multimodal support is currently restricted to the ['hf-multimodal', 'vllm-vlm'] model type." + ) + else: + raise ValueError( + f"Attempted to run tasks: {incompatible_tasks} which are text-only, but used a model type which only currently supports multimodal tasks." + ) + # end multimodality validation check + + # Cache the limit arg. + limit_arg = limit + limits = [] + for task_output in eval_tasks: + task: Task = task_output.task + + limit = get_sample_size(task, limit_arg) + limits.append(limit) + task.build_all_requests( + limit=limit, + rank=lm.rank, + world_size=lm.world_size, + cache_requests=cache_requests, + rewrite_requests_cache=rewrite_requests_cache, + system_instruction=system_instruction, + apply_chat_template=bool(apply_chat_template), + fewshot_as_multiturn=fewshot_as_multiturn, + chat_template=getattr(lm, "apply_chat_template") + if apply_chat_template + else None, + tokenizer_name=getattr(lm, "tokenizer_name", "") + if apply_chat_template + else "", + ) + eval_logger.debug( + f"Task: {task_output.task_name}; number of requests on this rank: {len(task.instances)}" + ) + if write_out: + print_writeout(task) + # aggregate Instances by LM method requested to get output. + for instance in task.instances: + reqtype = instance.request_type + requests[reqtype].append(instance) + + if lm.world_size > 1: + instances_rnk = torch.tensor(len(task._instances), device=lm.device) + gathered_item = ( + lm.accelerator.gather(instances_rnk).cpu().detach().numpy().tolist() + ) + # "multiple_choice" task types dispatch (several) "loglikelihood" request types + reqtype = ( + "loglikelihood" + if task.OUTPUT_TYPE == "multiple_choice" + else task.OUTPUT_TYPE + ) + # compute number of pseudo-batches to pad with (FSDP/DDP require even batches among ranks) + numpad = max(gathered_item) - gathered_item[lm.rank] + # todo: may not account for padding in cases like SquadV2 which has multiple req types + padding_requests[reqtype] += numpad + + ### Run LM on inputs, get all outputs ### + # execute each type of request + for reqtype, reqs in requests.items(): + eval_logger.info(f"Running {reqtype} requests") + # create `K` copies of each request `req` based off `K = req.repeats` + cloned_reqs = [] + for req in reqs: + cloned_reqs.extend([req] * req.repeats) + + if (lm.world_size > 1) and (padding_requests[reqtype] > 0): + for _ in range(padding_requests[reqtype]): + cloned_reqs.extend([req] * req.repeats) + + # run requests through model + resps = getattr(lm, reqtype)(cloned_reqs) + + # put responses from model into a list of length K for each request. + for x, req in zip(resps, cloned_reqs): + req.resps.append(x) + + if lm.world_size > 1: + lm.accelerator.wait_for_everyone() + + RANK = lm.rank + WORLD_SIZE = lm.world_size + ### Postprocess outputs ### + # TODO: del model here, maybe (idea: allow user to specify device of e.g. reward model separately) + for task_output, limit in zip(eval_tasks, limits): + task = task_output.task + task.apply_filters() + + ### Collect values of metrics on all datapoints ### + # # unpack results and sort back in order and return control to Task + # TODO: make it possible to use a different metric per filter + # Pre-process task.instances to group by doc_id + instances_by_doc_id = defaultdict(list) + for instance in task.instances: + instances_by_doc_id[instance.doc_id].append(instance) + # Sort instances within each group + for instances in instances_by_doc_id.values(): + instances.sort(key=lambda x: x.idx) + # iterate over different filters used + for filter_key in task.instances[0].filtered_resps.keys(): + doc_iterator = task.doc_iterator( + rank=RANK, limit=limit, world_size=WORLD_SIZE + ) + for doc_id, doc in doc_iterator: + requests = instances_by_doc_id[doc_id] + metrics = task.process_results( + doc, [req.filtered_resps[filter_key] for req in requests] + ) + if log_samples: + target = task.doc_to_target(doc) + example = { + "doc_id": doc_id, + "doc": doc, + "target": target, + "arguments": [req.args for req in requests], + "resps": [req.resps for req in requests], + "filtered_resps": [ + req.filtered_resps[filter_key] for req in requests + ], + "doc_hash": hash_string( + json.dumps( + requests[0].doc, + indent=2, + default=handle_non_serializable, + ensure_ascii=False, + ) + ), + "prompt_hash": hash_string(requests[0].arguments[0]), + "target_hash": hash_string(str(target)), + } + example.update(metrics) + task_output.logged_samples.append(example) + for metric, value in metrics.items(): + task_output.sample_metrics[(metric, filter_key)].append(value) + + if WORLD_SIZE > 1: + # if multigpu, then gather data across all ranks to rank 0 + # first gather logged samples across all ranks + for task_output in eval_tasks: + if log_samples: + # for task_name, task_samples in list(samples.items()): + full_samples = [None] * WORLD_SIZE if RANK == 0 else None + torch.distributed.gather_object( + obj=task_output.logged_samples, + object_gather_list=full_samples, + dst=0, + ) + + if RANK == 0: + task_output.logged_samples = list( + itertools.chain.from_iterable(full_samples) + ) + + # then collect metrics across all ranks + for metrics in task_output.sample_metrics: + metric_list = [None] * WORLD_SIZE if RANK == 0 else None + torch.distributed.gather_object( + obj=task_output.sample_metrics[metrics], + object_gather_list=metric_list, + dst=0, + ) + if RANK == 0: + task_output.sample_metrics[metrics] = list( + itertools.chain.from_iterable(metric_list) + ) + + if RANK == 0: + ### Aggregate results over all datapoints ### + # aggregate results ; run bootstrap CIs + for task_output in eval_tasks: + task_output.calculate_aggregate_metric(bootstrap_iters=bootstrap_iters) + ( + results, + samples, + configs, + versions, + num_fewshot, + higher_is_better, + ) = consolidate_results(eval_tasks) + + ### Calculate group metrics ### + if bool(results): + results, versions, show_group_table, *_ = consolidate_group_results( + results, versions, task_dict + ) + + results_agg, group_agg = prepare_print_tasks(task_dict, results) + subtask_list = get_subtask_list(task_dict) + + # collect all higher_is_better values for metrics + # in the group's subtasks. + # TODO: clean this up ; unify with the below metric_list loop? + _higher_is_better = {} + for group, task_list in subtask_list.items(): + if ( + len(task_list) != 0 + ): # subtask list will list "task_name": [] for solo tasks + for task in task_list: + for m, h in higher_is_better[task].items(): + if m not in _higher_is_better.keys(): + _higher_is_better[m] = h + + if ( + m in _higher_is_better + and _higher_is_better[m] is not None + and _higher_is_better[m] != h + ): + eval_logger.warning( + f"Higher_is_better values for metric {m} in group {group} are not consistent. Defaulting to None." + ) + _higher_is_better[m] = None + higher_is_better[group] = _higher_is_better + + results_dict = { + "results": dict(results_agg.items()), + **( + {"groups": dict(group_agg.items())} + if (bool(group_agg) & show_group_table) + else {} + ), + "group_subtasks": dict(reversed(subtask_list.items())), + "configs": dict(sorted(configs.items())), + "versions": dict(sorted(versions.items())), + "n-shot": dict(sorted(num_fewshot.items())), + "higher_is_better": dict(sorted(higher_is_better.items())), + "n-samples": { + task_output.task_name: { + "original": len(task_output.task.eval_docs), + "effective": min( + limit if limit else len(task_output.task.eval_docs), + len(task_output.task.eval_docs), + ), + } + for task_output, limit in zip(eval_tasks, limits) + }, + } + if log_samples: + results_dict["samples"] = dict(samples) + + return results_dict + + else: + return None + + +def request_caching_arg_to_dict(cache_requests: str) -> dict: + request_caching_args = { + "cache_requests": cache_requests in {"true", "refresh"}, + "rewrite_requests_cache": cache_requests == "refresh", + "delete_requests_cache": cache_requests == "delete", + } + + return request_caching_args diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/evaluator_utils.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/evaluator_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..d5a08326014279335521dcd1f5f70c1fe12c5003 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/evaluator_utils.py @@ -0,0 +1,544 @@ +import collections +import math +import pathlib +import sys +from typing import List, Optional, Tuple, Union + +from lm_eval.api.group import ConfigurableGroup +from lm_eval.api.metrics import ( + aggregate_subtask_metrics, + pooled_sample_stderr, + stderr_for_metric, +) +from lm_eval.api.task import Task +from lm_eval.utils import eval_logger, positional_deprecated + + +class TaskOutput: + """ + Wrapper class for Task outputs.It contains various attributes and methods to manage and calculate metrics for the task. + + Attributes: + task (object): The task object. + task_name (str): The name of the task. + task_config (dict): The configuration of the task. + version (str): The version of the task. + group_name (str): The name of the task group. + n_shot (int): The number of shots for the task. + task_alias (str): The alias of the task. + group_alias (str): The alias of the task group. + is_group (bool): Indicates if the task is a group. + logged_samples (list): The list of logged samples. + sample_len (int): The length of the samples. + sample_metrics (defaultdict): The dictionary of samples' metrics. + agg_metrics (defaultdict): The dictionary of aggregate metrics. + + Methods: + from_taskdict(cls, task_name: str, task): + Creates a TaskOutput instance from a task dictionary. + + calculate_aggregate_metric(bootstrap_iters=100000) -> None: + Calculates the aggregate metrics for the task. + """ + + def __init__( + self, + task=None, + task_name=None, + task_config=None, + version=None, + group_name=None, + n_shot=None, + task_alias=None, + group_alias=None, + is_group=None, + ): + self.task = task + self.task_config = task_config + self.task_name = task_name + self.group_name = group_name + self.version = version + self.n_shot = n_shot + self.task_alias = task_alias + self.group_alias = group_alias + self.is_group = is_group + self.logged_samples = [] + self.sample_len = None + self.sample_metrics = collections.defaultdict(list) + self.agg_metrics = collections.defaultdict(list) + + @classmethod + def from_taskdict(cls, task_name: str, task): + if isinstance(task, tuple): + group_name, task = task + else: + group_name = None + if not task: + # these gets filtered out in get_task_list + # once they are added to group hierarchy + is_group = True + return cls( + task=task, task_name=task_name, is_group=is_group, group_name=group_name + ) + version = task.VERSION + task_config = dict(task.dump_config()) + if (n_shot := task_config.get("num_fewshot")) == 0: + n_shot = task_config.get("metadata", {}).get("num_fewshot", 0) + task_alias = task_config.get("alias") + group_alias = task_config.get("group_alias") + return cls( + task=task, + task_name=task_name, + task_config=task_config, + group_name=group_name, + version=version, + n_shot=n_shot, + task_alias=task_alias, + group_alias=group_alias, + ) + + def calculate_aggregate_metric(self, bootstrap_iters=100000) -> None: + for (metric, filter_key), items in self.sample_metrics.items(): + agg_fn = self.task.aggregation()[metric] + metric_key = f"{metric},{filter_key}" + self.agg_metrics[metric_key] = agg_fn(items) + self.sample_len = len(items) # TODO: same sample size for each metric? + if isinstance(bootstrap_iters, int): + stderr_fn = stderr_for_metric( + metric=agg_fn, + bootstrap_iters=min(bootstrap_iters, 100) + if metric in ["bleu", "chrf", "ter"] + else bootstrap_iters, + ) + self.agg_metrics[f"{metric}_stderr,{filter_key}"] = ( + stderr_fn(items) if (stderr_fn and len(items) > 1) else "N/A" + ) + else: + raise ValueError( + f"Received bootstrap_iters '{bootstrap_iters}' but expected an integer. Set to 0 to turn off stderr calculations." + ) + + def __repr__(self): + return ( + f"TaskOutput(task_name={self.task_name}, " + f"group_name={self.group_name}, " + f"version={self.version}, " + f"n_shot={self.n_shot}, " + f"task_alias={self.task_alias}, " + f"group_alias={self.group_alias})" + ) + + +def get_task_list(task_dict: dict) -> List[TaskOutput]: + outputs = [] + for task_name, task_obj in task_dict.items(): + if isinstance(task_obj, dict): + _outputs = get_task_list(task_obj) + outputs.extend(_outputs) + else: + task_output = TaskOutput.from_taskdict(task_name, task_obj) + outputs.append(task_output) + + return outputs + + +def get_subtask_list(task_dict, task_root=None, depth=0): + subtask_list = {} + for group_obj, task_obj in task_dict.items(): + if isinstance(group_obj, ConfigurableGroup): + # group_name = group_obj.group_name + group_name = group_obj.group_name + else: + group_name = group_obj + if isinstance(task_obj, dict): + _subtask_list = get_subtask_list( + task_obj, task_root=group_name, depth=depth + 1 + ) + if task_root: + subtask_list.setdefault((task_root, depth), []).extend( + [ + _task + for (_task, _depth) in _subtask_list.keys() + if (_depth - 1) == depth + ] + ) + + subtask_list = {**subtask_list, **_subtask_list} + else: + if isinstance(task_obj, ConfigurableGroup): + # group_or_task_name = task_obj.group_name + group_or_task_name = task_obj.group_name + elif isinstance(task_obj, Task): + # group_or_task_name = task_obj.task_name + group_or_task_name = task_obj.task_name + + if task_root is None: + subtask_list.setdefault((group_or_task_name, depth), []) + else: + subtask_list.setdefault((task_root, depth), []).append( + group_or_task_name + ) + + if depth == 0: + _subtask_list = {} + for group_key, task_list in subtask_list.items(): + group_name, depth = group_key + _subtask_list[group_name] = task_list + subtask_list = _subtask_list + + return subtask_list + + +def print_writeout(task) -> None: + for inst in task.instances: + # print the prompt for the first few documents + if inst.doc_id < 1: + eval_logger.info( + f"Task: {task}; document {inst.doc_id}; context prompt (starting on next line):\ + \n{inst.args[0]}\n(end of prompt on previous line)\ntarget string or answer choice index (starting on next line):\n{task.doc_to_target(inst.doc)}\n(end of target on previous line)" + ) + eval_logger.info(f"Request: {str(inst)}") + + +def get_sample_size(task, limit: Optional[int]) -> Union[int, None]: + if limit is not None: + limit = ( + int(math.ceil(len(task.eval_docs) * limit)) if limit < 1.0 else int(limit) + ) + return limit + + +def prepare_print_tasks( + task_dict: dict, + results: dict, + task_depth=0, + group_depth=0, +) -> Tuple[dict, dict]: + """ + @param task_dict: Dictionary representing the group hierarchy of tasks. Each key is a group name and its + value is a list of task names. + @param results: Dictionary containing the results of each task. Each key is a + group name and its value is a dictionary of task results. + @param task_depth: The indentation level for printing the task + hierarchy. Default is 0. + @param group_depth: The indentation level for printing the group + hierarchy. Default is 0. + @return: A tuple of two dictionaries: results_agg and groups_agg. results_agg contains + aggregated results for each task, and groups_agg contains aggregated results for each group. + + Prepares the task hierarchy and aggregates the results for each task and group recursively for printing. + """ + + def _sort_task_dict(task_dict): + """ + Helper utility. Sorts the task dict at the current level of the hierarchy based on alphabetized task name. + Required so that we end up sorting within each sub-header correctly. + """ + + return dict( + sorted( + task_dict.items(), + key=lambda item: item[0].group_name + if isinstance(item[0], ConfigurableGroup) + else item[0], + ) + ) + + task_agg = collections.defaultdict(dict) + group_agg = collections.defaultdict(dict) + task_dict = _sort_task_dict(task_dict) + for task_or_group_name, task_or_group_obj in task_dict.items(): + tab_string = " " * task_depth + "- " if task_depth > 0 else "" + if isinstance(task_or_group_name, ConfigurableGroup): + # string_name = task_or_group_name.group_name + name = task_or_group_name.group_name + from_configurable_group = True + task_or_group_obj = _sort_task_dict(task_or_group_obj) + elif isinstance(task_or_group_name, str): + name = task_or_group_name + if isinstance(task_or_group_obj, Task): + # string_name = task_or_group_obj.task_name + name = task_or_group_obj.task_name + from_configurable_group = False + + task_agg[name] = results[name].copy() + if from_configurable_group: + if task_or_group_name.group_alias is not None: + alias = task_or_group_name.group_alias + else: + alias = task_or_group_name.group + else: + if "alias" in task_agg[name]: + alias = task_agg[name]["alias"] + else: + alias = name + + task_agg[name]["alias"] = tab_string + alias + if "samples" in task_agg[name]: + task_agg[name].pop("samples") + + if from_configurable_group and (" " not in results[name]): + group_tab_string = " " * group_depth + "- " if group_depth > 0 else "" + group_agg[name] = results[name].copy() + group_agg[name]["alias"] = group_tab_string + alias + if "samples" in group_agg[name]: + group_agg[name].pop("samples") + + if isinstance(task_or_group_obj, dict): + task_depth += 1 + group_depth += 1 + _task_agg, _group_agg = prepare_print_tasks( + task_or_group_obj, results, task_depth, group_depth + ) + task_agg = { + **task_agg, + **_task_agg, + } + group_agg = {**group_agg, **_group_agg} + task_depth -= 1 + group_depth -= 1 + return task_agg, group_agg + + +def consolidate_results( + eval_tasks: List[TaskOutput], +) -> Tuple[dict, dict, dict, dict, dict, dict]: + """ + @param eval_tasks: list(TaskOutput). + @return: A tuple containing the consolidated results, samples, configs, versions, and num_fewshot. + + Consolidates the results of multiple evaluation tasks into a single structure. + + The method iterates over each evaluation instance and extracts relevant information to create the consolidated + results structure. The consolidated results structure has the following properties: + + - results: A defaultdict with task names as keys and dictionaries as values. Each dictionary contains + metric/filter pairs as keys and corresponding metric values as values. The "alias" key is used to store task + aliases specified in the task configuration. + - samples: A defaultdict with task names as keys and lists of log samples as values. + - configs: A defaultdict with task names as keys and task configurations as values. + - versions: A defaultdict with task names as keys and task versions as values. + - num_fewshot: A defaultdict with task names as keys and number of few-shot samples as values. + - higher_is_better: A defaultdict with task names as keys and indicators of whether higher values are better + for each metric as values. + + The method then returns the consolidated results, samples, configs, versions, and num_fewshot as a tuple. + """ + # stores the final result for each task, for each metric/filter pair. + results = collections.defaultdict(dict) + # logs info about each document evaluated. + samples = collections.defaultdict(list) + # store num-fewshot value per task + num_fewshot = collections.defaultdict(int) + # Tracks the YAML configs of all chosen task + configs = collections.defaultdict(dict) + # Tracks each task's version. + versions = collections.defaultdict(dict) + # Track `higher_is_better` for each metric + higher_is_better = collections.defaultdict(dict) + + for task_output in eval_tasks: + if "task_alias" in (task_config := task_output.task_config): + results[task_output.task_name]["alias"] = task_config["task_alias"] + else: + results[task_output.task_name]["alias"] = task_output.task_name + if group_alias := task_output.group_alias: + if group_alias not in results and (group_name := task_output.group_name): + results[group_name]["alias"] = group_alias + num_fewshot[task_output.task_name] = task_output.n_shot + configs[task_output.task_name] = task_output.task_config + versions[task_output.task_name] = task_output.version + samples[task_output.task_name] = task_output.logged_samples + higher_is_better[task_output.task_name] = task_output.task.higher_is_better() + for (metric, filter_key), items in task_output.sample_metrics.items(): + metric_key = f"{metric},{filter_key}" + results[task_output.task_name][metric_key] = task_output.agg_metrics[ + metric_key + ] + results[task_output.task_name]["samples"] = task_output.sample_len + results[task_output.task_name][f"{metric}_stderr,{filter_key}"] = ( + task_output.agg_metrics[f"{metric}_stderr,{filter_key}"] + ) + return results, samples, configs, versions, num_fewshot, higher_is_better + + +def consolidate_group_results( + results, + versions, + task_dict, + task_root=None, + show_group_table=False, + task_aggregation_list=None, +) -> Tuple[dict, dict, bool, Union[None,]]: + """ + (Recursively) calculates groups' aggregated metrics and updates the results and versions dictionaries with this info. + + @return: a tuple [results, versions, show_group_table, task_aggregation_list] with formats described below: + + - results: A defaultdict with task names (and, after this function is called, group names of + groups that perform aggregation) as keys, and dictionaries with "alias" and metric,filter_name pairs as keys. + - versions: A defaultdict with task names (and, after this function is called, group names of + groups that perform aggregation) as keys, and float values representing the task or group's version if a version is specified. (defaulting to None). + - show_group_table: a boolean which is true if there exists a group that requires printing of its aggregated scores in a group table. + - task_aggregation_list: a defaultdict listing the subtasks to average over to produce a given group's end metric. + + The method then returns the updated results, versions, show_group_table, and task_aggregation_list as a tuple. + In the top-level invocation of this function, task_aggregation_list is ignored. + """ + if task_root is None: + task_root = {} + + if task_aggregation_list is None: + task_aggregation_list = {} + + for group_or_task, group_or_task_info in task_dict.items(): + # Convert to string + if isinstance(group_or_task, ConfigurableGroup): + group_config = group_or_task.config + group_or_task = group_or_task.group_name + else: + group_config = None + + if isinstance(group_or_task_info, Task): + if task_root: + task_aggregation_list.setdefault(task_root, []).append( + group_or_task_info.task_name + ) + else: + ( + results, + versions, + show_group_table, + _task_aggregation_list, + ) = consolidate_group_results( + results, + versions, + group_or_task_info, + group_or_task, + show_group_table, + task_aggregation_list, + ) + if task_root: + task_aggregation_list.setdefault(task_root, []).extend( + task_aggregation_list.get(group_or_task, []) + ) + + if (group_config is None) or ( + group_config["aggregate_metric_list"] is None + ): + results[group_or_task][" "] = " " + continue + + if "aggregate_metric_list" in group_config: + agg_metric_list = group_config["aggregate_metric_list"] + + show_group_table = show_group_table | bool( + group_config["aggregate_metric_list"] + ) + + task_list = _task_aggregation_list[group_or_task] + + metric_list = list( + { + key + for task in task_list + for key in results[task].keys() + if "_stderr" not in key and key not in ["task", "alias", "samples"] + } + ) + for metric in metric_list: + stderr = "_stderr,".join(metric.split(",")) + + # gather metrics, sizes, and stderrs from subtasks + metrics = [ + results[task][metric] + for task in task_list + if metric in results[task] + ] # TODO: copy? + stderrs = [ + results[task][stderr] + for task in task_list + if stderr in results[task] + ] + sizes = [ + results[task]["samples"] + for task in task_list + if metric in results[task] + ] + + for metric_config in agg_metric_list: + for filter_name in metric_config["filter_list"]: + if metric != ",".join([metric_config["metric"], filter_name]): + continue + + # compute group's pooled metric and stderr + if metric_config["aggregation"] == "mean": + aggregate_fn = aggregate_subtask_metrics + elif callable(metric_config["aggregation"]): + aggregate_fn = metric_config["aggregation"] + else: + raise ValueError( + f"Currently, only 'mean' is supported for automatically aggregating scores across groups' subtasks. Got '{metric_config['aggregation']}' for group '{group_or_task}'" + ) + + results[group_or_task][metric] = aggregate_fn( + metrics, + sizes, + metric_config["weight_by_size"], + ) + # TODO: calculate groups' metrics using arbitrary agg fns + if "N/A" in stderrs: + results[group_or_task][stderr] = "N/A" + else: + # NOTE: this assumes we are using the mean to aggregate. There are warnings about this elsewhere + results[group_or_task][stderr] = pooled_sample_stderr( + stderrs, sizes + ) + + results[group_or_task]["samples"] = sum(sizes) + group_metadata = group_config.get("metadata", None) + if group_metadata is not None: + versions[group_or_task] = group_metadata.get("version", None) + # print(results) + return results, versions, show_group_table, task_aggregation_list + + +@positional_deprecated +def find_test_root(start_path: pathlib.Path) -> pathlib.Path: + """ + Search upward in the directory tree to a maximum of three layers + to find and return the package root (containing the 'tests' folder) + """ + cur_path = start_path.resolve() + max_layers = 3 + for _ in range(max_layers): + if (cur_path / "tests" / "test_version_stable.py").exists(): + return cur_path + else: + cur_path = cur_path.parent.resolve() + raise FileNotFoundError( + f"Unable to find package root within {max_layers} upwards" + f"of {start_path}" + ) + + +@positional_deprecated +def run_task_tests(task_list: List[str]): + """ + Find the package root and run the tests for the given tasks + """ + import pytest + + package_root = find_test_root(start_path=pathlib.Path(__file__)) + task_string = " or ".join(task_list) + args = [ + f"{package_root}/tests/test_version_stable.py", + f"--rootdir={package_root}", + "-k", + f"{task_string}", + ] + sys.path.append(str(package_root)) + pytest_return_val = pytest.main(args) + if pytest_return_val: + raise ValueError( + f"Not all tests for the specified tasks ({task_list}) ran successfully! Error code: {pytest_return_val}" + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/__init__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..46fa4acd4cc4f06d1f62f25840b3c4d9ffc92b7e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/__init__.py @@ -0,0 +1,25 @@ +from functools import partial +from typing import List + +from lm_eval.api.filter import FilterEnsemble +from lm_eval.api.registry import get_filter + +from . import extraction, selection, transformation + + +def build_filter_ensemble( + filter_name: str, components: List[List[str]] +) -> FilterEnsemble: + """ + Create a filtering pipeline. + """ + filters = [] + for function, kwargs in components: + if kwargs is None: + kwargs = {} + # create a filter given its name in the registry + f = partial(get_filter(function), **kwargs) + # add the filter as a pipeline step + filters.append(f) + + return FilterEnsemble(name=filter_name, filters=filters) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/decontamination.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/decontamination.py new file mode 100644 index 0000000000000000000000000000000000000000..4eda4e022445355f191926790b2edf8f0cfa4bbd --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/decontamination.py @@ -0,0 +1,25 @@ +from lm_eval.api.filter import Filter +from lm_eval.api.registry import register_filter + + +@register_filter("decontaminate") +class DecontaminationFilter(Filter): + """ + A filter which evaluates + """ + + name = "track_decontamination" + + def __init__(self, path) -> None: + """ + + TODO: make sure only ever run one time on the train set (should this be cached as a class var? keyed by value for "path"). + should further cache result on a given (task_name, doc_id) + """ + self._decontam_results = None + + def apply(self, resps, docs) -> None: + """ + Return {"no_contamination", "only_contamination"} keys for the 2 different subsets + """ + pass diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/extraction.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/extraction.py new file mode 100644 index 0000000000000000000000000000000000000000..41dc6208ce67ce36d69b2d91dcb6815a3fefb5a9 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/extraction.py @@ -0,0 +1,184 @@ +import re +import sys +import unicodedata + +from lm_eval.api.filter import Filter +from lm_eval.api.registry import register_filter + + +@register_filter("regex") +class RegexFilter(Filter): + """ """ + + def __init__( + self, + regex_pattern: str = r"#### (\-?[0-9\.\,]+)", + group_select=0, + fallback: str = "[invalid]", + ) -> None: + """ + pass a string `regex` to run `re.compile(r"regex")` on. + `fallback` defines the output returned if no matches for the regex are located. + """ + self.regex_pattern = regex_pattern + self.regex = re.compile(regex_pattern) + self.group_select = group_select + self.fallback = fallback + + def apply(self, resps, docs): + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) + def filter_set(inst): + filtered = [] + for resp in inst: + match = self.regex.findall(resp) + if match: + match = match[self.group_select] + if isinstance(match, tuple): + match = [m for m in match if m][0] + match = match.strip() + else: + match = self.fallback + filtered.append(match) + return filtered + + # print(resps) + filtered_resps = list(map(lambda x: filter_set(x), resps)) + # print(filtered_resps) + + return filtered_resps + + +@register_filter("remove_whitespace") +class WhitespaceFilter(Filter): + """ """ + + def __init__(self) -> None: + pass + + def apply(self, resps, docs): + def filter_set(inst): + filtered_resp = [] + for resp in inst: + resp = resp.lstrip() + filtered_resp.append(resp) + return filtered_resp + + filtered_resps = [filter_set(resp) for resp in resps] + + return filtered_resps + + +@register_filter("multi_choice_regex") +class MultiChoiceRegexFilter(RegexFilter): + """ + A filter used to extract a model's answer on multiple choice questions with + letter answers. assumes each document has a "choices" field + containing the list of answer choices and that the answer label symbols + are of the form (A), (B), (C), ... or A, B, C. + """ + + def __init__( + self, + regex_pattern: str = r"#### (\-?[0-9\.\,]+)", + group_select=0, + fallback: str = "[invalid]", + ignore_case=False, + ignore_punctuation=False, + regexes_to_ignore=None, + ) -> None: + """ + regex_pattern: The basic regex pattern to use. If fails to match, we will use the customized match procedure + - step 1 : We parse the choices between ([A-Z])s then try to find these choices in the response. + - step 2 : We parse the choice with regex :[\s]*([A-?]), where ? varies by number of choices. + group_select: Selects the (group_select)th match from the findall result. + ignore_case: Ignores the case during step 1 matching + ignore_punctuation: Remove the punctuation during step 1 matching + regexes_to_ignore: Remove these regexes during step 1 matching + """ + super().__init__(regex_pattern, group_select, fallback) + self.ignore_case = ignore_case + self.ignore_punctuation = ignore_punctuation + self.regexes_to_ignore = regexes_to_ignore + + def apply(self, resps, docs): + # here, we assume we have a list, in which each element is + # a list of model responses for some particular input/target pair. + # so we process each of these (same input/target response sets) + # independently (and keep them a list.) + + def find_match(regex, resp, convert_dict={}): + match = regex.findall(resp) + if match: + match = match[self.group_select] + if isinstance(match, tuple): + match = [m for m in match if m][0] + match = match.strip() + if match and match in convert_dict: + match = convert_dict[match] + return match + + punct_tbl = dict.fromkeys( + i + for i in range(sys.maxunicode) + if unicodedata.category(chr(i)).startswith("P") + ) + + def filter_ignores(st): + if self.regexes_to_ignore is not None: + for s in self.regexes_to_ignore: + st = re.sub(s, "", st) + + if self.ignore_case: + st = st.lower() + + if self.ignore_punctuation: + # https://stackoverflow.com/a/266162 + st = st.translate(punct_tbl) + return st + + filtered_resps = [] + + for r, doc in zip(resps, docs): + fallback_regexes = [] + choice_to_alpha = {} + next_alpha = "A" + + without_paren_fallback_regexes = [] + without_paren_to_target = {} + + choices = doc["choices"] + for c in choices: + m = filter_ignores(c.strip()) + fallback_regexes.append(f"{re.escape(m)}") + choice_to_alpha[m] = f"({next_alpha})" + + without_paren_fallback_regexes.append(next_alpha) + without_paren_to_target[next_alpha] = f"({next_alpha})" + + next_alpha = chr(ord(next_alpha) + 1) + fallback_regex = re.compile("|".join(fallback_regexes)) + without_paren_fallback_regex = "|".join(without_paren_fallback_regexes) + without_paren_fallback_regex = re.compile( + f":[\s]*({without_paren_fallback_regex})" + ) + + filtered = [] + for resp in r: + match = find_match(self.regex, resp) + if not match: + match = find_match( + fallback_regex, filter_ignores(resp), choice_to_alpha + ) + if not match: + match = find_match( + without_paren_fallback_regex, resp, without_paren_to_target + ) + if not match: + match = self.fallback + filtered.append(match) + filtered_resps.append(filtered) + + return filtered_resps diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/selection.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/selection.py new file mode 100644 index 0000000000000000000000000000000000000000..6e368b5980626c8008ed48c45a360046660db13e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/selection.py @@ -0,0 +1,61 @@ +from collections import Counter + +from lm_eval.api.filter import Filter +from lm_eval.api.registry import register_filter + + +# TODO: implement "arg_max" filter. either it should take in an arbitrary "scoring"/reward function +# that takes an input and returns a scalar and then should select the max reward, +# or should implement different filters for different ways of handling a reward model's inference. + + +@register_filter("take_first") +class TakeFirstFilter(Filter): + def __init__(self) -> None: + """ + Can define custom behavior here, if an individual instantiation of a Filter class should have state. + """ + + def apply(self, resps, docs): + """ + Assuming each entry of `resps` is a list of model responses, we discard all but the first response. + """ + return map(lambda r: r[0], resps) + + +@register_filter("take_first_k") +class TakeKFilter(Filter): + def __init__(self, **kwargs) -> None: + self.k = kwargs.pop("k") + + super().__init__(**kwargs) + + def apply(self, resps, docs): + # need resp to be subscriptable to check below + resps = list(resps) + # check we have at least k responses per doc, else we can't take the first k + assert ( + len(resps[0]) >= self.k + ), f"Need at least {self.k} responses per doc to take first {self.k}, but got {len(resps[0])} only! Please increase TaskConfig.repeats ." + return map(lambda r: r[: self.k], resps) + + +@register_filter("majority_vote") +class MajorityVoteFilter(Filter): + def __init__(self) -> None: + """ + Can define custom behavior here, if an individual instantiation of a Filter class should have state. + """ + + def apply(self, resps, docs): + """ + Each entry of `resps` is a list of model responses. + We select the response that occurs most frequently in each entry of `resps`. + """ + + def select_majority(resp): + counts = Counter(resp) + vote = counts.most_common(1)[0][0] + return vote + + return map(lambda r: [select_majority(r)], resps) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/transformation.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/transformation.py new file mode 100644 index 0000000000000000000000000000000000000000..cac1c5921dafe74be0b8416bd3a0678dc1fa1570 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/filters/transformation.py @@ -0,0 +1,56 @@ +from lm_eval.api.filter import Filter +from lm_eval.api.registry import register_filter + + +@register_filter("lowercase") +class LowercaseFilter(Filter): + def __init__(self) -> None: + pass + + def apply(self, resps, docs): + def filter_set(inst): + return [resp.lower() for resp in inst] + + return [filter_set(resp) for resp in resps] + + +@register_filter("uppercase") +class UppercaseFilter(Filter): + def __init__(self) -> None: + pass + + def apply(self, resps, docs): + def filter_set(inst): + return [resp.upper() for resp in inst] + + return [filter_set(resp) for resp in resps] + + +@register_filter("map") +class MapFilter(Filter): + def __init__(self, mapping_dict: dict = None, default_value=None) -> None: + """ + Initializes the MapFilter with a given mapping dictionary and default value. + + Args: + - mapping_dict (dict): A dictionary containing the key-value mappings. + Default is an empty dictionary. + - default_value (Any): The value to be returned when a key is not found in the mapping_dict. + Default is None. + + Example: + mapper = MapFilter({'A': 1, 'B': 2}, default_value=0) + """ + if mapping_dict is None: + mapping_dict = {} + assert isinstance( + mapping_dict, dict + ), "Provided mapping_dict is not a dictionary" + self.mapping_dict = mapping_dict + self.default_value = default_value + + def apply(self, resps, docs): + def filter_set(inst): + return [self.mapping_dict.get(resp, self.default_value) for resp in inst] + + return [filter_set(resp) for resp in resps] diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/__init__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..02b7a6834c6486fde35ef02d715e90be3fba223a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/__init__.py @@ -0,0 +1,2 @@ +from .evaluation_tracker import EvaluationTracker +from .wandb_logger import WandbLogger diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/evaluation_tracker.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/evaluation_tracker.py new file mode 100644 index 0000000000000000000000000000000000000000..067b047b599fac2a0045f3a32e42b6ecec0afcaf --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/evaluation_tracker.py @@ -0,0 +1,521 @@ +import json +import os +import re +import time +from collections import defaultdict +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path + +from datasets import load_dataset +from datasets.utils.metadata import MetadataConfigs +from huggingface_hub import ( + DatasetCard, + DatasetCardData, + HfApi, + hf_hub_url, +) +from huggingface_hub.utils import build_hf_headers, get_session, hf_raise_for_status + +from lm_eval.utils import ( + eval_logger, + get_file_datetime, + get_file_task_name, + get_results_filenames, + get_sample_results_filenames, + handle_non_serializable, + hash_string, + sanitize_list, + sanitize_model_name, + sanitize_task_name, +) + + +@dataclass(init=False) +class GeneralConfigTracker: + """ + Tracker for the evaluation parameters. + + Attributes: + model_source (str): Source of the model (e.g. Hugging Face, GGUF, etc.) + model_name (str): Name of the model. + model_name_sanitized (str): Sanitized model name for directory creation. + start_time (float): Start time of the experiment. Logged at class init. + end_time (float): Start time of the experiment. Logged when calling [`GeneralConfigTracker.log_end_time`] + total_evaluation_time_seconds (str): Inferred total evaluation time in seconds (from the start and end times). + """ + + model_source: str = None + model_name: str = None + model_name_sanitized: str = None + system_instruction: str = None + system_instruction_sha: str = None + fewshot_as_multiturn: bool = None + chat_template: str = None + chat_template_sha: str = None + start_time: float = None + end_time: float = None + total_evaluation_time_seconds: str = None + + def __init__(self) -> None: + """Starts the evaluation timer.""" + self.start_time = time.perf_counter() + + @staticmethod + def _get_model_name(model_args: str) -> str: + """Extracts the model name from the model arguments.""" + + def extract_model_name(model_args: str, key: str) -> str: + """Extracts the model name from the model arguments using a key.""" + args_after_key = model_args.split(key)[1] + return args_after_key.split(",")[0] + + # order does matter, e.g. peft and delta are provided together with pretrained + prefixes = ["peft=", "delta=", "pretrained=", "model=", "path=", "engine="] + for prefix in prefixes: + if prefix in model_args: + return extract_model_name(model_args, prefix) + return "" + + def log_experiment_args( + self, + model_source: str, + model_args: str, + system_instruction: str, + chat_template: str, + fewshot_as_multiturn: bool, + ) -> None: + """Logs model parameters and job ID.""" + self.model_source = model_source + self.model_name = GeneralConfigTracker._get_model_name(model_args) + self.model_name_sanitized = sanitize_model_name(self.model_name) + self.system_instruction = system_instruction + self.system_instruction_sha = ( + hash_string(system_instruction) if system_instruction else None + ) + self.chat_template = chat_template + self.chat_template_sha = hash_string(chat_template) if chat_template else None + self.fewshot_as_multiturn = fewshot_as_multiturn + + def log_end_time(self) -> None: + """Logs the end time of the evaluation and calculates the total evaluation time.""" + self.end_time = time.perf_counter() + self.total_evaluation_time_seconds = str(self.end_time - self.start_time) + + +class EvaluationTracker: + """ + Keeps track and saves relevant information of the evaluation process. + Compiles the data from trackers and writes it to files, which can be published to the Hugging Face hub if requested. + """ + + def __init__( + self, + output_path: str = None, + hub_results_org: str = "", + hub_repo_name: str = "", + details_repo_name: str = "", + results_repo_name: str = "", + push_results_to_hub: bool = False, + push_samples_to_hub: bool = False, + public_repo: bool = False, + token: str = "", + leaderboard_url: str = "", + point_of_contact: str = "", + gated: bool = False, + ) -> None: + """ + Creates all the necessary loggers for evaluation tracking. + + Args: + output_path (str): Path to save the results. If not provided, the results won't be saved. + hub_results_org (str): The Hugging Face organization to push the results to. If not provided, the results will be pushed to the owner of the Hugging Face token. + hub_repo_name (str): The name of the Hugging Face repository to push the results to. If not provided, the results will be pushed to `lm-eval-results`. + details_repo_name (str): The name of the Hugging Face repository to push the details to. If not provided, the results will be pushed to `lm-eval-results`. + result_repo_name (str): The name of the Hugging Face repository to push the results to. If not provided, the results will not be pushed and will be found in the details_hub_repo. + push_results_to_hub (bool): Whether to push the results to the Hugging Face hub. + push_samples_to_hub (bool): Whether to push the samples to the Hugging Face hub. + public_repo (bool): Whether to push the results to a public or private repository. + token (str): Token to use when pushing to the Hugging Face hub. This token should have write access to `hub_results_org`. + leaderboard_url (str): URL to the leaderboard on the Hugging Face hub on the dataset card. + point_of_contact (str): Contact information on the Hugging Face hub dataset card. + gated (bool): Whether to gate the repository. + """ + self.general_config_tracker = GeneralConfigTracker() + + self.output_path = output_path + self.push_results_to_hub = push_results_to_hub + self.push_samples_to_hub = push_samples_to_hub + self.public_repo = public_repo + self.leaderboard_url = leaderboard_url + self.point_of_contact = point_of_contact + self.api = HfApi(token=token) if token else None + self.gated_repo = gated + + if not self.api and (push_results_to_hub or push_samples_to_hub): + raise ValueError( + "Hugging Face token is not defined, but 'push_results_to_hub' or 'push_samples_to_hub' is set to True. " + "Please provide a valid Hugging Face token by setting the HF_TOKEN environment variable." + ) + + if ( + self.api + and hub_results_org == "" + and (push_results_to_hub or push_samples_to_hub) + ): + hub_results_org = self.api.whoami()["name"] + eval_logger.warning( + f"hub_results_org was not specified. Results will be pushed to '{hub_results_org}'." + ) + + if hub_repo_name == "": + details_repo_name = ( + details_repo_name if details_repo_name != "" else "lm-eval-results" + ) + results_repo_name = ( + results_repo_name if results_repo_name != "" else details_repo_name + ) + else: + details_repo_name = hub_repo_name + results_repo_name = hub_repo_name + eval_logger.warning( + "hub_repo_name was specified. Both details and results will be pushed to the same repository. Using hub_repo_name is no longer recommended, details_repo_name and results_repo_name should be used instead." + ) + + self.details_repo = f"{hub_results_org}/{details_repo_name}" + self.details_repo_private = f"{hub_results_org}/{details_repo_name}-private" + self.results_repo = f"{hub_results_org}/{results_repo_name}" + self.results_repo_private = f"{hub_results_org}/{results_repo_name}-private" + + def save_results_aggregated( + self, + results: dict, + samples: dict, + ) -> None: + """ + Saves the aggregated results and samples to the output path and pushes them to the Hugging Face hub if requested. + + Args: + results (dict): The aggregated results to save. + samples (dict): The samples results to save. + """ + self.general_config_tracker.log_end_time() + + if self.output_path: + try: + eval_logger.info("Saving results aggregated") + + # calculate cumulative hash for each task - only if samples are provided + task_hashes = {} + if samples: + for task_name, task_samples in samples.items(): + sample_hashes = [ + s["doc_hash"] + s["prompt_hash"] + s["target_hash"] + for s in task_samples + ] + task_hashes[task_name] = hash_string("".join(sample_hashes)) + + # update initial results dict + results.update({"task_hashes": task_hashes}) + results.update(asdict(self.general_config_tracker)) + dumped = json.dumps( + results, + indent=2, + default=handle_non_serializable, + ensure_ascii=False, + ) + + path = Path(self.output_path if self.output_path else Path.cwd()) + path = path.joinpath(self.general_config_tracker.model_name_sanitized) + path.mkdir(parents=True, exist_ok=True) + + self.date_id = datetime.now().isoformat().replace(":", "-") + file_results_aggregated = path.joinpath(f"results_{self.date_id}.json") + file_results_aggregated.open("w", encoding="utf-8").write(dumped) + + if self.api and self.push_results_to_hub: + repo_id = ( + self.results_repo + if self.public_repo + else self.results_repo_private + ) + self.api.create_repo( + repo_id=repo_id, + repo_type="dataset", + private=not self.public_repo, + exist_ok=True, + ) + self.api.upload_file( + repo_id=repo_id, + path_or_fileobj=str( + path.joinpath(f"results_{self.date_id}.json") + ), + path_in_repo=os.path.join( + self.general_config_tracker.model_name, + f"results_{self.date_id}.json", + ), + repo_type="dataset", + commit_message=f"Adding aggregated results for {self.general_config_tracker.model_name}", + ) + eval_logger.info( + "Successfully pushed aggregated results to the Hugging Face Hub. " + f"You can find them at: {repo_id}" + ) + + except Exception as e: + eval_logger.warning("Could not save results aggregated") + eval_logger.info(repr(e)) + else: + eval_logger.info( + "Output path not provided, skipping saving results aggregated" + ) + + def save_results_samples( + self, + task_name: str, + samples: dict, + ) -> None: + """ + Saves the samples results to the output path and pushes them to the Hugging Face hub if requested. + + Args: + task_name (str): The task name to save the samples for. + samples (dict): The samples results to save. + """ + if self.output_path: + try: + eval_logger.info(f"Saving per-sample results for: {task_name}") + + path = Path(self.output_path if self.output_path else Path.cwd()) + path = path.joinpath(self.general_config_tracker.model_name_sanitized) + path.mkdir(parents=True, exist_ok=True) + + file_results_samples = path.joinpath( + f"samples_{task_name}_{self.date_id}.jsonl" + ) + + for sample in samples: + # we first need to sanitize arguments and resps + # otherwise we won't be able to load the dataset + # using the datasets library + arguments = {} + for i, arg in enumerate(sample["arguments"]): + arguments[f"gen_args_{i}"] = {} + for j, tmp in enumerate(arg): + arguments[f"gen_args_{i}"][f"arg_{j}"] = tmp + + sample["resps"] = sanitize_list(sample["resps"]) + sample["filtered_resps"] = sanitize_list(sample["filtered_resps"]) + sample["arguments"] = arguments + sample["target"] = str(sample["target"]) + + sample_dump = ( + json.dumps( + sample, + default=handle_non_serializable, + ensure_ascii=False, + ) + + "\n" + ) + + with open(file_results_samples, "a", encoding="utf-8") as f: + f.write(sample_dump) + + if self.api and self.push_samples_to_hub: + repo_id = ( + self.details_repo + if self.public_repo + else self.details_repo_private + ) + self.api.create_repo( + repo_id=repo_id, + repo_type="dataset", + private=not self.public_repo, + exist_ok=True, + ) + try: + if self.gated_repo: + headers = build_hf_headers() + r = get_session().put( + url=f"https://huggingface.co/api/datasets/{repo_id}/settings", + headers=headers, + json={"gated": "auto"}, + ) + hf_raise_for_status(r) + except Exception as e: + eval_logger.warning("Could not gate the repository") + eval_logger.info(repr(e)) + self.api.upload_folder( + repo_id=repo_id, + folder_path=str(path), + path_in_repo=self.general_config_tracker.model_name_sanitized, + repo_type="dataset", + commit_message=f"Adding samples results for {task_name} to {self.general_config_tracker.model_name}", + ) + eval_logger.info( + f"Successfully pushed sample results for task: {task_name} to the Hugging Face Hub. " + f"You can find them at: {repo_id}" + ) + + except Exception as e: + eval_logger.warning("Could not save sample results") + eval_logger.info(repr(e)) + else: + eval_logger.info("Output path not provided, skipping saving sample results") + + def recreate_metadata_card(self) -> None: + """ + Creates a metadata card for the evaluation results dataset and pushes it to the Hugging Face hub. + """ + + eval_logger.info("Recreating metadata card") + repo_id = self.details_repo if self.public_repo else self.details_repo_private + + files_in_repo = self.api.list_repo_files(repo_id=repo_id, repo_type="dataset") + results_files = get_results_filenames(files_in_repo) + sample_files = get_sample_results_filenames(files_in_repo) + + # Build a dictionary to store the latest evaluation datetime for: + # - Each tested model and its aggregated results + # - Each task and sample results, if existing + # i.e. { + # "org__model_name__gsm8k": "2021-09-01T12:00:00", + # "org__model_name__ifeval": "2021-09-01T12:00:00", + # "org__model_name__results": "2021-09-01T12:00:00" + # } + latest_task_results_datetime = defaultdict(lambda: datetime.min.isoformat()) + + for file_path in sample_files: + file_path = Path(file_path) + filename = file_path.name + model_name = file_path.parent + task_name = get_file_task_name(filename) + results_datetime = get_file_datetime(filename) + task_name_sanitized = sanitize_task_name(task_name) + # Results and sample results for the same model and task will have the same datetime + samples_key = f"{model_name}__{task_name_sanitized}" + results_key = f"{model_name}__results" + latest_datetime = max( + latest_task_results_datetime[samples_key], + results_datetime, + ) + latest_task_results_datetime[samples_key] = latest_datetime + latest_task_results_datetime[results_key] = max( + latest_task_results_datetime[results_key], + latest_datetime, + ) + + # Create metadata card + card_metadata = MetadataConfigs() + + # Add the latest aggregated results to the metadata card for easy access + for file_path in results_files: + file_path = Path(file_path) + results_filename = file_path.name + model_name = file_path.parent + eval_date = get_file_datetime(results_filename) + eval_date_sanitized = re.sub(r"[^\w\.]", "_", eval_date) + results_filename = Path("**") / Path(results_filename).name + config_name = f"{model_name}__results" + sanitized_last_eval_date_results = re.sub( + r"[^\w\.]", "_", latest_task_results_datetime[config_name] + ) + + if eval_date_sanitized == sanitized_last_eval_date_results: + # Ensure that all results files are listed in the metadata card + current_results = card_metadata.get(config_name, {"data_files": []}) + current_results["data_files"].append( + {"split": eval_date_sanitized, "path": [str(results_filename)]} + ) + card_metadata[config_name] = current_results + # If the results file is the newest, update the "latest" field in the metadata card + card_metadata[config_name]["data_files"].append( + {"split": "latest", "path": [str(results_filename)]} + ) + + # Add the tasks details configs + for file_path in sample_files: + file_path = Path(file_path) + filename = file_path.name + model_name = file_path.parent + task_name = get_file_task_name(filename) + eval_date = get_file_datetime(filename) + task_name_sanitized = sanitize_task_name(task_name) + eval_date_sanitized = re.sub(r"[^\w\.]", "_", eval_date) + results_filename = Path("**") / Path(filename).name + config_name = f"{model_name}__{task_name_sanitized}" + sanitized_last_eval_date_results = re.sub( + r"[^\w\.]", "_", latest_task_results_datetime[config_name] + ) + if eval_date_sanitized == sanitized_last_eval_date_results: + # Ensure that all sample results files are listed in the metadata card + current_details_for_task = card_metadata.get( + config_name, {"data_files": []} + ) + current_details_for_task["data_files"].append( + {"split": eval_date_sanitized, "path": [str(results_filename)]} + ) + card_metadata[config_name] = current_details_for_task + # If the samples results file is the newest, update the "latest" field in the metadata card + card_metadata[config_name]["data_files"].append( + {"split": "latest", "path": [str(results_filename)]} + ) + + # Get latest results and extract info to update metadata card examples + latest_datetime = max(latest_task_results_datetime.values()) + latest_model_name = max( + latest_task_results_datetime, key=lambda k: latest_task_results_datetime[k] + ) + last_results_file = [ + f for f in results_files if latest_datetime.replace(":", "-") in f + ][0] + last_results_file_path = hf_hub_url( + repo_id=repo_id, filename=last_results_file, repo_type="dataset" + ) + latest_results_file = load_dataset( + "json", data_files=last_results_file_path, split="train" + ) + results_dict = latest_results_file["results"][0] + new_dictionary = {"all": results_dict} + new_dictionary.update(results_dict) + results_string = json.dumps(new_dictionary, indent=4) + + dataset_summary = ( + "Dataset automatically created during the evaluation run of model " + ) + if self.general_config_tracker.model_source == "hf": + dataset_summary += f"[{self.general_config_tracker.model_name}](https://huggingface.co/{self.general_config_tracker.model_name})\n" + else: + dataset_summary += f"{self.general_config_tracker.model_name}\n" + dataset_summary += ( + f"The dataset is composed of {len(card_metadata)-1} configuration(s), each one corresponding to one of the evaluated task.\n\n" + f"The dataset has been created from {len(results_files)} run(s). Each run can be found as a specific split in each " + 'configuration, the split being named using the timestamp of the run.The "train" split is always pointing to the latest results.\n\n' + 'An additional configuration "results" store all the aggregated results of the run.\n\n' + "To load the details from a run, you can for instance do the following:\n" + ) + if self.general_config_tracker.model_source == "hf": + dataset_summary += ( + "```python\nfrom datasets import load_dataset\n" + f'data = load_dataset(\n\t"{repo_id}",\n\tname="{latest_model_name}",\n\tsplit="latest"\n)\n```\n\n' + ) + dataset_summary += ( + "## Latest results\n\n" + f'These are the [latest results from run {latest_datetime}]({last_results_file_path.replace("/resolve/", "/blob/")}) ' + "(note that there might be results for other tasks in the repos if successive evals didn't cover the same tasks. " + 'You find each in the results and the "latest" split for each eval):\n\n' + f"```python\n{results_string}\n```" + ) + card_data = DatasetCardData( + dataset_summary=dataset_summary, + repo_url=f"https://huggingface.co/{self.general_config_tracker.model_name}", + pretty_name=f"Evaluation run of {self.general_config_tracker.model_name}", + leaderboard_url=self.leaderboard_url, + point_of_contact=self.point_of_contact, + ) + card_metadata.to_dataset_card_data(card_data) + card = DatasetCard.from_template( + card_data, + pretty_name=card_data.pretty_name, + ) + card.push_to_hub(repo_id, repo_type="dataset") diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/utils.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..ded8f820ec8c8658becbcd5e18304158c294e91e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/utils.py @@ -0,0 +1,143 @@ +import logging +import os +import re +import subprocess +from pathlib import Path +from typing import Any, Dict, Optional, Tuple, Union + +import numpy as np +from torch.utils.collect_env import get_pretty_env_info +from transformers import __version__ as trans_version + + +logger = logging.getLogger(__name__) + + +def remove_none_pattern(input_string: str) -> Tuple[str, bool]: + """Remove the ',none' substring from the input_string if it exists at the end. + + Args: + input_string (str): The input string from which to remove the ',none' substring. + + Returns: + Tuple[str, bool]: A tuple containing the modified input_string with the ',none' substring removed + and a boolean indicating whether the modification was made (True) or not (False). + """ + # Define the pattern to match ',none' at the end of the string + pattern = re.compile(r",none$") + + # Use sub() to replace ',none' with an empty string + result = re.sub(pattern, "", input_string) + + # check if the input_string changed + removed = result != input_string + + return result, removed + + +def _handle_non_serializable(o: Any) -> Union[int, str, list]: + """Handle non-serializable objects by converting them to serializable types. + + Args: + o (Any): The object to be handled. + + Returns: + Union[int, str, list]: The converted object. If the object is of type np.int64 or np.int32, + it will be converted to int. If the object is of type set, it will be converted + to a list. Otherwise, it will be converted to str. + """ + if isinstance(o, np.int64) or isinstance(o, np.int32): + return int(o) + elif isinstance(o, set): + return list(o) + else: + return str(o) + + +def get_commit_from_path(repo_path: Union[Path, str]) -> Optional[str]: + try: + git_folder = Path(repo_path, ".git") + if git_folder.is_file(): + git_folder = Path( + git_folder.parent, + git_folder.read_text(encoding="utf-8").split("\n")[0].split(" ")[-1], + ) + if Path(git_folder, "HEAD").exists(): + head_name = ( + Path(git_folder, "HEAD") + .read_text(encoding="utf-8") + .split("\n")[0] + .split(" ")[-1] + ) + head_ref = Path(git_folder, head_name) + git_hash = head_ref.read_text(encoding="utf-8").replace("\n", "") + else: + git_hash = None + except Exception as err: + logger.debug( + f"Failed to retrieve a Git commit hash from path: {str(repo_path)}. Error: {err}" + ) + return None + return git_hash + + +def get_git_commit_hash(): + """ + Gets the git commit hash of your current repo (if it exists). + Source: https://github.com/EleutherAI/gpt-neox/blob/b608043be541602170bfcfb8ec9bf85e8a0799e0/megatron/neox_arguments/neox_args.py#L42 + """ + try: + git_hash = subprocess.check_output(["git", "describe", "--always"]).strip() + git_hash = git_hash.decode() + except (subprocess.CalledProcessError, FileNotFoundError): + # FileNotFoundError occurs when git not installed on system + git_hash = get_commit_from_path(os.getcwd()) # git hash of repo if exists + return git_hash + + +def add_env_info(storage: Dict[str, Any]): + try: + pretty_env_info = get_pretty_env_info() + except Exception as err: + pretty_env_info = str(err) + transformers_version = trans_version + upper_dir_commit = get_commit_from_path( + Path(os.getcwd(), "..") + ) # git hash of upper repo if exists + added_info = { + "pretty_env_info": pretty_env_info, + "transformers_version": transformers_version, + "upper_git_hash": upper_dir_commit, # in case this repo is submodule + } + storage.update(added_info) + + +def add_tokenizer_info(storage: Dict[str, Any], lm): + if getattr(lm, "tokenizer", False): + try: + tokenizer_info = { + "tokenizer_pad_token": [ + lm.tokenizer.pad_token, + str(lm.tokenizer.pad_token_id), + ], + "tokenizer_eos_token": [ + lm.tokenizer.eos_token, + str(lm.tokenizer.eos_token_id), + ], + "tokenizer_bos_token": [ + lm.tokenizer.bos_token, + str(lm.tokenizer.bos_token_id), + ], + "eot_token_id": getattr(lm, "eot_token_id", None), + "max_length": getattr(lm, "max_length", None), + } + storage.update(tokenizer_info) + except Exception as err: + logger.debug( + f"Logging detailed tokenizer info failed with {err}, skipping..." + ) + # seems gguf and textsynth do not have tokenizer + else: + logger.debug( + "LM does not have a 'tokenizer' attribute, not logging tokenizer metadata to results." + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/wandb_logger.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/wandb_logger.py new file mode 100644 index 0000000000000000000000000000000000000000..4bcc439ed84749e7dc165acceee5060ed0f4844a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/loggers/wandb_logger.py @@ -0,0 +1,351 @@ +import copy +import json +import logging +from typing import Any, Dict, List, Literal, Tuple + +import numpy as np +import pandas as pd +from packaging.version import Version + +from lm_eval.loggers.utils import _handle_non_serializable, remove_none_pattern + + +logger = logging.getLogger(__name__) + + +def get_wandb_printer() -> Literal["Printer"]: + """Returns a wandb printer instance for pretty stdout.""" + from wandb.sdk.lib.printer import new_printer + + printer = new_printer() + return printer + + +class WandbLogger: + def __init__(self, **kwargs) -> None: + """Attaches to wandb logger if already initialized. Otherwise, passes kwargs to wandb.init() + + Args: + kwargs Optional[Any]: Arguments for configuration. + + Parse and log the results returned from evaluator.simple_evaluate() with: + wandb_logger.post_init(results) + wandb_logger.log_eval_result() + wandb_logger.log_eval_samples(results["samples"]) + """ + try: + import wandb + + assert Version(wandb.__version__) >= Version("0.13.6") + if Version(wandb.__version__) < Version("0.13.6"): + wandb.require("report-editing:v0") + except Exception as e: + logger.warning( + "To use the wandb reporting functionality please install wandb>=0.13.6.\n" + "To install the latest version of wandb run `pip install wandb --upgrade`\n" + f"{e}" + ) + + self.wandb_args: Dict[str, Any] = kwargs + + # initialize a W&B run + if wandb.run is None: + self.run = wandb.init(**self.wandb_args) + else: + self.run = wandb.run + + self.printer = get_wandb_printer() + + def post_init(self, results: Dict[str, Any]) -> None: + self.results: Dict[str, Any] = copy.deepcopy(results) + self.task_names: List[str] = list(results.get("results", {}).keys()) + self.group_names: List[str] = list(results.get("groups", {}).keys()) + + def _get_config(self) -> Dict[str, Any]: + """Get configuration parameters.""" + self.task_configs = self.results.get("configs", {}) + cli_configs = self.results.get("config", {}) + configs = { + "task_configs": self.task_configs, + "cli_configs": cli_configs, + } + + return configs + + def _sanitize_results_dict(self) -> Tuple[Dict[str, str], Dict[str, Any]]: + """Sanitize the results dictionary.""" + _results = copy.deepcopy(self.results.get("results", dict())) + + # Remove None from the metric string name + tmp_results = copy.deepcopy(_results) + for task_name in self.task_names: + task_result = tmp_results.get(task_name, dict()) + for metric_name, metric_value in task_result.items(): + _metric_name, removed = remove_none_pattern(metric_name) + if removed: + _results[task_name][_metric_name] = metric_value + _results[task_name].pop(metric_name) + + # remove string valued keys from the results dict + wandb_summary = {} + for task in self.task_names: + task_result = _results.get(task, dict()) + for metric_name, metric_value in task_result.items(): + if isinstance(metric_value, str): + wandb_summary[f"{task}/{metric_name}"] = metric_value + + for summary_metric, summary_value in wandb_summary.items(): + _task, _summary_metric = summary_metric.split("/") + _results[_task].pop(_summary_metric) + + tmp_results = copy.deepcopy(_results) + for task_name, task_results in tmp_results.items(): + for metric_name, metric_value in task_results.items(): + _results[f"{task_name}/{metric_name}"] = metric_value + _results[task_name].pop(metric_name) + for task in self.task_names: + _results.pop(task) + + return wandb_summary, _results + + def _log_results_as_table(self) -> None: + """Generate and log evaluation results as a table to W&B.""" + columns = [ + "Version", + "Filter", + "num_fewshot", + "Metric", + "Value", + "Stderr", + ] + + def make_table(columns: List[str], key: str = "results"): + import wandb + + table = wandb.Table(columns=columns) + results = copy.deepcopy(self.results) + + for k, dic in results.get(key).items(): + if k in self.group_names and not key == "groups": + continue + version = results.get("versions").get(k) + if version == "N/A": + version = None + n = results.get("n-shot").get(k) + + for (mf), v in dic.items(): + m, _, f = mf.partition(",") + if m.endswith("_stderr"): + continue + if m == "alias": + continue + + if m + "_stderr" + "," + f in dic: + se = dic[m + "_stderr" + "," + f] + if se != "N/A": + se = "%.4f" % se + table.add_data(*[k, version, f, n, m, str(v), str(se)]) + else: + table.add_data(*[k, version, f, n, m, str(v), ""]) + + return table + + # log the complete eval result to W&B Table + table = make_table(["Tasks"] + columns, "results") + self.run.log({"evaluation/eval_results": table}) + + if "groups" in self.results.keys(): + table = make_table(["Groups"] + columns, "groups") + self.run.log({"evaluation/group_eval_results": table}) + + def _log_results_as_artifact(self) -> None: + """Log results as JSON artifact to W&B.""" + import wandb + + dumped = json.dumps( + self.results, indent=2, default=_handle_non_serializable, ensure_ascii=False + ) + artifact = wandb.Artifact("results", type="eval_results") + with artifact.new_file("results.json", mode="w", encoding="utf-8") as f: + f.write(dumped) + self.run.log_artifact(artifact) + + def log_eval_result(self) -> None: + """Log evaluation results to W&B.""" + # Log configs to wandb + configs = self._get_config() + self.run.config.update(configs) + + wandb_summary, self.wandb_results = self._sanitize_results_dict() + # update wandb.run.summary with items that were removed + self.run.summary.update(wandb_summary) + # Log the evaluation metrics to wandb + self.run.log(self.wandb_results) + # Log the evaluation metrics as W&B Table + self._log_results_as_table() + # Log the results dict as json to W&B Artifacts + self._log_results_as_artifact() + + def _generate_dataset( + self, data: List[Dict[str, Any]], config: Dict[str, Any] + ) -> pd.DataFrame: + """Generate a dataset from evaluation data. + + Args: + data (List[Dict[str, Any]]): The data to generate a dataset for. + config (Dict[str, Any]): The configuration of the task. + + Returns: + pd.DataFrame: A dataframe that is ready to be uploaded to W&B. + """ + ids = [x["doc_id"] for x in data] + labels = [x["target"] for x in data] + instance = [""] * len(ids) + resps = [""] * len(ids) + filtered_resps = [""] * len(ids) + model_outputs = {} + + metrics_list = config["metric_list"] + metrics = {} + for metric in metrics_list: + metric = metric.get("metric") + if metric in ["word_perplexity", "byte_perplexity", "bits_per_byte"]: + metrics[f"{metric}_loglikelihood"] = [x[metric][0] for x in data] + if metric in ["byte_perplexity", "bits_per_byte"]: + metrics[f"{metric}_bytes"] = [x[metric][1] for x in data] + else: + metrics[f"{metric}_words"] = [x[metric][1] for x in data] + else: + metrics[metric] = [x[metric] for x in data] + + if config["output_type"] == "loglikelihood": + instance = [x["arguments"][0][0] for x in data] + labels = [x["arguments"][0][1] for x in data] + resps = [ + f'log probability of continuation is {x["resps"][0][0][0]} ' + + "\n\n" + + "continuation will {} generated with greedy sampling".format( + "not be" if not x["resps"][0][0][1] else "be" + ) + for x in data + ] + filtered_resps = [ + f'log probability of continuation is {x["filtered_resps"][0][0]} ' + + "\n\n" + + "continuation will {} generated with greedy sampling".format( + "not be" if not x["filtered_resps"][0][1] else "be" + ) + for x in data + ] + elif config["output_type"] == "multiple_choice": + instance = [x["arguments"][0][0] for x in data] + choices = [ + "\n".join([f"{idx}. {y[1]}" for idx, y in enumerate(x["arguments"])]) + for x in data + ] + resps = [np.argmax([n[0][0] for n in x["resps"]]) for x in data] + filtered_resps = [ + np.argmax([n[0] for n in x["filtered_resps"]]) for x in data + ] + elif config["output_type"] == "loglikelihood_rolling": + instance = [x["arguments"][0][0] for x in data] + resps = [x["resps"][0][0] for x in data] + filtered_resps = [x["filtered_resps"][0] for x in data] + elif config["output_type"] == "generate_until": + instance = [x["arguments"][0][0] for x in data] + resps = [x["resps"][0][0] for x in data] + filtered_resps = [x["filtered_resps"][0] for x in data] + + model_outputs["raw_predictions"] = resps + model_outputs["filtered_predictions"] = filtered_resps + + df_data = { + "id": ids, + "data": instance, + } + if config["output_type"] == "multiple_choice": + df_data["choices"] = choices + + tmp_data = { + "input_len": [len(x) for x in instance], + "labels": labels, + "output_type": config["output_type"], + } + df_data.update(tmp_data) + df_data.update(model_outputs) + df_data.update(metrics) + + return pd.DataFrame(df_data) + + def _log_samples_as_artifact( + self, data: List[Dict[str, Any]], task_name: str + ) -> None: + import wandb + + # log the samples as an artifact + dumped = json.dumps( + data, + indent=2, + default=_handle_non_serializable, + ensure_ascii=False, + ) + artifact = wandb.Artifact(f"{task_name}", type="samples_by_task") + with artifact.new_file( + f"{task_name}_eval_samples.json", mode="w", encoding="utf-8" + ) as f: + f.write(dumped) + self.run.log_artifact(artifact) + # artifact.wait() + + def log_eval_samples(self, samples: Dict[str, List[Dict[str, Any]]]) -> None: + """Log evaluation samples to W&B. + + Args: + samples (Dict[str, List[Dict[str, Any]]]): Evaluation samples for each task. + """ + task_names: List[str] = [ + x for x in self.task_names if x not in self.group_names + ] + + ungrouped_tasks = [] + tasks_by_groups = {} + + for task_name in task_names: + group_names = self.task_configs[task_name].get("group", None) + if group_names: + if isinstance(group_names, str): + group_names = [group_names] + + for group_name in group_names: + if not tasks_by_groups.get(group_name): + tasks_by_groups[group_name] = [task_name] + else: + tasks_by_groups[group_name].append(task_name) + else: + ungrouped_tasks.append(task_name) + + for task_name in ungrouped_tasks: + eval_preds = samples[task_name] + + # log the samples as a W&B Table + df = self._generate_dataset(eval_preds, self.task_configs.get(task_name)) + self.run.log({f"{task_name}_eval_results": df}) + + # log the samples as a json file as W&B Artifact + self._log_samples_as_artifact(eval_preds, task_name) + + for group, grouped_tasks in tasks_by_groups.items(): + grouped_df = pd.DataFrame() + for task_name in grouped_tasks: + eval_preds = samples[task_name] + df = self._generate_dataset( + eval_preds, self.task_configs.get(task_name) + ) + df["group"] = group + df["task"] = task_name + grouped_df = pd.concat([grouped_df, df], ignore_index=True) + + # log the samples as a json file as W&B Artifact + self._log_samples_as_artifact(eval_preds, task_name) + + self.run.log({f"{group}_eval_results": grouped_df}) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/__init__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..cde586ec9fbaaf37826a1925e1e105549fb554ff --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/__init__.py @@ -0,0 +1,31 @@ +from . import ( + anthropic_llms, + api_models, + dummy, + gguf, + hf_vlms, + huggingface, + ibm_watsonx_ai, + mamba_lm, + nemo_lm, + neuralmagic, + neuron_optimum, + openai_completions, + optimum_lm, + textsynth, + vllm_causallms, + vllm_vlms, +) + + +# TODO: implement __all__ + + +try: + # enable hf hub transfer if available + import hf_transfer # type: ignore # noqa + import huggingface_hub.constants # type: ignore + + huggingface_hub.constants.HF_HUB_ENABLE_HF_TRANSFER = True +except ImportError: + pass diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/anthropic_llms.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/anthropic_llms.py new file mode 100644 index 0000000000000000000000000000000000000000..daba6734d2a362c1799f0aff2362ae97a249f7e5 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/anthropic_llms.py @@ -0,0 +1,362 @@ +import os +from functools import cached_property +from typing import Any, Dict, List, Tuple, Union + +from tqdm import tqdm + +from lm_eval import utils +from lm_eval.api.model import LM +from lm_eval.api.registry import register_model +from lm_eval.models.openai_completions import LocalCompletionsAPI +from lm_eval.models.utils import retry_on_specific_exceptions + + +eval_logger = utils.eval_logger + + +def anthropic_completion( + client, #: anthropic.Anthropic, + model: str, + prompt: str, + max_tokens_to_sample: int, + temperature: float, + stop: List[str], + **kwargs: Any, +) -> str: + """Wrapper function around the Anthropic completion API client with exponential back-off + in case of RateLimitError. + + params: + client: anthropic.Anthropic + Anthropic API client + model: str + Anthropic model e.g. 'claude-instant-v1', 'claude-2' + prompt: str + Prompt to feed to the model + max_tokens_to_sample: int + Maximum number of tokens to sample from the model + temperature: float + Sampling temperature + stop: List[str] + List of stop sequences + kwargs: Any + Additional model_args to pass to the API client + """ + + try: + import anthropic + except ModuleNotFoundError as exception: + raise type(exception)( + "attempted to use 'anthropic' LM type, but package `anthropic` is not installed. \ +please install anthropic via `pip install 'lm-eval[anthropic]'` or `pip install -e '.[anthropic]'`", + ) + + def _exception_callback(e: Exception, sleep_time: float) -> None: + eval_logger.warning( + f"RateLimitError occurred: {e.__cause__}\n Retrying in {sleep_time} seconds" + ) + + @retry_on_specific_exceptions( + on_exceptions=[anthropic.RateLimitError], + max_retries=None, # retry forever, consider changing + on_exception_callback=_exception_callback, + ) + def completion(): + response = client.completions.create( + prompt=f"{anthropic.HUMAN_PROMPT} {prompt}{anthropic.AI_PROMPT}", + model=model, + # NOTE: Claude really likes to do CoT, and overly aggressive stop sequences + # (e.g. gsm8k's ":") may truncate a lot of the input. + stop_sequences=[anthropic.HUMAN_PROMPT] + stop, + max_tokens_to_sample=max_tokens_to_sample, + temperature=temperature, + **kwargs, + ) + return response.completion + + return completion() + + +def anthropic_chat( + client, #: anthropic.Anthropic, + model: str, + prompt: str, + max_tokens: int, + temperature: float, + stop: List[str], + **kwargs: Any, +) -> str: + """Wrapper function around the Anthropic completion API client with exponential back-off + in case of RateLimitError. + + params: + client: anthropic.Anthropic + Anthropic API client + model: str + Anthropic model e.g. 'claude-3-opus-20240229', 'claude-3-sonnet-20240229' + prompt: str + Prompt to feed to the model + max_tokens: int + Maximum number of tokens to sample from the model + temperature: float + Sampling temperature + stop: List[str] + List of stop sequences + kwargs: Any + Additional model_args to pass to the API client + """ + + try: + import anthropic + except ModuleNotFoundError as exception: + raise type(exception)( + "attempted to use 'anthropic' LM type, but package `anthropic` is not installed. \ +please install anthropic via `pip install 'lm-eval[anthropic]'` or `pip install -e '.[anthropic]'`", + ) + + def _exception_callback(e: Exception, sleep_time: float) -> None: + eval_logger.warning( + f"RateLimitError occurred: {e.__cause__}\n Retrying in {sleep_time} seconds" + ) + + @retry_on_specific_exceptions( + on_exceptions=[ + anthropic.RateLimitError, + anthropic.APIConnectionError, + anthropic.APIStatusError, + ], + max_retries=None, # retry forever, consider changing + on_exception_callback=_exception_callback, + ) + def messages(): + response = client.messages.create( + model=model, + max_tokens=max_tokens, + temperature=temperature, + messages=[{"role": "user", "content": f"{prompt}"}], + **kwargs, + ) + return response.content[0].text + + return messages() + + +@register_model("anthropic-completions") +class AnthropicLM(LM): + REQ_CHUNK_SIZE = 20 # TODO: not used + + def __init__( + self, + batch_size: int = 1, + model: str = "claude-2.0", + max_tokens_to_sample: int = 256, + temperature: float = 0, # defaults to 1 + **kwargs, # top_p, top_k, etc. + ) -> None: + """Anthropic API wrapper. + + :param model: str + Anthropic model e.g. 'claude-instant-v1', 'claude-2' + :param max_tokens_to_sample: int + Maximum number of tokens to sample from the model + :param temperature: float + Sampling temperature + :param kwargs: Any + Additional model_args to pass to the API client + """ + super().__init__() + + try: + import anthropic + except ModuleNotFoundError as exception: + raise type(exception)( + "attempted to use 'anthropic' LM type, but package `anthropic` is not installed. \ +please install anthropic via `pip install 'lm-eval[anthropic]'` or `pip install -e '.[anthropic]'`", + ) + + self.model = model + # defaults to os.environ.get("ANTHROPIC_API_KEY") + self.client = anthropic.Anthropic() + self.temperature = temperature + self.max_tokens_to_sample = max_tokens_to_sample + self.tokenizer = self.client.get_tokenizer() + self.kwargs = kwargs + + @property + def eot_token_id(self): + # Not sure but anthropic.HUMAN_PROMPT ? + raise NotImplementedError("No idea about anthropic tokenization.") + + @property + def max_length(self) -> int: + return 2048 + + @property + def max_gen_toks(self) -> int: + return self.max_tokens_to_sample + + @property + def batch_size(self): + # Isn't used because we override _loglikelihood_tokens + raise NotImplementedError("No support for logits.") + + @property + def device(self): + # Isn't used because we override _loglikelihood_tokens + raise NotImplementedError("No support for logits.") + + def tok_encode(self, string: str) -> List[int]: + return self.tokenizer.encode(string).ids + + def tok_decode(self, tokens: List[int]) -> str: + return self.tokenizer.decode(tokens) + + def _loglikelihood_tokens(self, requests, disable_tqdm: bool = False): + raise NotImplementedError("No support for logits.") + + def generate_until(self, requests, disable_tqdm: bool = False) -> List[str]: + try: + import anthropic + except ModuleNotFoundError as exception: + raise type(exception)( + "attempted to use 'anthropic' LM type, but package `anthropic` is not installed. \ +please install anthropic via `pip install 'lm-eval[anthropic]'` or `pip install -e '.[anthropic]'`", + ) + + if not requests: + return [] + + _requests: List[Tuple[str, dict]] = [req.args for req in requests] + + res = [] + for request in tqdm(_requests, disable=disable_tqdm): + try: + inp = request[0] + request_args = request[1] + # generation_kwargs + until = request_args.get("until") + max_gen_toks = request_args.get("max_gen_toks", self.max_length) + temperature = request_args.get("temperature", self.temperature) + response = anthropic_completion( + client=self.client, + model=self.model, + prompt=inp, + max_tokens_to_sample=max_gen_toks, + temperature=temperature, # TODO: implement non-greedy sampling for Anthropic + stop=until, # type: ignore + **self.kwargs, + ) + res.append(response) + + self.cache_hook.add_partial("generate_until", request, response) + except anthropic.APIConnectionError as e: # type: ignore # noqa: F821 + eval_logger.critical(f"Server unreachable: {e.__cause__}") + break + except anthropic.APIStatusError as e: # type: ignore # noqa: F821 + eval_logger.critical(f"API error {e.status_code}: {e.message}") + break + + return res + + def _model_call(self, inps): + # Isn't used because we override _loglikelihood_tokens + raise NotImplementedError() + + def _model_generate(self, context, max_length, eos_token_id): + # Isn't used because we override generate_until + raise NotImplementedError() + + def loglikelihood(self, requests, disable_tqdm: bool = False): + raise NotImplementedError("No support for logits.") + + def loglikelihood_rolling(self, requests, disable_tqdm: bool = False): + raise NotImplementedError("No support for logits.") + + +@register_model("anthropic-chat", "anthropic-chat-completions") +class AnthropicChat(LocalCompletionsAPI): + def __init__( + self, + base_url="https://api.anthropic.com/v1/messages", + tokenizer_backend=None, + **kwargs, + ): + super().__init__( + base_url=base_url, tokenizer_backend=tokenizer_backend, **kwargs + ) + eval_logger.warning( + "Chat completions does not support batching. Defaulting to batch size 1." + ) + self._batch_size = 1 + self.anthropic_version = "2023-06-01" + eval_logger.warning( + f"Using Anthropic Version: {self.anthropic_version}. Confirm the current version here: https://docs.anthropic.com/en/api/versioning" + ) + + @cached_property + def api_key(self): + """Override this property to return the API key for the API request.""" + key = os.environ.get("ANTHROPIC_API_KEY", None) + if key is None: + raise ValueError( + "API key not found. Please set the ANTHROPIC_API_KEY environment variable." + ) + return key + + @cached_property + def header(self): + return { + "x-api-key": f"{self.api_key}", + "anthropic-version": self.anthropic_version, + } + + def _create_payload( + self, messages: List[Dict], generate=True, gen_kwargs: dict = None, **kwargs + ) -> dict: + system = ( + messages[0].get("content") if messages[0].get("role") == "system" else None + ) + if system: + messages = messages[1:] + gen_kwargs.pop("do_sample", False) + max_tokens = gen_kwargs.pop("max_gen_toks", self._max_gen_toks) + temperature = gen_kwargs.pop("temperature", 0) + stop = gen_kwargs.pop("until", ["\n\nHuman:"]) + if not isinstance(stop, list): + stop = [stop] + out = { + "messages": messages, + "model": self.model, + "max_tokens": max_tokens, + "temperature": temperature, + "stop_sequences": stop, + **gen_kwargs, + } + if system: + out["system"] = system + return out + + def parse_generations( + self, outputs: Union[Dict, List[Dict]], **kwargs + ) -> List[str]: + res = [] + if not isinstance(outputs, list): + outputs = [outputs] + for out in outputs: + for choices in out["content"]: + res.append(choices["text"]) + return res + + def tok_encode( + self, + string: str, + left_truncate_len=None, + add_special_tokens=None, + **kwargs, + ) -> List[str]: + return [string] + + def loglikelihood(self, requests, **kwargs): + raise NotImplementedError( + "Anthropic Chat Completions API does not support the return of loglikelihood" + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/api_models.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/api_models.py new file mode 100644 index 0000000000000000000000000000000000000000..fd21c857b516f049073b5112322a09879deae26d --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/api_models.py @@ -0,0 +1,654 @@ +import abc +import asyncio +import copy +import itertools +import json +from functools import cached_property +from typing import ( + Any, + Awaitable, + Callable, + Dict, + Iterable, + List, + Literal, + NamedTuple, + Optional, + Tuple, + Union, +) + + +try: + import requests + from aiohttp import ClientSession, TCPConnector + from tenacity import RetryError, retry, stop_after_attempt, wait_exponential + from tqdm import tqdm + from tqdm.asyncio import tqdm_asyncio +except ModuleNotFoundError: + pass + + +from importlib.util import find_spec + +from lm_eval import utils +from lm_eval.api.instance import Instance +from lm_eval.api.model import TemplateLM +from lm_eval.models.utils import Collator, chunks, configure_pad_token + + +LogLikelihoodInputs = Tuple[Tuple[str, str], List[int], List[int]] + + +# utility class to keep track of json encoded chats +class JsonChatStr(NamedTuple): + prompt: str + + def encode(self, encoding): + return self.prompt.encode(encoding) + + +eval_logger = utils.eval_logger + + +class TemplateAPI(TemplateLM): + def __init__( + self, + model: str = None, + pretrained: str = None, # `model` takes precedence over `pretrained` when passed. + base_url: str = None, + tokenizer: Optional[str] = None, + # Loglikelihood tasks require a tokenizer to calculate context lengths, + # however the requests can be sent as a string if the API doesn't support token inputs. + # use tokenized_requests=False + tokenizer_backend: Optional[ + Literal["tiktoken", "huggingface", "None", "none"] + ] = "huggingface", + truncate: bool = False, + # number of concurrent requests. More useful if not batching + num_concurrent: int = 1, + max_retries: int = 3, + max_gen_toks: int = 256, + batch_size: Union[str, int] = 1, + seed: int = 1234, + max_length: Optional[int] = 2048, + add_bos_token: bool = False, + custom_prefix_token_id: int = None, + # send the requests as tokens or strings + tokenized_requests: bool = True, + trust_remote_code: bool = False, + revision: Optional[str] = "main", + use_fast_tokenizer: bool = True, + verify_certificate: bool = True, + **kwargs, + ) -> None: + super().__init__() + missing_packages = [ + pkg + for pkg in ["aiohttp", "tqdm", "tenacity", "requests"] + if find_spec(pkg) is None + ] + if missing_packages: + raise ModuleNotFoundError( + f"Attempted to use an API model, but the required packages {missing_packages} are not installed. " + 'Please install these via `pip install lm-eval[api]` or `pip install -e ."[api]"`' + ) + self.model = model or pretrained + self.base_url = base_url + self.tokenizer = tokenizer + if not isinstance(batch_size, int) and "auto" in batch_size: + eval_logger.warning( + "Automatic batch size is not supported for API models. Defaulting to batch size 1." + ) + elif int(batch_size) > 1: + eval_logger.warning( + "Batch size > 1 detected. Ensure your API supports batched requests with varying total sequence lengths." + ) + self._batch_size = int(batch_size) if batch_size != "auto" else 1 + self._truncate = truncate + self._max_gen_toks = int(max_gen_toks) + self._seed = int(seed) + # max_length - 1 as we always have 1 token for generation + eval_logger.info(f"Using max length {max_length} - 1") + self.max_length = max_length - 1 + if int(num_concurrent) <= 1: + eval_logger.info( + "Concurrent requests are disabled. To enable concurrent requests, set `num_concurrent` > 1." + ) + self._concurrent = int(num_concurrent) + self.tokenizer_backend = ( + None if tokenizer_backend in ("None", "none") else tokenizer_backend + ) + self.add_bos_token = add_bos_token + self.custom_prefix_token_id = custom_prefix_token_id + self.tokenized_requests = tokenized_requests + self.max_retries = int(max_retries) + self.verify_certificate = verify_certificate + + eval_logger.info(f"Using tokenizer {self.tokenizer_backend}") + if self.tokenizer_backend is None: + self.tokenizer = None + self.tokenized_requests = False + else: + if self.tokenizer is None: + if self.tokenizer_backend == "huggingface": + import transformers + + self.tokenizer = transformers.AutoTokenizer.from_pretrained( + self.tokenizer if self.tokenizer else self.model, + trust_remote_code=trust_remote_code, + revision=revision, + use_fast=use_fast_tokenizer, + ) + # Not used as the API will handle padding but to mirror the behavior of the HFLM + self.tokenizer = configure_pad_token(self.tokenizer) + elif self.tokenizer_backend == "tiktoken": + try: + import tiktoken + + self.tokenizer = tiktoken.encoding_for_model(self.model) + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "Attempted to use 'openai' LM type, but the package `tiktoken` is not installed. " + "Please install it via `pip install lm-eval[api]` or `pip install -e .[api]`." + ) from e + if "openai" not in self.base_url: + eval_logger.warning( + f"Passed `base_url={self.base_url}` but using (OpenAI) Tiktoken tokenizer backend. " + "Pass `tokenizer_backend=huggingface` and provide the HF tokenizer name if your model does not use Tiktoken." + ) + else: + import transformers + + assert isinstance(tokenizer, str), "tokenizer must be a string" + self.tokenizer = transformers.AutoTokenizer.from_pretrained( + tokenizer, + trust_remote_code=trust_remote_code, + revision=revision, + use_fast=use_fast_tokenizer, + ) + + @abc.abstractmethod + def _create_payload( + self, + messages: Union[List[List[int]], List[dict], List[str], str], + *, + generate: bool = True, + gen_kwargs: Optional[dict] = None, + seed: int = 1234, + **kwargs, + ) -> dict: + """This method is responsible for creating the json payload that will be sent to the API.""" + raise NotImplementedError + + def create_message( + self, + messages: Union[List[List[int]], List[str], List[JsonChatStr]], + generate=False, + ) -> Union[List[List[int]], List[dict], List[str], str]: + """Helper method to transform the prompt into the expected API input format. messages consist of batched requests""" + if isinstance(messages[0], JsonChatStr): + # for chat completions we need to decode the json string to list[dict,...] + assert ( + self._batch_size == 1 + ), "non-tokenized chat requests are only supported with batch_size=1" + # list[dict["role":..., "content":...],...] + return json.loads(messages[0].prompt) + + if not self.tokenized_requests: + # if messages are tokenized: + if isinstance(messages[0][0], int): + # assuming decoding is lossless. However, this is only for loglikelihood requests + # as we need to compute the context length. For generations, we don't need to tokenize. + messages = self.decode_batch(messages) + if self._batch_size <= 1: + # if batch is 1 return str + return messages[0] + else: + # list[str,...] + return messages + + # list[list[int], ...] + return messages + + @staticmethod + @abc.abstractmethod + def parse_logprobs( + outputs: Union[Any, List[Any]], + tokens: List[List[int]] = None, + ctxlen: List[int] = None, + **kwargs, + ) -> List[Tuple[float, bool]]: + """Method used to parse the logprobs from the (batched) API response. This method should return a list of tuples""" + raise NotImplementedError + + @staticmethod + @abc.abstractmethod + def parse_generations(outputs: Union[Any, List[Any]], **kwargs) -> List[str]: + """Method used to parse the generations from the (batched) API response. This method should return a list of str""" + raise NotImplementedError + + @cached_property + def api_key(self) -> str: + """Override this property to return the API key for the API request.""" + return "" + + @cached_property + def header(self) -> dict: + """Override this property to return the headers for the API request.""" + return {"Authorization": f"Bearer {self.api_key}"} + + @property + def tokenizer_name(self) -> str: + """Must be defined for LM subclasses which implement Chat Templating. + Should return the name of the tokenizer or chat template used. + Used only to properly fingerprint caches when requests are being cached with `--cache_requests`, otherwise not used. + """ + return "" + + def apply_chat_template( + self, chat_history: List[Dict[str, str]] + ) -> Union[str, JsonChatStr]: + """Applies a chat template to a list of chat history between user and model.""" + if self.tokenizer_backend == "huggingface" and self.tokenized_requests: + return self.tokenizer.apply_chat_template( + chat_history, tokenize=False, add_generation_prompt=True + ) + else: + # bit of a hack. We'll load back before sending to the API + return JsonChatStr(json.dumps(chat_history)) + + @cached_property + def eot_token_id(self) -> Optional[int]: + if self.tokenizer is None: + return None + else: + if self.tokenizer_backend == "huggingface": + return self.tokenizer.eos_token_id + elif self.tokenizer_backend == "tiktoken": + return self.tokenizer.eot_token + + @cached_property + def prefix_token_id(self) -> Optional[int]: + if self.tokenizer is None: + return None + else: + if self.custom_prefix_token_id is not None: + return self.custom_prefix_token_id + if self.tokenizer_backend == "huggingface": + if self.tokenizer.bos_token_id is not None: + return self.tokenizer.bos_token_id + return self.tokenizer.eos_token_id + else: + return self.tokenizer.eot_token + + def tok_encode( + self, + string: str, + left_truncate_len: int = None, + add_special_tokens: bool = False, + truncation: bool = False, + **kwargs, + ) -> Union[List[List[int]], List[int], List[str]]: + if self.tokenizer_backend is None: + return [string] + elif self.tokenizer_backend == "huggingface": + # by default for CausalLM - false or self.add_bos_token is set + if not add_special_tokens: + add_special_tokens = False or self.add_bos_token + encoding: Union[List[List[int]], List[int]] = self.tokenizer( + string, + add_special_tokens=add_special_tokens, + truncation=truncation, + return_attention_mask=False, + ).input_ids + + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + if not isinstance(string, str): + encoding = [enc[-left_truncate_len:] for enc in encoding] + else: + encoding = encoding[-left_truncate_len:] + + return encoding + + else: + try: + encoding = self.tokenizer.encode(string) + except Exception: + encoding = self.tokenizer.encode_batch(string) + return encoding + + def decode_batch(self, tokens: List[List[int]]) -> List[str]: + if self.tokenizer_backend == "huggingface": + return self.tokenizer.batch_decode(tokens) + elif self.tokenizer_backend == "tiktoken": + return self.tokenizer.decode_batch(tokens) + + def model_call( + self, + messages: Union[List[List[int]], List[str], List[JsonChatStr]], + *, + generate: bool = True, + gen_kwargs: Optional[Dict] = None, + **kwargs, + ) -> Optional[dict]: + # !!! Copy: shared dict for each request, need new object !!! + gen_kwargs = copy.deepcopy(gen_kwargs) + try: + response = requests.post( + self.base_url, + json=self._create_payload( + self.create_message(messages), + generate=generate, + gen_kwargs=gen_kwargs, + seed=self._seed, + **kwargs, + ), + headers=self.header, + verify=self.verify_certificate, + ) + if not response.ok: + eval_logger.warning( + f"API request failed with error message: {response.text}. Retrying..." + ) + response.raise_for_status() + return response.json() + except RetryError: + eval_logger.error( + "API request failed after multiple retries. Please check the API status." + ) + return None + + async def amodel_call( + self, + session: ClientSession, + messages: Union[List[List[int]], List[str], List[JsonChatStr]], + *, + generate: bool = True, + cache_keys: list = None, + ctxlens: Optional[List[int]] = None, + gen_kwargs: Optional[Dict] = None, + **kwargs, + ) -> Union[List[str], List[Tuple[float, bool]], None]: + # !!! Copy: shared dict for each request, need new object !!! + gen_kwargs = copy.deepcopy(gen_kwargs) + payload = self._create_payload( + self.create_message(messages), + generate=generate, + gen_kwargs=gen_kwargs, + seed=self._seed, + **kwargs, + ) + cache_method = "generate_until" if generate else "loglikelihood" + try: + async with session.post( + self.base_url, + json=payload, + headers=self.header, + ) as response: + if not response.ok: + error_text = await response.text() + eval_logger.warning( + f"API request failed with error message: {error_text}. Retrying..." + ) + # raising exception will retry the request + response.raise_for_status() + outputs = await response.json() + answers = ( + self.parse_generations( + outputs=outputs, + ) + if generate + else self.parse_logprobs( + outputs=outputs, + tokens=messages, + ctxlens=ctxlens, + ) + ) + if cache_keys: + for res, cache in zip(answers, cache_keys): + self.cache_hook.add_partial(cache_method, cache, res) + return answers + # If the retries also fail + except RetryError: + eval_logger.error( + "API request failed after multiple retries. Please check the API status." + ) + return None + + def batch_loglikelihood_requests( + self, chunks: Iterable[List[LogLikelihoodInputs]] + ) -> Tuple[List[List[int]], List[int], List[Tuple[str, str]]]: + inputs = [] + ctxlens = [] + cache_keys = [] + for chunk in chunks: + for cache_key, context_enc, continuation_enc in chunk: + # max_length - 1 as we always have 1 token for generation + inp = (context_enc + continuation_enc)[-(self.max_length) :] + ctxlen = len(context_enc) - max( + 0, len(context_enc) + len(continuation_enc) - (self.max_length) + ) + + inputs.append(inp) + ctxlens.append(ctxlen) + cache_keys.append(cache_key) + return inputs, ctxlens, cache_keys + + async def get_batched_requests( + self, + requests: list, + cache_keys: list, + *, + generate: bool = True, + ctxlens: List[int] = None, + **kwargs, + ) -> Union[List[List[str]], List[List[Tuple[float, bool]]]]: + ctxlens = ctxlens if ctxlens else [None] * len(requests) + conn = TCPConnector(limit=self._concurrent) + async with ClientSession(connector=conn) as session: + retry_: Callable[..., Awaitable[Any]] = retry( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential(multiplier=0.5, min=1, max=10), + reraise=True, + )(self.amodel_call) + # Create tasks for each batch of request + tasks = [ + asyncio.create_task( + retry_( + session=session, + messages=message, + cache_keys=cache_key, + generate=generate, + ctxlens=ctxlen, + **kwargs, + ) + ) + for message, cache_key, ctxlen in zip( + chunks(requests, n=self._batch_size), + chunks(cache_keys, n=self._batch_size), + chunks(ctxlens, n=self._batch_size), + ) + ] + + return await tqdm_asyncio.gather(*tasks, desc="Requesting API") + + def _loglikelihood_tokens(self, requests, **kwargs) -> List[Tuple[float, bool]]: + assert ( + self.tokenizer is not None + ), "Tokenizer is required for loglikelihood tasks to compute context lengths." + res = [] + + def _collate(req: LogLikelihoodInputs): + """Defines the key for the sorted method""" + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + + toks = req[1] + req[2] + return -len(toks), tuple(toks) + + re_ord = Collator( + requests, + sort_fn=_collate, + group_by=None, + ) + # if concurrent then we'll batch in the async context + chunked = re_ord.get_batched(n=self._batch_size if self._concurrent <= 1 else 0) + if self._concurrent <= 1: + pbar = tqdm(desc="Requesting API", total=len(requests)) + for chunk in chunked: + inputs, ctxlens, cache_keys = self.batch_loglikelihood_requests([chunk]) + + outputs = retry( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential(multiplier=0.5, min=1, max=10), + reraise=True, + )(self.model_call)(messages=inputs, generate=False) + if isinstance(outputs, dict): + outputs = [outputs] + for answer_, cache_key in zip( + self.parse_logprobs( + outputs=outputs, tokens=inputs, ctxlens=ctxlens + ), + cache_keys, + ): + if answer_ is not None: + res.append(answer_) + # cache requests that aren't from a loglikelihood_rolling request + if cache_key is not None: + self.cache_hook.add_partial( + "loglikelihood", cache_key, answer_ + ) + pbar.update(1) + else: + inputs, ctxlens, cache_keys = self.batch_loglikelihood_requests(chunked) + res = itertools.chain.from_iterable( + asyncio.run( + self.get_batched_requests( + inputs, cache_keys, generate=False, ctxlens=ctxlens + ) + ) + ) + + return re_ord.get_original(res) + + def generate_until( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[str]: + res = [] + + def _collate_gen(_requests): + # sort by the length of the non-tokenized contexts + return -len(_requests[0]) + + # Let the API deal with tokenization + requests, all_gen_kwargs = zip(*(req.args for req in requests)) + if self.tokenized_requests: + encodings_list = self.tok_encode( + requests, add_special_tokens=self.add_bos_token + ) + else: + encodings_list = [None] * len(requests) + requests = [ + (a, b, c) for a, b, c in zip(requests, all_gen_kwargs, encodings_list) + ] + + re_ord = Collator( + requests, + sort_fn=_collate_gen, + group_by="gen_kwargs", + ) + chunked = re_ord.get_batched( + n=self._batch_size if self._concurrent <= 1 else 0, batch_fn=None + ) + if self._concurrent <= 1: + pbar = tqdm(desc="Requesting API", total=len(requests)) + for chunk in chunked: + contexts, all_gen_kwargs, encodings_list = zip(*chunk) + req = encodings_list if self.tokenized_requests else contexts + outputs = retry( + stop=stop_after_attempt(self.max_retries), + wait=wait_exponential(multiplier=0.5, min=1, max=10), + reraise=True, + )(self.model_call)( + messages=req, + generate=True, + gen_kwargs=copy.deepcopy(all_gen_kwargs[0]), + ) + for generated_text, context in zip( + self.parse_generations( + outputs=outputs, + contexts=contexts, + ), + contexts, + ): + if generated_text is not None: + res.append(generated_text) + + # partial caching + if context is not None: + self.cache_hook.add_partial( + "generate_until", + (context, all_gen_kwargs[0]), + generated_text, + ) + pbar.update(1) + else: + for chunk in chunked: + contexts, all_gen_kwargs, encodings_list = zip(*chunk) + req = encodings_list if self.tokenized_requests else contexts + results = itertools.chain.from_iterable( + asyncio.run( + self.get_batched_requests( + req, + cache_keys=[(ctx, all_gen_kwargs[0]) for ctx in contexts], + generate=True, + gen_kwargs=copy.deepcopy(all_gen_kwargs[0]), + ) + ) + ) + res.extend(results) + + return re_ord.get_original(res) + + def loglikelihood_rolling( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[float]: + loglikelihoods = [] + + for (string,) in tqdm([req.args for req in requests], disable=disable_tqdm): + rolling_token_windows = list( + map( + utils.make_disjoint_window, + utils.get_rolling_token_windows( + token_list=self.tok_encode(string), + prefix_token=self.prefix_token_id, + # max_seq_len - (1 for context) + max_seq_len=self.max_length - 1, + context_len=1, + ), + ) + ) + + # TODO: Right now, we pass single EOT token to the Encoder and the full context to the decoder, in seq2seq case + rolling_token_windows = [(None,) + x for x in rolling_token_windows] + + string_nll = self._loglikelihood_tokens( + rolling_token_windows, + disable_tqdm=True, + ) + + # discard is_greedy + string_nll = [x[0] for x in string_nll] + + string_nll = sum(string_nll) + loglikelihoods.append(string_nll) + + # cache this loglikelihood_rolling request + self.cache_hook.add_partial("loglikelihood_rolling", (string,), string_nll) + return loglikelihoods diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/dummy.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/dummy.py new file mode 100644 index 0000000000000000000000000000000000000000..014ad49ee36f756acd0428340f945312d79590e8 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/dummy.py @@ -0,0 +1,41 @@ +import random + +from tqdm import tqdm + +from lm_eval.api.model import LM +from lm_eval.api.registry import register_model + + +@register_model("dummy") +class DummyLM(LM): + def __init__(self) -> None: + super().__init__() + + @classmethod + def create_from_arg_string(cls, arg_string, additional_config=None): + return cls() + + def loglikelihood(self, requests, disable_tqdm: bool = False): + res = [] + + for _ in tqdm(requests, disable=disable_tqdm): + res.append((-random.random(), False)) + + return res + + def generate_until(self, requests, disable_tqdm: bool = False): + res = [] + + for request in tqdm(requests, disable=disable_tqdm): + res.append("lol") + assert request.arguments[0].strip() != "" + + return res + + def loglikelihood_rolling(self, requests, disable_tqdm: bool = False): + res = [] + + for _ in tqdm(requests, disable=disable_tqdm): + res.append(-random.random()) + + return res diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/gguf.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/gguf.py new file mode 100644 index 0000000000000000000000000000000000000000..52aef0dee62edb2eb390fe695e939f8e06d0555f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/gguf.py @@ -0,0 +1,132 @@ +import logging +import time + +import requests +from requests.exceptions import RequestException +from tqdm import tqdm + +from lm_eval.api.model import LM +from lm_eval.api.registry import register_model + + +logger = logging.getLogger(__name__) + + +def get_result(logprobs, context_length): + is_greedy = True + offsets = logprobs["text_offset"] + tokens = logprobs["tokens"] + tokens_logprobs = logprobs["token_logprobs"] + + idx = 0 + while offsets[idx] < context_length: + idx += 1 + continuation_logprobs = sum(tokens_logprobs[idx:-1]) + for i in range(idx, len(tokens)): + token = tokens[i] + top_tokens = logprobs["top_logprobs"][i] + top_token = max(top_tokens.keys(), key=lambda x: top_tokens[x]) + if top_token != token: + is_greedy = False + break + + return continuation_logprobs, is_greedy + + +@register_model("gguf", "ggml") +class GGUFLM(LM): + def __init__(self, base_url=None, max_length=2048, **kwargs): + super().__init__() + self.base_url = base_url + assert self.base_url, "must pass `base_url` to use GGUF LM!" + self.logprobs = 10 + self.temperature = 0.0 + self.max_length = max_length + + def gguf_completion( + self, context, continuation=None, stop=None, retries=3, delay=5, **kwargs + ): + for _ in range(retries): + try: + prompt = context + request = { + "prompt": prompt, + "logprobs": self.logprobs, + "temperature": self.temperature, + } + if continuation: + prompt += continuation + request.update({"prompt": prompt, "max_tokens": 1, "echo": True}) + if stop is not None: + request["stop"] = stop + response = requests.post( + f"{self.base_url}/v1/completions", json=request + ) + response.raise_for_status() + return response.json() + except RequestException as e: + logger.error(f"RequestException: {e}") + time.sleep(delay) # wait before retrying + else: + raise RuntimeError( + f"Failed to get a valid response after {retries} retries." + ) + + def loglikelihood(self, requests, disable_tqdm: bool = False): + if not requests: + return [] + res = [] + for context, continuation in tqdm( + [req.args for req in requests], disable=disable_tqdm + ): + response = self.gguf_completion(context=context, continuation=continuation) + if response and "choices" in response and response["choices"]: + choice = response["choices"][0] + logprobs = choice.get("logprobs") + if ( + logprobs + and "token_logprobs" in logprobs + and logprobs["token_logprobs"] + ): + logprob, is_greedy = get_result(logprobs, len(context)) + res.append((logprob, is_greedy)) + else: + logger.warning( + "Invalid logprobs data. Expected 'logprobs' to contain 'token_logprobs' list." + ) + else: + logger.error( + f"Invalid response for loglikelihood. Response: {response}" + ) + assert False + return res + + def generate_until(self, requests, disable_tqdm: bool = False): + if not requests: + return [] + + res = [] + for request in tqdm([req.args for req in requests], disable=disable_tqdm): + inp = request[0] + request_args = request[1] + until = request_args.get("until", [""]) + response = self.gguf_completion(context=inp, stop=until) + if response and "choices" in response and response["choices"]: + choice = response["choices"][0] + if "text" in choice: + generated_text = choice["text"].strip() + res.append(generated_text) + else: + logger.error( + f"Invalid response for greedy_until. Response: {response}" + ) + res.append(None) # Add default value in case of error + else: + logger.error(f"Invalid response for greedy_until. Response: {response}") + res.append(None) # Add default value in case of error + return res + + def loglikelihood_rolling(self, requests, disable_tqdm: bool = False): + raise NotImplementedError( + "loglikelihood_rolling not yet supported for GGUF models" + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/hf_vlms.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/hf_vlms.py new file mode 100644 index 0000000000000000000000000000000000000000..f2fcdd7027640dcfd1778d64737eb911781d7312 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/hf_vlms.py @@ -0,0 +1,724 @@ +import copy +from typing import Dict, List, Optional, Tuple, Union + +import torch +import torch.nn.functional as F +import transformers +from tqdm import tqdm +from transformers import BatchEncoding + +from lm_eval import utils +from lm_eval.api.instance import Instance +from lm_eval.api.registry import register_model +from lm_eval.models.huggingface import HFLM +from lm_eval.models.utils import ( + Collator, + flatten_image_list, + pad_and_concat, + replace_placeholders, + stop_sequences_criteria, +) + + +DEFAULT_IMAGE_PLACEHOLDER = "" + + +eval_logger = utils.eval_logger + + +@register_model("hf-multimodal") +class HFMultimodalLM(HFLM): + """ + An abstracted Hugging Face model class for multimodal LMs like Llava and Idefics. + """ + + AUTO_MODEL_CLASS = transformers.AutoModelForVision2Seq + MULTIMODAL = True # flag to indicate, for now, that this model type can run multimodal requests + + def __init__( + self, + pretrained: Union[str, transformers.PreTrainedModel], + image_token_id: Optional[int] = None, + image_string: Optional[str] = None, + interleave: bool = True, + # TODO: handle whitespace in image placeholder (replacement) + max_images: Optional[int] = 999, + convert_img_format=False, + **kwargs, + ): + # We initialize using HFLM's init. Sub-methods like _create_model and _create_tokenizer + # modify init behavior. + super().__init__(pretrained, **kwargs) + + assert ( + self.batch_size != "auto" + ), "Batch size 'auto' is not yet supported for hf-multimodal models." + self.chat_applied: bool = False + # TODO: phi-3.5 "image placeholders" are , , ... in order. how to handle this case + + # HF AutoModelForVision2Seq models have an `image_token_id` value in their configs + # denoting the token which indicates a location where an image will be substituted in. + # This can take different string values across models, e.g. for Idefics2 and <|image_pad|> for Qwen2-VL + self.interleave = interleave + self.max_images = max_images + self.rgb = convert_img_format + # WARNING: improperly set image_token_id can lead to ignored image input or other (potentially silent) errors! + if not image_string: + self.image_token_id = ( + int(image_token_id) + if image_token_id + else ( + getattr(self.config, "image_token_id", None) + or getattr(self.config, "image_token_index", None) + ) + ) + assert ( + self.image_token_id is not None + ), "Must have a non-None image_token_id to evaluate a Hugging Face AutoModelForVision2Seq model. Please pass `image_token_id` in `--model_args` if model's config does not already specify one." + # get the string this token ID corresponds to + self.image_token = self.tok_decode( + [self.image_token_id], skip_special_tokens=False + ) + if image_token_id is not None: + eval_logger.info( + f"A non-default image_token_id with image_token_id={self.image_token_id} and string value '{self.image_token}' was specified manually. Note that using an improper image_token placeholder may lead to ignored image input or errors!" + ) + else: + eval_logger.info( + f"A non-default image_token string with string value image_string='{image_string}' was specified manually. Note that using an improper image_token placeholder may lead to ignored image input or errors!" + ) + self.image_token = image_string + + def _create_tokenizer( + self, + pretrained: Union[str, transformers.PreTrainedModel], + tokenizer: Optional[ + Union[ + str, + transformers.ProcessorMixin, + ] + ], + revision: Optional[str] = "main", + trust_remote_code: Optional[bool] = False, + **kwargs, + ) -> None: + """ + Helper method during initialization. + + For the multimodal variant, we initialize not just + `self.tokenizer` but also `self.processor`. + """ + + if tokenizer: + if isinstance(tokenizer, str): + return transformers.AutoProcessor.from_pretrained( + tokenizer, + revision=revision, + trust_remote_code=trust_remote_code, + # use_fast=use_fast_tokenizer, + ) + else: + assert isinstance( + tokenizer, transformers.ProcessorMixin + ) # TODO: check this condition + return tokenizer + + # Get tokenizer based on 'pretrained' + if isinstance(pretrained, str): + model_name = pretrained + else: + # get the HF hub name via accessor on model + model_name = self.model.name_or_path + + self.processor = transformers.AutoProcessor.from_pretrained( + model_name, + revision=revision, + trust_remote_code=trust_remote_code, + # use_fast=use_fast_tokenizer, + ) + + self.tokenizer = self.processor.tokenizer + + def tok_multimodal_encode( + self, string, images, left_truncate_len=None, add_special_tokens=None + ): + """Helper function which encodes an image + string combo using AutoProcessor""" + # We inherit special token kwarg setup from HFLM.tok_encode + # special_tokens_kwargs = {} + + # by default for CausalLM - false or self.add_bos_token is set + # if add_special_tokens is None: + # special_tokens_kwargs = {"add_special_tokens": False or self.add_bos_token} + # otherwise the method explicitly defines the value + # else: + # special_tokens_kwargs = {"add_special_tokens": add_special_tokens} + + # encode text+images + # TODO: why does (Qwen2-VL) processor error when attempting to add special tokens to text? + encoding = self.processor( + text=string, images=images, return_tensors=None + ) # , **special_tokens_kwargs) + + # remove (and store) our tokenized text + text_encoding = encoding.pop("input_ids") + encoding.pop("attention_mask") + + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + text_encoding = text_encoding[-left_truncate_len:] + + return text_encoding, encoding # image_encoding is a dict + + def _encode_multimodal_pair(self, context, continuation, images): + """Helper function to perform the role of TemplateLM._encode_pair + Except allowing for image input to also be processed alongside `context`. + + This method is a bit messy due to the need to defer conversion of image and text token input + into PyTorch tensors until the main inference loop. + """ + + n_spaces = len(context) - len(context.rstrip()) + if n_spaces > 0: + continuation = context[-n_spaces:] + continuation + context = context[:-n_spaces] + + # TODO: replace default placeholder with self.image_token, for contexts + + whole_enc, image_enc = self.tok_multimodal_encode( + context + continuation, images + ) + context_enc, _ = self.tok_multimodal_encode(context, images) + + # tok_multimodal_encode returns List[List[int]] for tokenized text. Get rid of the batch dim + # since we only are encoding a single string. + # TODO: this is a bit hacky, it'd be nice to make this generally cleaner + whole_enc, context_enc = whole_enc[0], context_enc[0] + + context_enc_len = len(context_enc) + continuation_enc = whole_enc[context_enc_len:] + + return context_enc, continuation_enc, image_enc + + def apply_chat_template(self, chat_history: List[Dict[str, str]]) -> str: + self.chat_applied = True + if not self.interleave: + for content in chat_history: + c = [] + text = content["content"] + + # Count and remove image placeholders + image_count = min( + self.max_images, text.count(DEFAULT_IMAGE_PLACEHOLDER) + ) + text = text.replace(DEFAULT_IMAGE_PLACEHOLDER, "") + + # Add image entries + for _ in range(image_count): + c.append({"type": "image", "image": None}) + + # Add single text entry at the end + c.append({"type": "text", "text": text}) + + content["content"] = c + else: + for content in chat_history: + c = [] + text = content["content"] + expected_image_count = min( + self.max_images, text.count(DEFAULT_IMAGE_PLACEHOLDER) + ) + actual_image_count = 0 + + text_parts = text.split(DEFAULT_IMAGE_PLACEHOLDER) + + for i, part in enumerate(text_parts): + # TODO: concatenate text parts (esp. if skipping images)? + if part: # Add non-empty text parts + c.append({"type": "text", "text": part}) + if ( + (i < len(text_parts) - 1) and i < self.max_images + ): # Add image placeholder after each split except the last + c.append({"type": "image"}) + actual_image_count += 1 + + content["content"] = c + + if actual_image_count != expected_image_count: + raise ValueError( + f"Mismatch in image placeholder count. Expected: {expected_image_count}, Actual: {actual_image_count}" + ) + + return self.processor.apply_chat_template( + chat_history, add_generation_prompt=True + ) + + def chat_template(self, chat_template: Union[bool, str] = False) -> Optional[str]: + if hasattr(self.processor, "apply_chat_template"): + _tokenizer = self.tokenizer + self.tokenizer = self.processor + + selected_template = super().chat_template(chat_template) + + self.tokenizer = _tokenizer + return selected_template + else: + return super().chat_template(chat_template) + + def tok_batch_multimodal_encode( + self, + strings: List[str], # note that input signature of this fn is different + images: List[List], # TODO: images are pil.Image at the moment, update typehint + padding_side: str = "left", + left_truncate_len: int = None, + truncation: bool = False, + ) -> Union[ + BatchEncoding, Dict[str, torch.Tensor] + ]: # note that this return signature differs from HFLM tok_batch_encode. + # NOTE: here, we replace tags with our model's corresponding image_token string value. + if not self.chat_applied: + # TODO: This still keeps the whitespace in the image placeholder, which is not ideal. + strings = [ + replace_placeholders( + string, DEFAULT_IMAGE_PLACEHOLDER, self.image_token, self.max_images + ) + for string in strings + ] + + # encode a batch of strings. converts to tensors and pads automatically, unlike tok_encode. + old_padding_side = self.tokenizer.padding_side + self.tokenizer.padding_side = padding_side + + # add_special_tokens = {"add_special_tokens": False or self.add_bos_token} + + images = [img[: self.max_images] for img in images] + if self.rgb: + images = [[img.convert("RGB") for img in sublist] for sublist in images] + + # certain models like llava expect a single-level image list even for bs>1, multi-image. TODO: port this over to loglikelihoods + if getattr(self.config, "model_type", "") == "llava": + images = flatten_image_list(images) + + encoding = self.processor( + images=images, + text=strings, + truncation=truncation, + padding="longest", + return_tensors="pt", + # **add_special_tokens, # TODO: at least some Processors error out when passing this. How do we control whether text gets BOS added? + ) + + encoding.to( # TODO: our other tokenization methods in HFLM don't typically move to device. this breaks convention + self.device, self.model.dtype + ) # TODO: This only casts the pixel values. Should they always be float16? + if left_truncate_len: + encoding["input_ids"] = encoding["input_ids"][:, -left_truncate_len:] + encoding["attention_mask"] = encoding["attention_mask"][ + :, -left_truncate_len: + ] + self.tokenizer.padding_side = old_padding_side + + return encoding + + def _model_multimodal_call(self, inps, imgs, attn_mask=None, labels=None): + """ + TODO: update docstring + """ + # note: imgs is a dict. + with torch.no_grad(): + return self.model(inps, **imgs).logits + + def _model_multimodal_generate(self, inputs, max_length, stop, **generation_kwargs): + generation_kwargs["temperature"] = generation_kwargs.get("temperature", 0.0) + do_sample = generation_kwargs.get("do_sample", None) + + # The temperature has to be a strictly positive float -- if it is 0.0, use greedy decoding strategies + if generation_kwargs.get("temperature") == 0.0 and do_sample is None: + generation_kwargs["do_sample"] = do_sample = False + + if do_sample is False and generation_kwargs.get("temperature") == 0.0: + generation_kwargs.pop("temperature") + + stopping_criteria = stop_sequences_criteria( + self.tokenizer, + stop, + inputs["input_ids"].shape[1], + inputs["input_ids"].shape[0], + ) + return self.model.generate( + **inputs, + max_length=max_length, + stopping_criteria=stopping_criteria, + pad_token_id=self.tokenizer.pad_token_id, + use_cache=True, + **generation_kwargs, + ) + + def _batch_images(self, image_encs): + """ + Helper function: batch together image encodings across examples in a batch. + # TODO: for variable-sized images, this may break down. + """ + batched_imgs = {} + for key in image_encs[0].keys(): + batched_imgs[key] = torch.cat( + [ + torch.tensor( + image_enc[key], device=self.device, dtype=self.model.dtype + ) + for image_enc in image_encs + ], + dim=0, + ) + return batched_imgs + + def loglikelihood_rolling(self, requests: List[Instance]) -> List[float]: + raise NotImplementedError( + "model type `hf-multimodal` does not support loglikelihood_rolling. Use 'hf' model type for text-only loglikelihood_rolling tasks ", + "this is because we do not support measuring the loglikelihood a model assigns to an image.", + ) + + def loglikelihood( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[Tuple[float, bool]]: + raise NotImplementedError( + "'loglikelihood' requests for model type `hf-multimodal` are not yet tested. This feature will be enabled when a loglikelihood-based multiple-choice VQA dataset is added!" + ) + + new_reqs = [] + for context, continuation, aux_arguments in [req.args for req in requests]: + if context == "": + raise ValueError( + "Must get non-empty context for multimodal requests! You might be trying to run 'loglikelihood_rolling', which is not supported in the multimodal case." + ) + else: + visuals = aux_arguments["visual"] + + context_enc, continuation_enc, image_enc = self._encode_multimodal_pair( + context, continuation, visuals + ) + # TODO: key to pick for caching images + new_reqs.append( + ( + (context, continuation, visuals), + context_enc, + continuation_enc, + image_enc, + ) + ) + + return self._loglikelihood_tokens(new_reqs, disable_tqdm=disable_tqdm) + + def _loglikelihood_tokens( + self, + requests: List[ + Tuple[Tuple[None, str, str], List[int], List[int], List[int]] + ], # TODO: update typehint to be correct + disable_tqdm: bool = False, + override_bs: int = None, + ) -> List[Tuple[float, bool]]: + res = [] + + # TODO: **improve multimodal collation.** We currently ignore image size when ordering docs. ideally we'd take them into account + def _collate(req: Tuple[Tuple[str, str], List[int], List[int]]): + """Defines the key for the sorted method""" + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = req[1] + req[2] + return -len(toks), tuple(toks) + + def _lookup_one_token_cont(req: Tuple[Tuple[str, str], List[int], List[int]]): + """Defines the key to group and lookup one-token continuations""" + # Use with group_by="contexts" (optional)" + # allows for the creation of a lookup, so we can reuse logits in case of one-token continuations. + # speeds up some multiple-choice tasks proportionally to the number of choices. + # groups requests by context+continuation[:-1] and infer on one request/group. + return req[-1] + req[-3] + req[-2][:-1] + + re_ord = Collator( + requests, + sort_fn=_collate, + group_by="contexts" # TODO: can't group-by just "contexts" any more, need to incorporate imgs + if self.AUTO_MODEL_CLASS == transformers.AutoModelForCausalLM + and self.logits_cache + else None, + group_fn=_lookup_one_token_cont, + ) + + # automatic (variable) batch size detection for vectorization + # pull longest context sample from request + n_reordered_requests = len(re_ord) + batch_size = ( + self.batch_size + if self.batch_size != "auto" + else override_bs + if override_bs is not None + else 0 + ) + batch_fn = ( + self._batch_scheduler + if self.batch_size == "auto" + and n_reordered_requests > 0 + and not override_bs + else None + ) + + chunks = re_ord.get_batched(n=batch_size, batch_fn=batch_fn) + pbar = tqdm( + total=len(requests), + disable=(disable_tqdm or (self.rank != 0)), + desc="Running loglikelihood requests with text+image input", + ) + for chunk in chunks: + imgs = [] + inps = [] + cont_toks_list = [] + inplens = [] + + padding_len_inp = None + # because vectorizing is annoying, we first convert each (context, continuation) pair to padded + # tensors, then we pack them together into a batch, call the model, and then pick it all apart + # again because vectorizing is annoying + + for _, context_enc, continuation_enc, image_enc in chunk: + # sanity check + assert len(image_enc) > 0 + assert len(context_enc) > 0 + assert len(continuation_enc) > 0 + assert len(continuation_enc) <= self.max_length + + # how this all works (illustrated on a causal decoder-only setup): + # CTX CONT + # inp 0 1 2 3|4 5 6 7 8 9 <- last token is deleted by inp[:, :-1] + # model \ \ + # logits 1 2 3|4 5 6 7 8 9 <- the ctx half gets tossed out by the + # cont_toks 4 5 6 7 8 9 [:, -len(continuation_enc):, :self.vocab_size] slice + + # when too long to fit in context, truncate from the left + # TODO: assuming that we won't handle enc-dec Vision2Seq models. Is that a safe assumption? + inp = torch.tensor( + (context_enc + continuation_enc)[-(self.max_length + 1) :][:-1], + dtype=torch.long, + device=self.device, + ) + (inplen,) = inp.shape + + padding_len_inp = ( + max(padding_len_inp, inplen) + if padding_len_inp is not None + else inplen + ) + + inps.append(inp) # [1, inp_length] + cont_toks_list.append(continuation_enc) + inplens.append(inplen) + + imgs.append(image_enc) + + # create encoder attn mask and batched conts, if seq2seq + call_kwargs = {} + batched_inps = pad_and_concat( + padding_len_inp, inps, padding_side="right" + ) # [batch, padding_len_inp] + # batch our examples' image inputs together + batched_imgs = self._batch_images( + imgs + ) # TODO: fix/test for bs>1 case with differently-sized imgs! + + multi_logits = F.log_softmax( + self._model_multimodal_call(batched_inps, batched_imgs, **call_kwargs), + dim=-1, + ) # [batch, padding_length (inp or cont), vocab] + + for ( + request_str, + ctx_tokens, + _, + image_encs, + ), logits, inplen, cont_toks in zip( + chunk, multi_logits, inplens, cont_toks_list + ): + # Slice to original seq length + contlen = len(cont_toks) + # take only logits in the continuation + # (discard context toks if decoder-only ; discard right-padding) + # also discards + checks for "virtual tokens" in the causal LM's input window + # from prompt/prefix tuning tokens, if applicable + ctx_len = ( + inplen + (logits.shape[0] - padding_len_inp) + if self.AUTO_MODEL_CLASS == transformers.AutoModelForCausalLM + else None + ) + logits = self._select_cont_toks(logits, contlen=contlen, inplen=ctx_len) + logits = logits.unsqueeze(0) # [1, seq, vocab] + + # Check if per-token argmax is exactly equal to continuation + greedy_tokens = logits.argmax(dim=-1) + + # check for one-token continuation cache hits. + # noop in case group_by != "contexts" or no cache hit and returns the + # original args. Otherwise, expands the logits batch dimension and yields each + # batch along with matching continuation tokens and prompt strings. + # logits -> [1, seq, vocab] + for request_str, cont_toks, logits in re_ord.get_cache( + req_str=request_str, + cxt_toks=ctx_tokens, + cont_toks=cont_toks, + logits=logits, + ): + cont_toks = torch.tensor( + cont_toks, dtype=torch.long, device=self.device + ).unsqueeze(0) # [1, seq] + max_equal = (greedy_tokens == cont_toks).all() + + # Obtain log-probs at the corresponding continuation token indices + # last_token_slice = logits[:, -1, :].squeeze(0).tolist() + logits = torch.gather(logits, 2, cont_toks.unsqueeze(-1)).squeeze( + -1 + ) # [1, seq] + + # Answer: (log prob, is-exact-match) + answer = (float(logits.sum()), bool(max_equal)) + + res.append(answer) + + self.cache_hook.add_partial( + "loglikelihood", request_str, answer + ) # TODO: choose convention for adding images into the cache key + pbar.update(1) + + pbar.close() + + return re_ord.get_original(res) + + def generate_until( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[str]: + # TODO: back out to HFLM.generate_until() for all requests without aux_arguments (text-only reqs) + res = [] + + def _collate(x): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = self.tok_encode(x[0]) + return -len(toks), x[0] + + pbar = tqdm( + total=len(requests), + disable=(disable_tqdm or (self.rank != 0)), + desc="Running generate_until requests with text+image input", + ) + # TODO: port auto-batch sizing into this. + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + re_ords = Collator( + [reg.args for reg in requests], + _collate, + group_by="gen_kwargs", + group_fn=lambda x: x[1], + ) + chunks = re_ords.get_batched(n=self.batch_size, batch_fn=None) + + ### Up to here: was identical to non-multimodal HFLM generate_until ### + + for chunk in chunks: + contexts, all_gen_kwargs, aux_arguments = zip(*chunk) + + visuals = [arg["visual"] for arg in aux_arguments] + + if not isinstance(contexts, list): + contexts = list( + contexts + ) # for Qwen2-VL, processor is unhappy accepting a tuple of strings instead of a list. + # TODO: could we upstream this workaround to HF? + ### this part onward: same as HFLM ### + + # we assume all gen kwargs in the batch are the same + # this is safe to assume because the `grouper` object ensures it. + gen_kwargs = all_gen_kwargs[0] + # unpack our keyword arguments. + until = None + if isinstance(gen_kwargs, dict): + kwargs = copy.deepcopy(gen_kwargs) # edge case for repeats > 1 + if "until" in kwargs.keys(): + until = kwargs.pop("until") + if isinstance(until, str): + until = [until] + elif not isinstance(until, list): + raise ValueError( + f"Expected `kwargs['until']` to be of type Union[str,list] but got {until}" + ) + else: + raise ValueError( + f"Expected `kwargs` to be of type `dict` but got {type(gen_kwargs)}" + ) + # add EOS token to stop sequences + eos = self.tok_decode(self.eot_token_id, skip_special_tokens=False) + if not until: + until = [eos] + else: + until.append(eos) + if "max_gen_toks" in kwargs.keys(): + max_gen_toks = kwargs.pop("max_gen_toks") + else: + max_gen_toks = self.max_gen_toks + + ### end stuff that's entirely copied verbatim from HFLM ### + + max_ctx_len = self.max_length - max_gen_toks + + inputs = self.tok_batch_multimodal_encode( + contexts, + visuals, + left_truncate_len=max_ctx_len, + truncation=self.truncation, + ) + + context_enc = inputs["input_ids"] + + if "max_length" not in kwargs: + kwargs["max_length"] = context_enc.shape[1] + max_gen_toks + + cont = self._model_multimodal_generate(inputs, stop=until, **kwargs) + + del inputs + torch.cuda.empty_cache() + import gc + + gc.collect() + + ### essentially same as HFLM beyond this line! + + cont_toks_list = cont.tolist() + for cont_toks, context in zip(cont_toks_list, contexts): + # discard context + left-padding toks if using causal decoder-only VLM + cont_toks = cont_toks[context_enc.shape[1] :] + + s = self.tok_decode(cont_toks) + + # use secondary stop seqs to cut off should-have-been-stopped content post-hoc + for term in until: + if len(term) > 0: + # ignore '' separator, + # for seq2seq case where self.tok_decode(self.eot_token_id) = '' + s = s.split(term)[0] + + res.append(s) + self.cache_hook.add_partial( + "generate_until", (context, gen_kwargs), s + ) # TODO: cache key for multimodal input should be what? + pbar.update(1) + # reorder this group of results back to original unsorted form + res = re_ords.get_original(res) + + pbar.close() + return res diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/huggingface.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/huggingface.py new file mode 100644 index 0000000000000000000000000000000000000000..2c0626f8723df2b39c9efb140d3d2874412e2249 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/huggingface.py @@ -0,0 +1,1443 @@ +import copy +import os +from datetime import timedelta +from pathlib import Path +from typing import Dict, List, Literal, Optional, Tuple, Union + +import jinja2 +import torch +import torch.nn.functional as F +import transformers +from accelerate import ( + Accelerator, + InitProcessGroupKwargs, + find_executable_batch_size, +) +from accelerate.utils import get_max_memory +from huggingface_hub import HfApi +from packaging import version +from peft import PeftModel +from peft import __version__ as PEFT_VERSION +from tqdm import tqdm +from transformers.models.auto.modeling_auto import ( + MODEL_FOR_CAUSAL_LM_MAPPING_NAMES, + MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES, +) + +from lm_eval import utils +from lm_eval.api.instance import Instance +from lm_eval.api.model import TemplateLM +from lm_eval.api.registry import register_model +from lm_eval.models.utils import ( + Collator, + clear_torch_cache, + configure_pad_token, + get_dtype, + pad_and_concat, + stop_sequences_criteria, +) + + +eval_logger = utils.eval_logger + + +@register_model("hf-auto", "hf", "huggingface") +class HFLM(TemplateLM): + """ + An abstracted Huggingface model class. Enables usage with both models of + `transformers.AutoModelForCausalLM` and `transformers.AutoModelForSeq2SeqLM` classes. + + Supports data-parallel multi-GPU with HF Accelerate. + """ + + AUTO_MODEL_CLASS = None + _DEFAULT_MAX_LENGTH = 2048 + + def __init__( + self, + pretrained: Union[str, transformers.PreTrainedModel], + backend: Literal["default", "causal", "seq2seq"] = "default", + # override whether the model should be treated as decoder-only (causal) or encoder-decoder (seq2seq) + revision: Optional[str] = "main", + subfolder: Optional[str] = None, + tokenizer: Optional[ + Union[ + str, + transformers.PreTrainedTokenizer, + transformers.PreTrainedTokenizerFast, + ] + ] = None, + truncation: Optional[bool] = False, + logits_cache: bool = True, + max_length: Optional[int] = None, + device: Optional[str] = "cuda", + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[Union[int, str]] = 1, + max_batch_size: Optional[int] = 64, + trust_remote_code: Optional[bool] = False, + use_fast_tokenizer: Optional[bool] = True, + add_bos_token: Optional[bool] = False, + prefix_token_id: Optional[int] = None, + # arguments used for splitting a model across GPUs naively. + # only used if `parallelize=True`. + parallelize: Optional[bool] = False, + max_memory_per_gpu: Optional[Union[int, str]] = None, + max_cpu_memory: Optional[Union[int, str]] = None, + offload_folder: Optional[Union[str, os.PathLike]] = "./offload", + # PEFT, delta weights and quantization options + peft: Optional[str] = None, + delta: Optional[str] = None, + autogptq: Optional[Union[bool, str]] = False, + gptqmodel: Optional[bool] = False, + **kwargs, + ) -> None: + super().__init__() + # optionally: take in an already-initialized transformers.PreTrainedModel + if not isinstance(pretrained, str): + eval_logger.warning( + "`pretrained` model kwarg is not of type `str`. Many other model arguments may be ignored. Please do not launch via accelerate or use `parallelize=True` if passing an existing model this way." + ) + assert not parallelize, "`parallelize=True` is not compatible with passing pre-initialized model to `pretrained`" + self._model = pretrained + self._device = self._model.device + self._config = self._model.config + gpus = 0 + + else: + assert isinstance(device, str) + assert isinstance(pretrained, str) + assert isinstance(batch_size, (int, str)) + + gpus = torch.cuda.device_count() + accelerator_kwargs = InitProcessGroupKwargs(timeout=timedelta(weeks=52)) + accelerator = Accelerator(kwargs_handlers=[accelerator_kwargs]) + if accelerator.num_processes > 1: + self.accelerator = accelerator + + if "npu" in accelerator.device.type: + gpus = torch.npu.device_count() + + # using one process with no model parallelism + if not (parallelize or accelerator.num_processes > 1): + # use user-passed device + device_list = set( + ["cuda", "cpu"] + + [f"cuda:{i}" for i in range(gpus)] + + ["mps", "mps:0"] + + [f"npu:{i}" for i in range(gpus)] + ) + if device and device in device_list: + self._device = torch.device(device) + eval_logger.info(f"Using device '{device}'") + if device in ("mps", "mps:0") and version.parse( + torch.__version__ + ) < version.parse("2.1"): + raise RuntimeError( + f"mps requires torch >= 2.1. You have {torch.__version__}" + ) + else: + eval_logger.info("Device not specified") + eval_logger.info(f"Cuda Available? {torch.cuda.is_available()}") + self._device = ( + torch.device("cuda") + if torch.cuda.is_available() + else torch.device("cpu") + ) + else: # Parallelism managed by accelerate + if device != "cuda": + eval_logger.info( + f"Using `accelerate launch` or `parallelize=True`, device '{device}' will be overridden when placing model." + ) + # TODO: include in warning that `load_in_8bit` etc. affect this too + self._device = ( + self.accelerator.device + if hasattr(self, "accelerator") + else torch.device(device) + ) + + revision = str(revision) # cast to string if not already one + # TODO: update this to be less of a hack once subfolder is fixed in HF + revision = revision + ("/" + subfolder if subfolder is not None else "") + + self._get_config( + pretrained, + revision=revision, + trust_remote_code=trust_remote_code, + ) + + # determine which of 'causal' and 'seq2seq' backends to use for HF models + self._get_backend( + config=self.config, backend=backend, trust_remote_code=trust_remote_code + ) + + # load tokenizer so we know tokenizer vocabulary size before loading model and PEFT + self._create_tokenizer( + pretrained, + tokenizer, + revision=revision, + trust_remote_code=trust_remote_code, + use_fast_tokenizer=use_fast_tokenizer, + ) + + # if we passed `pretrained` as a string, initialize our model now + if isinstance(pretrained, str): + self._create_model( + pretrained=pretrained, + revision=revision, + dtype=dtype, + trust_remote_code=trust_remote_code, + parallelize=parallelize, + gpus=gpus, + max_memory_per_gpu=max_memory_per_gpu, + max_cpu_memory=max_cpu_memory, + offload_folder=offload_folder, + peft=peft, + delta=delta, + autogptq=autogptq, + gptqmodel=gptqmodel, + **kwargs, + ) + + # access self._model through self.model property outside this method + if isinstance(self.model, torch.nn.Module): + self.model.eval() + self.model.tie_weights() + + self.truncation = truncation + self.logits_cache = logits_cache + self.vocab_size = self.tokenizer.vocab_size + # select (or create) a pad token to use + self.tokenizer = configure_pad_token(self.tokenizer, model_config=self.config) + + self.add_bos_token = add_bos_token + if "gemma" in getattr(self.config, "model_type", ""): + self.add_bos_token = True + eval_logger.info( + f"Model type is '{self.config.model_type}', part of the Gemma family--a BOS token will be used as Gemma underperforms without it." + ) + + self._max_length = max_length + self.pretrained = pretrained + self.delta = delta + self.peft = peft + self.revision = revision + self.batch_schedule = 1 + self.batch_sizes = {} + self.max_batch_size = max_batch_size + + if str(batch_size).startswith("auto"): + batch_size = batch_size.split(":") + self.batch_size_per_gpu = batch_size[0] + self.batch_schedule = float(batch_size[1]) if len(batch_size) > 1 else 1 + else: + self.batch_size_per_gpu = int(batch_size) + + if isinstance(pretrained, str): + if gpus >= 1 or str(self.device) == "mps": + # TODO: can remove this whole snippet except in the mps case, perhaps? + if not (parallelize or autogptq or hasattr(self, "accelerator")): + # place model onto device requested manually, + # if not using HF Accelerate or device_map + # or any other option that preloads model onto device + try: + self.model.to(self.device) + except ValueError: + eval_logger.debug( + "Failed to place model onto specified device. This may be because the model is quantized via `bitsandbytes` or `device_map` is provided. If the desired GPU is being used, this message is safe to ignore." + ) + # multigpu data-parallel support when launched with accelerate + if gpus > 1: + if accelerator.num_processes > 1: + if parallelize: + eval_logger.warning( + "You are both using a HF Accelerate `device_map` (`--model_args parallelize=True`) and launching via `accelerate launch`. This will attempt to do model and data parallelism depending on the resources available." + ) + elif gpus > accelerator.num_processes: + eval_logger.warning( + "WARNING: The number of total system GPUs does not match the number of spawned processes. " + "If you would like to use data parallelism, please launch the script " + "with 'accelerate launch *script*'. " + f"Current run will proceed with {accelerator.num_processes} devices." + ) + if self.accelerator.is_local_main_process: + eval_logger.info( + f"Using {gpus} devices with data parallelism" + ) + + self._device = torch.device(f"{accelerator.device}") + self.accelerator = accelerator + + self._rank = self.accelerator.local_process_index + self._world_size = self.accelerator.num_processes + else: + # if we aren't launching via accelerate, ditch + self._rank = 0 + self._world_size = 1 + else: + # if a PreTrainedModel was passed into HFLM, we forgo distributed setup. + eval_logger.warning( + "Passed an already-initialized model through `pretrained`, assuming single-process call to evaluate() or custom distributed integration" + ) + self._rank = 0 + self._world_size = 1 + + self.custom_prefix_token_id = prefix_token_id + if prefix_token_id is not None: + eval_logger.info( + f"Loglikelihood prefix token id used in evaluation: {self.prefix_token_id}" + ) + + def _get_accelerate_args( + self, + parallelize: Optional[bool] = None, + device_map: Optional[str] = "auto", + max_memory_per_gpu: Optional[Union[int, str]] = None, + max_cpu_memory: Optional[Union[int, str]] = None, + offload_folder: Optional[str] = "./offload", + gpus: Optional[int] = None, + ) -> dict: + """Returns the kwargs needed to apply `accelerate` in `AutoModel.from_pretrained`.""" + num_local_processes = int(os.environ.get("LOCAL_WORLD_SIZE", 1)) + num_machines = int(os.environ.get("WORLD_SIZE", 0)) // num_local_processes + if ( + num_machines == 0 + and hasattr(self, "accelerator") + and self.accelerator is not None + ): + eval_logger.info( + "We are not in a distributed setting for accelerate. Setting model_parallel to False." + ) + parallelize = False + + if parallelize is None: + # If parallelism is unset by the user, we automatically assign model parallelism + # if enough extra GPUs are available + max_memory_all_gpus = get_max_memory() + # We just want gpu, not cpu, max memory + if "cpu" in max_memory_all_gpus: + del max_memory_all_gpus["cpu"] + parallelize = bool(num_local_processes < len(max_memory_all_gpus)) + eval_logger.info( + f"Setting model parallel to {parallelize} since " + f"the number of local processes is {num_local_processes} " + f"and the number of GPUs is {len(max_memory_all_gpus)}" + ) + + args = {} + if parallelize: # Model parallelism will be used + max_memory = {} + if max_memory_per_gpu is not None: # Using the provided memory requirements + max_memory_per_gpu_map = { + device_idx: max_memory_per_gpu for device_idx in range(gpus) + } + else: # Estimating the possible memory requirements + max_memory_all_gpus = get_max_memory() + if "cpu" in max_memory_all_gpus: + del max_memory_all_gpus["cpu"] + if not hasattr(self, "accelerator"): + max_memory_per_gpu_map = { + k: v for k, v in max_memory_all_gpus.items() + } + else: + # use only 1 / num_processes of the GPUs if we are running under accelerate launch + max_memory_per_gpu_map = { + k: v + for k, v in max_memory_all_gpus.items() + if k % num_local_processes + == (self.accelerator.process_index % num_local_processes) + } + args["max_memory"] = max_memory_per_gpu_map + args["device_map"] = "auto" if device_map is None else device_map + eval_logger.info( + f"Model parallel was set to True, setting max memory per GPU to {max_memory_per_gpu_map} and device map to {args.get('device_map')}" + ) + + if max_cpu_memory is not None: + max_memory["cpu"] = max_cpu_memory + + args["offload_folder"] = offload_folder + elif ( + device_map is None + ): # No model parallelism, we use the default provided device for our model + if hasattr(self, "accelerator"): + device_map = {"": f"{self.accelerator.device}"} + else: + device_map = {"": str(self.device)} + args["max_memory"] = None + args["device_map"] = device_map + eval_logger.info( + f"Model parallel was set to False, max memory was not set, and device map was set to {device_map}" + ) + else: + args["max_memory"] = None + args["device_map"] = None + eval_logger.info("Model parallel was set to False.") + + return args + + @property + def config(self): + # return the associated transformers.AutoConfig for the given pretrained model. + return self._config + + @property + def model(self): + # returns the model, unwrapping it if using Accelerate + if hasattr(self, "accelerator"): + return self.accelerator.unwrap_model(self._model) + else: + return self._model + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def prefix_token_id(self): + # it is used as prefix for loglikelihood + if self.custom_prefix_token_id is not None: + return self.custom_prefix_token_id + if self.tokenizer.bos_token_id is not None: + return self.tokenizer.bos_token_id + return self.tokenizer.eos_token_id + + @property + def max_length(self): + if self._max_length: # if max length manually set, return it + return self._max_length + seqlen_config_attrs = ("n_positions", "max_position_embeddings", "n_ctx") + for attr in seqlen_config_attrs: + if hasattr(self.model.config, attr): + return getattr(self.model.config, attr) + if hasattr(self.tokenizer, "model_max_length"): + if self.tokenizer.model_max_length == 1000000000000000019884624838656: + return self._DEFAULT_MAX_LENGTH + return self.tokenizer.model_max_length + return self._DEFAULT_MAX_LENGTH + + @property + def max_gen_toks(self) -> int: + return 256 + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + @property + def tokenizer_name(self) -> str: + return self.tokenizer.name_or_path.replace("/", "__") + + def _get_backend( + self, + config: Union[transformers.PretrainedConfig, transformers.AutoConfig], + backend: Literal["default", "causal", "seq2seq"] = "default", + trust_remote_code: Optional[bool] = False, + ) -> None: + """ + Helper method during initialization. + Determines the backend ("causal" (decoder-only) or "seq2seq" (encoder-decoder)) model type to be used. + sets `self.AUTO_MODEL_CLASS` appropriately if not already set. + + **If not calling HFLM.__init__() or HFLM._get_backend() within a subclass of HFLM, + user must set `self.backend` to be either "causal" or "seq2seq" manually!** + """ + + assert backend in ["default", "causal", "seq2seq"] + + if backend != "default": + # if we've settled on non-default backend, use that manually + if backend == "causal": + self.backend = backend + elif backend == "seq2seq": + self.backend = backend + eval_logger.info( + f"Overrode HF model backend type, and using type '{self.backend}'" + ) + else: + # determine and use the default HF backend for this model, based on its config + metadata. + if ( + getattr(config, "model_type") + in MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES + ): + # first check if model type is listed under seq2seq models, since some + # models like MBart are listed in both seq2seq and causal mistakenly in HF transformers. + # these special cases should be treated as seq2seq models. + self.backend = "seq2seq" + eval_logger.debug(f"Using model type '{self.backend}'") + elif ( + getattr(self.config, "model_type") in MODEL_FOR_CAUSAL_LM_MAPPING_NAMES + ): + self.backend = "causal" + eval_logger.debug(f"Using model type '{self.backend}'") + else: + if not trust_remote_code: + eval_logger.warning( + "HF model type is neither marked as CausalLM or Seq2SeqLM. \ + This is expected if your model requires `trust_remote_code=True` but may be an error otherwise." + "Setting backend to causal" + ) + # if model type is neither in HF transformers causal or seq2seq model registries + # then we default to assuming AutoModelForCausalLM + self.backend = "causal" + eval_logger.info( + f"Model type cannot be determined. Using default model type '{self.backend}'" + ) + + if self.AUTO_MODEL_CLASS is None: + if self.backend == "causal": + self.AUTO_MODEL_CLASS = transformers.AutoModelForCausalLM + elif self.backend == "seq2seq": + self.AUTO_MODEL_CLASS = transformers.AutoModelForSeq2SeqLM + + def _get_config( + self, + pretrained: str, + revision: str = "main", + trust_remote_code: bool = False, + ) -> None: + """Return the model config for HuggingFace models""" + self._config = transformers.AutoConfig.from_pretrained( + pretrained, + revision=revision, + trust_remote_code=trust_remote_code, + ) + + def _create_model( + self, + pretrained: str, + revision: Optional[str] = "main", + dtype: Optional[Union[str, torch.dtype]] = "auto", + trust_remote_code: Optional[bool] = False, + # arguments used for splitting a model across GPUs naively. + # only used if `parallelize=True`. + # (accelerate naive PP (device_map) options) + parallelize: Optional[bool] = False, + gpus: Optional[int] = None, + max_memory_per_gpu: Optional[Union[int, str]] = None, + max_cpu_memory: Optional[Union[int, str]] = None, + offload_folder: Optional[str] = "./offload", + # PEFT, delta weights and quantization options + peft: Optional[str] = None, + delta: Optional[str] = None, + autogptq: Optional[Union[bool, str]] = False, + gptqmodel: Optional[bool] = False, + **kwargs, + ) -> None: + """ + Initializes an HF or HF-compatible PreTrainedModel from scratch + inside HFLM, using the kwargs passed into self.__init__(). + + Also handles functionality such as AutoGPTQ usage and PEFT wrapping. + + For future similar extensions to AutoGPTQ that are not core to HF's ecosystem, + (such as PyTorch models that are nearly, but not quite, fully mirroring + HF's public interface relied on in this HFLM class) + please consider subclassing HFLM and overriding this and other methods as needed. + """ + + model_kwargs = kwargs if kwargs else {} + + model_kwargs.update( + self._get_accelerate_args( + parallelize=parallelize, + device_map=kwargs.get("device_map", None), + max_memory_per_gpu=max_memory_per_gpu, + max_cpu_memory=max_cpu_memory, + offload_folder=offload_folder, + gpus=gpus, + ) + ) + + quant_method = model_kwargs.pop("quant_method", "") + if not autogptq and not quant_method: + if model_kwargs.get("load_in_4bit", None): + assert ( + transformers.__version__ >= "4.30.0" + ), "load_in_4bit requires transformers >= 4.30.0" + if transformers.__version__ >= "4.30.0": + if model_kwargs.get("load_in_4bit", None): + if model_kwargs.get("bnb_4bit_compute_dtype", None): + model_kwargs["bnb_4bit_compute_dtype"] = get_dtype( + model_kwargs["bnb_4bit_compute_dtype"] + ) + + self._model = self.AUTO_MODEL_CLASS.from_pretrained( + pretrained, + revision=revision, + torch_dtype=get_dtype(dtype), + trust_remote_code=trust_remote_code, + **model_kwargs, + ) + elif autogptq: + try: + from auto_gptq import AutoGPTQForCausalLM + except ModuleNotFoundError: + raise Exception( + "Tried to load auto_gptq, but auto-gptq is not installed ", + "please install auto-gptq via pip install lm-eval[gptq] or pip install -e .[gptq]", + ) + + self._model = AutoGPTQForCausalLM.from_quantized( + pretrained, + trust_remote_code=trust_remote_code, + model_basename=None if autogptq is True else Path(autogptq).stem, + use_safetensors=True + if autogptq is True + else autogptq.endswith(".safetensors"), + **model_kwargs, + ) + else: + self._model = self._create_quantized_model( + quant_method, + pretrained, + trust_remote_code, + **model_kwargs, + ) + + if peft and delta: + raise ValueError( + "Cannot use both 'peft' and 'delta' options at the same time." + ) + + if peft: + if model_kwargs.get("load_in_4bit", None): + if version.parse(PEFT_VERSION) < version.parse("0.4.0"): + raise AssertionError("load_in_4bit requires peft >= 0.4.0") + if self._model.config.vocab_size != len(self.tokenizer): + # resize model for LoRAs with added tokens + eval_logger.info( + f"Model config indicates vocab_size='{self._model.config.vocab_size}', but found tokenizer with vocab size '{len(self.tokenizer)}'. Resizing model embedding layer..." + ) + self._model.resize_token_embeddings(len(self.tokenizer)) + self._model = PeftModel.from_pretrained( + self._model, peft, revision=revision + ) + elif delta: + if autogptq: + eval_logger.warning( + "Delta weights might trigger unexpected behavior when used with AutoGPTQ." + ) + _model_delta = self.AUTO_MODEL_CLASS.from_pretrained( + delta, + revision=revision, + torch_dtype=get_dtype(dtype), + trust_remote_code=trust_remote_code, + **model_kwargs, + ) + for name, param in self._model.state_dict().items(): + try: + param.data += _model_delta.state_dict()[name] + except KeyError: + raise KeyError(f"Delta model is missing weights for layer: {name}") + except Exception as e: + raise RuntimeError( + f"Failed to add delta weights to layer {name}. Error: {e}" + ) + + del _model_delta + + return None + + def _create_quantized_model( + self, + quant_method: str, + pretrained: str, + trust_remote_code: Optional[bool] = False, + **kwargs: Dict, + ): + q_method = quant_method.lower() + if q_method == "gptq": + # create quantized models according to quantization method + try: + from auto_gptq import AutoGPTQForCausalLM + except ModuleNotFoundError: + raise Exception( + "Tried to load auto_gptq, but auto-gptq is not installed ", + "please install auto-gptq via pip install lm-eval[gptq] or pip install -e .[gptq]", + ) + + return AutoGPTQForCausalLM.from_quantized( + pretrained, + trust_remote_code=trust_remote_code, + use_safetensors=True, + **kwargs, + ) + elif q_method == "awq": + try: + from awq import AutoAWQForCausalLM + except ModuleNotFoundError: + raise Exception( + "Tried to load auto_awq, but auto-awq is not installed ", + "please install auto-awq via pip install lm-eval[awq] or pip install -e .[awq]", + ) + return AutoAWQForCausalLM.from_quantized( + pretrained, + trust_remote_code=trust_remote_code, + safetensors=True, + **kwargs, + ) + elif q_method == "hqq": + try: + from hqq.engine.hf import HQQModelForCausalLM + except ModuleNotFoundError: + raise Exception( + "Tried to load hqq, but hqq is not installed ", + "please install hqq via pip install lm-eval[hqq] or pip install -e .[hqq]", + ) + + # return HQQModelForCausalLM.from_quantized(pretrained, **kwargs) + return HQQModelForCausalLM.from_quantized(pretrained) + else: + raise Exception(f"Unsupported quantization method {quant_method}") + + def _create_tokenizer( + self, + pretrained: Union[str, transformers.PreTrainedModel], + tokenizer: Optional[ + Union[ + str, + transformers.PreTrainedTokenizer, + transformers.PreTrainedTokenizerFast, + ] + ], + revision: Optional[str] = "main", + trust_remote_code: Optional[bool] = False, + use_fast_tokenizer: Optional[bool] = True, + ) -> None: + """ + Helper method during initialization. + + Create a tokenizer object corresponding to the correct + tokenizer for value of `pretrained`, or use the pre-initialized tokenizer passed. + """ + + if tokenizer: + if isinstance(tokenizer, str): + self.tokenizer = transformers.AutoTokenizer.from_pretrained( + tokenizer, + revision=revision, + trust_remote_code=trust_remote_code, + use_fast=use_fast_tokenizer, + ) + else: + assert isinstance( + tokenizer, transformers.PreTrainedTokenizer + ) or isinstance(tokenizer, transformers.PreTrainedTokenizerFast) + self.tokenizer = tokenizer + else: + # Get tokenizer based on 'pretrained' + if isinstance(pretrained, str): + model_name = pretrained + else: + # get the HF hub name via accessor on model + model_name = self.model.name_or_path + self.tokenizer = transformers.AutoTokenizer.from_pretrained( + model_name, + revision=revision, + trust_remote_code=trust_remote_code, + use_fast=use_fast_tokenizer, + ) + return None + + def _detect_batch_size(self, requests=None, pos: int = 0): + if requests: + _, context_enc, continuation_enc = requests[pos] + max_length = len( + (context_enc + continuation_enc)[-(self.max_length + 1) :][:-1] + ) + max_context_enc = len(context_enc[-(self.max_length + 1) :]) + max_cont_enc = len(continuation_enc[-(self.max_length + 1) :]) + else: + max_length = self.max_length + max_context_enc = max_length + max_cont_enc = max_length + + # if OOM, then halves batch_size and tries again + @find_executable_batch_size(starting_batch_size=self.max_batch_size) + def forward_batch(batch_size): + if self.backend == "seq2seq": + length = max(max_context_enc, max_cont_enc) + batched_conts = torch.ones( + (batch_size, length), device=self.device + ).long() + test_batch = torch.ones((batch_size, length), device=self.device).long() + call_kwargs = { + "attn_mask": test_batch, + "labels": batched_conts, + } + else: + call_kwargs = {} + test_batch = torch.ones( + (batch_size, max_length), device=self.device + ).long() + for _ in range(5): + out = F.log_softmax(self._model_call(test_batch, **call_kwargs), dim=-1) # noqa: F841 + + return batch_size + + try: + batch_size = forward_batch() + except RuntimeError as e: + if "No executable batch size found" in str(e): + batch_size = 1 + else: + raise + + if self.world_size > 1: + # if multi-GPU, always take minimum over all selected batch sizes + max_rnk_bs = torch.tensor([batch_size], device=self.device) + gathered = ( + self.accelerator.gather(max_rnk_bs).cpu().detach().numpy().tolist() + ) + batch_size = min(gathered) + clear_torch_cache() + return batch_size + + clear_torch_cache() + return batch_size + + def tok_encode( + self, string: str, left_truncate_len=None, add_special_tokens=None + ) -> List[int]: + """ """ + # default for None - empty dict, use predefined tokenizer param + # used for all models except for CausalLM or predefined value + special_tokens_kwargs = {} + + # by default for CausalLM - false or self.add_bos_token is set + if add_special_tokens is None: + if self.backend == "causal": + special_tokens_kwargs = { + "add_special_tokens": False or self.add_bos_token + } + # otherwise the method explicitly defines the value + else: + special_tokens_kwargs = {"add_special_tokens": add_special_tokens} + + encoding = self.tokenizer.encode(string, **special_tokens_kwargs) + + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + encoding = encoding[-left_truncate_len:] + + return encoding + + def tok_batch_encode( + self, + strings: List[str], + padding_side: str = "left", + left_truncate_len: int = None, + truncation: bool = False, + ) -> Tuple[torch.Tensor, torch.Tensor]: + # encode a batch of strings. converts to tensors and pads automatically, unlike tok_encode. + old_padding_side = self.tokenizer.padding_side + self.tokenizer.padding_side = padding_side + + add_special_tokens = {} + if self.backend == "causal": + add_special_tokens = {"add_special_tokens": False or self.add_bos_token} + + encoding = self.tokenizer( + strings, + truncation=truncation, + padding="longest", + return_tensors="pt", + **add_special_tokens, + ) + if left_truncate_len: + encoding["input_ids"] = encoding["input_ids"][:, -left_truncate_len:] + encoding["attention_mask"] = encoding["attention_mask"][ + :, -left_truncate_len: + ] + self.tokenizer.padding_side = old_padding_side + + return encoding["input_ids"], encoding["attention_mask"] + + def tok_decode(self, tokens, skip_special_tokens=True): + return self.tokenizer.decode(tokens, skip_special_tokens=skip_special_tokens) + + def _model_call(self, inps, attn_mask=None, labels=None): + """ + :param inps: torch.Tensor + A torch tensor of shape [batch, (sequence_ctx + sequence_cont)] or of shape + [batch, sequence_ctx]. the size of sequence may vary from call to call + :param attn_mask: torch.Tensor, optional + A torch tensor of shape [batch, (sequence_ctx + sequence_cont)]. Only passed + (and must be passed) if self.AUTO_MODEL_CLASS is transformers.AutoModelForSeq2SeqLM + :param labels: torch.Tensor, optional + A torch tensor of shape [batch, (sequence_ctx + sequence_cont)]. Only passed + (and must be passed) if self.AUTO_MODEL_CLASS is transformers.AutoModelForSeq2SeqLM + :return + A torch tensor of shape [batch, sequence, vocab] with the + logits returned from the model's decoder + """ + with torch.no_grad(): + if attn_mask is not None or labels is not None: + assert attn_mask is not None and labels is not None + assert self.AUTO_MODEL_CLASS == transformers.AutoModelForSeq2SeqLM + return self.model( + input_ids=inps, attention_mask=attn_mask, labels=labels + ).logits + else: + assert self.AUTO_MODEL_CLASS == transformers.AutoModelForCausalLM + return self.model(inps).logits + + def _model_generate(self, context, max_length, stop, **generation_kwargs): + # temperature = 0.0 if not set + # if do_sample is false and temp==0.0: + # remove temperature, as do_sample=False takes care of this + # and we don't want a warning from HF + generation_kwargs["temperature"] = generation_kwargs.get("temperature", 0.0) + do_sample = generation_kwargs.get("do_sample", None) + + # The temperature has to be a strictly positive float -- if it is 0.0, use greedy decoding strategies + if generation_kwargs.get("temperature") == 0.0 and do_sample is None: + generation_kwargs["do_sample"] = do_sample = False + + if do_sample is False and generation_kwargs.get("temperature") == 0.0: + generation_kwargs.pop("temperature") + # build stopping criteria + stopping_criteria = stop_sequences_criteria( + self.tokenizer, stop, context.shape[1], context.shape[0] + ) + return self.model.generate( + input_ids=context, + max_length=max_length, + stopping_criteria=stopping_criteria, + pad_token_id=self.tokenizer.pad_token_id, + use_cache=True, + **generation_kwargs, + ) + + def _select_cont_toks( + self, logits: torch.Tensor, contlen: int = None, inplen: int = None + ) -> torch.Tensor: + if self.backend == "causal": + assert ( + contlen and inplen + ), "Must pass input len and cont. len to select scored logits for causal LM" + # discard right-padding. + # also discard the input/context tokens. we'll only score continuations. + logits = logits[inplen - contlen : inplen] + elif self.backend == "seq2seq": + assert ( + contlen and not inplen + ), "Selecting scored logits for Seq2SeqLM requires only cont. len" + # only discard right-padding. + # the logits input to this fn only contain decoder-side tokens. + logits = logits[:contlen] + + return logits + + def loglikelihood_rolling( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[float]: + loglikelihoods = [] + + adaptive_batch_size = None + if self.batch_size == "auto": + # using rolling window with maximum context + print("Passed argument batch_size = auto. Detecting largest batch size") + batch_size = self._detect_batch_size() + print(f"Determined Largest batch size: {batch_size}") + adaptive_batch_size = batch_size + + for (string,) in tqdm( + [req.args for req in requests], disable=(disable_tqdm or (self.rank != 0)) + ): + rolling_token_windows = list( + map( + utils.make_disjoint_window, + utils.get_rolling_token_windows( + token_list=self.tok_encode(string), + prefix_token=self.prefix_token_id, + max_seq_len=self.max_length, + context_len=1, + ), + ) + ) + + # TODO: Right now, we pass single EOT token to the Encoder and the full context to the decoder, in seq2seq case + rolling_token_windows = [(None,) + x for x in rolling_token_windows] + + pad_amnt = 0 + if self.world_size > 1: + # We pad out the external document-level iterator so the inner iterator doesn't hang + mytensor = torch.tensor(len(rolling_token_windows), device=self.device) + gathered = ( + self.accelerator.gather(mytensor).cpu().detach().numpy().tolist() + ) + + pad_amnt = max(gathered) - gathered[self.rank] + if pad_amnt > 0: + rolling_token_windows += pad_amnt * [rolling_token_windows[0]] + + string_nll = self._loglikelihood_tokens( + requests=rolling_token_windows, + disable_tqdm=True, + override_bs=adaptive_batch_size, + ) + + if (self.world_size > 1) and (pad_amnt > 0): + string_nll = [x[0] for x in string_nll[:-pad_amnt]] + else: + # discard is_greedy + string_nll = [x[0] for x in string_nll] + + string_nll = sum(string_nll) + loglikelihoods.append(string_nll) + + # cache this loglikelihood_rolling request + self.cache_hook.add_partial("loglikelihood_rolling", (string,), string_nll) + + return loglikelihoods + + def _batch_scheduler(self, pos, n_reordered_requests): + sched = pos // int(len(n_reordered_requests) / self.batch_schedule) + if sched in self.batch_sizes: + return self.batch_sizes[sched] + if (len(self.batch_sizes) > 1) and ( + self.batch_sizes[sched - 1] == self.max_batch_size + ): + # if previous batch size is already maximal, skip recomputation + self.batch_sizes[sched] = self.max_batch_size + return self.batch_sizes[sched] + print( + f"Passed argument batch_size = auto:{self.batch_schedule}. Detecting largest batch size" + ) + self.batch_sizes[sched] = self._detect_batch_size(n_reordered_requests, pos) + print(f"Determined largest batch size: {self.batch_sizes[sched]}") + return self.batch_sizes[sched] + + def _loglikelihood_tokens( + self, + requests: List[Tuple[Tuple[str, str], List[int], List[int]]], + disable_tqdm: bool = False, + override_bs: int = None, + ) -> List[Tuple[float, bool]]: + # TODO: implement some kind of efficient-request-middleware that lumps together requests with the same context + res = [] + + def _collate(req: Tuple[Tuple[str, str], List[int], List[int]]): + """Defines the key for the sorted method""" + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + + toks = req[1] + req[2] + return -len(toks), tuple(toks) + + def _lookup_one_token_cont(req: Tuple[Tuple[str, str], List[int], List[int]]): + """Defines the key to group and lookup one-token continuations""" + # Use with group_by="contexts" (optional)" + # allows for the creation of a lookup, so we can reuse logits in case of one-token continuations. + # speeds up some multiple-choice tasks proportionally to the number of choices. + # groups requests by context+continuation[:-1] and infer on one request/group. + return req[-2] + req[-1][:-1] + + re_ord = Collator( + requests, + sort_fn=_collate, + group_by="contexts" + if self.backend == "causal" and self.logits_cache + else None, + group_fn=_lookup_one_token_cont, + ) + + # automatic (variable) batch size detection for vectorization + # pull longest context sample from request + n_reordered_requests = len(re_ord) + batch_size = ( + self.batch_size + if self.batch_size != "auto" + else override_bs + if override_bs is not None + else 0 + ) + batch_fn = ( + self._batch_scheduler + if self.batch_size == "auto" + and n_reordered_requests > 0 + and not override_bs + else None + ) + + chunks = re_ord.get_batched(n=batch_size, batch_fn=batch_fn) + pbar = tqdm( + total=len(requests), + disable=(disable_tqdm or (self.rank != 0)), + desc="Running loglikelihood requests", + ) + for chunk in chunks: + inps = [] + cont_toks_list = [] + inplens = [] + + conts = [] + encoder_attns = [] + + padding_len_inp = None + padding_len_cont = None + # because vectorizing is annoying, we first convert each (context, continuation) pair to padded + # tensors, then we pack them together into a batch, call the model, and then pick it all apart + # again because vectorizing is annoying + + for _, context_enc, continuation_enc in chunk: + # sanity check + assert len(context_enc) > 0 + assert len(continuation_enc) > 0 + assert len(continuation_enc) <= self.max_length + + # how this all works (illustrated on a causal decoder-only setup): + # CTX CONT + # inp 0 1 2 3|4 5 6 7 8 9 <- last token is deleted by inp[:, :-1] + # model \ \ + # logits 1 2 3|4 5 6 7 8 9 <- the ctx half gets tossed out by the + # cont_toks 4 5 6 7 8 9 [:, -len(continuation_enc):, :self.vocab_size] slice + + # when too long to fit in context, truncate from the left + if self.backend == "causal": + inp = torch.tensor( + (context_enc + continuation_enc)[-(self.max_length + 1) :][:-1], + dtype=torch.long, + device=self.device, + ) + (inplen,) = inp.shape + elif self.backend == "seq2seq": + inp = torch.tensor( + (context_enc)[-self.max_length :], + dtype=torch.long, + device=self.device, + ) + (inplen,) = inp.shape + + # build encoder attn masks + encoder_attns.append(torch.ones_like(inp)) + + cont = torch.tensor( + (continuation_enc)[-self.max_length :], + # TODO: left-shift these? + # TODO: our code assumes we never end up truncating conts for either model type + dtype=torch.long, + device=self.device, + ) + (contlen,) = cont.shape + + conts.append(cont) + + padding_len_cont = ( + max(padding_len_cont, contlen) + if padding_len_cont is not None + else contlen + ) + + padding_len_inp = ( + max(padding_len_inp, inplen) + if padding_len_inp is not None + else inplen + ) + + inps.append(inp) # [1, inp_length] + cont_toks_list.append(continuation_enc) + inplens.append(inplen) + + # create encoder attn mask and batched conts, if seq2seq + call_kwargs = {} + if self.backend == "causal": + batched_inps = pad_and_concat( + padding_len_inp, inps, padding_side="right" + ) # [batch, padding_len_inp] + elif self.backend == "seq2seq": + # TODO: left-pad encoder inps and mask? + batched_inps = pad_and_concat( + padding_len_inp, inps + ) # [batch, padding_len_inp] + batched_conts = pad_and_concat( + padding_len_cont, conts + ) # [batch, padding_len_cont] + batched_encoder_mask = pad_and_concat( + padding_len_inp, encoder_attns + ) # [batch, padding_len_inp] + call_kwargs = { + "attn_mask": batched_encoder_mask, + "labels": batched_conts, + } + + multi_logits = F.log_softmax( + self._model_call(batched_inps, **call_kwargs), dim=-1 + ) # [batch, padding_length (inp or cont), vocab] + + for (request_str, ctx_tokens, _), logits, inplen, cont_toks in zip( + chunk, multi_logits, inplens, cont_toks_list + ): + # Slice to original seq length + contlen = len(cont_toks) + # take only logits in the continuation + # (discard context toks if decoder-only ; discard right-padding) + # also discards + checks for "virtual tokens" in the causal LM's input window + # from prompt/prefix tuning tokens, if applicable + ctx_len = ( + inplen + (logits.shape[0] - padding_len_inp) + if self.backend == "causal" + else None + ) + logits = self._select_cont_toks(logits, contlen=contlen, inplen=ctx_len) + logits = logits.unsqueeze(0) # [1, seq, vocab] + + # Check if per-token argmax is exactly equal to continuation + greedy_tokens = logits.argmax(dim=-1) + + # check for one-token continuation cache hits. + # noop in case group_by != "contexts" or no cache hit and returns the + # original args. Otherwise, expands the logits batch dimension and yields each + # batch along with matching continuation tokens and prompt strings. + # logits -> [1, seq, vocab] + for request_str, cont_toks, logits in re_ord.get_cache( + req_str=request_str, + cxt_toks=ctx_tokens, + cont_toks=cont_toks, + logits=logits, + ): + cont_toks = torch.tensor( + cont_toks, dtype=torch.long, device=self.device + ).unsqueeze(0) # [1, seq] + max_equal = (greedy_tokens == cont_toks).all() + + # Obtain log-probs at the corresponding continuation token indices + # last_token_slice = logits[:, -1, :].squeeze(0).tolist() + logits = torch.gather(logits, 2, cont_toks.unsqueeze(-1)).squeeze( + -1 + ) # [1, seq] + + # Answer: (log prob, is-exact-match) + answer = (float(logits.sum()), bool(max_equal)) + + res.append(answer) + + if request_str is not None: + # special case: loglikelihood_rolling produces a number of loglikelihood requests + # all with cache key None. instead do add_partial on the per-example level + # in the loglikelihood_rolling() function for those. + self.cache_hook.add_partial( + "loglikelihood", request_str, answer + ) + pbar.update(1) + + pbar.close() + + return re_ord.get_original(res) + + def generate_until( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[str]: + res = [] + + def _collate(req: Tuple[str, dict]): + """Defines the key for the sorted method""" + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = self.tok_encode(req[0]) + return -len(toks), req[0] + + pbar = tqdm( + total=len(requests), + disable=(disable_tqdm or (self.rank != 0)), + desc="Running generate_until requests", + ) + adaptive_batch_size = None + if self.batch_size == "auto": + # using rolling window with maximum context + print("Passed argument batch_size = auto. Detecting largest batch size") + batch_size = self._detect_batch_size() + print(f"Determined Largest batch size: {batch_size}") + adaptive_batch_size = batch_size + # for each different set of kwargs, we execute all requests, by batch. + batch_size = ( + self.batch_size + if self.batch_size != "auto" + else adaptive_batch_size + if adaptive_batch_size is not None + else 0 + ) + batch_fn = ( + self._batch_scheduler + if self.batch_size == "auto" and not adaptive_batch_size + else None + ) + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + # group_fn=lambda x: x[1] -> x=(context, gen_kwargs) + re_ords = Collator( + [reg.args for reg in requests], + sort_fn=_collate, + group_by="gen_kwargs", + group_fn=lambda x: x[1], + ) + chunks = re_ords.get_batched(n=batch_size, batch_fn=batch_fn) + for chunk in chunks: + contexts, all_gen_kwargs = zip(*chunk) + # we assume all gen kwargs in the batch are the same + # this is safe to assume because the `grouper` object ensures it. + gen_kwargs = all_gen_kwargs[0] + # unpack our keyword arguments. + until = None + if isinstance(gen_kwargs, dict): + kwargs = copy.deepcopy(gen_kwargs) # edge case for repeats > 1 + if "until" in kwargs.keys(): + until = kwargs.pop("until") + if isinstance(until, str): + until = [until] + elif not isinstance(until, list): + raise ValueError( + f"Expected `kwargs['until']` to be of type Union[str,list] but got {until}" + ) + else: + raise ValueError( + f"Expected `kwargs` to be of type `dict` but got {type(gen_kwargs)}" + ) + # add EOS token to stop sequences + eos = self.tok_decode(self.eot_token_id, skip_special_tokens=False) + if not until: + until = [eos] + else: + until.append(eos) + if "max_gen_toks" in kwargs.keys(): + max_gen_toks = kwargs.pop("max_gen_toks") + else: + max_gen_toks = self.max_gen_toks + + # set the max length in tokens of inputs ("context_enc") + if self.backend == "causal": + # max len for inputs = max length, minus room to generate the max new tokens + max_ctx_len = self.max_length - max_gen_toks + elif self.backend == "seq2seq": + # max len for inputs = encoder's whole max_length + max_ctx_len = self.max_length + + # encode, pad, and truncate contexts for this batch + context_enc, attn_masks = self.tok_batch_encode( + contexts, + left_truncate_len=max_ctx_len, + truncation=self.truncation, + ) + context_enc = context_enc.to(self.device) + attn_masks = attn_masks.to(self.device) + + if "max_length" not in kwargs: + kwargs["max_length"] = context_enc.shape[1] + max_gen_toks + + # perform batched generation + cont = self._model_generate( + context=context_enc, + attention_mask=attn_masks, + stop=until, + **kwargs, + ) + + cont_toks_list = cont.tolist() + for cont_toks, context in zip(cont_toks_list, contexts): + # discard context + left-padding toks if using causal decoder-only LM + if self.backend == "causal": + cont_toks = cont_toks[context_enc.shape[1] :] + + s = self.tok_decode(cont_toks) + + # use secondary stop seqs to cut off should-have-been-stopped content post-hoc + for term in until: + if len(term) > 0: + # ignore '' separator, + # for seq2seq case where self.tok_decode(self.eot_token_id) = '' + s = s.split(term)[0] + + res.append(s) + + self.cache_hook.add_partial("generate_until", (context, gen_kwargs), s) + pbar.update(1) + # reorder this group of results back to original unsorted form + res = re_ords.get_original(res) + + pbar.close() + + return res + + def apply_chat_template(self, chat_history: List[Dict[str, str]]) -> str: + """ + Method to apply a chat template to a list of chat history between user and model. + """ + try: + chat_templated = self.tokenizer.apply_chat_template( + chat_history, tokenize=False, add_generation_prompt=True + ) + except jinja2.exceptions.TemplateError: + eval_logger.warning( + "Failed to apply chat template. removing the system role in chat history." + ) + chat_history = [msg for msg in chat_history if msg["role"] != "system"] + chat_templated = self.tokenizer.apply_chat_template( + chat_history, tokenize=False, add_generation_prompt=True + ) + + return chat_templated + + def get_model_info(self) -> dict: + """ + Method to get Hugging Face model information for experiment reproducibility. + """ + + def get_model_num_params(model) -> int: + if hasattr(model, "num_parameters"): + return model.num_parameters() + if hasattr(model, "parameters"): + return sum(p.numel() for p in model.parameters()) + else: + return -1 + + def get_model_dtype(model) -> str: + if hasattr(model, "dtype"): + return model.dtype + else: + return "" + + def get_model_sha(pretrained: str, revision: str) -> str: + try: + model_info = HfApi().model_info(repo_id=pretrained, revision=revision) + return model_info.sha + except Exception as e: + eval_logger.debug( + f"Failed to get model SHA for {pretrained} at revision {revision}. Error: {e}" + ) + return "" + + model_info = { + "model_num_parameters": get_model_num_params(self._model), + "model_dtype": get_model_dtype(self._model), + "model_revision": self.revision, + "model_sha": get_model_sha(self.pretrained, self.revision), + } + if self.peft: + model_info["peft_sha"] = get_model_sha(self.peft, self.revision) + if self.delta: + model_info["delta_sha"] = get_model_sha(self.delta, self.revision) + return model_info diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/ibm_watsonx_ai.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/ibm_watsonx_ai.py new file mode 100644 index 0000000000000000000000000000000000000000..a82c5c4567e76346f79d56e1f906672d801c9b89 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/ibm_watsonx_ai.py @@ -0,0 +1,374 @@ +import copy +import os +from functools import lru_cache +from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Type, cast + +from tqdm import tqdm + +from lm_eval.api.instance import Instance +from lm_eval.api.model import LM +from lm_eval.api.registry import register_model +from lm_eval.utils import eval_logger, simple_parse_args_string + + +class LogLikelihoodResult(NamedTuple): + log_likelihood: float + is_greedy: bool + + +def _verify_credentials(creds: Any) -> None: + """ + Verifies that all required keys are present in the credentials dictionary. + Args: + creds (Any): A dictionary containing the credentials. + Raises: + ValueError: If any of the necessary credentials are missing, with guidance on which environment variables need to be set. + """ + required_keys = ["apikey", "url", "project_id"] + env_var_mapping = { + "apikey": "WATSONX_API_KEY", + "url": "WATSONX_URL", + "project_id": "WATSONX_PROJECT_ID", + } + missing_keys = [key for key in required_keys if key not in creds or not creds[key]] + + if missing_keys: + missing_env_vars = [env_var_mapping[key] for key in missing_keys] + raise ValueError( + f"Missing required credentials: {', '.join(missing_keys)}. Please set the following environment variables: {', '.join(missing_env_vars)}" + ) + + +@lru_cache(maxsize=None) +def get_watsonx_credentials() -> Dict[str, str]: + """ + Retrieves Watsonx API credentials from environmental variables. + Returns: + Dict[str, str]: A dictionary containing the credentials necessary for authentication, including + keys such as `apikey`, `url`, and `project_id`. + Raises: + AssertionError: If the credentials format is invalid or any of the necessary credentials are missing. + """ + + credentials = { + "apikey": os.getenv("WATSONX_API_KEY", None), + "url": os.getenv("WATSONX_URL", None), + "project_id": os.getenv("WATSONX_PROJECT_ID", None), + } + + _verify_credentials(credentials) + return credentials + + +@register_model("watsonx_llm") +class WatsonxLLM(LM): + """ + Implementation of LM model interface for evaluating Watsonx model with the lm_eval framework. + See https://github.com/EleutherAI/lm-evaluation-harness/blob/main/docs/model_guide.md for reference. + """ + + @classmethod + def create_from_arg_string( + cls: Type["WatsonxLLM"], + arg_string: str, + additional_config: Optional[Dict] = None, + ) -> "WatsonxLLM": + """ + Allow the user to specify model parameters (TextGenerationParameters) in CLI arguments. + """ + try: + from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams + except ImportError: + raise ImportError( + "Could not import ibm_watsonx_ai: Please install lm_eval[ibm_watsonx_ai] package." + ) + + args = simple_parse_args_string(arg_string) + args.update(additional_config) + + model_id = args.pop("model_id", None) + if model_id is None: + raise ValueError("'model_id' is required, please pass it in 'model_args'") + + if not args.get("do_sample", None): + args["temperature"] = None + args["top_p"] = None + args["top_k"] = None + args["seed"] = None + + generate_params = { + GenParams.DECODING_METHOD: ( + "greedy" if not args.get("do_sample", None) else "sample" + ), + GenParams.LENGTH_PENALTY: args.get("length_penalty", None), + GenParams.TEMPERATURE: args.get("temperature", None), + GenParams.TOP_P: args.get("top_p", None), + GenParams.TOP_K: args.get("top_k", None), + GenParams.RANDOM_SEED: args.get("seed", None), + GenParams.REPETITION_PENALTY: args.get("repetition_penalty", None), + GenParams.MIN_NEW_TOKENS: args.get("min_new_tokens", None), + GenParams.MAX_NEW_TOKENS: args.get("max_new_tokens", 256), + GenParams.STOP_SEQUENCES: args.get("stop_sequences", None), + GenParams.TIME_LIMIT: args.get("time_limit", None), + GenParams.TRUNCATE_INPUT_TOKENS: args.get("truncate_input_tokens", None), + GenParams.RETURN_OPTIONS: { + "generated_tokens": True, + "input_tokens": True, + "token_logprobs": True, + "token_ranks": True, + }, + } + + generate_params = {k: v for k, v in generate_params.items() if v is not None} + + return cls( + watsonx_credentials=get_watsonx_credentials(), + model_id=model_id, + generate_params=generate_params, + ) + + def __init__( + self, + watsonx_credentials: Dict, + model_id, + generate_params: Optional[Dict[Any, Any]] = None, + ) -> None: + try: + from ibm_watsonx_ai import APIClient + from ibm_watsonx_ai.foundation_models import ModelInference + except ImportError: + raise ImportError( + "Could not import ibm_watsonx_ai: Please install lm_eval[ibm_watsonx_ai] package." + ) + super().__init__() + client = APIClient(watsonx_credentials) + project_id = watsonx_credentials.get("project_id", None) + deployment_id = watsonx_credentials.get("deployment_id", None) + client.set.default_project(project_id) + self.generate_params = generate_params + self.model = ModelInference( + model_id=model_id, + deployment_id=deployment_id, + api_client=client, + project_id=project_id, + ) + self._model_id = model_id + + @staticmethod + def _has_stop_token(response_tokens: List[str], context_tokens: List[str]) -> bool: + """ + Determines whether a stop token has been generated in the `response_tokens` compared to the `context_tokens`. + If the tokens do not match as expected, the function raises a RuntimeError, indicating a possible + misalignment between the tokens generated by the tokenizer and the model. + Args: + response_tokens (List[str]): The List of tokens generated as a response by the model. + context_tokens (List[str]): The List of tokens representing the input context. + Returns: + bool: True if the `response_tokens` likely contain a stop token that terminates the sequence, + otherwise raises an exception. + Raises: + RuntimeError: If there is an unexpected mismatch between the `response_tokens` and the `context_tokens`. + """ + context_length = len(context_tokens) + if response_tokens[: context_length - 1] == context_tokens[:-1]: + return ( + response_tokens[-1] != context_tokens[-1] + ) # only last token differs, probably stop sequence () + raise RuntimeError( + f"There is an unexpected difference between tokenizer and model tokens:\n" + f"context_tokens={context_tokens}\n" + f"response_tokens={response_tokens[:context_length]}" + ) + + def _check_model_logprobs_support(self): + """ + Verifies if the model supports returning log probabilities for input tokens. + This function sends a prompt to the model and checks whether the model's response + includes log probabilities for the input tokens. If log probabilities are not present, + it raises a `RuntimeError`, indicating that the model is not supported. + Raises: + RuntimeError: If the model does not return log probabilities for input tokens. + """ + tokens = self.model.generate_text( + prompt=["The best ice cream flavor is:"], + params=self.generate_params, + raw_response=True, + )[0]["results"][0] + if all(token.get("logprob", None) is None for token in tokens["input_tokens"]): + raise RuntimeError( + f"Model {self._model_id} is not supported: does not return logprobs for input tokens" + ) + + def _get_log_likelihood( + self, + input_tokens: List[Dict[str, float]], + context_tokens: List[Dict[str, float]], + ) -> LogLikelihoodResult: + """ + Calculates the log likelihood of the generated tokens compared to the context tokens. + Args: + input_tokens (List[Dict[str, float]]): A List of token dictionaries, each containing + token information like `text` and `logprob`. + context_tokens (List[Dict[str, float]]): A List of token dictionaries representing + the input context. + Returns: + LogLikelihoodResult: An object containing the calculated log likelihood and a boolean + flag indicating if the tokens were generated greedily. + """ + + response_tokens = [token["text"] for token in input_tokens] + context_length = len(context_tokens) + + if self._has_stop_token(response_tokens, context_tokens): + context_length -= 1 + + return LogLikelihoodResult( + log_likelihood=sum( + token.get("logprob", 0) for token in input_tokens[context_length:] + ), + is_greedy=all( + token["rank"] == 1 for token in input_tokens[context_length:] + ), + ) + + def generate_until(self, requests: List[Instance]) -> List[str]: + """ + Generates text responses for a List of requests, with progress tracking and caching. + Args: + requests (List[Instance]): A List of instances, each containing a text input to be processed. + Returns: + List[str]: A List of generated responses. + """ + requests = [request.args for request in requests] + results = [] + + for request in tqdm( + requests, + desc="Running generate_until function ...", + ): + context, continuation = request + try: + response = self.model.generate_text(context, self.generate_params) + except Exception as exp: + eval_logger.error("Error while generating text.") + raise exp + + results.append(response) + self.cache_hook.add_partial( + "generate_until", (context, continuation), response + ) + + return results + + def loglikelihood(self, requests: List[Instance]) -> List[Tuple[float, bool]]: + """ + Args: + requests: Each request contains Instance.args : Tuple[str, str] containing: + 1. an input string to the LM and + 2. a target string on which the loglikelihood of the LM producing this target, + conditioned on the input, will be returned. + Returns: + Tuple (loglikelihood, is_greedy) for each request according to the input order: + loglikelihood: probability of generating the target string conditioned on the input + is_greedy: True if and only if the target string would be generated by greedy sampling from the LM + """ + try: + from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams + except ImportError: + raise ImportError( + "Could not import ibm_watsonx_ai: Please install lm_eval[ibm_watsonx_ai] package." + ) + self._check_model_logprobs_support() + generate_params = copy.copy(self.generate_params) + generate_params[GenParams.MAX_NEW_TOKENS] = 1 + + requests = [request.args for request in requests] + results: List[LogLikelihoodResult] = [] + + # Note: We're not using batching due to (current) indeterminism of loglikelihood values when sending batch of requests + for request in tqdm( + requests, + desc="Running loglikelihood function ...", + ): + context, continuation = request + try: + tokenized_context = self.model.tokenize( + prompt=context, return_tokens=True + )["result"]["tokens"] + except Exception as exp: + eval_logger.error("Error while model tokenize.") + raise exp + + input_prompt = context + continuation + + try: + response = self.model.generate_text( + prompt=input_prompt, params=generate_params, raw_response=True + ) + except Exception as exp: + eval_logger.error("Error while model generate text.") + raise exp + + log_likelihood_response = self._get_log_likelihood( + response["results"][0]["input_tokens"], tokenized_context + ) + results.append(log_likelihood_response) + self.cache_hook.add_partial( + "loglikelihood", + (context, continuation), + ( + log_likelihood_response.log_likelihood, + log_likelihood_response.is_greedy, + ), + ) + + return cast(List[Tuple[float, bool]], results) + + def loglikelihood_rolling(self, requests) -> List[Tuple[float, bool]]: + """ + Used to evaluate perplexity on a data distribution. + Args: + requests: Each request contains Instance.args : Tuple[str] containing an input string to the model whose + entire loglikelihood, conditioned on purely the EOT token, will be calculated. + Returns: + Tuple (loglikelihood,) for each request according to the input order: + loglikelihood: solely the probability of producing each piece of text given no starting input. + """ + try: + from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams + except ImportError: + raise ImportError( + "Could not import ibm_watsonx_ai: Please install lm_eval[ibm_watsonx_ai] package." + ) + self._check_model_logprobs_support() + generate_params = copy.deepcopy(self.generate_params) + generate_params[GenParams.MAX_NEW_TOKENS] = 1 + + requests = [request.args for request in requests] + results: List[LogLikelihoodResult] = [] + + # Note: We're not using batching due to (current) indeterminism of loglikelihood values when sending batch of requests + for request in tqdm( + requests, + desc="Running loglikelihood_rolling function ...", + ): + context, continuation = request + try: + response = self.model.generate_text( + prompt=context, params=generate_params, raw_response=True + ) + except Exception as exp: + eval_logger.error("Error while model generate text.") + raise exp + + log_likelihood_response = self._get_log_likelihood( + response["results"][0]["input_tokens"], [] + ) + results.append(log_likelihood_response) + self.cache_hook.add_partial( + "loglikelihood_rolling", + (context, continuation), + log_likelihood_response.log_likelihood, + ) + + return cast(List[Tuple[float, bool]], results) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/mamba_lm.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/mamba_lm.py new file mode 100644 index 0000000000000000000000000000000000000000..5f3da695a2a329801f55bee16524af09110ddc20 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/mamba_lm.py @@ -0,0 +1,165 @@ +from typing import Optional, Union + +import torch + +import lm_eval.models.utils +from lm_eval.api.registry import register_model +from lm_eval.models.huggingface import HFLM + + +@register_model("mamba_ssm") +class MambaLMWrapper(HFLM): + def __init__( + self, + pretrained="state-spaces/mamba-130m", + # To use the HF compatible variant + is_hf: bool = False, + **kwargs, + ) -> None: + """ + Mamba (via the `mamba_ssm` package) supports the following args: + ``` + d_model: int, + n_layer: int, + vocab_size: int, + initializer_cfg=None, + pad_vocab_size_multiple: int = 1, + ssm_cfg=None, + norm_epsilon: float = 1e-5, + rms_norm: bool = False, + initializer_cfg=None, + fused_add_norm=False, + residual_in_fp32=False, + ``` + + See https://github.com/state-spaces/mamba/blob/main/mamba_ssm/models/mixer_seq_simple.py#L175 for more info. + The above can all be passed via `--model_args` or to this __init__() directly + but we recommend placing many of these within the config.json file uploaded alongside your + Mamba model to the HF Hub instead. + All other HuggingFace from_pretrained() kwargs + such as those related to + `parallelize=True`, PEFT, autoGPTQ, + or any sub-configurations of these advanced args, + are unsupported by the `mamba_ssm` package. + + The HFLM arguments + + `backend`, `tokenizer`, `truncation`, `max_length`, + `device`, `dtype`, `batch_size`, `max_batch_size`, `trust_remote_code`, `use_fast_tokenizer` + + Are all supported by Mamba where they do not conflict + with Mamba-specific restrictions such as causal LMs only. + """ + + if "backend" in kwargs: + # mamba currently only supports causal models + assert kwargs["backend"] == "causal" + self.is_hf = is_hf or (True if pretrained.endswith("hf") else False) + super().__init__( + pretrained=pretrained, + # set appropriate defaults for tokenizer, max length, etc + backend=kwargs.pop("backend", "causal"), + tokenizer=kwargs.pop("tokenizer", "EleutherAI/gpt-neox-20b"), + max_length=kwargs.pop("max_length", 2048), + **kwargs, + ) + + def _get_config( + self, + pretrained: str, + **kwargs, + ) -> None: + if self.is_hf: + super()._get_config(pretrained, **kwargs) + else: + try: + from mamba_ssm.utils.hf import load_config_hf # noqa: F811 + except ModuleNotFoundError as exception: + raise type(exception)( + "attempted to use 'mamba_ssm' LM type, but package `mamba_ssm` is not installed. \ + please install mamba via `pip install lm-eval[mamba]` or `pip install -e .[mamba]`", + ) + + self._config = load_config_hf(pretrained) + + def _create_model( + self, + pretrained: str, + dtype: Optional[Union[str, torch.dtype]] = "float16", + # no `parallelize=True` options + # no PEFT and quantization options + # Mamba does not support arbitrary HF from_pretrained() args + **kwargs, + ) -> None: + if self.is_hf: + super()._create_model(pretrained, dtype=dtype, **kwargs) + else: + try: + from mamba_ssm.models.mixer_seq_simple import ( + MambaLMHeadModel, # noqa: F811 + ) + except ModuleNotFoundError as exception: + raise type(exception)( + "attempted to use 'mamba_ssm' LM type, but package `mamba_ssm` is not installed. \ + please install mamba via `pip install lm-eval[mamba]` or `pip install -e .[mamba]`", + ) + + self._model = MambaLMHeadModel.from_pretrained( + pretrained, + device=self._device, + dtype=torch.float16 + if dtype == "auto" + else lm_eval.models.utils.get_dtype(dtype), + ) + + def _model_generate(self, context, max_length, stop, **generation_kwargs): + remove_arg = ( + ["attention_mask"] if self.is_hf else ["do_sample", "attention_mask"] + ) + for key in remove_arg: + if key in generation_kwargs: + generation_kwargs.pop(key) + + # mamba's custom GenerationMixin currently does not support + # passing stopping criteria. + # for the time being, we simply generate to max length, + # then truncate (equivalent result) + # -- this should be revisited to speed up generation + # stopping_criteria = stop_sequences_criteria( + # self.tokenizer, stop, 1, context.shape[0] + # ) + + if not self.is_hf: + return self.model.generate( + input_ids=context, + max_length=max_length, + # stopping_criteria=stopping_criteria, + # pad_token_id=self.tokenizer.pad_token_id, + # use_cache=True, + **generation_kwargs, + ) + else: + stopping_criteria = lm_eval.models.utils.stop_sequences_criteria( + self.tokenizer, + stop, + context.shape[1], + context.shape[0], + ) + + generation_kwargs["temperature"] = generation_kwargs.get("temperature", 0.0) + do_sample = generation_kwargs.get("do_sample", None) + + # The temperature has to be a strictly positive float -- if it is 0.0, use greedy decoding strategies + if generation_kwargs.get("temperature") == 0.0 and do_sample is None: + generation_kwargs["do_sample"] = do_sample = False + if do_sample is False and generation_kwargs.get("temperature") == 0.0: + generation_kwargs.pop("temperature") + + return self.model.generate( + input_ids=context, + max_length=max_length, + stopping_criteria=stopping_criteria, + pad_token_id=self.tokenizer.pad_token_id, + use_cache=True, + **generation_kwargs, + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/nemo_lm.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/nemo_lm.py new file mode 100644 index 0000000000000000000000000000000000000000..cf56019715a9d65c446f9b7285458cd00fc499ea --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/nemo_lm.py @@ -0,0 +1,543 @@ +# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import importlib +import pathlib +from copy import deepcopy +from typing import List, Literal + +import filelock +import numpy as np +import torch +from tqdm import tqdm + +from lm_eval.api.instance import Instance +from lm_eval.api.model import LM +from lm_eval.api.registry import register_model +from lm_eval.models.utils import Collator +from lm_eval.utils import ( + eval_logger, + get_rolling_token_windows, + make_disjoint_window, + simple_parse_args_string, +) + + +def _patch_pretrained_cfg( + pretrained_cfg, trainer, tensor_model_parallel_size, pipeline_model_parallel_size +): + try: + import omegaconf + except ModuleNotFoundError as exception: + raise type(exception)( + "Attempted to use 'nemo_lm' model type, but package `nemo` is not installed" + "Please install nemo following the instructions in the README: either with a NVIDIA PyTorch or NeMo container, " + "or installing nemo following https://github.com/NVIDIA/NeMo.", + ) + + omegaconf.OmegaConf.set_struct(pretrained_cfg, True) + with omegaconf.open_dict(pretrained_cfg): + attributes_to_update = { + "sequence_parallel": False, + "activations_checkpoint_granularity": None, + "activations_checkpoint_method": None, + "precision": trainer.precision, + "global_batch_size": None, + "tensor_model_parallel_size": tensor_model_parallel_size, + "pipeline_model_parallel_size": pipeline_model_parallel_size, + "apply_rope_fusion": False, + } + for name, value in attributes_to_update.items(): + if hasattr(pretrained_cfg, name): + pretrained_cfg[name] = value + return pretrained_cfg + + +def _get_target_from_class(target_class) -> str: + return f"{target_class.__module__}.{target_class.__name__}" + + +def load_model( + model_path: str, + trainer, + tensor_model_parallel_size: int, + pipeline_model_parallel_size: int, +) -> torch.nn.Module: + try: + from nemo.collections.nlp.models.language_modeling.megatron_gpt_model import ( + MegatronGPTModel, + ) + from nemo.collections.nlp.parts.nlp_overrides import NLPSaveRestoreConnector + except ModuleNotFoundError as exception: + raise type(exception)( + "Attempted to use 'nemo_lm' model type, but package `nemo` is not installed" + "Please install nemo following the instructions in the README: either with a NVIDIA PyTorch or NeMo container, " + "or installing nemo following https://github.com/NVIDIA/NeMo.", + ) + model_path = pathlib.Path(model_path) + + save_restore_connector = NLPSaveRestoreConnector() + if model_path.is_dir(): + save_restore_connector.model_extracted_dir = model_path.as_posix() + pretrained_cfg = save_restore_connector.restore_from( + None, model_path.as_posix(), return_config=True, trainer=trainer + ) + if not hasattr(pretrained_cfg, "target"): + pretrained_cfg["target"] = _get_target_from_class(MegatronGPTModel) + + pretrained_cfg = _patch_pretrained_cfg( + pretrained_cfg, + trainer, + tensor_model_parallel_size=tensor_model_parallel_size, + pipeline_model_parallel_size=pipeline_model_parallel_size, + ) + + model_to_load_path = model_path + override_config = pretrained_cfg + + module_name, class_name = override_config.target.rsplit(".", 1) + model_class = getattr(importlib.import_module(module_name), class_name) + + # monkeypatch _build_tokenizer method to be process-safe + tokenizer_lock = filelock.FileLock(f"/tmp/{model_path.name}.tokenizer.lock") + + def _synced_build_tokenizer(self): + with tokenizer_lock: + self._original_build_tokenizer() + + model_class._original_build_tokenizer = model_class._build_tokenizer + model_class._build_tokenizer = _synced_build_tokenizer + + model = model_class.restore_from( + restore_path=model_to_load_path.as_posix(), + trainer=trainer, + override_config_path=override_config, + save_restore_connector=save_restore_connector, + map_location=f"cuda:{trainer.local_rank}", + ) + + model.freeze() + model.training = False + try: + # Have to turn off activations_checkpoint_method for inference + model.model.language_model.encoder.activations_checkpoint_method = None + except AttributeError: + pass + return model + + +def setup_distributed_environment(trainer): + try: + from nemo.utils.app_state import AppState + except ModuleNotFoundError as exception: + raise type(exception)( + "Attempted to use 'nemo_lm' model type, but package `nemo` is not installed" + "Please install nemo following the instructions in the README: either with a NVIDIA PyTorch or NeMo container, " + "or installing nemo following https://github.com/NVIDIA/NeMo.", + ) + + def dummy(): + return + + if trainer.strategy.launcher is not None: + trainer.strategy.launcher.launch(dummy, trainer=trainer) + trainer.strategy.setup_environment() + + app_state = AppState() + + return app_state + + +@register_model("nemo_lm") +class NeMoLM(LM): + def __init__( + self, + path: str, + max_length: int = 4096, + batch_size: int = 1, + max_gen_toks: int = 256, + devices: int = 1, + num_nodes: int = 1, + tensor_model_parallel_size: int = 1, + pipeline_model_parallel_size: int = 1, + precision: Literal[ + "16-mixed", + "bf16-mixed", + "32-true", + "64-true", + 64, + 32, + 16, + "64", + "32", + "16", + "bf16", + ] = "bf16", + **kwargs, + ): + try: + from nemo.collections.nlp.modules.common.text_generation_utils import ( + generate, + ) + from nemo.collections.nlp.parts.nlp_overrides import NLPDDPStrategy + from pytorch_lightning.trainer.trainer import Trainer + + self.generate = generate + except ModuleNotFoundError as exception: + raise type(exception)( + "Attempted to use 'nemo_lm' model type, but package `nemo` is not installed" + "Please install nemo following the instructions in the README: either with a NVIDIA PyTorch or NeMo container, " + "or installing nemo following https://github.com/NVIDIA/NeMo.", + ) + + super().__init__() + + if ( + tensor_model_parallel_size == 1 + and pipeline_model_parallel_size == 1 + and devices > 1 + ): + eval_logger.info( + f"The number of data replicas for evaluation is {devices}." + ) + eval_logger.info(f"The total number of devices is {devices}.") + eval_logger.info( + "No tensor parallelism or pipeline parallelism is applied." + ) + + elif tensor_model_parallel_size * pipeline_model_parallel_size == devices: + eval_logger.info( + f"Setting tensor parallelism to {tensor_model_parallel_size} and pipeline parallelism to {pipeline_model_parallel_size}." + ) + eval_logger.info(f"The total number of devices is {devices}.") + eval_logger.info("No data parallelism is applied.") + + else: + raise ValueError( + "Please set the product of tensor_model_parallel_size and pipeline_model_parallel_size" + "equal to the specified number of devices." + ) + + if num_nodes > 1: + raise ValueError( + "A number of nodes greater than 1 is not supported yet. Please set num_nodes as 1." + ) + + trainer = Trainer( + strategy=NLPDDPStrategy(), + devices=devices, + accelerator="gpu", + num_nodes=num_nodes, + precision=precision, + logger=False, + enable_checkpointing=False, + use_distributed_sampler=False, + ) + # Modify the following flags only for data replication + if ( + tensor_model_parallel_size == 1 + and pipeline_model_parallel_size == 1 + and devices > 1 + ): + self._device = torch.device(f"cuda:{trainer.global_rank}") + self._rank = trainer.global_rank + self._world_size = trainer.world_size + self.model = load_model( + path, + trainer, + tensor_model_parallel_size=tensor_model_parallel_size, + pipeline_model_parallel_size=pipeline_model_parallel_size, + ).cuda() + self.tokenizer = self.model.tokenizer + self.app_state = setup_distributed_environment(trainer) + + self._max_length = max_length + self._batch_size = int(batch_size) + self._max_gen_toks = max_gen_toks + + @classmethod + def create_from_arg_string(cls, arg_string, additional_config=None): + args = simple_parse_args_string(arg_string) + if additional_config: + args["batch_size"] = additional_config.get("batch_size", 1) + + return cls(**args) + + @property + def eot_token_id(self): + try: + return self.tokenizer.eos_id + except AttributeError: + return None + + @property + def max_length(self): + return self._max_length + + @property + def max_gen_toks(self): + return self._max_gen_toks + + @property + def batch_size(self): + return self._batch_size + + @property + def device(self): + return self._device + + @property + def rank(self): + return self._rank + + @property + def world_size(self): + return self._world_size + + @property + def accelerator(self): + return self._Accelerator(self.world_size) + + class _Accelerator: + def __init__(self, world_size): + self.world_size = world_size + + def wait_for_everyone(self): + torch.distributed.barrier() + + def gather(self, local_tensor): + gathered_tensors = [ + torch.zeros(1, dtype=local_tensor.dtype).cuda() + for _ in range(self.world_size) + ] + torch.distributed.all_gather(gathered_tensors, local_tensor) + return torch.cat(gathered_tensors) + + def tok_encode(self, string: str): + return self.tokenizer.text_to_ids(string) + + def tok_decode(self, tokens): + return self.tokenizer.ids_to_text(tokens) + + def _encode_pair(self, context, continuation): + n_spaces = len(context) - len(context.rstrip()) + if n_spaces > 0: + continuation = context[-n_spaces:] + continuation + context = context[:-n_spaces] + whole_enc = self.tok_encode(context + continuation) + context_enc = self.tok_encode(context) + context_enc_len = len(context_enc) + continuation_enc = whole_enc[context_enc_len:] + return context_enc, continuation_enc + + def loglikelihood(self, requests): + new_reqs = [] + for context, continuation in [req.args for req in requests]: + if context == "": + # end of text as context + context_enc, continuation_enc = ( + [self.eot_token_id], + self.tok_encode(continuation), + ) + else: + context_enc, continuation_enc = self._encode_pair(context, continuation) + + new_reqs.append(((context, continuation), context_enc, continuation_enc)) + + return self._loglikelihood_tokens(new_reqs) + + def loglikelihood_rolling( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[float]: + loglikelihoods = [] + + for (string,) in tqdm([req.args for req in requests], disable=disable_tqdm): + rolling_token_windows = list( + map( + make_disjoint_window, + get_rolling_token_windows( + token_list=self.tok_encode(string), + prefix_token=self.eot_token_id, + max_seq_len=self.max_length - 1, + context_len=1, + ), + ) + ) + + rolling_token_windows = [(None,) + x for x in rolling_token_windows] + + string_nll = self._loglikelihood_tokens( + rolling_token_windows, + ) + + # discard is_greedy + string_nll = [x[0] for x in string_nll] + + string_nll = sum(string_nll) + loglikelihoods.append(string_nll) + + # cache this loglikelihood_rolling request + self.cache_hook.add_partial("loglikelihood_rolling", (string,), string_nll) + return loglikelihoods + + def _loglikelihood_tokens(self, requests, disable_tqdm=False): + res = [] + + def _collate(x): + toks = x[1] + x[2] + return -len(toks), tuple(toks) + + re_ord = Collator(requests, sort_fn=_collate) + chunks = re_ord.get_batched(n=self.batch_size, batch_fn=None) + pbar = tqdm( + total=len(requests), + disable=(disable_tqdm or (self.rank != 0)), + desc="Running loglikelihood requests", + ) + for chunk in chunks: + inps = [] + ctxlens = [] + contlens = [] + + for _, context_enc, continuation_enc in chunk: + # Leave one token for generation. Tokens_to_generate = 0 breaks NeMo. + inp = (context_enc + continuation_enc)[-(self.max_length - 1) :] + + ctxlen = len(context_enc) - max( + 0, len(context_enc) + len(continuation_enc) - (self.max_length - 1) + ) + ctxlens.append(ctxlen) + contlens.append(len(continuation_enc)) + + inps.append(self.tok_decode(inp)) + + output = self.generate( + self.model, + inputs=inps, + tokens_to_generate=1, + min_tokens_to_generate=1, + compute_logprob=True, + all_probs=True, + ) + + batch_token_ids = np.asarray(output["token_ids"])[:, :-1] + batch_logprobs = output["logprob"][:, :-1] + batch_full_logprob = output["full_logprob"][:, :-1, :] + + # Compute greedy tokens for entire batch rather than calling it with proper ctxlen for each sample. + # Additional tokens for each sample will be trimmed later. + min_ctxlen = min(ctxlens) + + # Use min_ctxlen-1 instead of min_ctxlen since full_logprobs are not returns for the first token. + batch_greedy_tokens = ( + torch.argmax(batch_full_logprob[:, min_ctxlen - 1 :, :], -1) + .cpu() + .numpy() + ) + + for token_ids, greedy_tokens, logprobs, ctxlen, contlen, ( + cache_key, + _, + _, + ) in zip( + batch_token_ids, + batch_greedy_tokens, + batch_logprobs, + ctxlens, + contlens, + chunk, + ): + # Trim at contlen since shorter contexts in a batch will have more than one token generated. + # Use ctxlen-1 instead of ctxlen same as for full_logprob in batch_greedy_tokens calculation + logprobs = (logprobs[ctxlen - 1 :])[:contlen] + logprob = sum(logprobs).tolist() + + continuation_tokens = (token_ids[ctxlen:])[:contlen] + len_diff = ctxlen - min_ctxlen + is_greedy = continuation_tokens == (greedy_tokens[len_diff:])[:contlen] + if not isinstance(is_greedy, bool): + is_greedy = is_greedy.all() + answer = (logprob, is_greedy) + + if cache_key is not None: + # special case: loglikelihood_rolling produces a number of loglikelihood requests + # all with cache key None. instead do add_partial on the per-example level + # in the loglikelihood_rolling() function for those. + self.cache_hook.add_partial("loglikelihood", cache_key, answer) + + res.append(answer) + pbar.update(1) + + pbar.close() + + return re_ord.get_original(res) + + def generate_until(self, requests): + if not requests: + return [] + res = [] + + def get_until(req_args): + until = req_args.get("until", []) + until = deepcopy(until) # prevent from modifying req_args for cache_key + if self.tokenizer.ids_to_tokens([self.eot_token_id])[0] not in until: + until.append(self.tokenizer.ids_to_tokens([self.eot_token_id])[0]) + return until + + def _collate(x): + toks = self.tok_encode(x[0]) + return len(toks), x[0] + + re_ords = Collator( + [reg.args for reg in requests], sort_fn=_collate, group_by="gen_kwargs" + ) + chunks = re_ords.get_batched(n=self.batch_size, batch_fn=None) + for chunk in chunks: + contexts, all_gen_kwargs = zip(*chunk) + # we assume all gen kwargs in the batch are the same + # this is safe to assume because the `grouper` object ensures it. + req_args = all_gen_kwargs[0] + # unpack our keyword arguments. + until = get_until(req_args) + max_gen_toks = req_args.get("max_gen_toks", self.max_gen_toks) + + remaining_length = self.max_length - max_gen_toks + contexts = [] + for context, _ in chunk: + encoded_context = self.tok_encode(context) + encoded_context = encoded_context[-remaining_length:] + contexts.append(self.tok_decode(encoded_context)) + + output = self.generate( + self.model, + inputs=contexts, + tokens_to_generate=max_gen_toks, + end_strings=until, + greedy=True, + ) + + answers = output["sentences"] + + continuations = [] + for context, answer in zip(contexts, answers): + continuations.append(answer[len(context) :]) + + for term in until: + continuations = [answer.split(term)[0] for answer in continuations] + + for request, answer in zip(chunk, continuations): + self.cache_hook.add_partial("greedy_until", request, answer) + res.append(answer) + + return re_ords.get_original(res) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/neuralmagic.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/neuralmagic.py new file mode 100644 index 0000000000000000000000000000000000000000..0d66f599e671c60d89716498199224335d8929c7 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/neuralmagic.py @@ -0,0 +1,429 @@ +import copy +from typing import List, Optional, Tuple, Union + +import numpy +import transformers +from tqdm import tqdm + +import lm_eval.models.utils +from lm_eval import utils +from lm_eval.api.instance import Instance +from lm_eval.api.model import LM +from lm_eval.api.registry import register_model +from lm_eval.models.huggingface import HFLM + + +eval_logger = utils.eval_logger + + +@register_model("sparseml") +class SparseMLLM(HFLM): + """ + SparseML is an open-source model optimization toolkit that enables you to create + inference-optimized sparse models using pruning, quantization, and distillation + algorithms. Models optimized with SparseML can then be exported to the ONNX format and + deployed with DeepSparse for GPU-class performance on CPU hardware. + + This class is a wrapper around the HuggingFace LM class to enable SparseML + integration with the lm-evaluation-harness. + """ + + def _create_model( + self, + pretrained: str, + revision: Optional[str] = "main", + dtype: Optional[str] = "auto", + trust_remote_code: Optional[bool] = False, + **kwargs, + ) -> None: + try: + from sparseml.transformers import SparseAutoModelForCausalLM + except ModuleNotFoundError as exception: + raise type(exception)( + "Package `sparseml` is not installed. " + "Please install it via `pip install sparseml[transformers]`" + ) + + model_kwargs = kwargs if kwargs else {} + + if "device_map" not in model_kwargs: + # set a device_map to initialize model on the right GPU. + # this is needed because it seems that the default behavior + # for quantized models now seems to be device_map="auto" + # which breaks data-parallel mode. + if hasattr(self, "accelerator"): + model_kwargs.update( + {"device_map": {"": f"cuda:{self.accelerator.local_process_index}"}} + ) + else: + model_kwargs.update({"device_map": {"": str(self.device)}}) + + relevant_kwarg_names = [ + "offload_folder", + "device_map", + ] + relevant_kwargs = { + k: v for k, v in model_kwargs.items() if k in relevant_kwarg_names + } + + # Log the difference between model_kwargs and relevant_kwargs so we can see + # what is being ignored + ignored_kwargs = {} + for k, v in model_kwargs.items(): + if k not in relevant_kwargs.keys(): + ignored_kwargs[k] = v + eval_logger.warning( + f"The sparseml integration is ignoring the following kwargs that are specified: {ignored_kwargs}" + ) + + model = SparseAutoModelForCausalLM.from_pretrained( + pretrained, + revision=revision, + torch_dtype=lm_eval.models.utils.get_dtype(dtype), + trust_remote_code=trust_remote_code, + **relevant_kwargs, + ) + self._model = model + + def _get_config(self, pretrained: str, **kwargs) -> None: + try: + from sparseml.transformers import SparseAutoConfig + except ModuleNotFoundError as exception: + raise type(exception)( + "Package `sparseml` is not installed. " + "Please install it via `pip install sparseml[transformers]`" + ) + + self._config = SparseAutoConfig.from_pretrained( + pretrained_model_name_or_path=pretrained, **kwargs + ) + + def _create_tokenizer( + self, + pretrained: Union[str, transformers.PreTrainedModel], + tokenizer: Optional[ + Union[ + str, + transformers.PreTrainedTokenizer, + transformers.PreTrainedTokenizerFast, + ] + ], + **kwargs, + ) -> None: + try: + from sparseml.transformers import SparseAutoTokenizer + except ModuleNotFoundError as exception: + raise type(exception)( + "Package `sparseml` is not installed. " + "Please install it via `pip install sparseml[transformers]`" + ) + + if tokenizer: + if isinstance(tokenizer, str): + self.tokenizer = SparseAutoTokenizer.from_pretrained( + tokenizer, + **kwargs, + ) + else: + assert isinstance( + tokenizer, transformers.PreTrainedTokenizer + ) or isinstance(tokenizer, transformers.PreTrainedTokenizerFast) + self.tokenizer = tokenizer + else: + # Get tokenizer based on 'pretrained' + if isinstance(pretrained, str): + model_name = pretrained + else: + # get the HF hub name via accessor on model + model_name = self.model.name_or_path + self.tokenizer = SparseAutoTokenizer.from_pretrained( + model_name, + **kwargs, + ) + return None + + +@register_model("deepsparse") +class DeepSparseLM(LM): + """ + Wrapper around DeepSparse, a sparsity-aware deep learning + inference runtime for CPUs, to make it compatible with the + lm-evaluation-harness. + """ + + _DEFAULT_MAX_LENGTH = 2048 + + def __init__( + self, + pretrained: str, + tokenizer: Optional[ + Union[ + str, + transformers.PreTrainedTokenizer, + transformers.PreTrainedTokenizerFast, + ] + ] = None, + batch_size: Optional[Union[int, str]] = 1, + max_gen_toks: Optional[int] = 256, + max_length: Optional[int] = None, + ): + super().__init__() + + try: + import deepsparse + except ModuleNotFoundError as exception: + raise type(exception)( + "Package `deepsparse` is not installed. " + "Please install it via `pip install deepsparse[transformers]`" + ) + + if isinstance(batch_size, str) and not batch_size.isdigit(): + eval_logger.warning( + f"batch_size={batch_size} is not valid for deepsparse because it is not an integer. " + "Ignoring and using the default of 1." + ) + batch_size = 1 + + self.batch_size = int(batch_size) + self._max_length = max_length if max_length else self._DEFAULT_MAX_LENGTH + self._max_gen_toks = max_gen_toks + self.batch_sizes = {} + + # Initialize new model and tokenizer instances + self.model = deepsparse.TextGeneration( + model_path=pretrained, + sequence_length=self._max_length, + batch_size=batch_size, + ) + self.tokenizer = tokenizer if tokenizer else self.model.tokenizer + self.config = self.model.config + + def tok_encode(self, string: str) -> List[int]: + return self.tokenizer.encode(string) + + def tok_decode(self, tokens: List[int]) -> str: + return self.tokenizer.decode(tokens) + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def prefix_token_id(self): + # it is used as prefix for loglikelihood + if self.tokenizer.bos_token_id is not None: + return self.tokenizer.bos_token_id + return self.tokenizer.eos_token_id + + @property + def max_length(self) -> int: + return self._max_length + + @property + def max_gen_toks(self) -> int: + return self._max_gen_toks + + def loglikelihood(self, requests) -> List[Tuple[float, bool]]: + """ + Copied directly from + https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/models/huggingface.py + """ + new_reqs = [] + for context, continuation in [req.args for req in requests]: + if context == "": + raise NotImplementedError( + "Implementing empty context is not supported yet" + ) + context_enc, continuation_enc = self._encode_pair(context, continuation) + + new_reqs.append(((context, continuation), context_enc, continuation_enc)) + + return self._loglikelihood_tokens(new_reqs) + + def _loglikelihood_tokens( + self, + requests: List[Tuple[Tuple[str, str], List[int], List[int]]], + disable_tqdm: bool = False, + ) -> List[Tuple[float, bool]]: + """ + The function to compute the loglikelihood of the continuation + tokens given the context tokens. + + This function is an adapted version of the original function from + https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/models/huggingface.py + """ + res = [] + + def _collate(x): + """Defines the key for the sorted method""" + toks = x[1] + x[2] + return -len(toks), tuple(toks) + + re_ord = utils.Reorderer(requests, _collate) + + for chunk in tqdm( + list(lm_eval.models.utils.chunks(re_ord.get_reordered(), self.batch_size)), + disable=disable_tqdm, + ): + batch_inp = [] + batch_cache_key = [] + batch_continuation_enc = [] + # len(chunk) is the batch_size + for cache_key, context_enc, continuation_enc in chunk: + # how this all works (illustrated on a causal decoder-only setup): + # CTX CONT + # inp 0 1 2 3|4 5 6 7 8 9 <- last token is deleted by inp[:, :-1] + # model \ \ + # logits 1 2 3|4 5 6 7 8 9 <- the ctx half gets tossed out by the + # cont_toks 4 5 6 7 8 9 [:, -len(continuation_enc):, :self.vocab_size] slice # noqa: E501 + + inp = (context_enc + continuation_enc)[-(self.max_length + 1) :][:-1] + + batch_inp.append(self.tokenizer.decode(inp)) + batch_cache_key.append(cache_key) + batch_continuation_enc.append(continuation_enc) + + response = self.model( + prompt=batch_inp, + max_new_tokens=0, + output_scores=True, + include_prompt_logits=True, + ) + + for resp, continuation_enc, cache_key in zip( + response.generations, batch_continuation_enc, batch_cache_key + ): + # (seq_len, vocab_size) + multi_scores = resp.score + + from deepsparse.utils.data import numpy_log_softmax + + # (seq_len, vocab_size) but with softmax applied + multi_logits = numpy_log_softmax(multi_scores, axis=1) + # toss out the context half of the sequence + # (cont_len, vocab_size) + continuation_multi_logits = multi_logits[-len(continuation_enc) :] + + # pick out the logits for the continuation tokens + # (cont_len,) + continuation_logits = continuation_multi_logits[ + numpy.arange(len(continuation_enc)), continuation_enc + ] + # check if the tokens generated greedly are the same + # as the expected continuation + greedy_tokens = continuation_multi_logits.argmax(axis=1) + max_equal = greedy_tokens.tolist() == continuation_enc + + # Answer: (log prob, is-exact-match) + answer = (float(continuation_logits.sum()), bool(max_equal)) + + res.append(answer) + + if cache_key is not None: + # special case: loglikelihood_rolling produces a number of loglikelihood requests + # all with cache key None. instead do add_partial on the per-example level + # in the loglikelihood_rolling() function for those. + self.cache_hook.add_partial("loglikelihood", cache_key, answer) + + return re_ord.get_original(res) + + def loglikelihood_rolling(self, requests: List[Instance]) -> List[float]: + raise NotImplementedError( + "The method not required by any of our current task integrations so far" + ) + + def generate_until(self, requests: List[Instance]) -> List[str]: + """ + The function to generate a certain number of new tokens + given a context. + + This function is an adapted version of the original function from + https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/models/openai_completions.py + """ + if not requests: + return [] + res = [] + requests = [req.args for req in requests] + + def _collate(x): + toks = self.tok_encode(x[0]) + return len(toks), x[0] + + re_ord = utils.Reorderer(requests, _collate) + + def sameuntil_chunks(xs, size): + ret = [] + lastuntil = xs[0][1] + for x in xs: + if len(ret) >= size or x[1] != lastuntil: + yield ret, lastuntil + ret = [] + lastuntil = x[1] + ret.append(x) + + if ret: + yield ret, lastuntil + + pbar = tqdm(total=len(requests)) + for chunk, request_args in tqdm( + list(sameuntil_chunks(re_ord.get_reordered(), self.batch_size)) + ): + inps = [] + + # make a deepcopy since we are changing arguments + request_args = copy.deepcopy(request_args) + + self._max_gen_toks = request_args.pop("max_gen_toks", self.max_gen_toks) + + for context, _ in chunk: + # add context (prompts) to the list + inps.append(context) + + until = request_args.pop("until", ["<|endoftext|>"]) + request_args.pop("do_sample", None) + request_args["temperature"] = request_args.get("temperature", 0) + + # run inference (generate max_gen_toks tokens) + out = self.model( + sequences=inps, + max_new_tokens=self.max_gen_toks - 1, + stop=until, + **request_args, + ) + + for resp, (context, args_) in zip(out.generations, chunk): + text = resp.text + until_ = until + # split the text at the first occurrence of any of the until tokens + for term in until_: + if len(term) > 0: + text = text.split(term)[0] + + res.append(text) + + self.cache_hook.add_partial( + "generate_until", (context, {"until": until_}), text + ) + pbar.update(1) + + pbar.close() + + return re_ord.get_original(res) + + def _encode_pair( + self, context: str, continuation: str + ) -> Tuple[List[int], List[int]]: + """ + Copied directly from + https://github.com/EleutherAI/lm-evaluation-harness/blob/main/lm_eval/models/huggingface.py + """ + n_spaces = len(context) - len(context.rstrip()) + if n_spaces > 0: + continuation = context[-n_spaces:] + continuation + context = context[:-n_spaces] + whole_enc = self.tok_encode(context + continuation) + context_enc = self.tok_encode(context) + context_enc_len = len(context_enc) + continuation_enc = whole_enc[context_enc_len:] + return context_enc, continuation_enc diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/neuron_optimum.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/neuron_optimum.py new file mode 100644 index 0000000000000000000000000000000000000000..ca2aaf657eeba309e116ef4b99db98686e7c1376 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/neuron_optimum.py @@ -0,0 +1,677 @@ +import copy +import logging +from collections import defaultdict +from typing import List, Optional, Union + +import torch +import torch.nn.functional as F +import transformers +from packaging import version +from tqdm import tqdm +from transformers import GenerationConfig +from transformers.generation import StoppingCriteriaList + +import lm_eval.models.utils +from lm_eval import utils +from lm_eval.api.model import TemplateLM +from lm_eval.api.registry import register_model +from lm_eval.models.utils import stop_sequences_criteria + + +try: + NEURON_AVAILABLE = True + from optimum.neuron import NeuronModelForCausalLM + from optimum.neuron.generation import TokenSelector + from optimum.neuron.version import __version__ as optimum_neuron_version +except ImportError: + NeuronModelForCausalLM = object + NEURON_AVAILABLE = False + + +logger = logging.getLogger(__name__) + + +class CustomNeuronModelForCausalLM(NeuronModelForCausalLM): + """NeuronModelForCausalLM with `stopping_criteria` in `generate`""" + + def generate( + self, + input_ids: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + stopping_criteria: Optional["StoppingCriteriaList"] = None, + generation_config: Optional["GenerationConfig"] = None, + **kwargs, + ) -> torch.LongTensor: + r""" + A streamlined generate() method overriding the transformers.GenerationMixin.generate() method. + + This method uses the same logits processors/warpers and stopping criteria as the transformers library + `generate()` method but restricts the generation to greedy search and sampling. + + It does not support transformers `generate()` advanced options. + + Please refer to https://huggingface.co/docs/transformers/en/main_classes/text_generation#transformers.GenerationMixin.generate + for details on generation configuration. + + Parameters: + input_ids (`torch.Tensor` of shape `(batch_size, sequence_length)`): + The sequence used as a prompt for the generation. + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. + generation_config (`~transformers.generation.GenerationConfig`, *optional*): + The generation configuration to be used as base parametrization for the generation call. `**kwargs` + passed to generate matching the attributes of `generation_config` will override them. If + `generation_config` is not provided, default will be used, which had the following loading + priority: 1) from the `generation_config.json` model file, if it exists; 2) from the model + configuration. Please note that unspecified parameters will inherit [`~transformers.generation.GenerationConfig`]'s + default values, whose documentation should be checked to parameterize generation. + + Returns: + `torch.Tensor`: A `torch.FloatTensor`. + """ + # The actual generation configuration is a combination of config and parameters + generation_config = copy.deepcopy( + self.generation_config if generation_config is None else generation_config + ) + model_kwargs = generation_config.update( + **kwargs + ) # All unused kwargs must be model kwargs + # Check model kwargs are actually used by either prepare_inputs_for_generation or forward + self._validate_model_kwargs(model_kwargs) + + # Instantiate a TokenSelector for the specified configuration + selector = TokenSelector.create( + input_ids, generation_config, self, self.max_length + ) + selector.stopping_criteria.append(stopping_criteria) + # Verify that the inputs are compatible with the model static input dimensions + batch_size, sequence_length = input_ids.shape + if sequence_length > self.max_length: + raise ValueError( + f"The input sequence length ({sequence_length}) exceeds the model static sequence length ({self.max_length})" + ) + padded_input_ids = input_ids + padded_attention_mask = attention_mask + if batch_size > self.batch_size: + raise ValueError( + f"The specified batch_size ({batch_size}) exceeds the model static batch size ({self.batch_size})" + ) + elif batch_size < self.batch_size and not self.continuous_batching: + logger.warning( + "Inputs will be padded to match the model static batch size. This will increase latency." + ) + padding_shape = [self.batch_size - batch_size, sequence_length] + padding = torch.full( + padding_shape, fill_value=self.config.eos_token_id, dtype=torch.int64 + ) + padded_input_ids = torch.cat([input_ids, padding]) + if attention_mask is not None: + padding = torch.zeros(padding_shape, dtype=torch.int64) + padded_attention_mask = torch.cat([attention_mask, padding]) + + output_ids = self.generate_tokens( + padded_input_ids, + selector, + batch_size, + attention_mask=padded_attention_mask, + **model_kwargs, + ) + return output_ids[:batch_size, :] + + +@register_model("neuronx") +class NEURON_HF(TemplateLM): + """ + Enables usage with on AWS Neuron + using the HuggingFace Transformers + Transformers neuronx library. + Tested with neuron 2.17.0 + """ + + def __init__( + self, + pretrained: Optional[str] = "TinyLlama/TinyLlama-1.1B-Chat-v1.0", + revision: Optional[str] = "main", + tp_degree: Optional[int] = None, + subfolder: Optional[str] = None, + tokenizer: Optional[str] = None, + truncation: Optional[bool] = False, + max_length: Optional[int] = None, + dtype: Optional[Union[str, torch.dtype]] = "auto", + batch_size: Optional[int] = 1, + low_cpu_mem_usage: Optional[bool] = True, + trust_remote_code: Optional[bool] = False, + use_fast_tokenizer: Optional[bool] = True, + add_bos_token: Optional[bool] = False, + ) -> None: + if not NEURON_AVAILABLE: + raise ImportError( + "Tried to load neuron model, but neuron is not installed ", + "please install neuron via pip install transformers-neuron ", + "also make sure you are running on an AWS inf2 instance", + ) + if version.parse(optimum_neuron_version) != version.parse("0.0.24"): + logger.warning( + '`optimum-neuron` model requires `pip install "optimum[neuronx]>=0.0.17" ' + "preferably using the Hugging Face Neuron Deep Learning AMI (Ubuntu 22.04) " + "https://aws.amazon.com/marketplace/pp/prodview-gr3e6yiscria2 " + f"You are using optimum-neuron={optimum_neuron_version}" + ) + super().__init__() + + assert isinstance(pretrained, str) + assert isinstance(batch_size, (int, str)) + + self.batch_size_per_gpu = int(batch_size) + batch_size = int(batch_size) + + self._config = transformers.AutoConfig.from_pretrained( + pretrained, + revision=revision, + trust_remote_code=trust_remote_code, + ) + + revision = str(revision) # cast to string if not already one + # TODO: update this to be less of a hack once subfolder is fixed in HF + revision = revision + ("/" + subfolder if subfolder is not None else "") + + self.tokenizer = transformers.AutoTokenizer.from_pretrained( + pretrained if tokenizer is None else tokenizer, + revision=revision, + trust_remote_code=trust_remote_code, + use_fast=use_fast_tokenizer, + ) + + neuron_config = getattr(self._config, "neuron", None) + if neuron_config is None: + # Check export parameters + if tp_degree is not None: + assert isinstance(tp_degree, int), ( + f"tp_degree must be set to an integer," + f" but is tp_degree=`{tp_degree}` with type=`{type(tp_degree)}`." + "Set it to a number lower than the number of neuron cores on your instance." + " For inf2.xlarge and inf2.8xlarge, set it to `2`." + " For inf2.24xlarge, set it <= `12`." + " For inf2.48xlarge, set it <= `24`." + ) + torch_dtype = lm_eval.models.utils.get_dtype(dtype) + + if torch_dtype == torch.float16: + self.amp_dtype = "f16" + elif torch_dtype == torch.bfloat16: + self.amp_dtype = "bf16" + elif torch_dtype == torch.float32: + self.amp_dtype = "f32" + else: + raise NotImplementedError( + "Only float16/bfloat16/float32 are supported." + ) + + print(f"{'='*20} \n exporting model to neuron") + self.model = CustomNeuronModelForCausalLM.from_pretrained( + pretrained, + revision=revision, + trust_remote_code=trust_remote_code, + low_cpu_mem_usage=low_cpu_mem_usage, + export=True, + batch_size=batch_size, + num_cores=tp_degree, + auto_cast_type=self.amp_dtype, + sequence_length=max_length, + ) + neuron_config = self.model.config.neuron + print( + f"SUCCESS: neuron model exported with config {neuron_config}. \n {'='*20}" + ) + else: + print( + f"{'='*20} \n loading neuron model with config" f" {neuron_config}..." + ) + self.model = CustomNeuronModelForCausalLM.from_pretrained( + pretrained, + revision=revision, + trust_remote_code=trust_remote_code, + low_cpu_mem_usage=low_cpu_mem_usage, + ) + print(f"SUCCESS: neuron model loaded. \n {'='*20}") + + self.truncation = truncation + + self.vocab_size = self.tokenizer.vocab_size + self.tokenizer.pad_token_id = self.tokenizer.eos_token_id + self.add_bos_token = add_bos_token + + self.batch_schedule = 1 + self.batch_sizes = {} + + @property + def config(self): + # return the associated transformers.AutoConfig for the given pretrained model. + return self._config + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def prefix_token_id(self): + # it is used as prefix for loglikelihood + return self.tokenizer.bos_token_id or self.tokenizer.eos_token_id + + @property + def max_length(self): + return self.model.max_length + + @property + def max_gen_toks(self) -> int: + return 256 + + @property + def batch_size(self): + return self.batch_size_per_gpu + + @property + def device(self): + """device are neuron cores, but the created tensors are on CPU.""" + return "cpu" + + @property + def rank(self): + return 0 + + @property + def world_size(self): + return 1 + + def tok_encode(self, string: str, left_truncate_len=None, add_special_tokens=None): + """ """ + if add_special_tokens is None: + add_special_tokens = False or self.add_bos_token + + encoding = self.tokenizer.encode(string, add_special_tokens=add_special_tokens) + + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + encoding = encoding[-left_truncate_len:] + + return encoding + + def tok_batch_encode( + self, + strings: List[str], + padding_side: str = "left", + left_truncate_len: int = None, + truncation: bool = False, + ): + # encode a batch of strings. converts to tensors and pads automatically, unlike tok_encode. + old_padding_side = self.tokenizer.padding_side + self.tokenizer.padding_side = padding_side + + add_special_tokens = False or self.add_bos_token + + encoding = self.tokenizer( + strings, + truncation=truncation, + padding="longest", + return_tensors="pt", + add_special_tokens=add_special_tokens, + ) + if left_truncate_len: + encoding["input_ids"] = encoding["input_ids"][:, -left_truncate_len:] + encoding["attention_mask"] = encoding["attention_mask"][ + :, -left_truncate_len: + ] + self.tokenizer.padding_side = old_padding_side + + return encoding["input_ids"], encoding["attention_mask"] + + def tok_decode(self, tokens): + return self.tokenizer.decode(tokens) + + def _model_generate(self, context, max_length, stop, **generation_kwargs): + # we require users to pass do_sample=True explicitly + # for non-greedy gen. This should be reevaluated when considering beam search. + + with torch.inference_mode(): + if "do_sample" not in generation_kwargs.keys(): + generation_kwargs["do_sample"] = False + + stopping_criteria = stop_sequences_criteria( + self.tokenizer, + stop + [self.tokenizer.decode([self.config.eos_token_id])], + 1, + context.shape[0], + ) + + return self.model.generate( + input_ids=context, + max_length=max_length, + stopping_criteria=stopping_criteria, + pad_token_id=self.eot_token_id, + use_cache=True, + **generation_kwargs, + ) + + def _select_cont_toks(self, logits, contlen=None, inplen=None): + assert ( + contlen and inplen + ), "Must pass input len and cont. len to select scored logits for causal LM" + # discard right-padding. + # also discard the input/context tokens. we'll only score continuations. + logits = logits[inplen - contlen : inplen] + + return logits + + def loglikelihood_rolling(self, requests, disable_tqdm: bool = False): + loglikelihoods = [] + + adaptive_batch_size = None + + for (string,) in tqdm( + [req.args for req in requests], disable=(disable_tqdm or (self.rank != 0)) + ): + rolling_token_windows = list( + map( + utils.make_disjoint_window, + utils.get_rolling_token_windows( + token_list=self.tok_encode(string), + prefix_token=self.prefix_token_id, + max_seq_len=self.max_length, + context_len=1, + ), + ) + ) + + # TODO: Right now, we pass single EOT token to the Encoder and the full context to the decoder, in seq2seq case + rolling_token_windows = [(None,) + x for x in rolling_token_windows] + + pad_amnt = 0 + if self.world_size > 1: + # We pad out the external document-level iterator so the inner iterator doesn't hang + mytensor = torch.tensor(len(rolling_token_windows), device=self.device) + gathered = ( + self.accelerator.gather(mytensor).cpu().detach().numpy().tolist() + ) + + pad_amnt = max(gathered) - gathered[self.rank] + if pad_amnt > 0: + rolling_token_windows += pad_amnt * [rolling_token_windows[0]] + + string_nll = self._loglikelihood_tokens( + rolling_token_windows, + disable_tqdm=True, + override_bs=adaptive_batch_size, + ) + + if (self.world_size > 1) and (pad_amnt > 0): + string_nll = [x[0] for x in string_nll[:-pad_amnt]] + else: + # discard is_greedy + string_nll = [x[0] for x in string_nll] + + string_nll = sum(string_nll) + loglikelihoods.append(string_nll) + # cache this loglikelihood_rolling request + self.cache_hook.add_partial("loglikelihood_rolling", (string,), string_nll) + return loglikelihoods + + def _loglikelihood_tokens( + self, requests, disable_tqdm: bool = False, override_bs=None + ): + # TODO: implement some kind of efficient-request-middleware that lumps together requests with the same context + res = [] + + def _collate(x): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + + toks = x[1] + x[2] + return -len(toks), tuple(toks) + + re_ord = utils.Reorderer(requests, _collate) + + n_reordered_requests = len(re_ord.get_reordered()) # noqa + # automatic (variable) batch size detection for vectorization + # pull longest context sample from request + + chunks = lm_eval.models.utils.chunks( + re_ord.get_reordered(), + n=self.batch_size, + fn=None, + ) + + for chunk in tqdm(chunks, disable=(disable_tqdm or (self.rank != 0))): + inps = [] + cont_toks_list = [] + inplens = [] + + conts = [] # noqa + encoder_attns = [] # noqa + + padding_len_inp = None + padding_len_cont = None # noqa + # because vectorizing is annoying, we first convert each (context, continuation) pair to padded + # tensors, then we pack them together into a batch, call the model, and then pick it all apart + # again because vectorizing is annoying + + for _, context_enc, continuation_enc in chunk: + # sanity check + assert len(context_enc) > 0 + assert len(continuation_enc) > 0 + assert len(continuation_enc) <= self.max_length + + # how this all works (illustrated on a causal decoder-only setup): + # CTX CONT + # inp 0 1 2 3|4 5 6 7 8 9 <- last token is deleted by inp[:, :-1] + # model \ \ + # logits 1 2 3|4 5 6 7 8 9 <- the ctx half gets tossed out by the + # cont_toks 4 5 6 7 8 9 [:, -len(continuation_enc):, :self.vocab_size] slice + + # when too long to fit in context, truncate from the left + inp = torch.tensor( + (context_enc + continuation_enc)[-(self.max_length + 1) :][:-1], + dtype=torch.long, + device=self.device, + ) + (inplen,) = inp.shape + + padding_len_inp = ( + max(padding_len_inp, inplen) + if padding_len_inp is not None + else inplen + ) + + inps.append(inp) # [1, inp_length] + cont_toks_list.append(continuation_enc) + inplens.append(inplen) + + # Add dummy inputs up to the model static batch size + if len(inps) < self.batch_size: + inps = inps + [ + torch.zeros_like(inps[0]), + ] * (self.batch_size - len(inps)) + + masks = [torch.ones_like(inp) for inp in inps] + batched_inps = lm_eval.models.utils.pad_and_concat( + padding_len_inp, inps, padding_side="right" + ) # [batch, padding_len_inp] + + batched_masks = lm_eval.models.utils.pad_and_concat( + padding_len_inp, masks, padding_side="right" + ) + if self.model.model.neuron_config.output_all_logits: + inputs = self.model.prepare_inputs_for_prefill( + batched_inps, batched_masks + ) + multi_logits = F.log_softmax( + self.model.forward(**inputs).logits, dim=-1 + ) # [batch, padding_length (inp or cont), vocab] + else: + # The model will only return the logits for the last input token, so we need + # to iterate over inputs to accumulate logits. + # To speed things up we use the KV cache as we would do when generating. + inputs = self.model.prepare_inputs_for_prefill( + batched_inps[:, :1], batched_masks[:, :1] + ) + outputs = [self.model.forward(**inputs).logits] + for i in range(1, padding_len_inp): + inputs = self.model.prepare_inputs_for_decode( + batched_inps[:, : i + 1], batched_masks[:, : i + 1] + ) + outputs.append(self.model.forward(**inputs).logits) + multi_logits = F.log_softmax(torch.concat(outputs, dim=1), dim=-1) + + for (cache_key, _, _), logits, inplen, cont_toks in zip( + chunk, multi_logits, inplens, cont_toks_list + ): + # Slice to original seq length + contlen = len(cont_toks) + # take only logits in the continuation + # (discard context toks if decoder-only ; discard right-padding) + # also discards + checks for "virtual tokens" in the causal LM's input window + # from prompt/prefix tuning tokens, if applicable + ctx_len = inplen + (logits.shape[0] - padding_len_inp) + logits = self._select_cont_toks(logits, contlen=contlen, inplen=ctx_len) + logits = logits.unsqueeze(0) # [1, seq, vocab] + + # Check if per-token argmax is exactly equal to continuation + greedy_tokens = logits.argmax(dim=-1) + cont_toks = torch.tensor( + cont_toks, dtype=torch.long, device=self.device + ).unsqueeze(0) # [1, seq] + max_equal = (greedy_tokens == cont_toks).all() + + # Obtain log-probs at the corresponding continuation token indices + # last_token_slice = logits[:, -1, :].squeeze(0).tolist() + logits = torch.gather(logits, 2, cont_toks.unsqueeze(-1)).squeeze( + -1 + ) # [1, seq] + + # Answer: (log prob, is-exact-match) + answer = (float(logits.sum()), bool(max_equal)) + + res.append(answer) + + if cache_key is not None: + # special case: loglikelihood_rolling produces a number of loglikelihood requests + # all with cache key None. instead do add_partial on the per-example level + # in the loglikelihood_rolling() function for those. + self.cache_hook.add_partial("loglikelihood", cache_key, answer) + + return re_ord.get_original(res) + + def generate_until(self, requests, disable_tqdm: bool = False): + res = defaultdict(list) + re_ords = {} + + def _collate(x): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = self.tok_encode(x[0]) + return -len(toks), x[0] + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + grouper = lm_eval.models.utils.Grouper(requests, lambda x: str(x.args[1])) + for key, reqs in grouper.get_grouped().items(): + # within each set of reqs for given kwargs, we reorder by token length, descending. + re_ords[key] = utils.Reorderer([req.args for req in reqs], _collate) + + pbar = tqdm(total=len(requests), disable=(disable_tqdm or (self.rank != 0))) + + # for each different set of kwargs, we execute all requests, by batch. + for key, re_ord in re_ords.items(): + chunks = lm_eval.models.utils.chunks( + re_ord.get_reordered(), n=self.batch_size + ) + for chunk in tqdm(chunks, disable=self.rank != 0): + contexts, all_gen_kwargs = zip(*chunk) + # we assume all gen kwargs in the batch are the same + # this is safe to assume because the `grouper` object ensures it. + gen_kwargs = all_gen_kwargs[0] + # unpack our keyword arguments. + until = None + if isinstance(gen_kwargs, dict): + kwargs = copy.deepcopy(gen_kwargs) # edge case for repeats > 1 + if "until" in kwargs.keys(): + until = kwargs.pop("until") + if isinstance(until, str): + until = [until] + elif not isinstance(until, list): + raise ValueError( + f"Expected `kwargs['until']` to be of type Union[str,list] but got {until}" + ) + else: + raise ValueError( + f"Expected `kwargs` to be of type `dict` but got {kwargs}" + ) + # add EOS token to stop sequences + eos = self.tok_decode(self.eot_token_id) + if not until: + until = [eos] + else: + until.append(eos) + if "max_gen_toks" in kwargs.keys(): + max_gen_toks = kwargs.pop("max_gen_toks") + else: + max_gen_toks = self.max_gen_toks + # first stop sequence is used to halt generation upon encountering + primary_until = [until[0]] + + max_ctx_len = self.max_length - max_gen_toks + + # encode, pad, and truncate contexts for this batch + context_enc, attn_masks = self.tok_batch_encode( + contexts, + left_truncate_len=max_ctx_len, + truncation=self.truncation, + ) + context_enc = context_enc.to(self.device) + attn_masks = attn_masks.to(self.device) + + if "max_length" not in kwargs: + kwargs["max_length"] = context_enc.shape[1] + max_gen_toks + + # perform batched generation + cont = self._model_generate( + context=context_enc, + attention_mask=attn_masks, + stop=primary_until, + **kwargs, + ) + + cont_toks_list = cont.tolist() + for cont_toks, context in zip(cont_toks_list, contexts): + # discard context + left-padding toks if using causal decoder-only LM + cont_toks = cont_toks[context_enc.shape[1] :] + + s = self.tok_decode(cont_toks) + + # use secondary stop seqs to cut off should-have-been-stopped content post-hoc + for term in until: + if len(term) > 0: + # ignore '' separator, + # for seq2seq case where self.tok_decode(self.eot_token_id) = '' + s = s.split(term)[0] + + res[key].append(s) + + self.cache_hook.add_partial( + "generate_until", (context, gen_kwargs), s + ) + pbar.update(1) + # reorder this group of results back to original unsorted form + res[key] = re_ord.get_original(res[key]) + + pbar.close() + + return grouper.get_original(res) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/openai_completions.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/openai_completions.py new file mode 100644 index 0000000000000000000000000000000000000000..2f10316f754bdff488f9edfa04190d03a109c619 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/openai_completions.py @@ -0,0 +1,281 @@ +import os +from functools import cached_property +from typing import Any, Dict, List, Optional, Tuple, Union + +from lm_eval.api.registry import register_model +from lm_eval.models.api_models import TemplateAPI +from lm_eval.utils import eval_logger + + +@register_model("local-completions") +class LocalCompletionsAPI(TemplateAPI): + def __init__( + self, + base_url=None, + tokenizer_backend="huggingface", + **kwargs, + ): + super().__init__( + base_url=base_url, tokenizer_backend=tokenizer_backend, **kwargs + ) + + def _create_payload( + self, + messages: Union[List[List[int]], List[dict], List[str], str], + generate=False, + gen_kwargs: Optional[dict] = None, + seed: int = 1234, + **kwargs, + ) -> dict: + if generate: + gen_kwargs.pop("do_sample", False) + if "max_tokens" in gen_kwargs: + max_tokens = gen_kwargs.pop("max_tokens") + else: + max_tokens = gen_kwargs.pop("max_gen_toks", self._max_gen_toks) + temperature = gen_kwargs.pop("temperature", 0) + stop = gen_kwargs.pop("until", ["<|endoftext|>"]) + return { + "prompt": messages, + "model": self.model, + "max_tokens": max_tokens, + "temperature": temperature, + "stop": stop, + "seed": seed, + **gen_kwargs, + } + else: + return { + "model": self.model, + "prompt": messages, + "temperature": 0, + "max_tokens": 1, + "logprobs": 1, + "seed": seed, + "echo": True, + } + + @staticmethod + def parse_logprobs( + outputs: Union[Dict, List[Dict]], + tokens: List[List[int]] = None, + ctxlens: List[int] = None, + **kwargs, + ) -> List[Tuple[float, bool]]: + res = [] + if not isinstance(outputs, list): + outputs = [outputs] + for out in outputs: + for choice, ctxlen in zip(out["choices"], ctxlens): + assert ctxlen > 0, "Context length must be greater than 0" + logprobs = sum(choice["logprobs"]["token_logprobs"][ctxlen:-1]) + tokens_logprobs = choice["logprobs"]["token_logprobs"][ctxlen:-1] + top_logprobs = choice["logprobs"]["top_logprobs"][ctxlen:-1] + is_greedy = True + for tok, top in zip(tokens_logprobs, top_logprobs): + if tok != max(top.values()): + is_greedy = False + break + res.append((logprobs, is_greedy)) + return res + + @staticmethod + def parse_generations(outputs: Union[Dict, List[Dict]], **kwargs) -> List[str]: + res = [] + if not isinstance(outputs, list): + outputs = [outputs] + for out in outputs: + for choices in out["choices"]: + res.append(choices["text"]) + return res + + @property + def api_key(self): + return os.environ.get("OPENAI_API_KEY", "") + + +@register_model("local-chat-completions") +class LocalChatCompletion(LocalCompletionsAPI): + def __init__( + self, + base_url=None, + tokenizer_backend=None, + tokenized_requests=False, + **kwargs, + ): + eval_logger.warning( + "chat-completions endpoint requires the `--apply_chat_template` flag." + ) + super().__init__( + base_url=base_url, + tokenizer_backend=tokenizer_backend, + tokenized_requests=tokenized_requests, + **kwargs, + ) + if self._batch_size > 1: + eval_logger.warning( + "Chat completions does not support batching. Defaulting to batch size 1." + ) + self._batch_size = 1 + + def _create_payload( + self, + messages: List[Dict], + generate=False, + gen_kwargs: dict = None, + seed=1234, + **kwargs, + ) -> dict: + assert ( + type(messages) is not str + ), "chat-completions require the --apply_chat_template flag." + gen_kwargs.pop("do_sample", False) + if "max_tokens" in gen_kwargs: + max_tokens = gen_kwargs.pop("max_tokens") + else: + max_tokens = gen_kwargs.pop("max_gen_toks", self._max_gen_toks) + temperature = gen_kwargs.pop("temperature", 0) + stop = gen_kwargs.pop("until", ["<|endoftext|>"]) + if not isinstance(stop, (list, tuple)): + stop = [stop] + return { + "messages": messages, + "model": self.model, + "max_tokens": max_tokens, + "temperature": temperature, + "stop": stop[:4], + "seed": seed, + **gen_kwargs, + } + + @staticmethod + def parse_generations(outputs: Union[Dict, List[Dict]], **kwargs) -> List[str]: + res = [] + if not isinstance(outputs, list): + outputs = [outputs] + for out in outputs: + for choices in out["choices"]: + res.append(choices["message"]["content"]) + return res + + def tok_encode( + self, + string: Union[str, Any], + left_truncate_len=None, + add_special_tokens=None, + **kwargs, + ) -> Union[List[str], List[int], Any]: + return string + + def loglikelihood(self, requests, **kwargs): + raise NotImplementedError( + "Loglikelihood is not supported for chat completions. Consider using the completions API instead." + ) + + +@register_model( + "openai-completions", +) +class OpenAICompletionsAPI(LocalCompletionsAPI): + def __init__( + self, + base_url="https://api.openai.com/v1/completions", + tokenizer_backend="tiktoken", + **kwargs, + ): + super().__init__( + base_url=base_url, tokenizer_backend=tokenizer_backend, **kwargs + ) + + @cached_property + def api_key(self): + """Override this property to return the API key for the API request.""" + key = os.environ.get("OPENAI_API_KEY", None) + if key is None: + raise ValueError( + "API key not found. Please set the `OPENAI_API_KEY` environment variable." + ) + return key + + def loglikelihood(self, requests, **kwargs): + assert ( + self.model + in [ + "babbage-002", + "davinci-002", + ] + ), f"Prompt loglikelihoods are only supported by OpenAI's API for {['babbage-002', 'davinci-002']}." + return super().loglikelihood(requests, **kwargs) + + def chat_template(self, chat_template: Union[bool, str] = False) -> Optional[str]: + return "" + + +@register_model("openai-chat-completions") +class OpenAIChatCompletion(LocalChatCompletion): + def __init__( + self, + base_url="https://api.openai.com/v1/chat/completions", + tokenizer_backend=None, + tokenized_requests=False, + **kwargs, + ): + if "o1" in kwargs.get("model", ""): + eval_logger.warning( + "o1 models do not support `stop` and only support temperature=1" + ) + super().__init__( + base_url=base_url, + tokenizer_backend=tokenizer_backend, + tokenized_requests=tokenized_requests, + **kwargs, + ) + + @cached_property + def api_key(self): + """Override this property to return the API key for the API request.""" + key = os.environ.get("OPENAI_API_KEY", None) + if key is None: + raise ValueError( + "API key not found. Please set the `OPENAI_API_KEY` environment variable." + ) + return key + + def loglikelihood(self, requests, **kwargs): + raise NotImplementedError( + "Loglikelihood (and therefore `multiple_choice`-type tasks) is not supported for chat completions as OpenAI does not provide prompt logprobs. See https://github.com/EleutherAI/lm-evaluation-harness/issues/942#issuecomment-1777836312 or https://github.com/EleutherAI/lm-evaluation-harness/issues/1196 for more background on this limitation." + ) + + def _create_payload( + self, + messages: List[Dict], + generate=False, + gen_kwargs: dict = None, + seed=1234, + **kwargs, + ) -> dict: + assert ( + type(messages) is not str + ), "chat-completions require the --apply_chat_template flag." + gen_kwargs.pop("do_sample", False) + if "max_tokens" in gen_kwargs: + max_tokens = gen_kwargs.pop("max_tokens") + else: + max_tokens = gen_kwargs.pop("max_gen_toks", self._max_gen_toks) + temperature = gen_kwargs.pop("temperature", 0) + stop = gen_kwargs.pop("until", ["<|endoftext|>"]) + if not isinstance(stop, (list, tuple)): + stop = [stop] + output = { + "messages": messages, + "model": self.model, + "max_completion_tokens": max_tokens, + "temperature": temperature, + "stop": stop[:4], + "seed": seed, + **gen_kwargs, + } + if "o1" in self.model: + output.pop("stop") + output["temperature"] = 1 + return output diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/optimum_lm.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/optimum_lm.py new file mode 100644 index 0000000000000000000000000000000000000000..bd26239875e08e8153770ef43ac62558bf3acc12 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/optimum_lm.py @@ -0,0 +1,87 @@ +import json +from importlib.util import find_spec +from pathlib import Path + +from lm_eval import utils +from lm_eval.api.registry import register_model +from lm_eval.models.huggingface import HFLM + + +eval_logger = utils.eval_logger + + +@register_model("openvino") +class OptimumLM(HFLM): + """ + Optimum Intel provides a simple interface to optimize Transformer models and convert them to \ + OpenVINO™ Intermediate Representation (IR) format to accelerate end-to-end pipelines on \ + Intel® architectures using OpenVINO™ runtime. + + To use an OpenVINO config, use `--model_args ov_config` to point to a json file with an OpenVINO config: + `lm_eval --model openvino --model_args pretrained=gpt2,ov_config=config.json --task lambada_openai` + Example json file contents: {"INFERENCE_PRECISION_HINT": "f32", "CACHE_DIR": "model_cache"} + """ + + def __init__( + self, + device="cpu", + **kwargs, + ) -> None: + if "backend" in kwargs: + # optimum currently only supports causal models + assert ( + kwargs["backend"] == "causal" + ), "Currently, only OVModelForCausalLM is supported." + + self.openvino_device = device + + super().__init__( + device=self.openvino_device, + backend=kwargs.pop("backend", "causal"), + **kwargs, + ) + + def _create_model( + self, + pretrained: str, + revision="main", + dtype="auto", + trust_remote_code=False, + **kwargs, + ) -> None: + if not find_spec("optimum"): + raise ModuleNotFoundError( + "package `optimum` is not installed. Please install it via `pip install optimum[openvino]`" + ) + else: + from optimum.intel.openvino import OVModelForCausalLM + + model_kwargs = kwargs if kwargs else {} + if "ov_config" in model_kwargs: + if not Path(model_kwargs["ov_config"]).exists(): + raise ValueError( + "ov_config should point to a .json file containing an OpenVINO config" + ) + with open(model_kwargs["ov_config"]) as f: + model_kwargs["ov_config"] = json.load(f) + eval_logger.info( + f"Using custom OpenVINO config: {model_kwargs['ov_config']}" + ) + + else: + model_kwargs["ov_config"] = {} + model_kwargs["ov_config"].setdefault("CACHE_DIR", "") + model_file = Path(pretrained) / "openvino_model.xml" + if model_file.exists(): + export = False + else: + export = True + + self._model = OVModelForCausalLM.from_pretrained( + pretrained, + revision=revision, + trust_remote_code=trust_remote_code, + export=export, + device=self.openvino_device.upper(), + **model_kwargs, + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/textsynth.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/textsynth.py new file mode 100644 index 0000000000000000000000000000000000000000..a14f6287b6f11b21cfc69ca471bcbe99a631be12 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/textsynth.py @@ -0,0 +1,172 @@ +"""TextSynth API +Implementation provided by Fabrice Bellard: + https://github.com/EleutherAI/lm-evaluation-harness/issues/295 + +In order to use the API, you must have a valid TextSynth account and +enough credits. + +Example usage: + + python main.py --model textsynth --model_args engine=gptj_6B --no_cache --tasks piqa + +Homepage: https://textsynth.com/index.html +""" + +import logging +import os + +import requests as _requests +from tqdm import tqdm + +from lm_eval.api.model import LM +from lm_eval.api.registry import register_model +from lm_eval.models.utils import retry_on_specific_exceptions + + +logger = logging.getLogger(__name__) + + +def textsynth_completion(**kwargs): + """Query TextSynth API for completion. + Retry with back-off until they respond. + """ + + def _exception_callback(e: Exception, sleep_time: float) -> None: + import traceback + + traceback.print_exc() + + @retry_on_specific_exceptions( + on_exceptions=[_requests.exceptions.RequestException], + max_retries=None, # retry forever, consider changing + on_exception_callback=_exception_callback, + ) + def completion(): + return _requests.post(**kwargs) + + return completion() + + +@register_model("textsynth") +class TextSynthLM(LM): + def __init__(self, engine, truncate: bool = False, **kwargs) -> None: + """ + :param engine: str + TextSynth API engine (e.g. `gptj_6B`) + :param truncate: bool + Truncate input if too long (if False and input is too long, throw error) + """ + super().__init__() + + self.engine = engine + self.truncate = truncate + self.api_url = "https://api.textsynth.com" + # Read from environment variable TEXTSYNTH_API_SECRET_KEY + self.api_key = os.environ["TEXTSYNTH_API_SECRET_KEY"] + + @property + def eot_token_id(self): + # Isn't used because we override loglikelihood, loglikelihood_rolling and generate_until + raise NotImplementedError() + + @property + def max_length(self) -> int: + # NOTE: Turn on truncation to avoid errors on long inputs. + return 2048 + + @property + def max_gen_toks(self) -> int: + return 256 + + @property + def batch_size(self): + # Isn't used because we override loglikelihood, loglikelihood_rolling and generate_until + raise NotImplementedError() + + @property + def device(self): + # Isn't used because we override loglikelihood, loglikelihood_rolling and generate_until + raise NotImplementedError() + + def tok_encode(self, string: str): + # Isn't used because we override loglikelihood, loglikelihood_rolling and generate_until + raise NotImplementedError() + + def tok_decode(self, tokens): + # Isn't used because we override loglikelihood, loglikelihood_rolling and generate_until + raise NotImplementedError() + + def loglikelihood(self, requests, disable_tqdm: bool = False): + res = [] + for context, continuation in tqdm(requests, disable=disable_tqdm): + response = textsynth_completion( + url=self.api_url + "/v1/engines/" + self.engine + "/logprob", + headers={"Authorization": "Bearer " + self.api_key}, + json={"context": context, "continuation": continuation}, + ) + resp = response.json() + if "logprob" in resp: + logprob = resp["logprob"] + is_greedy = resp["is_greedy"] + res.append((logprob, is_greedy)) + + self.cache_hook.add_partial( + "loglikelihood", (context, continuation), (logprob, is_greedy) + ) + else: + logger.error( + f"The following response does not contain `logprobs`. Got:\n{resp}" + ) + assert False + return res + + def loglikelihood_rolling(self, requests, disable_tqdm: bool = False): + # TODO: The TextSynth API does not support tokenized inputs so we cannot + # manually partition long contexts into smaller rolling windows as + # done for other models derived from `BaseLM`. Override this method + # with a windowing scheme that works for direct string inputs. + raise NotImplementedError( + "`loglikelihood_rolling` is currently not supported due to lack of " + "input tokenization support from TextSynth." + ) + + def generate_until(self, requests, disable_tqdm: bool = False): + if not requests: + return [] + + res = [] + for request in tqdm(requests, disable=disable_tqdm): + inp = request[0] + request_args = request[1] + until = request_args["until"] + response = textsynth_completion( + url=self.api_url + "/v1/engines/" + self.engine + "/completions", + headers={"Authorization": "Bearer " + self.api_key}, + json={ + "prompt": inp, + "max_tokens": self.max_gen_toks, + "top_k": 1, + "stop": until, + }, + ) + resp = response.json() + if "text" in resp: + s = resp["text"] + res.append(s) + + self.cache_hook.add_partial("generate_until", (inp, request_args), s) + else: + logger.error( + "The following response does not contain generated `text`. " + "Got:\n{resp}" + ) + assert False + return res + + def _model_call(self, inps): + # Isn't used because we override _loglikelihood_tokens + raise NotImplementedError() + + def _model_generate(self, context, max_length, eos_token_id): + # Isn't used because we override generate_until + raise NotImplementedError() diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/utils.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..28ecc658544f26a7b13af546ac75dd4371264459 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/utils.py @@ -0,0 +1,711 @@ +import collections +import fnmatch +import gc +import itertools +import time +from functools import wraps +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + Iterator, + List, + Literal, + Optional, + Tuple, + Type, + Union, +) + +import torch +import transformers + +from lm_eval.utils import eval_logger + + +if TYPE_CHECKING: + from transformers import PreTrainedTokenizerBase + from transformers.configuration_utils import PretrainedConfig + + +def chunks(iter, n: int = 0, fn=None): + """ + Divides an iterable into chunks of specified size or based on a given function. + Useful for batching + + Parameters: + - iter: The input iterable to be divided into chunks. + - n: An integer representing the size of each chunk. Default is 0. + - fn: A function that takes the current index and the iterable as arguments and returns the size of the chunk. Default is None. + + Returns: + An iterator that yields chunks of the input iterable. + + Example usage: + ``` + data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + for chunk in chunks(data, 3): + print(chunk) + ``` + Output: + ``` + [1, 2, 3] + [4, 5, 6] + [7, 8, 9] + [10] + ``` + """ + arr = [] + for i, x in enumerate(iter): + arr.append(x) + if len(arr) == (fn(i, iter) if fn else n): + yield arr + arr = [] + + if arr: + yield arr + + +class MultiChoice: + def __init__(self, choices) -> None: + self.choices = choices + + # Simple wildcard support (linux filename patterns) + def __contains__(self, values) -> bool: + for value in values.split(","): + if len(fnmatch.filter(self.choices, value)) == 0: + eval_logger.info("Available tasks to choose:") + for choice in self.choices: + eval_logger.info(f" - {choice}") + raise ValueError("'{}' is not in task list".format(value)) + return True + + def __iter__(self) -> Iterator: + for choice in self.choices: + yield choice + + +class Grouper: + """ + takes an array `arr` and function `fn` and returns a dictionary + with keys fn(ob) for each ob in `arr` and with values `self.arr[key]` a list of all + objects in `arr` satisfying `key == fn(ob)`. + """ + + def __init__(self, arr, fn) -> None: + # self.orig_arr = arr + self.size = len(arr) + arr = list(enumerate(arr)) + + def group_return_dict(arr, fn): + res = collections.defaultdict(list) + + for ob in arr: + res[fn(ob)].append(ob) + return res + + arr = group_return_dict(arr, lambda x: fn(x[1])) + + # self.arr has format Dict[Tuple[int, ]] + self.arr = arr + self._grouped = None + + def get_grouped(self): + # return the contents but not indices for our grouped dict. + if self._grouped: + return self._grouped + grouped = {} + for key in self.arr.keys(): + # drop the index from each element of self.arr + grouped[key] = [y[1] for y in self.arr[key]] + self._grouped = grouped + return grouped + + def get_original(self, grouped_dict): + # take in a grouped dictionary with e.g. results for each key listed + # in the same order as the instances in `self.arr`, and + # return the results in the same (single list) order as `self.orig_arr`. + res = [None] * self.size + cov = [False] * self.size + # orig = [None] * self.size + + assert grouped_dict.keys() == self.arr.keys() + + for key in grouped_dict.keys(): + for (ind, _), v in zip(self.arr[key], grouped_dict[key]): + res[ind] = v + cov[ind] = True + # orig[ind] = _ + + assert all(cov) + # assert orig == self.orig_arr + + return res + + +def pad_and_concat( + max_length: int, + tensors: List[torch.Tensor], + padding_side: Literal["right", "left"] = "right", +): + """ + Method for padding a list of tensors given the maximum tensor + length in the batch. Used for batching inputs and continuations in + seq2seq models. + """ + assert ( + padding_side == "left" or padding_side == "right" + ), f"Unrecognized padding type: '{padding_side}' not 'left' or 'right'" + + for i, tensor in enumerate(tensors): + if len(tensor.shape) == 2: + tensor = tensor.squeeze(0) # squeeze, in case passed [1, seq] size + tensor_len = tensor.shape[0] + if tensor_len < max_length: + if padding_side == "right": + # right-pad + tensors[i] = torch.cat( + [ + tensor, # [seq] + torch.zeros( + max_length - tensor_len, + dtype=torch.long, + device=tensor.device, + ), # [padding_length - seq] + ], + dim=0, + ).unsqueeze(0) + else: + # left-pad + tensors[i] = torch.cat( + [ + torch.zeros( + max_length - tensor_len, + dtype=torch.long, + device=tensor.device, + ), # [padding_length - seq] + tensor, # [seq] + ], + dim=0, + ).unsqueeze(0) + else: + tensors[i] = tensor.unsqueeze(0) + + return torch.cat(tensors, dim=0) + + +def clear_torch_cache() -> None: + gc.collect() + torch.cuda.empty_cache() + + +def get_dtype(dtype: Union[str, torch.dtype]) -> torch.dtype: + """Converts `dtype` from `str` to torch.dtype when possible. Does not use an instantiated HF AutoConfig""" + if isinstance(dtype, str) and dtype != "auto": + # Convert `str` args torch dtype: `float16` -> `torch.float16` + _torch_dtype = getattr(torch, dtype) + else: + _torch_dtype = dtype + return _torch_dtype + + +class MultiTokenEOSCriteria(transformers.StoppingCriteria): + """Criteria to stop on the specified multi-token sequence.""" + + def __init__( + self, + sequence: str, + tokenizer: transformers.PreTrainedTokenizer, + initial_decoder_input_length: int, + batch_size: int, + ) -> None: + self.initial_decoder_input_length = initial_decoder_input_length + self.done_tracker = [False] * batch_size + self.sequence = sequence + self.sequence_ids = tokenizer.encode(sequence, add_special_tokens=False) + # print(sequence, self.sequence_ids) + # we look back for 2 more tokens than it takes to encode our stop sequence + # because tokenizers suck, and a model might generate `['\n', '\n']` but our `sequence` is `['\n\n']` + # and we don't want to mistakenly not stop a generation because our + # (string) stop sequence was output in a different tokenization + + # NOTE: there is a minor danger that this will end up looking back 2 tokens into the past, into the inputs to the model, + # and stopping generation immediately as a result. With only 2 extra tokens of lookback, this risk is minimized + # Additionally, in lookback_ids_batch we should prevent ever looking back into the inputs as described. + self.sequence_id_len = len(self.sequence_ids) + 2 + self.tokenizer = tokenizer + + def __call__(self, input_ids, scores, **kwargs) -> bool: + # For efficiency, we compare the last n tokens where n is the number of tokens in the stop_sequence + lookback_ids_batch = input_ids[:, self.initial_decoder_input_length :] + + lookback_ids_batch = lookback_ids_batch[:, -self.sequence_id_len :] + + lookback_tokens_batch = self.tokenizer.batch_decode(lookback_ids_batch) + + for i, done in enumerate(self.done_tracker): + if not done: + self.done_tracker[i] = self.sequence in lookback_tokens_batch[i] + return False not in self.done_tracker + + +def stop_sequences_criteria( + tokenizer: transformers.PreTrainedTokenizer, + stop_sequences: List[str], + initial_decoder_input_length: int, + batch_size: int, +) -> transformers.StoppingCriteriaList: + return transformers.StoppingCriteriaList( + [ + *[ + MultiTokenEOSCriteria( + sequence, tokenizer, initial_decoder_input_length, batch_size + ) + for sequence in stop_sequences + ], + ] + ) + + +def undistribute(iterable): + """ + Undoes https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.distribute . + + Re-interleaves results that have been split using more_itertools.distribute: + >>> group_1, group_2 = distribute(2, [1, 2, 3, 4, 5, 6]) + >>> list(group_1) + [1, 3, 5] + >>> list(group_2) + [2, 4, 6] + >>> undistribute([group_1, group_2]) + [1, 2, 3, 4, 5, 6] + + Handles non-uniform component lengths: + + >>> children = distribute(3, [1, 2, 3, 4, 5, 6, 7]) + >>> [list(c) for c in children] + [[1, 4, 7], [2, 5], [3, 6]] + >>> undistribute(children) + [1, 2, 3, 4, 5, 6, 7] + + Also handles when some iterables are empty: + + >>> children = distribute(5, [1, 2, 3]) + >>> [list(c) for c in children] + [[1], [2], [3], [], []] + >>> undistribute(children) + [1, 2, 3] + + """ + + return [ + x + for x in itertools.chain.from_iterable( + itertools.zip_longest(*[list(x) for x in iterable]) + ) + if x is not None + ] + + +def retry_on_specific_exceptions( + on_exceptions: List[Type[Exception]], + max_retries: Optional[int] = None, + backoff_time: float = 3.0, + backoff_multiplier: float = 1.5, + on_exception_callback: Optional[Callable[[Exception, float], Any]] = None, +): + """Retry on an LLM Provider's rate limit error with exponential backoff + For example, to use for OpenAI, do the following: + ``` + from openai import RateLimitError + + # Recommend specifying max_retries to avoid infinite loops! + @retry_on_specific_exceptions([RateLimitError], max_retries=3) + def completion(...): + # Wrap OpenAI completion function here + ... + ``` + """ + + def decorator(func: Callable): + @wraps(func) + def wrapper(*args, **kwargs): + sleep_time = backoff_time + attempt = 0 + while max_retries is None or attempt < max_retries: + try: + return func(*args, **kwargs) + except tuple(on_exceptions) as e: + if on_exception_callback is not None: + on_exception_callback(e, sleep_time) + time.sleep(sleep_time) + sleep_time *= backoff_multiplier + attempt += 1 + + return wrapper + + return decorator + + +class Collator: + """ + A class for reordering and batching elements of an array. + + This class allows for sorting an array based on a provided sorting function, grouping elements based on a grouping function, and generating batches from the sorted and grouped data. + + Objects of this class have the group_by attribute which determines the method for grouping + the data while batching it. Three options include "gen_kwargs", "contexts", or None: + If group_by == "gen_kwargs" then requests will be grouped by gen_kwargs + If group_by == "contexts" then requests will be grouped by context + cont[:-1] + If None then requests will just be reordered by length descending. + """ + + def __init__( + self, + arr: List, + sort_fn: Callable = lambda x: x, + group_fn: Callable = lambda x: x[1], + group_by: Union[Literal["gen_kwargs", "contexts"], None] = None, + ) -> None: + self._group_by = group_by + # 0 indices are enumerated indices. Apply functions to original arr. + self._sort_fn = lambda x: sort_fn(x[1]) + self._group_fn = lambda x: group_fn(x[1]) + self._reorder_indices: List = [] + self._size = len(arr) + self._arr_with_indices: Union[Dict, Tuple[Tuple[int, Any], ...]] = tuple( + enumerate(arr) + ) # [indices, (arr)] + if self._group_by == "contexts": + self._group_by_context() + elif self._group_by == "gen_kwargs": + self._group_by_index() + + def _group_by_index(self) -> None: + """Group the elements of a list based on their indices.""" + self._arr_with_indices = self.group( + self._arr_with_indices, fn=self._group_fn, group_by="gen_kwargs" + ) + + def _group_by_context(self) -> None: + """Group the array with indices by context.""" + self._arr_with_indices = self.group( + self._arr_with_indices, fn=self._group_fn, group_by="contexts" + ) + + def get_batched(self, n: int = 1, batch_fn: Optional[Callable] = None) -> Iterator: + """ + Generates and yields batches from the reordered array. The method of grouping and batching + depends on the parameter `group_by`. + If `group_by` is set to "gen_kwargs", it will batch the + re-ordered values with same gen_kwargs for each batch. + If `group_by` is "contexts", it caches the requests by context before batching. + If `group_by` is neither "gen_kwargs" nor "contexts", it yields the reordered array + + Parameters: + - n (int): The size of each batch. Defaults to 1. + - batch_fn ([Callable[[int, Iterable], int]] | None): A function to determine the size of + each batch. Optional, defaults to None. + + Returns: + Iterator: An iterator over batches of reordered elements grouped as per the `group_by` + attribute. + + Yields: + List of batched elements according to the `group_by` attribute. + """ + if self._group_by == "gen_kwargs": + for ( + key, + values, + ) in self._arr_with_indices.items(): # type: ignore + values = self._reorder(values) + batch = self.get_chunks(values, n=n, fn=batch_fn) + yield from batch + elif self._group_by == "contexts": + # Get one sample from each key + values = self._reorder( + [value[0] for value in self._arr_with_indices.values()] + ) + batch = self.get_chunks(values, n=n, fn=batch_fn) + yield from batch + else: + values = self._reorder(self._arr_with_indices) # type: ignore + batch = self.get_chunks(values, n=n, fn=batch_fn) + yield from batch + + def get_cache( + self, + req_str: Tuple[str, str] = None, + cxt_toks: List[int] = None, + cont_toks: List[int] = None, + logits: torch.Tensor = None, + ) -> Iterator[Tuple[Tuple[str, str], List[int], torch.Tensor]]: + """ + Retrieves cached single-token continuations and their associated arguments, updating indices as necessary. + + The behavior of this function varies depending on how the `group_by` attribute is set: + + - When `group_by` is "contexts": + The function identifies single-token continuations by checking for keys that equate to + [context+continuation][-1] and logs the indices for re-ordering. + In this mode, this function can work in two scenarios: + + 1. Cache Hit - Single Match: + If a single matching context-continuation pair is found in the cache, + the function yields the original arguments. + + 2. Cache Hit - Multiple Matches: + If multiple matching context-continuation pairs are found in the cache, + the function expands the logits batch dimension to match the number of cache hits. + It updates the original requests and continuation tokens. + + - When `group_by` is not set to "contexts": + This method yields the original arguments, logits and continuation tokens, + without checking for one-token continuations. + + Parameters: + - req_str (tuple[str, str]): Original strings used for CachingLM. + - cxt_toks (list[int]): Full context tokens used for lookup. + - cont_toks (list[int]): Continuation tokens for which logits were generated. + - logits (torch.Tensor [1, seq_length, vocab_size]): Logits generated by the model given context and continuation keys. + + Yields: + - Iterator: + - req_str (tuple[str, str]): strings used for CachingLM. + - cont_toks (list[int]) : continuation tokens. + - logits (torch.Tensor [1, seq_length, vocab_size]): The original logits (repeated cache hit times) + """ + if self._group_by == "contexts": + cache_hit: List[ + Tuple[int, Tuple[Tuple[str, str], List[int], List[int]]] + ] = self._arr_with_indices.pop(tuple(cxt_toks + cont_toks[:-1])) + if (cache_size := len(cache_hit)) == 1: + self._reorder_indices.extend(x[0] for x in cache_hit) + yield req_str, cont_toks, logits + else: + # If we have matching requests then expand the batch dimension (no-op) and + # yield each along with its corresponding args. + multilogits = logits.expand(cache_size, -1, -1).chunk(cache_size) + indices, req_str, cont_toks = zip( + *[(x[0], x[1][0], x[-1][-1]) for x in cache_hit] + ) + self._reorder_indices.extend(indices) + for c_key, cont_tok, logit in zip(req_str, cont_toks, multilogits): + yield c_key, cont_tok, logit + else: + yield req_str, cont_toks, logits + + def _reorder(self, arr: Union[List, Tuple[Tuple[int, Any], ...]]) -> Iterator: + """ + Reorders the elements in the array based on the sorting function. + + Parameters: + - arr (list | tuple[tuple[int, Any], ...]]): The array or iterable to be reordered. + + Yields: + Iterator + """ + arr = sorted(arr, key=self._sort_fn) + if not self._group_by == "contexts": + # If grouped by contexts then indices will be set in get_cache() + self._reorder_indices.extend([x[0] for x in arr]) + yield from [x[1] for x in arr] + + def get_original(self, newarr: List) -> List: + """ + Restores the original order of elements from the reordered list. + + Parameters: + - newarr (list): The reordered array. + + Returns: + list: The array with elements restored to their original order. + """ + res = [None] * self._size + cov = [False] * self._size + + for ind, v in zip(self._reorder_indices, newarr): + res[ind] = v + cov[ind] = True + + assert all(cov) + + return res + + def __len__(self): + return self._size + + @staticmethod + def group( + arr: Iterable, + fn: Callable, + group_by: Literal["gen_kwargs", "contexts"] = "gen_kwargs", + ) -> dict: + """ + Groups elements of an iterable based on a provided function. + + + The `group_by` parameter determines the method of grouping. + If `group_by` is "contexts", the elements are grouped by [context + cont][:-1]. + If `group_by` is "gen_kwargs", the elements are grouped based on the gen_kwargs dict. + + Parameters: + - arr (Iterable): The iterable to be grouped. + - fn (Callable): The function to determine the grouping. + - values (bool): If True, returns the values of the group. Defaults to False. + + Returns: + Iterator: An iterable of grouped elements. + """ + res = collections.defaultdict(list) + for ob in arr: + # where ob == [context + cont] + if group_by == "contexts": + res[tuple(fn(ob))].append(ob) + else: + try: + hashable_dict = tuple( + ( + key, + tuple(value) + if isinstance(value, collections.abc.Iterable) + else value, + ) + for key, value in sorted(fn(ob).items()) + ) + res[hashable_dict].append(ob) + except (TypeError, AttributeError): + res[tuple(fn(ob))].append(ob) + return res + + @staticmethod + def get_chunks(_iter, n: int = 0, fn=None): + """ + Divides an iterable into chunks of specified size or based on a given function. + Useful for batching + + Parameters: + - iter: The input iterable to be divided into chunks. + - n: An integer representing the size of each chunk. Default is 0. + - fn: A function that takes the current index and the iterable as arguments and returns the size of the chunk. Default is None. + + Returns: + An iterator that yields chunks of the input iterable. + + Example usage: + ``` + data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + for chunk in chunks(data, 3): + print(chunk) + ``` + Output: + ``` + [1, 2, 3] + [4, 5, 6] + [7, 8, 9] + [10] + ``` + """ + arr = [] + _iter = tuple(_iter) + for i, x in enumerate(_iter): + arr.append(x) + if len(arr) == (fn(i, _iter) if fn else n): + yield arr + arr = [] + + if arr: + yield arr + + +def configure_pad_token( + tokenizer: "PreTrainedTokenizerBase", + model_config: Optional["PretrainedConfig"] = None, +) -> "PreTrainedTokenizerBase": + """ + This function checks if the (Hugging Face) tokenizer has a padding token and sets it if not present. + Some tokenizers require special handling. + + Args: + tokenizer: The tokenizer for which the padding token is to be handled. + model_config: The configuration of the model. Default is None. + + Returns: + The tokenizer after the padding token has been handled. + + Raises: + AssertionError: If the tokenizer is of type RWKVWorldTokenizer or Rwkv5Tokenizer and the padding token id is not 0. + """ + if tokenizer.pad_token: + pass + elif tokenizer.unk_token: + tokenizer.pad_token_id = tokenizer.unk_token_id + elif tokenizer.eos_token: + tokenizer.pad_token_id = tokenizer.eos_token_id + else: + # handle special cases + if model_config and getattr(model_config, "model_type", None) == "qwen": + # Qwen's trust_remote_code tokenizer does not allow for adding special tokens + tokenizer.pad_token = "<|endoftext|>" + elif ( + tokenizer.__class__.__name__ == "RWKVWorldTokenizer" + or tokenizer.__class__.__name__ == "Rwkv5Tokenizer" + ): + # The RWKV world tokenizer, does not allow for adding special tokens / setting the pad token (which is set as 0) + # The additional tokenizer name check is needed, as there exists rwkv4 models with neox tokenizer + # --- + # Note that the world tokenizer class name, might change in the future for the final huggingface merge + # https://github.com/huggingface/transformers/pull/26963 + assert tokenizer.pad_token_id == 0 + else: + tokenizer.add_special_tokens({"pad_token": "<|pad|>"}) + + return tokenizer + + +def replace_placeholders( + string: str, default_placeholder: str, image_token: str, max_images: int +): + """ + A utility function used for local multimodal models. It locates all `placeholder` string + occurrences in the given input `string_` and replaces the first `max_count` instances with + `replacement`, and all subsequent occurrences with the empty string. + + This is used to replace placeholder tags by model-specific image tokens like <|image_pad|> + and to allow for only the first `max_count` images to be passed to a model if desired. + + :param string: The original string containing placeholders. + :param default_placeholder: The placeholder text to be replaced. + :param image_token: The token to replace the placeholder with. + :param max_images: The maximum number of replacements to make. + :return: The string with placeholders replaced. + """ + count = 0 + result = [] + + parts = string.split(default_placeholder) + for part in parts[:-1]: # Iterate through all but the last part + result.append(part) + if count < max_images: + result.append(image_token) + count += 1 + elif default_placeholder != image_token: + result.append(default_placeholder) + + # Add the last part of the string + result.append(parts[-1]) + return "".join(result) + + +def flatten_image_list(images: List[List]): + """ + Takes in a list of lists of images, and returns a single list of all images in order. + Used for some multimodal models like Llava-1.5 which expects this flattened-list format for its image processor. + + :param images: A list of lists of PIL images. + :return: a list of PIL images, via concatenating all the sub-lists in order. + """ + return [image for image_list in images for image in image_list] diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/vllm_causallms.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/vllm_causallms.py new file mode 100644 index 0000000000000000000000000000000000000000..b9ee6f92b788d0378f8259309417e9dce8fdf2c9 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/vllm_causallms.py @@ -0,0 +1,542 @@ +import copy +from importlib.metadata import version +from importlib.util import find_spec +from typing import TYPE_CHECKING, Dict, List, Literal, Optional, Tuple, Union + +from more_itertools import distribute +from packaging.version import parse as parse_version +from tqdm import tqdm + +from lm_eval.api.instance import Instance +from lm_eval.api.model import TemplateLM +from lm_eval.api.registry import register_model +from lm_eval.models.utils import Collator, configure_pad_token, undistribute +from lm_eval.utils import ( + eval_logger, + get_rolling_token_windows, + make_disjoint_window, +) + + +try: + import ray + from vllm import LLM, SamplingParams + from vllm.lora.request import LoRARequest + from vllm.transformers_utils.tokenizer import get_tokenizer +except ModuleNotFoundError: + pass + +if TYPE_CHECKING: + pass + +eval_logger = eval_logger + + +@register_model("vllm") +class VLLM(TemplateLM): + _DEFAULT_MAX_LENGTH = 2048 + + def __init__( + self, + pretrained: str, + dtype: Literal["float16", "bfloat16", "float32", "auto"] = "auto", + revision: Optional[str] = None, + trust_remote_code: Optional[bool] = False, + tokenizer: Optional[str] = None, + tokenizer_mode: Literal["auto", "slow"] = "auto", + tokenizer_revision: Optional[str] = None, + add_bos_token: Optional[bool] = False, + prefix_token_id: Optional[int] = None, + tensor_parallel_size: int = 1, + quantization: Optional[str] = None, + max_gen_toks: int = 256, + swap_space: int = 4, + batch_size: Union[str, int] = 1, + max_batch_size=None, + max_length: int = None, + max_model_len: int = None, + seed: int = 1234, + gpu_memory_utilization: float = 0.9, + device: str = "cuda", + data_parallel_size: int = 1, + lora_local_path: str = None, + **kwargs, + ): + super().__init__() + + if not find_spec("vllm"): + raise ModuleNotFoundError( + "attempted to use 'vllm' LM type, but package `vllm` is not installed. " + "Please install vllm via `pip install lm-eval[vllm]` or `pip install -e .[vllm]`" + ) + + assert "cuda" in device or device is None, "vLLM only supports CUDA" + assert ( + max_length is None or max_model_len is None + ), "Either max_length or max_model_len may be provided, but not both" + + self._max_length = max_model_len if max_model_len is not None else max_length + self.tensor_parallel_size = int(tensor_parallel_size) + self.data_parallel_size = int(data_parallel_size) + self.model_args = { + "model": pretrained, + "gpu_memory_utilization": float(gpu_memory_utilization), + "revision": revision, + "dtype": dtype, + "tokenizer": tokenizer, + "tokenizer_mode": tokenizer_mode, + "tokenizer_revision": tokenizer_revision, + "trust_remote_code": trust_remote_code, + "tensor_parallel_size": int(tensor_parallel_size), + "max_model_len": int(self._max_length) if self._max_length else None, + "swap_space": int(swap_space), + "quantization": quantization, + "seed": int(seed), + } + self.model_args.update(kwargs) + self.batch_size = ( + "auto" + if isinstance(batch_size, str) and "auto" in batch_size + else batch_size + ) + if self.data_parallel_size <= 1: + self.model = LLM(**self.model_args) + else: + eval_logger.warning( + "You might experience occasional issues with model weight downloading when data_parallel is in use. To ensure stable performance, run with data_parallel_size=1 until the weights are downloaded and cached." + ) + self.model_args["worker_use_ray"] = True + self.batch_size = "auto" + eval_logger.info("Manual batching is not compatible with data parallelism.") + + from transformers import AutoConfig + + self._config = AutoConfig.from_pretrained( + pretrained, trust_remote_code=trust_remote_code, revision=revision + ) + self.tokenizer = get_tokenizer( + tokenizer if tokenizer else pretrained, + tokenizer_mode=tokenizer_mode, + trust_remote_code=trust_remote_code, + revision=tokenizer_revision, + ) + self.tokenizer = configure_pad_token(self.tokenizer) + self.add_bos_token = add_bos_token + if "gemma" in pretrained.lower(): + self.add_bos_token = True + eval_logger.info( + "Found 'gemma' in model name, a BOS token will be used as Gemma series models underperform without it." + ) + + self.custom_prefix_token_id = prefix_token_id + if prefix_token_id is not None: + eval_logger.info( + f"Loglikelihood prefix token id used in evaluation: {self.prefix_token_id}" + ) + + self._max_gen_toks = max_gen_toks + + if lora_local_path is not None: + assert parse_version(version("vllm")) > parse_version( + "0.3.0" + ), "lora adapters only compatible with vllm > v0.3.0." + self.lora_request = LoRARequest("finetuned", 1, lora_local_path) + else: + self.lora_request = None + + @property + def eot_token_id(self): + # we use EOT because end of *text* is more accurate for what we're doing than end of *sentence* + return self.tokenizer.eos_token_id + + @property + def prefix_token_id(self): + # it is used as prefix for loglikelihood + if self.custom_prefix_token_id is not None: + return self.custom_prefix_token_id + if self.tokenizer.bos_token_id is not None: + return self.tokenizer.bos_token_id + return self.tokenizer.eos_token_id + + @property + def max_length(self): + if self._max_length: # if max length manually set, return it + return self._max_length + if self.data_parallel_size <= 1: + return self.model.llm_engine.model_config.max_model_len + else: + seqlen_config_attrs = ("n_positions", "max_position_embeddings", "n_ctx") + for attr in seqlen_config_attrs: + if hasattr(self._config, attr): + return getattr(self._config, attr) + if hasattr(self.tokenizer, "model_max_length"): + if self.tokenizer.model_max_length == 1000000000000000019884624838656: + return self._DEFAULT_MAX_LENGTH + return self.tokenizer.model_max_length + return self._DEFAULT_MAX_LENGTH + + @property + def max_gen_toks(self): + return self._max_gen_toks + + def apply_chat_template(self, chat_history: List[Dict[str, str]]) -> str: + """ + Method to apply a chat template to a list of chat history between user and model. + """ + return self.tokenizer.apply_chat_template( + chat_history, tokenize=False, add_generation_prompt=True + ) + + @property + def tokenizer_name(self) -> str: + return self.tokenizer.name_or_path.replace("/", "__") + + def tok_encode( + self, + string: Union[str, List[str]], + left_truncate_len: int = None, + add_special_tokens: bool = False, + truncation: bool = False, + ) -> Union[List[int], List[List[int]]]: + if not add_special_tokens: + add_special_tokens = False or self.add_bos_token + encoding: Union[List[List[int]], List[int]] = self.tokenizer( + string, + add_special_tokens=add_special_tokens, + truncation=truncation, + return_attention_mask=False, + ).input_ids + + # left-truncate the encoded context to be at most `left_truncate_len` tokens long + if left_truncate_len: + if not isinstance(string, str): + encoding = [enc[-left_truncate_len:] for enc in encoding] + else: + encoding = encoding[-left_truncate_len:] + + return encoding + + def _model_generate( + self, + requests: List[List[int]] = None, + generate: bool = False, + max_tokens: int = None, + stop: Optional[List[str]] = None, + **kwargs, + ): + if generate: + kwargs = self.modify_gen_kwargs(kwargs) + sampling_params = SamplingParams(max_tokens=max_tokens, stop=stop, **kwargs) + else: + sampling_params = SamplingParams( + temperature=0, prompt_logprobs=1, max_tokens=1, detokenize=False + ) + if self.data_parallel_size > 1: + # vLLM hangs if tensor_parallel > 1 and resources are set in ray.remote + # also seems to only work with decorator and not with ray.remote() fn + # see https://github.com/vllm-project/vllm/issues/973 + # note: this has changed on 0.3.3, and it only works now if num_gpus are set. + # but then tensor_parallel breaks + @ray.remote + def run_inference_one_model( + model_args: dict, + sampling_params, + requests: List[List[int]], + lora_request: LoRARequest, + ): + llm = LLM(**model_args) + return llm.generate( + prompt_token_ids=requests, + sampling_params=sampling_params, + lora_request=lora_request, + ) + + # dispatch requests to all self.data_parallel_size workers, in interleaved fashion + # interleaved important to balance context lengths across workers + requests = [list(x) for x in distribute(self.data_parallel_size, requests)] + inputs = ( + (self.model_args, sampling_params, req, self.lora_request) + for req in requests + ) + object_refs = [run_inference_one_model.remote(*x) for x in inputs] + results = ray.get(object_refs) + # Invoke ray.shutdown() to prevent hang-ups if subsequent calls required. + ray.shutdown() + # flatten results + return undistribute(results) + + outputs = self.model.generate( + prompt_token_ids=requests, + sampling_params=sampling_params, + use_tqdm=True if self.batch_size == "auto" else False, + lora_request=self.lora_request, + ) + return outputs + + def loglikelihood_rolling( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[float]: + loglikelihoods = [] + + for (string,) in tqdm([req.args for req in requests], disable=disable_tqdm): + rolling_token_windows = list( + map( + make_disjoint_window, + get_rolling_token_windows( + token_list=self.tok_encode(string), + prefix_token=self.prefix_token_id, + # max_seq_len - (1 for context) + max_seq_len=self.max_length - 1, + context_len=1, + ), + ) + ) + + rolling_token_windows = [(None,) + x for x in rolling_token_windows] + + string_nll = self._loglikelihood_tokens( + rolling_token_windows, + ) + + # discard is_greedy + string_nll = [x[0] for x in string_nll] + + string_nll = sum(string_nll) + loglikelihoods.append(string_nll) + + # cache this loglikelihood_rolling request + self.cache_hook.add_partial("loglikelihood_rolling", (string,), string_nll) + + return loglikelihoods + + def generate_until( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[str]: + res = [] + + # batch tokenize contexts + context, all_gen_kwargs = zip(*(req.args for req in requests)) + context_encoding: List[List[int]] = self.tok_encode( + context, add_special_tokens=self.add_bos_token + ) + requests = [ + ((a, b), c) for a, b, c in zip(context, context_encoding, all_gen_kwargs) + ] + + def _collate_gen(_requests): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + return -len(_requests[0][1]), _requests[0][0] + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + re_ords = Collator(requests, _collate_gen, group_by="gen_kwargs") + chunks = re_ords.get_batched( + n=int(self.batch_size) if self.batch_size != "auto" else 0, batch_fn=None + ) + + pbar = tqdm( + total=len(requests), + disable=(disable_tqdm or (self.rank != 0)), + desc="Running generate_until requests", + ) + # for each different set of kwargs, we execute all requests, by batch. + for chunk in chunks: + context_and_encoding, all_gen_kwargs = zip(*chunk) + context, context_encoding = zip(*context_and_encoding) + # we assume all gen kwargs in the batch are the same + # this is safe to assume because the `grouper` object ensures it. + gen_kwargs = all_gen_kwargs[0] + # unpack our keyword arguments. + until = None + if isinstance(gen_kwargs, dict): + kwargs = copy.deepcopy(gen_kwargs) # edge case for repeats > 1 + if "until" in kwargs.keys(): + until = kwargs.pop("until") + if isinstance(until, str): + until = [until] + elif not isinstance(until, list): + raise ValueError( + f"Expected `kwargs['until']` to be of type Union[str,list] but got {until}" + ) + else: + raise ValueError( + f"Expected `kwargs` to be of type `dict` but got {gen_kwargs}" + ) + # add EOS token to stop sequences + eos = self.tokenizer.decode(self.eot_token_id) + if not until: + until = [eos] + else: + until.append(eos) + if "max_gen_toks" in kwargs.keys(): + max_gen_toks = kwargs.pop("max_gen_toks") + else: + max_gen_toks = self.max_gen_toks + + # set the max length in tokens of inputs ("context_enc") + # max len for inputs = max length, minus room to generate the max new tokens + max_ctx_len = self.max_length - max_gen_toks + context_encoding = [x[-max_ctx_len:] for x in context_encoding] + + # perform batched generation + cont = self._model_generate( + requests=context_encoding, + generate=True, + max_tokens=max_gen_toks, + stop=until, + **kwargs, + ) + + # cache generations + for output, context in zip(cont, context): + generated_text = output.outputs[0].text + res.append(generated_text) + self.cache_hook.add_partial( + "generate_until", (context, gen_kwargs), generated_text + ) + pbar.update(1) + + pbar.close() + # reorder all group of results back to original unsorted form + return re_ords.get_original(res) + + def _loglikelihood_tokens( + self, + requests: List[Tuple[Tuple[str, str], List[int], List[int]]], + disable_tqdm: bool = False, + ) -> List[Tuple[float, bool]]: + res = [] + + def _collate(x): + toks = x[1] + x[2] + return -len(toks), tuple(toks) + + # Reorder requests by length and batch + re_ord = Collator(requests, sort_fn=_collate) + chunks = re_ord.get_batched( + n=int(self.batch_size) if self.batch_size != "auto" else 0, batch_fn=None + ) + + pbar = tqdm( + total=len(requests), + disable=disable_tqdm, + desc="Running loglikelihood requests", + ) + for chunk in chunks: + inputs = [] + ctxlens = [] + for cache_key, context_enc, continuation_enc in chunk: + inp = (context_enc + continuation_enc)[-(self.max_length) :] + ctxlen = len(context_enc) - max( + 0, len(context_enc) + len(continuation_enc) - (self.max_length) + ) + + inputs.append(inp) + ctxlens.append(ctxlen) + + outputs = self._model_generate(requests=inputs, generate=False) + + for output, ctxlen, (cache_key, _, _), inp in zip( + outputs, ctxlens, chunk, inputs + ): + answer = self._parse_logprobs( + tokens=inp, + outputs=output, + ctxlen=ctxlen, + ) + + res.append(answer) + + if cache_key is not None: + # special case: loglikelihood_rolling produces a number of loglikelihood requests + # all with cache key None. instead do add_partial on the per-example level + # in the loglikelihood_rolling() function for those. + self.cache_hook.add_partial("loglikelihood", cache_key, answer) + pbar.update(1) + pbar.close() + return re_ord.get_original(res) + + @staticmethod + def _parse_logprobs(tokens: List, outputs, ctxlen: int) -> Tuple[float, bool]: + """Process logprobs and tokens. + + :param tokens: list + Input tokens (potentially left-truncated) + :param outputs: RequestOutput + Contains prompt_logprobs + :param ctxlen: int + Length of context (so we can slice them away and only keep the predictions) + :return: + continuation_logprobs: float + Log probabilities of continuation tokens + is_greedy: bool + Whether argmax matches given continuation exactly + """ + + # The first entry of prompt_logprobs is None because the model has no previous tokens to condition on. + continuation_logprobs_dicts = outputs.prompt_logprobs + + def coerce_logprob_to_num(logprob): + # vLLM changed the return type of logprobs from float + # to a Logprob object storing the float value + extra data + # (https://github.com/vllm-project/vllm/pull/3065). + # If we are dealing with vllm's Logprob object, return + # the logprob value stored as an attribute. Otherwise, + # return the object itself (which should be a float + # for older versions of vLLM). + return getattr(logprob, "logprob", logprob) + + continuation_logprobs_dicts = [ + { + token: coerce_logprob_to_num(logprob) + for token, logprob in logprob_dict.items() + } + if logprob_dict is not None + else None + for logprob_dict in continuation_logprobs_dicts + ] + + # Calculate continuation_logprobs + # assume ctxlen always >= 1 + continuation_logprobs = sum( + logprob_dict.get(token) + for token, logprob_dict in zip( + tokens[ctxlen:], continuation_logprobs_dicts[ctxlen:] + ) + ) + + # Determine if is_greedy + is_greedy = True + for token, logprob_dict in zip( + tokens[ctxlen:], continuation_logprobs_dicts[ctxlen:] + ): + # Get the token with the maximum log probability from the logprob_dict + if logprob_dict: # Ensure the logprob_dict is not None + top_token = max(logprob_dict, key=logprob_dict.get) + if top_token != token: + is_greedy = False + break + + return continuation_logprobs, is_greedy + + @staticmethod + def modify_gen_kwargs(kwargs: dict) -> dict: + # sampling_params + do_sample = kwargs.pop("do_sample", None) + if do_sample is False and "temperature" not in kwargs: + eval_logger.debug( + "Got `do_sample=False` and no temperature value, setting VLLM temperature to 0.0 ..." + ) + kwargs["temperature"] = 0.0 + # hf defaults + kwargs["skip_special_tokens"] = kwargs.get("skip_special_tokens", False) + kwargs["spaces_between_special_tokens"] = kwargs.get( + "spaces_between_special_tokens", False + ) + return kwargs diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/vllm_vlms.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/vllm_vlms.py new file mode 100644 index 0000000000000000000000000000000000000000..13a2a3ff4ca44429fee10d6511475581c1144c3c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/models/vllm_vlms.py @@ -0,0 +1,291 @@ +import copy +from typing import Dict, List, Optional + +import transformers +from more_itertools import distribute +from tqdm import tqdm + +from lm_eval.api.instance import Instance +from lm_eval.api.registry import register_model +from lm_eval.models.utils import Collator, replace_placeholders, undistribute +from lm_eval.models.vllm_causallms import VLLM +from lm_eval.utils import eval_logger + + +try: + import ray + from vllm import LLM, SamplingParams + from vllm.lora.request import LoRARequest # noqa: F401 + from vllm.transformers_utils.tokenizer import get_tokenizer # noqa: F401 +except ModuleNotFoundError: + pass + + +DEFAULT_IMAGE_PLACEHOLDER = "" + + +@register_model("vllm-vlm") +class VLLM_VLM(VLLM): + MULTIMODAL = True + + def __init__( + self, + pretrained: str, + trust_remote_code: Optional[bool] = False, + revision: Optional[str] = None, + interleave: bool = True, + # TODO: handle max_images and limit_mm_per_prompt better + max_images: int = 999, + **kwargs, + ): + if max_images != 999: + kwargs["limit_mm_per_prompt"] = {"image": max_images} + eval_logger.info(f"Setting limit_mm_per_prompt[image] to {max_images}") + super().__init__( + pretrained=pretrained, + trust_remote_code=trust_remote_code, + revision=revision, + **kwargs, + ) + self.interleave = interleave + self.max_images = max_images + self.processor = transformers.AutoProcessor.from_pretrained( + pretrained, + revision=revision, + trust_remote_code=trust_remote_code, + ) + self.chat_applied: bool = False + + def tok_batch_multimodal_encode( + self, + strings: List[str], # note that input signature of this fn is different + images, # TODO: typehint on this + left_truncate_len: int = None, + truncation: bool = False, + ): + images = [img[: self.max_images] for img in images] + # TODO: is the default placeholder always ? + if self.chat_applied is False: + strings = [ + replace_placeholders( + string, + DEFAULT_IMAGE_PLACEHOLDER, + DEFAULT_IMAGE_PLACEHOLDER, + self.max_images, + ) + for string in strings + ] + + outputs = [] + for x, i in zip(strings, images): + inputs = { + "prompt": x, + "multi_modal_data": {"image": i}, + } + outputs.append(inputs) + return outputs + + def _model_generate( + self, + requests: List[List[dict]] = None, + generate: bool = False, + max_tokens: int = None, + stop: Optional[List[str]] = None, + **kwargs, + ): + if generate: + kwargs = self.modify_gen_kwargs(kwargs) + sampling_params = SamplingParams(max_tokens=max_tokens, stop=stop, **kwargs) + else: + sampling_params = SamplingParams( + temperature=0, prompt_logprobs=1, max_tokens=1, detokenize=False + ) + if self.data_parallel_size > 1: + # vLLM hangs if tensor_parallel > 1 and resources are set in ray.remote + # also seems to only work with decorator and not with ray.remote() fn + # see https://github.com/vllm-project/vllm/issues/973 + # note: this has changed on 0.3.3, and it only works now if num_gpus are set. + # but then tensor_parallel breaks + @ray.remote + def run_inference_one_model( + model_args: dict, sampling_params, requests: List[List[dict]] + ): + llm = LLM(**model_args) + return llm.generate(requests, sampling_params=sampling_params) + + # dispatch requests to all self.data_parallel_size workers, in interleaved fashion + # interleaved important to balance context lengths across workers + requests = [list(x) for x in distribute(self.data_parallel_size, requests)] + inputs = ((self.model_args, sampling_params, req) for req in requests) + object_refs = [run_inference_one_model.remote(*x) for x in inputs] + results = ray.get(object_refs) + # Invoke ray.shutdown() to prevent hang-ups if subsequent calls required. + ray.shutdown() + # flatten results + return undistribute(results) + + if self.lora_request is not None: + outputs = self.model.generate( + requests, + sampling_params=sampling_params, + use_tqdm=True if self.batch_size == "auto" else False, + lora_request=self.lora_request, + ) + else: + outputs = self.model.generate( + requests, + sampling_params=sampling_params, + use_tqdm=True if self.batch_size == "auto" else False, + ) + return outputs + + def apply_chat_template(self, chat_history: List[Dict[str, str]]) -> str: + self.chat_applied = True + if not self.interleave: + for content in chat_history: + c = [] + text = content["content"] + + # Count and remove image placeholders + image_count = min( + self.max_images, text.count(DEFAULT_IMAGE_PLACEHOLDER) + ) + text = text.replace(DEFAULT_IMAGE_PLACEHOLDER, "") + + # Add image entries + for _ in range(image_count): + c.append({"type": "image", "image": None}) + + # Add single text entry at the end + c.append({"type": "text", "text": text}) + + content["content"] = c + else: + for content in chat_history: + c = [] + text = content["content"] + expected_image_count = min( + self.max_images, text.count(DEFAULT_IMAGE_PLACEHOLDER) + ) + actual_image_count = 0 + + text_parts = text.split(DEFAULT_IMAGE_PLACEHOLDER) + + for i, part in enumerate(text_parts): + # TODO: concatenate text parts (esp. if skipping images)? + if part: # Add non-empty text parts + c.append({"type": "text", "text": part}) + if ( + (i < len(text_parts) - 1) and i < self.max_images + ): # Add image placeholder after each split except the last + c.append({"type": "image"}) + actual_image_count += 1 + + content["content"] = c + + if actual_image_count != expected_image_count: + raise ValueError( + f"Mismatch in image placeholder count. Expected: {expected_image_count}, Actual: {actual_image_count}" + ) + + return self.processor.apply_chat_template( + chat_history, add_generation_prompt=True + ) + + def generate_until( + self, requests: List[Instance], disable_tqdm: bool = False + ) -> List[str]: + # TODO: support text-only reqs + res = [] + + def _collate(x): + # the negative sign on len(toks) sorts descending - this has a few advantages: + # - time estimates will always be over not underestimates, which is more useful for planning + # - to know the size of a batch when going through the list, you know the first one is always the batch + # padded context length. this is useful to simplify the batching logic and more importantly to make + # automatic adaptive batches much much easier to implement + # - any OOMs will happen right away rather than near the end + toks = self.tok_encode(x[0]) + return -len(toks), x[0] + + pbar = tqdm( + total=len(requests), + disable=(disable_tqdm or (self.rank != 0)), + desc="Running generate_until requests with text+image input", + ) + # TODO: port auto-batch sizing into this. + + # we group requests by their generation_kwargs, + # so that we don't try to execute e.g. greedy sampling and temp=0.8 sampling + # in the same batch. + re_ords = Collator( + [reg.args for reg in requests], + _collate, + group_by="gen_kwargs", + group_fn=lambda x: x[1], + ) + chunks = re_ords.get_batched(n=self.batch_size, batch_fn=None) + + for chunk in chunks: + contexts, all_gen_kwargs, aux_arguments = zip(*chunk) + + visuals = [arg["visual"] for arg in aux_arguments] + + if not isinstance(contexts, list): + contexts = list( + contexts + ) # for Qwen2-VL, processor is unhappy accepting a tuple of strings instead of a list. + # TODO: could we upstream this workaround to HF? + + # we assume all gen kwargs in the batch are the same + # this is safe to assume because the `grouper` object ensures it. + gen_kwargs = all_gen_kwargs[0] + # unpack our keyword arguments. + until = None + if isinstance(gen_kwargs, dict): + kwargs = copy.deepcopy(gen_kwargs) # edge case for repeats > 1 + if "until" in kwargs.keys(): + until = kwargs.pop("until") + if isinstance(until, str): + until = [until] + elif not isinstance(until, list): + raise ValueError( + f"Expected `kwargs['until']` to be of type Union[str,list] but got {until}" + ) + else: + raise ValueError( + f"Expected `kwargs` to be of type `dict` but got {type(gen_kwargs)}" + ) + # add EOS token to stop sequences + eos = self.tokenizer.decode(self.eot_token_id) + if not until: + until = [eos] + else: + until.append(eos) + if "max_gen_toks" in kwargs.keys(): + max_gen_toks = kwargs.pop("max_gen_toks") + else: + max_gen_toks = self.max_gen_toks + + max_ctx_len = self.max_length - max_gen_toks + + inputs = self.tok_batch_multimodal_encode( + contexts, + visuals, + left_truncate_len=max_ctx_len, + ) + + cont = self._model_generate(inputs, stop=until, generate=True, **kwargs) + + for output, context in zip(cont, contexts): + generated_text = output.outputs[0].text + res.append(generated_text) + self.cache_hook.add_partial( + "generate_until", (context, gen_kwargs), generated_text + ) + pbar.update(1) + # reorder this group of results back to original unsorted form + res = re_ords.get_original(res) + + pbar.close() + return res diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/README.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/README.md new file mode 100644 index 0000000000000000000000000000000000000000..390f30493910c48634d708447336c7c9e6c5b621 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/README.md @@ -0,0 +1,133 @@ + +# Tasks + + A list of supported tasks and task groupings can be viewed with `lm-eval --tasks list`. + + For more information, including a full list of task names and their precise meanings or sources, follow the links provided to the individual README.md files for each subfolder. + +| Task Family | Description | Language(s) | +|-------------|-------------|-------------| +| [aclue](aclue/README.md) | Tasks focusing on ancient Chinese language understanding and cultural aspects. | Ancient Chinese | +| [aexams](aexams/README.md) | Tasks in Arabic related to various academic exams covering a range of subjects. | Arabic | +| [agieval](agieval/README.md) | Tasks involving historical data or questions related to history and historical texts. | English, Chinese | +| [anli](anli/README.md) | Adversarial natural language inference tasks designed to test model robustness. | English | +| [arabic_leaderboard_complete](arabic_leaderboard_complete/README.md) | A full version of the tasks in the Open Arabic LLM Leaderboard, focusing on the evaluation of models that reflect the characteristics of Arabic language understanding and comprehension, culture, and heritage. Note that some of these tasks are machine-translated. | Arabic (Some MT) | +| [arabic_leaderboard_light](arabic_leaderboard_light/README.md) | A light version of the tasks in the Open Arabic LLM Leaderboard (i.e., 10% samples of the test set in the original benchmarks), focusing on the evaluation of models that reflect the characteristics of Arabic language understanding and comprehension, culture, and heritage. Note that some of these tasks are machine-translated. | Arabic (Some MT) | +| [arabicmmlu](arabicmmlu/README.md) | Localized Arabic version of MMLU with multiple-choice questions from 40 subjects. | Arabic | +| [arc](arc/README.md) | Tasks involving complex reasoning over a diverse set of questions. | English | +| [arithmetic](arithmetic/README.md) | Tasks involving numerical computations and arithmetic reasoning. | English | +| [asdiv](asdiv/README.md) | Tasks involving arithmetic and mathematical reasoning challenges. | English | +| [babi](babi/README.md) | Tasks designed as question and answering challenges based on simulated stories. | English | +| [basque_bench](basque_bench/README.md) | Collection of tasks in Basque encompassing various evaluation areas. | Basque | +| [basqueglue](basqueglue/README.md) | Tasks designed to evaluate language understanding in Basque language. | Basque | +| [bbh](bbh/README.md) | Tasks focused on deep semantic understanding through hypothesization and reasoning. | English, German | +| [belebele](belebele/README.md) | Language understanding tasks in a variety of languages and scripts. | Multiple (122 languages) | +| benchmarks | General benchmarking tasks that test a wide range of language understanding capabilities. | | +| [bertaqa](bertaqa/README.md) | Local Basque cultural trivia QA tests in English and Basque languages. | English, Basque, Basque (MT) | +| [bigbench](bigbench/README.md) | Broad tasks from the BIG-bench benchmark designed to push the boundaries of large models. | Multiple | +| [blimp](blimp/README.md) | Tasks testing grammatical phenomena to evaluate language model's linguistic capabilities. | English | +| [catalan_bench](catalan_bench/README.md) | Collection of tasks in Catalan encompassing various evaluation areas. | Catalan | +| [ceval](ceval/README.md) | Tasks that evaluate language understanding and reasoning in an educational context. | Chinese | +| [cmmlu](cmmlu/README.md) | Multi-subject multiple choice question tasks for comprehensive academic assessment. | Chinese | +| code_x_glue | Tasks that involve understanding and generating code across multiple programming languages. | Go, Java, JS, PHP, Python, Ruby | +| [commonsense_qa](commonsense_qa/README.md) | CommonsenseQA, a multiple-choice QA dataset for measuring commonsense knowledge. | English | +| [copal_id](copal_id/README.md) | Indonesian causal commonsense reasoning dataset that captures local nuances. | Indonesian | +| [coqa](coqa/README.md) | Conversational question answering tasks to test dialog understanding. | English | +| [crows_pairs](crows_pairs/README.md) | Tasks designed to test model biases in various sociodemographic groups. | English, French | +| csatqa | Tasks related to SAT and other standardized testing questions for academic assessment. | Korean | +| [drop](drop/README.md) | Tasks requiring numerical reasoning, reading comprehension, and question answering. | English | +| [eq_bench](eq_bench/README.md) | Tasks focused on equality and ethics in question answering and decision-making. | English | +| [eus_exams](eus_exams/README.md) | Tasks based on various professional and academic exams in the Basque language. | Basque | +| [eus_proficiency](eus_proficiency/README.md) | Tasks designed to test proficiency in the Basque language across various topics. | Basque | +| [eus_reading](eus_reading/README.md) | Reading comprehension tasks specifically designed for the Basque language. | Basque | +| [eus_trivia](eus_trivia/README.md) | Trivia and knowledge testing tasks in the Basque language. | Basque | +| [fda](fda/README.md) | Tasks for extracting key-value pairs from FDA documents to test information extraction. | English | +| [fld](fld/README.md) | Tasks involving free-form and directed dialogue understanding. | English | +| [french_bench](french_bench/README.md) | Set of tasks designed to assess language model performance in French. | French| +| [galician_bench](galician_bench/README.md) | Collection of tasks in Galician encompassing various evaluation areas. | Galician | +| [glue](glue/README.md) | General Language Understanding Evaluation benchmark to test broad language abilities. | English | +| [gpqa](gpqa/README.md) | Tasks designed for general public question answering and knowledge verification. | English | +| [gsm8k](gsm8k/README.md) | A benchmark of grade school math problems aimed at evaluating reasoning capabilities. | English | +| [haerae](haerae/README.md) | Tasks focused on assessing detailed factual and historical knowledge. | Korean | +| [headqa](headqa/README.md) | A high-level education-based question answering dataset to test specialized knowledge. | Spanish, English | +| [hellaswag](hellaswag/README.md) | Tasks to predict the ending of stories or scenarios, testing comprehension and creativity. | English | +| [hendrycks_ethics](hendrycks_ethics/README.md) | Tasks designed to evaluate the ethical reasoning capabilities of models. | English | +| [hendrycks_math](hendrycks_math/README.md) | Mathematical problem-solving tasks to test numerical reasoning and problem-solving. | English | +| [ifeval](ifeval/README.md) | Interactive fiction evaluation tasks for narrative understanding and reasoning. | English | +| [inverse_scaling](inverse_scaling/README.md) | Multiple-choice tasks from the Inverse Scaling Prize, designed to find settings where larger language models perform worse. | English | +| [japanese_leaderboard](japanese_leaderboard/README.md) | Japanese language understanding tasks to benchmark model performance on various linguistic aspects. | Japanese | +| [kbl](kbl/README.md) | Korean Benchmark for Legal Language Understanding. | Korean | +| [kmmlu](kmmlu/README.md) | Knowledge-based multi-subject multiple choice questions for academic evaluation. | Korean | +| [kobest](kobest/README.md) | A collection of tasks designed to evaluate understanding in Korean language. | Korean | +| [kormedmcqa](kormedmcqa/README.md) | Medical question answering tasks in Korean to test specialized domain knowledge. | Korean | +| [lambada](lambada/README.md) | Tasks designed to predict the endings of text passages, testing language prediction skills. | English | +| [lambada_cloze](lambada_cloze/README.md) | Cloze-style LAMBADA dataset. | English | +| [lambada_multilingual](lambada_multilingual/README.md) | Multilingual LAMBADA dataset. This is a legacy version of the multilingual dataset, and users should instead use `lambada_multilingual_stablelm`. | German, English, Spanish, French, Italian | +| [lambada_multilingual_stablelm](lambada_multilingual_stablelm/README.md) | Multilingual LAMBADA dataset. Users should prefer evaluating on this version of the multilingual dataset instead of on `lambada_multilingual`. | German, English, Spanish, French, Italian, Dutch, Portuguese | +| [leaderboard](leaderboard/README.md) | Task group used by Hugging Face's [Open LLM Leaderboard v2](https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard). Those tasks are static and will not change through time | English | +| [lingoly](lingoly/README.md) | Challenging logical reasoning benchmark in low-resource languages with controls for memorization | English, Multilingual | +| [logiqa](logiqa/README.md) | Logical reasoning tasks requiring advanced inference and deduction. | English, Chinese | +| [logiqa2](logiqa2/README.md) | Large-scale logical reasoning dataset adapted from the Chinese Civil Service Examination. | English, Chinese | +| [mathqa](mathqa/README.md) | Question answering tasks involving mathematical reasoning and problem-solving. | English | +| [mc_taco](mc_taco/README.md) | Question-answer pairs that require temporal commonsense comprehension. | English | +| [med_concepts_qa](med_concepts_qa/README.md) | Benchmark for evaluating LLMs on their abilities to interpret medical codes and distinguish between medical concept. | English | +| [metabench](metabench/README.md) | Distilled versions of six popular benchmarks which are highly predictive of overall benchmark performance and of a single general ability latent trait. | English | +| medmcqa | Medical multiple choice questions assessing detailed medical knowledge. | English | +| medqa | Multiple choice question answering based on the United States Medical License Exams. | | +| [mgsm](mgsm/README.md) | Benchmark of multilingual grade-school math problems. | Spanish, French, German, Russian, Chinese, Japanese, Thai, Swahili, Bengali, Telugu | +| [minerva_math](minerva_math/README.md) | Mathematics-focused tasks requiring numerical reasoning and problem-solving skills. | English | +| [mmlu](mmlu/README.md) | Massive Multitask Language Understanding benchmark for broad domain language evaluation. Several variants are supported. | English | +| [mmlu_pro](mmlu_pro/README.md) | A refined set of MMLU, integrating more challenging, reasoning-focused questions and expanding the choice set from four to ten options. | English | +| [mmlusr](mmlusr/README.md) | Variation of MMLU designed to be more rigorous. | English | +| model_written_evals | Evaluation tasks auto-generated for evaluating a collection of AI Safety concerns. | | +| [mutual](mutual/README.md) | A retrieval-based dataset for multi-turn dialogue reasoning. | English | +| [nq_open](nq_open/README.md) | Open domain question answering tasks based on the Natural Questions dataset. | English | +| [okapi/arc_multilingual](okapi/arc_multilingual/README.md) | Tasks that involve reading comprehension and information retrieval challenges. | Multiple (31 languages) **Machine Translated.** | +| [okapi/hellaswag_multilingual](okapi/hellaswag_multilingual/README.md) | Tasks that involve reading comprehension and information retrieval challenges. | Multiple (30 languages) **Machine Translated.** | +| okapi/mmlu_multilingual | Tasks that involve reading comprehension and information retrieval challenges. | Multiple (34 languages) **Machine Translated.** | +| [okapi/truthfulqa_multilingual](okapi/truthfulqa_multilingual/README.md) | Tasks that involve reading comprehension and information retrieval challenges. | Multiple (31 languages) **Machine Translated.** | +| [openbookqa](openbookqa/README.md) | Open-book question answering tasks that require external knowledge and reasoning. | English | +| [paloma](paloma/README.md) | Paloma is a comprehensive benchmark designed to evaluate open language models across a wide range of domains, ranging from niche artist communities to mental health forums on Reddit. | English | +| [paws-x](paws-x/README.md) | Paraphrase Adversaries from Word Scrambling, focusing on cross-lingual capabilities. | English, French, Spanish, German, Chinese, Japanese, Korean | +| [pile](pile/README.md) | Open source language modelling data set that consists of 22 smaller, high-quality datasets. | English | +| [pile_10k](pile_10k/README.md) | The first 10K elements of The Pile, useful for debugging models trained on it. | English | +| [piqa](piqa/README.md) | Physical Interaction Question Answering tasks to test physical commonsense reasoning. | English | +| [polemo2](polemo2/README.md) | Sentiment analysis and emotion detection tasks based on Polish language data. | Polish | +| [portuguese_bench](portuguese_bench/README.md) | Collection of tasks in European Portuguese encompassing various evaluation areas. | Portuguese | +| [prost](prost/README.md) | Tasks requiring understanding of professional standards and ethics in various domains. | English | +| [pubmedqa](pubmedqa/README.md) | Question answering tasks based on PubMed research articles for biomedical understanding. | English | +| [qa4mre](qa4mre/README.md) | Question Answering for Machine Reading Evaluation, assessing comprehension and reasoning. | English | +| [qasper](qasper/README.md) | Question Answering dataset based on academic papers, testing in-depth scientific knowledge. | English | +| [race](race/README.md) | Reading comprehension assessment tasks based on English exams in China. | English | +| realtoxicityprompts | Tasks to evaluate language models for generating text with potential toxicity. | | +| [sciq](sciq/README.md) | Science Question Answering tasks to assess understanding of scientific concepts. | English | +| [scrolls](scrolls/README.md) | Tasks that involve long-form reading comprehension across various domains. | English | +| [siqa](siqa/README.md) | Social Interaction Question Answering to evaluate common sense and social reasoning. | English | +| [spanish_bench](spanish_bench/README.md) | Collection of tasks in Spanish encompassing various evaluation areas. | Spanish | +| [squad_completion](squad_completion/README.md) | A variant of the SQuAD question answering task designed for zero-shot evaluation of small LMs. | English | +| [squadv2](squadv2/README.md) | Stanford Question Answering Dataset version 2, a reading comprehension benchmark. | English | +| [storycloze](storycloze/README.md) | Tasks to predict story endings, focusing on narrative logic and coherence. | English | +| [super_glue](super_glue/README.md) | A suite of challenging tasks designed to test a range of language understanding skills. | English | +| [swag](swag/README.md) | Situations With Adversarial Generations, predicting the next event in videos. | English | +| [swde](swde/README.md) | Information extraction tasks from semi-structured web pages. | English | +| [tinyBenchmarks](tinyBenchmarks/README.md) | Evaluation of large language models with fewer examples using tiny versions of popular benchmarks. | English | +| [tmmluplus](tmmluplus/README.md) | An extended set of tasks under the TMMLU framework for broader academic assessments. | Traditional Chinese | +| [toxigen](toxigen/README.md) | Tasks designed to evaluate language models on their propensity to generate toxic content. | English | +| [translation](translation/README.md) | Tasks focused on evaluating the language translation capabilities of models. | Arabic, English, Spanish, Basque, Hindi, Indonesian, Burmese, Russian, Swahili, Telugu, Chinese | +| [triviaqa](triviaqa/README.md) | A large-scale dataset for trivia question answering to test general knowledge. | English | +| [truthfulqa](truthfulqa/README.md) | A QA task aimed at evaluating the truthfulness and factual accuracy of model responses. | English | +| [turkishmmlu](turkishmmlu/README.md) | A multiple-choice QA test modeled after MMLU, written in Turkish based on Turkish high-school level exams. | Turkish | +| [unitxt](unitxt/README.md) | A number of tasks implemented using the unitxt library for flexible, shareable, and reusable data preparation and evaluation for generative AI. | English | +| [unscramble](unscramble/README.md) | Tasks involving the rearrangement of scrambled sentences to test syntactic understanding. | English | +| [webqs](webqs/README.md) | Web-based question answering tasks designed to evaluate internet search and retrieval. | English | +| [wikitext](wikitext/README.md) | Tasks based on text from Wikipedia articles to assess language modeling and generation. | English | +| [winogrande](winogrande/README.md) | A large-scale dataset for coreference resolution, inspired by the Winograd Schema Challenge. | English | +| [wmdp](wmdp/README.md) | A benchmark with the objective of minimizing performance, based on potentially-sensitive multiple-choice knowledge questions. | English | +| [wmt2016](wmt2016/README.md) | Tasks from the WMT 2016 shared task, focusing on translation between multiple languages. | English, Czech, German, Finnish, Russian, Romanian, Turkish | +| [wsc273](wsc273/README.md) | The Winograd Schema Challenge, a test of commonsense reasoning and coreference resolution. | English | +| [xcopa](xcopa/README.md) | Cross-lingual Choice of Plausible Alternatives, testing reasoning in multiple languages. | Estonian, Haitian, Indonesian, Italian, Quechua, Swahili, Tamil, Thai, Turkish, Vietnamese, Chinese | +| [xnli](xnli/README.md) | Cross-Lingual Natural Language Inference to test understanding across different languages. | Arabic, Bulgarian, German, Greek, English, Spanish, French, Hindi, Russian, Swahili, Thai, Turkish, Urdu, Vietnamese, Chinese | +| [xnli_eu](xnli_eu/README.md) | Cross-lingual Natural Language Inference tasks in Basque. | Basque | +| [xquad](xquad/README.md) | Cross-lingual Question Answering Dataset in multiple languages. | Arabic, German, Greek, English, Spanish, Hindi, Romanian, Russian, Thai, Turkish, Vietnamese, Chinese | +| [xstorycloze](xstorycloze/README.md) | Cross-lingual narrative understanding tasks to predict story endings in multiple languages. | Russian, Simplified Chinese, Spanish, Arabic, Hindi, Indonesian, Telugu, Swahili, Basque, Burmese | +| [xwinograd](xwinograd/README.md) | Cross-lingual Winograd schema tasks for coreference resolution in multiple languages. | English, French, Japanese, Portuguese, Russian, Chinese | diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/__init__.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..edcd104dfaa87d17939a4365e5b5e102cfc3083b --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/__init__.py @@ -0,0 +1,652 @@ +import collections +import inspect +import logging +import os +from functools import partial +from typing import Dict, List, Mapping, Optional, Union + +from lm_eval import utils +from lm_eval.api.group import ConfigurableGroup, GroupConfig +from lm_eval.api.task import ConfigurableTask, Task +from lm_eval.evaluator_utils import get_subtask_list + + +GROUP_ONLY_KEYS = list(GroupConfig().to_dict().keys()) + + +class TaskManager: + """TaskManager indexes all tasks from the default `lm_eval/tasks/` + and an optional directory if provided. + + """ + + def __init__( + self, + verbosity="INFO", + include_path: Optional[Union[str, List]] = None, + include_defaults: bool = True, + ) -> None: + self.verbosity = verbosity + self.include_path = include_path + self.logger = utils.eval_logger + self.logger.setLevel(getattr(logging, f"{verbosity}")) + + self._task_index = self.initialize_tasks( + include_path=include_path, include_defaults=include_defaults + ) + self._all_tasks = sorted(list(self._task_index.keys())) + + self._all_groups = sorted( + [x for x in self._all_tasks if self._task_index[x]["type"] == "group"] + ) + self._all_subtasks = sorted( + [ + x + for x in self._all_tasks + if self._task_index[x]["type"] in ["task", "python_task"] + ] + ) + self._all_tags = sorted( + [x for x in self._all_tasks if self._task_index[x]["type"] == "tag"] + ) + + self.task_group_map = collections.defaultdict(list) + + def initialize_tasks( + self, + include_path: Optional[Union[str, List]] = None, + include_defaults: bool = True, + ): + """Creates a dictionary of tasks index. + + :param include_path: Union[str, List] = None + An additional path to be searched for tasks recursively. + Can provide more than one such path as a list. + :param include_defaults: bool = True + If set to false, default tasks (those in lm_eval/tasks/) are not indexed. + :return + Dictionary of task names as key and task metadata + """ + if include_defaults: + all_paths = [os.path.dirname(os.path.abspath(__file__)) + "/"] + else: + all_paths = [] + if include_path is not None: + if isinstance(include_path, str): + include_path = [include_path] + all_paths.extend(include_path) + + task_index = {} + for task_dir in all_paths: + tasks = self._get_task_and_group(task_dir) + task_index = {**tasks, **task_index} + + return task_index + + @property + def all_tasks(self): + return self._all_tasks + + @property + def all_groups(self): + return self._all_groups + + @property + def all_subtasks(self): + return self._all_subtasks + + @property + def all_tags(self): + return self._all_tags + + @property + def task_index(self): + return self._task_index + + def list_all_tasks( + self, list_groups=True, list_tags=True, list_subtasks=True + ) -> str: + from pytablewriter import MarkdownTableWriter + + def sanitize_path(path): + # don't print full path if we are within the lm_eval/tasks dir ! + # if we aren't though, provide the full path. + if "lm_eval/tasks/" in path: + return "lm_eval/tasks/" + path.split("lm_eval/tasks/")[-1] + else: + return path + + group_table = MarkdownTableWriter() + group_table.headers = ["Group", "Config Location"] + gt_values = [] + for g in self.all_groups: + path = self.task_index[g]["yaml_path"] + if path == -1: + path = "---" + else: + path = sanitize_path(path) + gt_values.append([g, path]) + group_table.value_matrix = gt_values + + tag_table = MarkdownTableWriter() + tag_table.headers = ["Tag"] + tag_table.value_matrix = [[t] for t in self.all_tags] + + subtask_table = MarkdownTableWriter() + subtask_table.headers = ["Task", "Config Location", "Output Type"] + st_values = [] + for t in self.all_subtasks: + path = self.task_index[t]["yaml_path"] + + output_type = "" + + # read the yaml file to determine the output type + if path != -1: + config = utils.load_yaml_config(path, mode="simple") + if "output_type" in config: + output_type = config["output_type"] + elif ( + "include" in config + ): # if no output type, check if there is an include with an output type + include_path = path.split("/")[:-1] + config["include"] + include_config = utils.load_yaml_config(include_path, mode="simple") + if "output_type" in include_config: + output_type = include_config["output_type"] + + if path == -1: + path = "---" + else: + path = sanitize_path(path) + st_values.append([t, path, output_type]) + subtask_table.value_matrix = st_values + + result = "\n" + if list_groups: + result += group_table.dumps() + "\n\n" + if list_tags: + result += tag_table.dumps() + "\n\n" + if list_subtasks: + result += subtask_table.dumps() + "\n\n" + return result + + def match_tasks(self, task_list): + return utils.pattern_match(task_list, self.all_tasks) + + def _name_is_registered(self, name) -> bool: + if name in self.all_tasks: + return True + return False + + def _name_is_task(self, name) -> bool: + if self._name_is_registered(name) and (self.task_index[name]["type"] == "task"): + return True + return False + + def _name_is_tag(self, name) -> bool: + if self._name_is_registered(name) and (self.task_index[name]["type"] == "tag"): + return True + return False + + def _name_is_group(self, name) -> bool: + if self._name_is_registered(name) and ( + self.task_index[name]["type"] == "group" + ): + return True + return False + + def _name_is_python_task(self, name): + if self._name_is_registered(name) and ( + self.task_index[name]["type"] == "python_task" + ): + return True + return False + + def _config_is_task(self, config) -> bool: + if ("task" in config) and isinstance(config["task"], str): + return True + return False + + def _config_is_group(self, config) -> bool: + if ("task" in config) and isinstance(config["task"], list): + return True + return False + + def _config_is_python_task(self, config) -> bool: + if "class" in config: + return True + return False + + def _get_yaml_path(self, name): + if name not in self.task_index: + raise ValueError + return self.task_index[name]["yaml_path"] + + def _get_config(self, name): + if name not in self.task_index: + raise ValueError + yaml_path = self._get_yaml_path(name) + if yaml_path == -1: + return {} + else: + return utils.load_yaml_config(yaml_path, mode="full") + + def _get_tasklist(self, name): + if self._name_is_task(name): + raise ValueError + return self.task_index[name]["task"] + + def _process_alias(self, config, group=None): + # If the group is not the same as the original + # group which the group alias was intended for, + # Set the group_alias to None instead. + if ("group_alias" in config) and ("group" in config) and group is not None: + if config["group"] != group: + config["group_alias"] = None + return config + + def _class_has_config_in_constructor(self, cls): + constructor = getattr(cls, "__init__", None) + return ( + "config" in inspect.signature(constructor).parameters + if constructor + else False + ) + + def _load_individual_task_or_group( + self, + name_or_config: Optional[Union[str, dict]] = None, + parent_name: Optional[str] = None, + update_config: Optional[dict] = None, + ) -> Mapping: + def _load_task(config, task): + if "include" in config: + config = { + **utils.load_yaml_config( + yaml_path=None, + yaml_config={"include": config.pop("include")}, + mode="full", + ), + **config, + } + if self._config_is_python_task(config): + if self._class_has_config_in_constructor(config["class"]): + task_object = config["class"](config=config) + else: + task_object = config["class"]() + if isinstance(task_object, ConfigurableTask): + # very scuffed: set task name here. TODO: fixme? + task_object.config.task = task + else: + task_object = ConfigurableTask(config=config) + + return {task: task_object} + + def _get_group_and_subtask_from_config(config): + group_name = ConfigurableGroup(config=config) + subtask_list = [] + for task in group_name.config["task"]: + if isinstance(task, str) and self._name_is_tag(task): + subtask_list.extend(self._get_tasklist(task)) + else: + subtask_list.append(task) + return group_name, subtask_list + + def _process_group_config(config, update_config=None): + if update_config is not None: + config = {**config, **update_config} + _update_config = { + k: v for k, v in config.items() if k not in GROUP_ONLY_KEYS + } + if not bool(_update_config): + _update_config = None + + group_config = {k: v for k, v in config.items() if k in GROUP_ONLY_KEYS} + return group_config, _update_config + + if isinstance(name_or_config, str): + if update_config is not None: + # Process name_or_config as a dict instead + name_or_config = {"task": name_or_config, **update_config} + elif self._name_is_task(name_or_config) or self._name_is_python_task( + name_or_config + ): + task_config = self._get_config(name_or_config) + return _load_task(task_config, task=name_or_config) + else: + subtask_list = self._get_tasklist(name_or_config) + if subtask_list == -1: + group_config = self._get_config(name_or_config) + group_config, update_config = _process_group_config(group_config) + group_name, subtask_list = _get_group_and_subtask_from_config( + group_config + ) + else: + if self._name_is_tag(name_or_config): + fn = partial( + self._load_individual_task_or_group, + update_config=name_or_config + if isinstance(name_or_config, dict) + else None, + ) + return dict( + collections.ChainMap(*map(fn, reversed(subtask_list))) + ) + else: + group_name = ConfigurableGroup( + config={"group": name_or_config, "task": subtask_list} + ) + + if isinstance(name_or_config, dict): + if self._config_is_task(name_or_config): + name = name_or_config.pop("task") + if update_config is not None: + name_or_config = {**name_or_config, **update_config} + # If the name is registered as a group + if self._name_is_group(name): + group_config = self._get_config(name) + + group_config, update_config = _process_group_config( + group_config, name_or_config + ) + group_name, subtask_list = _get_group_and_subtask_from_config( + group_config + ) + elif self._name_is_tag(name): + subtask_list = self._get_tasklist(name) + fn = partial( + self._load_individual_task_or_group, + update_config=name_or_config, + ) + return dict(collections.ChainMap(*map(fn, reversed(subtask_list)))) + else: + if self._name_is_registered(name): + base_task_config = self._get_config(name) + + # Check if this is a duplicate. + if parent_name is not None: + num_duplicate = len( + list( + filter( + lambda x: x.startswith(name), + self.task_group_map[parent_name], + ) + ) + ) + if num_duplicate > 0: + name = f"{name}-{num_duplicate}" + self.task_group_map[parent_name].append(name) + + task_config = { + **base_task_config, + **name_or_config, + } + else: + task_config = name_or_config + return _load_task(task_config, task=name) + else: + group_config, update_config = _process_group_config(name_or_config) + group_name, subtask_list = _get_group_and_subtask_from_config( + group_config + ) + + fn = partial( + self._load_individual_task_or_group, + parent_name=group_name, + update_config=update_config, + ) + return { + group_name: dict(collections.ChainMap(*map(fn, reversed(subtask_list)))) + } + + def load_task_or_group(self, task_list: Optional[Union[str, list]] = None) -> dict: + """Loads a dictionary of task objects from a list + + :param task_list: Union[str, list] = None + Single string or list of string of task names to be loaded + + :return + Dictionary of task objects + """ + if isinstance(task_list, str): + task_list = [task_list] + + all_loaded_tasks = dict( + collections.ChainMap(*map(self._load_individual_task_or_group, task_list)) + ) + return all_loaded_tasks + + def load_config(self, config: Dict): + return self._load_individual_task_or_group(config) + + def _get_task_and_group(self, task_dir: str): + """Creates a dictionary of tasks index with the following metadata, + - `type`, that can be either `task`, `python_task`, `group` or `tags`. + `task` refer to regular task configs, `python_task` are special + yaml files that only consists of `task` and `class` parameters. + `group` are group configs. `tags` are labels that can be assigned + to tasks to assist in sorting and calling tasks of certain themes. + - `yaml_path`, path to the yaml file. If the entry is a `group` that + was configured through a task config, the yaml_path will be -1 + and all subtasks will be listed in `task` (see below) + - `task`, reserved for entries with `type` as `group`. This will list + all subtasks. When a group config is created (as opposed to task + config having `group` parameter set), this will be set to -1 to + avoid recursive indexing. The whole list of subtasks will be loaded + at evaluation. + + :param task_dir: str + A directory to check for tasks + + :return + Dictionary of task names as key and task metadata + """ + + def _populate_tags_and_groups(config, task, tasks_and_groups, print_info): + # TODO: remove group in next release + if "tag" in config: + attr_list = config["tag"] + if isinstance(attr_list, str): + attr_list = [attr_list] + + for tag in attr_list: + if tag not in tasks_and_groups: + tasks_and_groups[tag] = { + "type": "tag", + "task": [task], + "yaml_path": -1, + } + elif tasks_and_groups[tag]["type"] != "tag": + self.logger.info( + f"The tag '{tag}' is already registered as a group, this tag will not be registered. " + "This may affect tasks you want to call." + ) + break + else: + tasks_and_groups[tag]["task"].append(task) + + # TODO: remove group in next release + print_info = True + ignore_dirs = [ + "__pycache__", + ".ipynb_checkpoints", + ] + tasks_and_groups = collections.defaultdict() + for root, dirs, file_list in os.walk(task_dir): + dirs[:] = [d for d in dirs if d not in ignore_dirs] + for f in file_list: + if f.endswith(".yaml"): + yaml_path = os.path.join(root, f) + config = utils.load_yaml_config(yaml_path, mode="simple") + if self._config_is_python_task(config): + # This is a python class config + task = config["task"] + tasks_and_groups[task] = { + "type": "python_task", + "yaml_path": yaml_path, + } + _populate_tags_and_groups( + config, task, tasks_and_groups, print_info + ) + elif self._config_is_group(config): + # This is a group config + tasks_and_groups[config["group"]] = { + "type": "group", + "task": -1, # This signals that + # we don't need to know + # the task list for indexing + # as it can be loaded + # when called. + "yaml_path": yaml_path, + } + + # # Registered the level 1 tasks from a group config + # for config in config["task"]: + # if isinstance(config, dict) and self._config_is_task(config): + # task = config["task"] + # tasks_and_groups[task] = { + # "type": "task", + # "yaml_path": yaml_path, + # } + + elif self._config_is_task(config): + # This is a task config + task = config["task"] + tasks_and_groups[task] = { + "type": "task", + "yaml_path": yaml_path, + } + _populate_tags_and_groups( + config, task, tasks_and_groups, print_info + ) + else: + self.logger.debug(f"File {f} in {root} could not be loaded") + + return tasks_and_groups + + +def get_task_name_from_config(task_config: Dict[str, str]) -> str: + if "task" in task_config: + return task_config["task"] + if "dataset_name" in task_config: + return "{dataset_path}_{dataset_name}".format(**task_config) + else: + return "{dataset_path}".format(**task_config) + + +def get_task_name_from_object(task_object): + if hasattr(task_object, "config"): + return task_object._config["task"] + + # TODO: scrap this + # this gives a mechanism for non-registered tasks to have a custom name anyways when reporting + return ( + task_object.EVAL_HARNESS_NAME + if hasattr(task_object, "EVAL_HARNESS_NAME") + else type(task_object).__name__ + ) + + +def _check_duplicates(task_dict: dict) -> List[str]: + """helper function solely used in validating get_task_dict output. + Takes the output of lm_eval.evaluator_utils.get_subtask_list and + returns a list of all leaf subtasks contained within, and errors if any such leaf subtasks are + "oversubscribed" to several disjoint groups. + """ + subtask_names = [] + for key, value in task_dict.items(): + subtask_names.extend(value) + + duplicate_tasks = { + task_name for task_name in subtask_names if subtask_names.count(task_name) > 1 + } + + # locate the potentially problematic groups that seem to 'compete' for constituent subtasks + competing_groups = [ + group + for group in task_dict.keys() + if len(set(task_dict[group]).intersection(duplicate_tasks)) > 0 + ] + + if len(duplicate_tasks) > 0: + raise ValueError( + f"Found 1 or more tasks while trying to call get_task_dict() that were members of more than 1 called group: {list(duplicate_tasks)}. Offending groups: {competing_groups}. Please call groups which overlap their constituent tasks in separate evaluation runs." + ) + + +def get_task_dict( + task_name_list: Union[str, List[Union[str, Dict, Task]]], + task_manager: Optional[TaskManager] = None, +): + """Creates a dictionary of task objects from either a name of task, config, or prepared Task object. + + :param task_name_list: List[Union[str, Dict, Task]] + Name of model or LM object, see lm_eval.models.get_model + :param task_manager: TaskManager = None + A TaskManager object that stores indexed tasks. If not set, + task_manager will load one. This should be set by the user + if there are additional paths that want to be included + via `include_path` + + :return + Dictionary of task objects + """ + + task_name_from_string_dict = {} + task_name_from_config_dict = {} + task_name_from_object_dict = {} + + if isinstance(task_name_list, str): + task_name_list = [task_name_list] + elif isinstance(task_name_list, list): + if not all([isinstance(task, (str, dict, Task)) for task in task_name_list]): + raise TypeError( + "Expected all list items to be of types 'str', 'dict', or 'Task', but at least one entry did not match." + ) + else: + raise TypeError( + f"Expected a 'str' or 'list' but received {type(task_name_list)}." + ) + + string_task_name_list = [task for task in task_name_list if isinstance(task, str)] + others_task_name_list = [ + task for task in task_name_list if not isinstance(task, str) + ] + if len(string_task_name_list) > 0: + if task_manager is None: + task_manager = TaskManager() + + task_name_from_string_dict = task_manager.load_task_or_group( + string_task_name_list + ) + + for task_element in others_task_name_list: + if isinstance(task_element, dict): + task_name_from_config_dict = { + **task_name_from_config_dict, + **task_manager.load_config(config=task_element), + } + + elif isinstance(task_element, Task): + task_name_from_object_dict = { + **task_name_from_object_dict, + get_task_name_from_object(task_element): task_element, + } + + if not set(task_name_from_string_dict.keys()).isdisjoint( + set(task_name_from_object_dict.keys()) + ): + raise ValueError + + final_task_dict = { + **task_name_from_string_dict, + **task_name_from_config_dict, + **task_name_from_object_dict, + } + + # behavior can get odd if one tries to invoke several groups that "compete" for the same task. + # (notably, because one could request several num_fewshot values at once in GroupConfig overrides for the subtask + # and we'd be unsure which to use and report.) + # we explicitly check and error in this case. + _check_duplicates(get_subtask_list(final_task_dict)) + + return final_task_dict diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/README.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6323ef7e3ed1902493d536bd3e6670848227b922 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/README.md @@ -0,0 +1,50 @@ +# ACLUE + +### Paper + +Can Large Language Model Comprehend Ancient Chinese? A Preliminary Test on ACLUE +https://arxiv.org/abs/2310.09550 + +The Ancient Chinese Language Understanding Evaluation (ACLUE) is an evaluation benchmark focused on ancient Chinese language comprehension. It aims to assess the performance of large-scale language models on understanding ancient Chinese. The benchmark comprises 15 tasks spanning various domains, including lexical, syntactic, semantic, inference, and knowledge. ACLUE's tasks are derived from a combination of manually curated questions from publicly available resources, and automatically +generated questions from classical Chinese language corpora. The range of questions span from the Xia dynasty (2070 BCE) to the Ming dynasty (1368 CE). ACLUE adopts a multiple-choice question format for all tasks. + +Homepage: https://github.com/isen-zhang/ACLUE + +### Citation + +```bibtex +@inproceedings{zhang-li-2023-large, + title = "Can Large Language Model Comprehend {A}ncient {C}hinese? A Preliminary Test on {ACLUE}", + author = "Zhang, Yixuan and Li, Haonan", + booktitle = "Proceedings of the Ancient Language Processing Workshop", + month = sep, + year = "2023", + address = "Varna, Bulgaria", + publisher = "INCOMA Ltd., Shoumen, Bulgaria", + url = "https://aclanthology.org/2023.alp-1.9", + pages = "80--87" +} +``` + +### Groups, Tags, and Tasks + +#### Groups + +- `aclue`: All 15 subjects of the ACLUE dataset, evaluated following the methodology in CMMLU's original implementation. + +#### Tasks + +The following tasks evaluate subjects in the ACLUE dataset using loglikelihood-based multiple-choice scoring: +- `aclue_{subject_english}` + +### Checklist + +* [x] Is the task an existing benchmark in the literature? + * [x] Have you referenced the original paper that introduced the task? + * [x] If yes, does the original paper provide a reference implementation? + * [x] Yes, original implementation contributed by author of the benchmark + +If other tasks on this dataset are already supported: +* [x] Is the "Main" variant of this task clearly denoted? +* [x] Have you provided a short sentence in a README on what each new variant adds / evaluates? +* [x] Have you noted which, if any, published evaluation setups are matched by this variant? diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_aclue.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_aclue.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a2ae37ef5a6794a0db58005ea14f3943e56c87e3 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_aclue.yaml @@ -0,0 +1,26 @@ +group: aclue +task: + - aclue_ancient_chinese_culture + - aclue_ancient_literature + - aclue_ancient_medical + - aclue_ancient_phonetics + - aclue_basic_ancient_chinese + - aclue_couplet_prediction + - aclue_homographic_character_resolution + - aclue_named_entity_recognition + - aclue_poetry_appreciate + - aclue_poetry_context_prediction + - aclue_poetry_quality_assessment + - aclue_poetry_sentiment_analysis + - aclue_polysemy_resolution + - aclue_reading_comprehension + - aclue_sentence_segmentation +aggregate_metric_list: + - metric: acc + aggregation: mean + weight_by_size: true + - metric: acc_norm + aggregation: mean + weight_by_size: true +metadata: + version: 1.0 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_default_template_yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_default_template_yaml new file mode 100644 index 0000000000000000000000000000000000000000..9505197a72cef39b25bd5ef39d65c13bd97a89ea --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_default_template_yaml @@ -0,0 +1,18 @@ +dataset_path: tyouisen/aclue +test_split: test +fewshot_split: dev +fewshot_config: + sampler: first_n +output_type: multiple_choice +doc_to_text: "{{Question.strip()}}\nA. {{A}}\nB. {{B}}\nC. {{C}}\nD. {{D}}\n答案:" +doc_to_choice: ["A", "B", "C", "D"] +doc_to_target: "{{['A', 'B', 'C', 'D'].index(Answer)}}" +metric_list: + - metric: acc + aggregation: mean + higher_is_better: true + - metric: acc_norm + aggregation: mean + higher_is_better: true +metadata: + version: 1.0 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_generate_configs.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_generate_configs.py new file mode 100644 index 0000000000000000000000000000000000000000..8bd1792ae3d200b422c6f804ef7d89252591b2a7 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/_generate_configs.py @@ -0,0 +1,82 @@ +""" +Take in a YAML, and output all other splits with this YAML +""" + +import argparse +import os + +import yaml +from tqdm import tqdm + +from lm_eval.utils import eval_logger + + +SUBJECTS = { + "古文单字多义": "polysemy_resolution", + "诗词情感分类": "poetry_sentiment_analysis", + "古汉语命名体识别": "named_entity_recognition", + "古汉语知识": "basic_ancient_chinese", + "古诗词上下句预测": "poetry_context_prediction", + "古文断句": "sentence_segmentation", + "对联": "couplet_prediction", + "古诗词曲鉴赏": "poetry_appreciate", + "国学常识": "ancient_chinese_culture", + "古音学": "ancient_phonetics", + "通假字": "homographic_character_resolution", + "古代文学知识": "ancient_literature", + "医古文": "ancient_medical", + "古诗词质量评估": "poetry_quality_assessment", + "古文阅读理解": "reading_comprehension", +} + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("--base_yaml_path", required=True) + parser.add_argument("--save_prefix_path", default="aclue") + parser.add_argument("--cot_prompt_path", default=None) + parser.add_argument("--task_prefix", default="") + return parser.parse_args() + + +if __name__ == "__main__": + args = parse_args() + + # get filename of base_yaml so we can `"include": ` it in our other YAMLs. + base_yaml_name = os.path.split(args.base_yaml_path)[-1] + with open(args.base_yaml_path, encoding="utf-8") as f: + base_yaml = yaml.full_load(f) + + if args.cot_prompt_path is not None: + import json + + with open(args.cot_prompt_path, encoding="utf-8") as f: + cot_file = json.load(f) + + for subject_zh, subject_eng in tqdm(SUBJECTS.items()): + if args.cot_prompt_path is not None: + description = cot_file[subject_eng] + else: + description = ( + f"以下是关于{subject_zh}的单项选择题,请直接给出正确答案的选项。\n\n" + ) + + yaml_dict = { + "include": base_yaml_name, + "task": f"aclue_{args.task_prefix}_{subject_eng}" + if args.task_prefix != "" + else f"aclue_{subject_eng}", + "dataset_name": subject_eng, + "description": description, + } + + file_save_path = args.save_prefix_path + f"_{subject_eng}.yaml" + eval_logger.info(f"Saving yaml for subset {subject_eng} to {file_save_path}") + with open(file_save_path, "w", encoding="utf-8") as yaml_file: + yaml.dump( + yaml_dict, + yaml_file, + width=float("inf"), + allow_unicode=True, + default_style='"', + ) diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_chinese_culture.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_chinese_culture.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c9f52077dedd24ce500247a4b606eea83fac6320 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_chinese_culture.yaml @@ -0,0 +1,4 @@ +"dataset_name": "ancient_chinese_culture" +"description": "以下是关于国学常识的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_ancient_chinese_culture" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_literature.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_literature.yaml new file mode 100644 index 0000000000000000000000000000000000000000..641befa3aa1920d8dca1c7007a4fe8cd24ab8e77 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_literature.yaml @@ -0,0 +1,4 @@ +"dataset_name": "ancient_literature" +"description": "以下是关于古代文学知识的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_ancient_literature" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_phonetics.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_phonetics.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2fe908e531a07466a66f58f2f5009d5111d5a02d --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_ancient_phonetics.yaml @@ -0,0 +1,4 @@ +"dataset_name": "ancient_phonetics" +"description": "以下是关于古音学的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_ancient_phonetics" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_basic_ancient_chinese.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_basic_ancient_chinese.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5afb88be88b8778fde06cff3a2084bce14397174 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_basic_ancient_chinese.yaml @@ -0,0 +1,4 @@ +"dataset_name": "basic_ancient_chinese" +"description": "以下是关于古汉语知识的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_basic_ancient_chinese" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_named_entity_recognition.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_named_entity_recognition.yaml new file mode 100644 index 0000000000000000000000000000000000000000..566e93019b994528bb003f46fb458ed725ef8af1 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_named_entity_recognition.yaml @@ -0,0 +1,4 @@ +"dataset_name": "named_entity_recognition" +"description": "以下是关于古汉语命名体识别的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_named_entity_recognition" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_appreciate.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_appreciate.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4642992674a1f159fe101859dead4509df6c8166 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_appreciate.yaml @@ -0,0 +1,4 @@ +"dataset_name": "poetry_appreciate" +"description": "以下是关于古诗词曲鉴赏的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_poetry_appreciate" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_context_prediction.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_context_prediction.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1b408b659657b4677e056f93c59f2a59ef60cb95 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_context_prediction.yaml @@ -0,0 +1,4 @@ +"dataset_name": "poetry_context_prediction" +"description": "以下是关于古诗词上下句预测的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_poetry_context_prediction" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_quality_assessment.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_quality_assessment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a7a7bee2c4ca59e0dc7b2f3fdc08371a9a585d42 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_quality_assessment.yaml @@ -0,0 +1,4 @@ +"dataset_name": "poetry_quality_assessment" +"description": "以下是关于古诗词质量评估的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_poetry_quality_assessment" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_sentiment_analysis.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_sentiment_analysis.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6e1367f8043d7e1e9ebcd01dfbaacfbdeb0f9fec --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_poetry_sentiment_analysis.yaml @@ -0,0 +1,4 @@ +"dataset_name": "poetry_sentiment_analysis" +"description": "以下是关于诗词情感分类的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_poetry_sentiment_analysis" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_polysemy_resolution.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_polysemy_resolution.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ee0deea16f6bcb6906fd68e2e65bf72ea276e74a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_polysemy_resolution.yaml @@ -0,0 +1,4 @@ +"dataset_name": "polysemy_resolution" +"description": "以下是关于古文单字多义的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_polysemy_resolution" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_reading_comprehension.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_reading_comprehension.yaml new file mode 100644 index 0000000000000000000000000000000000000000..92f2455d8089bcc3b7d1ff8b99c03144b5b7d61d --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_reading_comprehension.yaml @@ -0,0 +1,4 @@ +"dataset_name": "reading_comprehension" +"description": "以下是关于古文阅读理解的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_reading_comprehension" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_sentence_segmentation.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_sentence_segmentation.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9d81c3fe6eae35a6adc888d9c73430aa891bfe86 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aclue/aclue_sentence_segmentation.yaml @@ -0,0 +1,4 @@ +"dataset_name": "sentence_segmentation" +"description": "以下是关于古文断句的单项选择题,请直接给出正确答案的选项。\n\n" +"include": "_default_template_yaml" +"task": "aclue_sentence_segmentation" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/README.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0c0461920c1cd51b6c3a4deb2af68843558116e1 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/README.md @@ -0,0 +1,53 @@ +# Arabic EXAMS + +### Paper + +EXAMS: a resource specialized in multilingual high school exam questions. +The original paper [EXAMS](https://aclanthology.org/2020.emnlp-main.438/) + +The Arabic EXAMS dataset includes five subjects + + - Islamic studies + - Biology + - Physics + - Science + - Social + +The original dataset [EXAMS-QA](https://github.com/mhardalov/exams-qa) + +EXAMS is a benchmark dataset for cross-lingual and multilingual question answering for high school examinations. +With 24,000 high-quality high school exam questions in 16 languages, covering 8 language families and 24 school subjects from Natural Sciences and Social Sciences, among others. +EXAMS offers unique fine-grained evaluation framework across multiple languages and subjects + +Homepage for Arabic EXAMS: [EXAMS Arabic Homepage](https://github.com/FreedomIntelligence/AceGPT/tree/main/eval/benchmark_eval/benchmarks/EXAMS_Arabic) + +### Citation + + +### Groups, Tags, and Tasks + +#### Groups + +- `aexams`: Arabic EXAMS dataset, including IslamicStudies, Biology, Science, Physics, Social subjects. + +#### Tasks + + +The following tasks evaluate subjects in Arabic EXAMS dataset using loglikelihood-based multiple-choice scoring: +- `aexams_IslamicStudies` +- `aexams_Biology` +- `aexams_Science` +- `aexams_Physics` +- `aexams_Social` + +### Checklist + +* [x] Is the task an existing benchmark in the literature? + * [x] Have you referenced the original paper that introduced the task? + * [x] If yes, does the original paper provide a reference implementation? + * [x] Yes, original implementation contributed by author of the benchmark + +If other tasks on this dataset are already supported: +* [x] Is the "Main" variant of this task clearly denoted? +* [x] Have you provided a short sentence in a README on what each new variant adds / evaluates? +* [x] Have you noted which, if any, published evaluation setups are matched by this variant? diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/_aexams.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/_aexams.yaml new file mode 100644 index 0000000000000000000000000000000000000000..59099b9c38c11e5391e031a2e07808a83d645938 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/_aexams.yaml @@ -0,0 +1,16 @@ +group: aexams +task: + - aexams_Biology + - aexams_IslamicStudies + - aexams_Physics + - aexams_Science + - aexams_Social +aggregate_metric_list: + - metric: acc + aggregation: mean + weight_by_size: true + - metric: acc_norm + aggregation: mean + weight_by_size: true +metadata: + version: 1.0 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/aexams_Biology.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/aexams_Biology.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9ee2e33b5844ef438da4ac51bfd916af04cb53e6 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/aexams/aexams_Biology.yaml @@ -0,0 +1,4 @@ +"dataset_name": "Biology" +"description": "قم بالإجابة على مايلي في مجال العلوم الحيوية\n\n" +"include": "_default_template_yaml" +"task": "aexams_Biology" diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_amh.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_amh.yaml new file mode 100644 index 0000000000000000000000000000000000000000..04d0bdd67114f3c0887979fdce210f0fa94616e7 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_amh.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: amh +doc_to_target: '{% if answer is not none %}{{answer[15:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + -
+ - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_amh diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_ewe.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_ewe.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4eae6fc4c790968040080aee824c345bd786db44 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_ewe.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: ewe +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_ewe diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_fra.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_fra.yaml new file mode 100644 index 0000000000000000000000000000000000000000..16aeacf2c54706a18165bd1230ee812bb080ceb8 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_fra.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: fra +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + -
+ - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_fra diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_hau.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_hau.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3a6668e989af297b60b1aafd53a3cb44e3936a60 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_hau.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: hau +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_hau diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_ibo.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_ibo.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ab79986a5dec2af92711a675b3a4d79b31b044a9 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_ibo.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: ibo +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_ibo diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_kin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_kin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d4c9c75af0ccfc6d2b0b18138dec074e10b6047e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_kin.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: kin +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_kin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_lin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_lin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7136d7370cfd8f9e35b4ebc5e0615330b84edddc --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_lin.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: lin +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_lin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_lug.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_lug.yaml new file mode 100644 index 0000000000000000000000000000000000000000..03fc0c2884cf9d14cadcf583cce1e81c47938963 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_lug.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: lug +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_lug diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_orm.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_orm.yaml new file mode 100644 index 0000000000000000000000000000000000000000..49d7e93390dc5c63ce83364ea1ec8ede77537ea8 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_orm.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: orm +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_orm diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_sna.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_sna.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a61de85a3ffbbd5c2f3e91d5f26eb63a6241d78c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_sna.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: sna +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_sna diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_sot.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_sot.yaml new file mode 100644 index 0000000000000000000000000000000000000000..455c1adcc5b896ce2c2140c9f30e8fa1857e60a2 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_sot.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: sot +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_sot diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_swa.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_swa.yaml new file mode 100644 index 0000000000000000000000000000000000000000..462ddfd378f8c02a872780a8013f0f74378551e0 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_swa.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: swa +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_swa diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_twi.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_twi.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8c4673b7ba00668d5d3bdcacfd2e00f342362194 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_twi.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: twi +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_twi diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_wol.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_wol.yaml new file mode 100644 index 0000000000000000000000000000000000000000..08a8e030a4c0c0d444ac464b974d9886e434ff43 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_wol.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: wol +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_wol diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_xho.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_xho.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2103d182f3ca1703c43e03279a6d1aa9bcc9532d --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_xho.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: xho +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_xho diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_yor.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_yor.yaml new file mode 100644 index 0000000000000000000000000000000000000000..aa084c32a645cab532b002565f3c8a324708d6ba --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_yor.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: yor +doc_to_target: '{% if answer is not none %}{{answer[16:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_yor diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_zul.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_zul.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dcffb6944658282d620f7dbcec9d6513bcaf36c5 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/afrimgsm_direct_zul.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: zul +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: direct_yaml +task: afrimgsm_direct_zul diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/direct_yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/direct_yaml new file mode 100644 index 0000000000000000000000000000000000000000..be97482c9c08c309f511689a03e8e9635e1d583c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/direct/direct_yaml @@ -0,0 +1,37 @@ +# This file will be included in the generated language-specific task configs. +# It doesn't have a yaml file extension as it is not meant to be imported directly +# by the harness. +group: + - afrimgsm + - afrimgsm_direct +dataset_path: masakhane/afrimgsm +dataset_name: null # Overridden by language-specific config. +output_type: generate_until +# training_split: train +test_split: test +target_delimiter: "" +generation_kwargs: + until: + - "\n\n" + - "\n" + do_sample: false + temperature: 0.0 +filter_list: + - name: remove_whitespace + filter: + - function: remove_whitespace + - function: take_first + - filter: + - function: regex + group_select: -1 + regex_pattern: (-?[$0-9.,]{2,})|(-?[0-9]+) + - function: take_first + name: flexible-extract +metric_list: + - metric: exact_match + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: true +metadata: + version: 2.0 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_amh.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_amh.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f00400d96d15547bb73acd53c84ad5d4ce6f024f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_amh.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: amh +doc_to_target: '{% if answer is not none %}{{answer[15:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_amh diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_eng.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_eng.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c62bf206a3ff5644c5d213ef394f4f0cbe3667d0 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_eng.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: eng +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_eng diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_ewe.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_ewe.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ea246f7c16cec59da6562b0e17b43da0268caa0e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_ewe.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: ewe +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_ewe diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_fra.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_fra.yaml new file mode 100644 index 0000000000000000000000000000000000000000..16bf57b76e4d48384ee909854ce7ac4050215894 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_fra.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: fra +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_fra diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_hau.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_hau.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2a397baf1e40185883569b53ffc9bb82265b4257 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_hau.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: hau +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_hau diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_ibo.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_ibo.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9bd7bf62b4c9fed96aa01280c9d157a08cc04efb --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_ibo.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: ibo +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_ibo diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_kin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_kin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..841913b7c689a30833282cd40fdbc6a6db4a3dac --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_kin.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: kin +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_kin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_lin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_lin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..76d7fdb91fb8dd39b23d4c8c5a0513eaa6538a6d --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_lin.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: lin +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_lin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_lug.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_lug.yaml new file mode 100644 index 0000000000000000000000000000000000000000..84c05bb292fdec783de75f708002ad5e53c3e3fc --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_lug.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: lug +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_lug diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_orm.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_orm.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e9e5600e99104054e169ef1d29da528ef5a9be39 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_orm.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: orm +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_orm diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_sna.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_sna.yaml new file mode 100644 index 0000000000000000000000000000000000000000..058689623d3fa6147743052f840ab25f8ef0bb4f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_sna.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: sna +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_sna diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_sot.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_sot.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ae443f1833c3b248941bd0cdbae2e0a058625d4a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_sot.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: sot +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_sot diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_swa.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_swa.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1aa2d07d0e132e0cf2787d75ab6e7281b4302f97 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_swa.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: swa +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_swa diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_twi.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_twi.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2957cb378e5ec6b27f0911eeab048aa91bf40e43 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_twi.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: twi +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_twi diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_wol.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_wol.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6ecf4c44eff8d04d081a15062272ba168bab7ded --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_wol.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: wol +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_wol diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_xho.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_xho.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9dc6691bdee31264bcba551b0288980de24b6e7f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_xho.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: xho +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_xho diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_yor.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_yor.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8ef29830fa23b3fa561276bf6472a453c7e80384 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_yor.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: yor +doc_to_target: '{% if answer is not none %}{{answer[16:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_yor diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_zul.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_zul.yaml new file mode 100644 index 0000000000000000000000000000000000000000..24f486e0af03eda4a290eee0881da5a3b07dd96c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/afrimgsm_en_cot_zul.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: zul +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nStep-by-Step Answer:"}}{% else %}{{"Question: "+question+"\nStep-by-Step Answer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: cot_yaml +task: afrimgsm_en_cot_zul diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/cot_yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/cot_yaml new file mode 100644 index 0000000000000000000000000000000000000000..7b320046526f51725a1b01cc407793a82223439b --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/en_cot/cot_yaml @@ -0,0 +1,37 @@ +# This file will be included in the generated language-specific task configs. +# It doesn't have a yaml file extension as it is not meant to be imported directly by the harness. +group: + - afrimgsm + - afrimgsm_en_cot +dataset_path: masakhane/afrimgsm +dataset_name: null # Overridden by language-specific config. +output_type: generate_until +training_split: train +test_split: test +generation_kwargs: + until: + - "\n\n" + - "\n" + do_sample: false + temperature: 0.0 +target_delimiter: " " +metric_list: + - metric: exact_match + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: true +filter_list: + - name: "strict-match" + filter: + - function: "regex" + regex_pattern: "The answer is (\\-?[0-9\\.\\,]+)" + - function: "take_first" + - filter: + - function: regex + group_select: -1 + regex_pattern: (-?[$0-9.,]{2,})|(-?[0-9]+) + - function: take_first + name: flexible-extract +metadata: + version: 2.0 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/run.sh b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/run.sh new file mode 100644 index 0000000000000000000000000000000000000000..075500be33775dc49288ce7f7180604c7c6f99ce --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/run.sh @@ -0,0 +1,6 @@ +lm_eval --model hf \ + --model_args pretrained="google/gemma-7b" --tasks afrimgsm_en_cot_eng,mgsm_en_cot_en,afrimgsm_native_cot_eng,mgsm_native_cot_en,afrimgsm_direct_eng,mgsm_direct_en,afrimgsm_direct_native_eng \ + --device cuda:0 \ + --batch_size 1 \ + --verbosity DEBUG \ + --limit 5 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_amh.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_amh.yaml new file mode 100644 index 0000000000000000000000000000000000000000..55fbe4bfdb590b6d352b71c16eebefef3cbb3399 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_amh.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: amh +doc_to_target: '{% if answer is not none %}{{answer[15:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_amh diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_eng.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_eng.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1d729a5cab74ddeb5b3e03f97eadef54a5be3a3c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_eng.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: eng +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_eng diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_ewe.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_ewe.yaml new file mode 100644 index 0000000000000000000000000000000000000000..26191dc815bc0747c05af177e38662e4c4581bfb --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_ewe.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: ewe +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_ewe diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_fra.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_fra.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9f0331ee8f3f730372c3eaecb0defe0887bd6502 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_fra.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: fra +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_fra diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_hau.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_hau.yaml new file mode 100644 index 0000000000000000000000000000000000000000..850dad6351a693c2a738a0a570e15da8b412a63a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_hau.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: hau +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_hau diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_ibo.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_ibo.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8b81178cc719c44419e24b5e14fc5c3e61b73a7a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_ibo.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: ibo +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_ibo diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_kin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_kin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5a8f53e2e7e7449b1db465062bfb8524b94d3c85 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_kin.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: kin +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_kin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_lin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_lin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..58044ee2b887d3a83f9004e303da6c2bc048703f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_lin.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: lin +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_lin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_lug.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_lug.yaml new file mode 100644 index 0000000000000000000000000000000000000000..87013c146f2ef8bddee0a82c2c21949bcac549b0 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_lug.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: lug +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_lug diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_orm.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_orm.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1dd19325a57022df444f04eba5eb1b3ced117b61 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_orm.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: orm +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_orm diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_sna.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_sna.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d710b1da339ca0012239993417f83c946a7c3e09 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_sna.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: sna +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_sna diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_sot.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_sot.yaml new file mode 100644 index 0000000000000000000000000000000000000000..643eaaeef10a1f70b3b7f13b58cb606dd6ae3f73 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_sot.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: sot +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_sot diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_swa.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_swa.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b882e89c24a75ce06a1790791a084e1c087acc1b --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_swa.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: swa +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_swa diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_twi.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_twi.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ac946eb7f413d227dfe0fc5b770e0c6c7bc2d159 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_twi.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: twi +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_twi diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_wol.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_wol.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dbcc6b2e0e553ebe5353abaebbf6030d68c5b024 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_wol.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: wol +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_wol diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_xho.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_xho.yaml new file mode 100644 index 0000000000000000000000000000000000000000..dfb3d74f40fac640988e1ffba3caf007d56b66ec --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_xho.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: xho +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_xho diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_yor.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_yor.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6b4c346ffeeacd42de58efab206db84af0168670 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_yor.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: yor +doc_to_target: '{% if answer is not none %}{{answer[16:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_yor diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_zul.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_zul.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5e79edffadafebb8e31c710e854157046d15b10e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/afrimgsm_translate_zul.yaml @@ -0,0 +1,12 @@ +# Generated by utils.py +dataset_name: zul +doc_to_target: '{% if answer is not none %}{{answer[21:]}}{% else %}{{answer_number|string}}{% endif %}' +doc_to_text: '{% if answer is not none %}{{question+"\nAnswer:"}}{% else %}{{"Question: "+question+"\nAnswer:"}}{% endif %}' +generation_kwargs: + do_sample: false + until: + - 'Question:' + - + - <|im_end|> +include: translate_direct_yaml +task: afrimgsm_translate_direct_zul diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/translate_direct_yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/translate_direct_yaml new file mode 100644 index 0000000000000000000000000000000000000000..1e54d3ea43f33b037d1f28389a0c3d30c6589906 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimgsm/translate/translate_direct_yaml @@ -0,0 +1,36 @@ +# This file will be included in the generated language-specific task configs. +# It doesn't have a yaml file extension as it is not meant to be imported directly +# by the harness. +group: + - afrimgsm + - afrimgsm_translate +dataset_path: masakhane/afrimgsm-translate-test +dataset_name: null # Overridden by language-specific config. +output_type: generate_until +test_split: test +generation_kwargs: + until: + - "\n\n" + - "\n" + do_sample: false + temperature: 0.0 +target_delimiter: " " +filter_list: + - name: remove_whitespace + filter: + - function: remove_whitespace + - function: take_first + - filter: + - function: regex + group_select: -1 + regex_pattern: (-?[$0-9.,]{2,})|(-?[0-9]+) + - function: take_first + name: flexible-extract +metric_list: + - metric: exact_match + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: true +metadata: + version: 2.0 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/README.md b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f7f7ed4d82f04224440a0d164d2cc24c0e758990 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/README.md @@ -0,0 +1,50 @@ +# MathQA + +### Paper + +IrokoBench: A New Benchmark for African Languages in the Age of Large Language Models +https://arxiv.org/pdf/2406.03368 + +IrokoBench is a human-translated benchmark dataset for 16 typologically diverse +low-resource African languages covering three tasks: natural language inference (AfriXNLI), +mathematical reasoning (AfriMGSM), and multi-choice knowledge-based QA (AfriMMLU). + + +### Citation + +``` +@misc{adelani2024irokobenchnewbenchmarkafrican, + title={IrokoBench: A New Benchmark for African Languages in the Age of Large Language Models}, + author={David Ifeoluwa Adelani and Jessica Ojo and Israel Abebe Azime and Jian Yun Zhuang and Jesujoba O. Alabi and Xuanli He and Millicent Ochieng and Sara Hooker and Andiswa Bukula and En-Shiun Annie Lee and Chiamaka Chukwuneke and Happy Buzaaba and Blessing Sibanda and Godson Kalipe and Jonathan Mukiibi and Salomon Kabongo and Foutse Yuehgoh and Mmasibidi Setaka and Lolwethu Ndolela and Nkiruka Odu and Rooweither Mabuya and Shamsuddeen Hassan Muhammad and Salomey Osei and Sokhar Samb and Tadesse Kebede Guge and Pontus Stenetorp}, + year={2024}, + eprint={2406.03368}, + archivePrefix={arXiv}, + primaryClass={cs.CL}, + url={https://arxiv.org/abs/2406.03368}, +} +``` + +### Groups and Tasks + +#### Groups + +* `afrimmlu`: All afrimmlu tasks +* `afrimmlu_direct`: afrimmlu_direct evaluates models performance on the curated dataset +* `afrimmlu_translate`: afrimmlu_translate evaluates models in translate-test setting + +#### Tasks +* `afrimmlu_direct_{language_code}`: each task evaluates for one language +* `afrimmlu_translate_{language_code}`: each task evaluates for one language + +### Checklist + +For adding novel benchmarks/datasets to the library: +* [x] Is the task an existing benchmark in the literature? + * [x] Have you referenced the original paper that introduced the task? + * [ ] If yes, does the original paper provide a reference implementation? If so, have you checked against the reference implementation and documented how to run such a test? + +If other tasks on this dataset are already supported: +* [x] Is the "Main" variant of this task clearly denoted? +* [x] Have you provided a short sentence in a README on what each new variant adds / evaluates? +* [x] Have you noted which, if any, published evaluation setups are matched by this variant? + * [x] Checked for equivalence with v0.3.0 LM Evaluation Harness diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_common_yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_common_yaml new file mode 100644 index 0000000000000000000000000000000000000000..2cda741a7e757bd28010b916e20d0c9ee11fc989 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_common_yaml @@ -0,0 +1,37 @@ +group: + - afrimmlu + - afrimmlu_direct +task: null +dataset_path: masakhane/afrimmlu +dataset_name: null +output_type: multiple_choice +validation_split: validation +test_split: test +fewshot_split: validation +doc_to_text: !function utils.doc_to_text +doc_to_target: "{{['A', 'B', 'C', 'D'].index(answer)}}" +doc_to_choice: !function utils.doc_to_choice +should_decontaminate: true +doc_to_decontamination_query: "Question: {{question}}\nAnswer:" +metric_list: + - metric: f1 + aggregation: !function utils.weighted_f1_score + # aggregation: mean + average: weighted + hf_evaluate: true + higher_is_better: True + ignore_case: true + ignore_punctuation: true + regexes_to_ignore: + - "," + - "\\$" + - metric: acc + aggregation: mean + higher_is_better: true + ignore_case: true + ignore_punctuation: true + regexes_to_ignore: + - "," + - "\\$" +metadata: + version: 1.0 diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_amh.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_amh.yaml new file mode 100644 index 0000000000000000000000000000000000000000..aa60c668fd9b2879f020f990655e7eedce2b3a81 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_amh.yaml @@ -0,0 +1,3 @@ +dataset_name: amh +include: afrimmlu_common_yaml +task: afrimmlu_direct_amh diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_eng.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_eng.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a1e647cdf1d0278c73744288fa61cd7709550231 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_eng.yaml @@ -0,0 +1,3 @@ +dataset_name: eng +include: afrimmlu_common_yaml +task: afrimmlu_direct_eng diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_ewe.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_ewe.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1cc45ddc0e50d1bb4992aecdb4f5208dbb77881b --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_ewe.yaml @@ -0,0 +1,3 @@ +dataset_name: ewe +include: afrimmlu_common_yaml +task: afrimmlu_direct_ewe diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_fra.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_fra.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e6adb6c8aa4e50c6efca737792907cb658c30627 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_fra.yaml @@ -0,0 +1,3 @@ +dataset_name: fra +include: afrimmlu_common_yaml +task: afrimmlu_direct_fra diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_hau.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_hau.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9cc9a1ae7acc7318faf68a241f68b0d5cba93978 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_hau.yaml @@ -0,0 +1,3 @@ +dataset_name: hau +include: afrimmlu_common_yaml +task: afrimmlu_direct_hau diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_ibo.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_ibo.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6abb2c4a467986751376679b31ec5db8a7af0886 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_ibo.yaml @@ -0,0 +1,3 @@ +dataset_name: ibo +include: afrimmlu_common_yaml +task: afrimmlu_direct_ibo diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_kin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_kin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2f81f709c4812db3ecfa71bbb9cfb74099a10aab --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_kin.yaml @@ -0,0 +1,3 @@ +dataset_name: kin +include: afrimmlu_common_yaml +task: afrimmlu_direct_kin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_lin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_lin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..55363ed93772284fc54386592ae827c03246d681 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_lin.yaml @@ -0,0 +1,3 @@ +dataset_name: lin +include: afrimmlu_common_yaml +task: afrimmlu_direct_lin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_lug.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_lug.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0d484427eda8fcd4b645b3f90b191f075cb88ce9 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_lug.yaml @@ -0,0 +1,3 @@ +dataset_name: lug +include: afrimmlu_common_yaml +task: afrimmlu_direct_lug diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_orm.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_orm.yaml new file mode 100644 index 0000000000000000000000000000000000000000..763eb8a75f894797185436d3a83c9fd57393f4ac --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_orm.yaml @@ -0,0 +1,3 @@ +dataset_name: orm +include: afrimmlu_common_yaml +task: afrimmlu_direct_orm diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_sna.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_sna.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ed9e69af392838290bac14d08259585c56daace8 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_sna.yaml @@ -0,0 +1,3 @@ +dataset_name: sna +include: afrimmlu_common_yaml +task: afrimmlu_direct_sna diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_sot.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_sot.yaml new file mode 100644 index 0000000000000000000000000000000000000000..acdba0fdccf12f73004669dbed1b7cbee9ded24f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_sot.yaml @@ -0,0 +1,3 @@ +dataset_name: sot +include: afrimmlu_common_yaml +task: afrimmlu_direct_sot diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_swa.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_swa.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c1aa82b0b1d44314c337b904c346806cb3c720a4 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_swa.yaml @@ -0,0 +1,3 @@ +dataset_name: swa +include: afrimmlu_common_yaml +task: afrimmlu_direct_swa diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_twi.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_twi.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2695d4a156d4b59dbb2c483ebdbbc16e01c7a415 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_twi.yaml @@ -0,0 +1,3 @@ +dataset_name: twi +include: afrimmlu_common_yaml +task: afrimmlu_direct_twi diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_wol.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_wol.yaml new file mode 100644 index 0000000000000000000000000000000000000000..027f837637fb061d227d33e925d3030af51c3cbe --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_wol.yaml @@ -0,0 +1,3 @@ +dataset_name: wol +include: afrimmlu_common_yaml +task: afrimmlu_direct_wol diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_xho.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_xho.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8e0c12972d01be342a6838b0eab4c1f609d6dc48 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_xho.yaml @@ -0,0 +1,3 @@ +dataset_name: xho +include: afrimmlu_common_yaml +task: afrimmlu_direct_xho diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_yor.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_yor.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2a9f7645c2259a607f871e54b07c14ab962ed04c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_yor.yaml @@ -0,0 +1,3 @@ +dataset_name: yor +include: afrimmlu_common_yaml +task: afrimmlu_direct_yor diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_zul.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_zul.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9d8d3b415b44ef4ab0b762f411006c7b00d54226 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/afrimmlu_direct_zul.yaml @@ -0,0 +1,3 @@ +dataset_name: zul +include: afrimmlu_common_yaml +task: afrimmlu_direct_zul diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/utils.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..f1bb9162f0fbc68807db68134970ae2636980cbf --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/direct/utils.py @@ -0,0 +1,32 @@ +from lm_eval.utils import weighted_f1_score + + +def doc_to_choice(doc): + choices = eval(doc["choices"]) + return choices + + +def doc_to_text(doc): + output = """You are a highly knowledgeable and intelligent artificial intelligence + model answers multiple-choice questions about {subject} + + Question: {question} + + Choices: + A: {choice1} + B: {choice2} + C: {choice3} + D: {choice4} + + Answer: """ + + choices = eval(doc["choices"]) + text = output.format( + subject=doc["subject"], + question=doc["question"], + choice1=choices[0], + choice2=choices[1], + choice3=choices[2], + choice4=choices[3], + ) + return text diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/fewshot.sh b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/fewshot.sh new file mode 100644 index 0000000000000000000000000000000000000000..c69c48d7dff4e2495485023187dc162742c7ca6a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/fewshot.sh @@ -0,0 +1,8 @@ +lm_eval --model hf \ + --model_args pretrained=masakhane/African-ultrachat-alpaca \ + --tasks afrimmlu_direct_amh,afrimmlu_direct_eng,afrimmlu_direct_ewe,afrimmlu_direct_fra,afrimmlu_direct_hau,afrimmlu_direct_ibo,afrimmlu_direct_kin,afrimmlu_direct_lin,afrimmlu_direct_lug,afrimmlu_direct_orm,afrimmlu_direct_sna,afrimmlu_direct_sot,afrimmlu_direct_twi,afrimmlu_direct_wol,afrimmlu_direct_xho,afrimmlu_direct_yor,afrimmlu_direct_zul \ + --device cuda:0 \ + --batch_size 1 \ + --num_fewshot 0 \ + --verbosity DEBUG \ + --wandb_args project=afrimmlu diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_amh.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_amh.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ac88ffa9500701e8bbb2b5c64d1f4c9f2ec856bc --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_amh.yaml @@ -0,0 +1,3 @@ +dataset_name: amh +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_amh diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_eng.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_eng.yaml new file mode 100644 index 0000000000000000000000000000000000000000..0be98beedd86223dd14c1abbf51dbe93c7ff658a --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_eng.yaml @@ -0,0 +1,3 @@ +dataset_name: eng +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_eng diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_ewe.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_ewe.yaml new file mode 100644 index 0000000000000000000000000000000000000000..624342b91f383479c7ef340bfb80ce305608cf61 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_ewe.yaml @@ -0,0 +1,3 @@ +dataset_name: ewe +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_ewe diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_fra.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_fra.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c4fd7e1fc774b6dd987e6c35d3a3fadbf6d577c4 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_fra.yaml @@ -0,0 +1,3 @@ +dataset_name: fra +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_fra diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_hau.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_hau.yaml new file mode 100644 index 0000000000000000000000000000000000000000..aaeb415fa2a00516ea3a84133066b7eae009f017 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_hau.yaml @@ -0,0 +1,3 @@ +dataset_name: hau +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_hau diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_ibo.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_ibo.yaml new file mode 100644 index 0000000000000000000000000000000000000000..93fb24e8c3fa799a41c022a708748bb5e7341631 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_ibo.yaml @@ -0,0 +1,3 @@ +dataset_name: ibo +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_ibo diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_kin.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_kin.yaml new file mode 100644 index 0000000000000000000000000000000000000000..f39f666840626dcf6ea61a196be702ec1c3e3308 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_kin.yaml @@ -0,0 +1,3 @@ +dataset_name: kin +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_kin diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_lug.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_lug.yaml new file mode 100644 index 0000000000000000000000000000000000000000..72e4bce0113c8473eabf68a7d2e43ba2eabc965c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_lug.yaml @@ -0,0 +1,3 @@ +dataset_name: lug +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_lug diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_sna.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_sna.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9979740a9bf6194d9a9c4db0f0b4845312f1aed7 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_sna.yaml @@ -0,0 +1,3 @@ +dataset_name: sna +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_sna diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_sot.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_sot.yaml new file mode 100644 index 0000000000000000000000000000000000000000..deb2b9b81d544140bfa7e720d0b544089b39bfcd --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_sot.yaml @@ -0,0 +1,3 @@ +dataset_name: sot +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_sot diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_twi.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_twi.yaml new file mode 100644 index 0000000000000000000000000000000000000000..51a2d26ae0563acda4972b272de4c0d6de81146f --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_twi.yaml @@ -0,0 +1,3 @@ +dataset_name: twi +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_twi diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_xho.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_xho.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c0bdf4471b2178c67d7f6e1ae9c5fba16b3b7710 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/translate/afrimmlu_translate_xho.yaml @@ -0,0 +1,3 @@ +dataset_name: xho +include: afrimmlu_common_translate_yaml +task: afrimmlu_translate_xho diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/utils.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..9d02b342b2e3c9f3d3bd66d3f62330aa53c9159c --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrimmlu/utils.py @@ -0,0 +1,32 @@ +from lm_eval.utils import weighted_f1_score + + +def doc_to_choice(doc): + choices = eval(doc["choices"]) + return choices + + +def doc_to_text(doc): + output = """You are a highly knowledgeable and intelligent artificial intelligence + model answers multiple-choice questions about '{subject}' + + Question: '''{question}''' + + Choices: + A: ''{choice1}''' + B: ''{choice2}''' + C: ''{choice3}''' + D: ''{choice4}''' + + Answer: """ + + choices = eval(doc["choices"]) + text = output.format( + subject=doc["subject"], + question=doc["question"], + choice1=choices[0], + choice2=choices[1], + choice3=choices[2], + choice4=choices[3], + ) + return text diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrixnli/anli prompt/en-direct/afrixnli_en_direct_amh.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrixnli/anli prompt/en-direct/afrixnli_en_direct_amh.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3727f15a1825dfd7f1a5b5dae00ada16c69af054 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrixnli/anli prompt/en-direct/afrixnli_en_direct_amh.yaml @@ -0,0 +1,4 @@ +# Generated by utils.py +dataset_name: amh +include: afrixnli_en_direct_yaml +task: afrixnli_en_direct_amh diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrixnli/anli prompt/en-direct/afrixnli_en_direct_ibo.yaml b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrixnli/anli prompt/en-direct/afrixnli_en_direct_ibo.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b8762c691458dd9709e236cb493eabb3fcb6881e --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/tasks/afrixnli/anli prompt/en-direct/afrixnli_en_direct_ibo.yaml @@ -0,0 +1,4 @@ +# Generated by utils.py +dataset_name: ibo +include: afrixnli_en_direct_yaml +task: afrixnli_en_direct_ibo diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/utils.py b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..7166e24d0723e397f00347d6f14eb14e5902a452 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/lm_eval/utils.py @@ -0,0 +1,501 @@ +import collections +import fnmatch +import functools +import hashlib +import importlib.util +import inspect +import json +import logging +import os +import re +from dataclasses import asdict, is_dataclass +from itertools import islice +from typing import Any, Callable, List + +import numpy as np +import yaml +from jinja2 import BaseLoader, Environment, StrictUndefined + + +logging.basicConfig( + format="%(asctime)s,%(msecs)03d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s", + datefmt="%Y-%m-%d:%H:%M:%S", + level=logging.INFO, +) +eval_logger = logging.getLogger("lm-eval") + +SPACING = " " * 47 + +HIGHER_IS_BETTER_SYMBOLS = { + True: "↑", + False: "↓", +} + + +def hash_string(string: str) -> str: + return hashlib.sha256(string.encode("utf-8")).hexdigest() + + +def escaped_split(text, sep_char, maxsplit=-1): + """Split text into a list on occurrences of the given separation + character `sep_char`. The separation character may be escaped by a + backslash to avoid splitting at that location. + + The separation character must be a string of size 1. + + If `maxsplit` is given, at most `maxsplit` splits are done (thus, + the list will have at most `maxsplit + 1` elements). If `maxsplit` + is not specified or less than 0, then there is no limit on the + number of splits (all possible splits are made). + """ + assert ( + len(sep_char) == 1 + ), "separation string must be a single character for escaped splitting" + + if maxsplit == 0: + return text + maxsplit = max(0, maxsplit) + + return re.split(r"(? str: + """ + Given the sample results filenames, extracts and returns the task name. + """ + return filename[filename.find("_") + 1 : filename.rfind("_")] + + +def get_file_datetime(filename: str) -> str: + """ + Given the results and sample results filenames, extracts and returns the datetime. + """ + return filename[filename.rfind("_") + 1 :].replace(".jsonl", "") + + +def sanitize_model_name(model_name: str) -> str: + """ + Given the model name, returns a sanitized version of it. + """ + return re.sub(r"[\"<>:/\|\\?\*\[\]]+", "__", model_name) + + +def sanitize_task_name(task_name: str) -> str: + """ + Given the task name, returns a sanitized version of it. + """ + return re.sub(r"\W", "_", task_name) + + +def get_latest_filename(filenames: List[str]) -> str: + """ + Given a list of filenames, returns the filename with the latest datetime. + """ + return max(filenames, key=lambda f: get_file_datetime(f)) + + +def get_results_filenames(filenames: List[str]) -> List[str]: + """ + Extracts filenames that correspond to aggregated results. + """ + return [f for f in filenames if "/results_" in f and ".json" in f] + + +def get_sample_results_filenames(filenames: List[str]) -> List[str]: + """ + Extracts filenames that correspond to sample results. + """ + return [f for f in filenames if "/samples_" in f and ".json" in f] + + +def get_rolling_token_windows(token_list, prefix_token, max_seq_len, context_len): + """ + - context_len allows for a rolling window context, allowing each prediction window to potentially + condition on some context + + :param token_list: list + List of tokens to be PREDICTED + :param max_seq_len: int + max_seq_len of model (or max_seq_len we want to use) + :param context_len: int + Amount of desired token context for prediction. Needs to be at least 1. + :param prefix_token: token + Dummy token like so the first token has something to condition on + :return: generator + Generator of tuples + (input_tokens, pred_tokens) + Note: Score only the last len(pred_tokens) logits of the LM + """ + assert 1 <= context_len <= max_seq_len + if not token_list: + return + # +1 offset, going from input->preds + pred_len = max_seq_len - context_len + 1 + predicted = 0 + + # Special handling for first window: predict all tokens + first_seq_len = min(max_seq_len, len(token_list)) + yield ([prefix_token] + token_list[: first_seq_len - 1], token_list[:first_seq_len]) + predicted += first_seq_len + + while predicted < len(token_list): + window_pred_len = min(len(token_list) - predicted, pred_len) + window_end = predicted + window_pred_len + + yield ( + token_list[window_end - max_seq_len - 1 : window_end - 1], + token_list[window_end - window_pred_len : window_end], + ) + predicted += window_pred_len + + +def make_disjoint_window(pair): + """Takes output from get_rolling_token_windows and makes the context not overlap with the continuation""" + a, b = pair + return a[: len(a) - (len(b) - 1)], b + + +class EnhancedJSONEncoder(json.JSONEncoder): + """ + Provides a proper json encoding for the loggers and trackers json dumps. + Notably manages the json encoding of dataclasses. + """ + + def default(self, o): + if is_dataclass(o): + return asdict(o) + return super().default(o) + + +class Reorderer: + def __init__(self, arr: List[Any], fn: Callable) -> None: + """Reorder an array according to some function + + Args: + arr (List[Any]): The initial array + fn (Callable[[Any], Any]): A function to determine the priority of elements + """ + self.size = len(arr) + arr = list(enumerate(arr)) + arr = group(arr, lambda x: fn(x[1])) + # arr = [([y[0] for y in x], x[0][1]) for x in arr] + # TODO: overhaul reorderer. It currently grouped requests by content but we don't want this + arr = [([y[0]], x[0][1]) for x in arr for y in x] + arr.sort(key=lambda x: fn(x[1])) + + self.arr = arr + + def get_reordered(self): + """Gets the reordered array + + Returns: + List[Any]: The reordered array + """ + return [x[1] for x in self.arr] + + def get_original(self, newarr): + """Restores the original order of a new array based on the old array's order + + Args: + newarr (List[Any]): The array to be restored + + Returns: + List[Any]: The array restored to the original order + """ + res = [None] * self.size + cov = [False] * self.size + + for (inds, _), v in zip(self.arr, newarr): + for ind in inds: + res[ind] = v + cov[ind] = True + + assert all(cov) + + return res + + +def make_table(result_dict, column: str = "results", sort_results: bool = False): + """Generate table of results.""" + from pytablewriter import LatexTableWriter, MarkdownTableWriter + + if column == "results": + column_name = "Tasks" + elif column == "groups": + column_name = "Groups" + + all_headers = [ + column_name, + "Version", + "Filter", + "n-shot", + "Metric", + "", + "Value", + "", + "Stderr", + ] + + md_writer = MarkdownTableWriter() + latex_writer = LatexTableWriter() + md_writer.headers = all_headers + latex_writer.headers = all_headers + + values = [] + + keys = result_dict[column].keys() + if sort_results: + # sort entries alphabetically by task or group name. + # NOTE: we default here to false, because order matters for multi-level table printing a la mmlu. + # sorting here would mess that up + keys = sorted(keys) + for k in keys: + dic = result_dict[column][k] + version = result_dict["versions"].get(k, " N/A") + n = str(result_dict.get("n-shot", " ").get(k, " ")) + higher_is_better = result_dict.get("higher_is_better", {}).get(k, {}) + + if "alias" in dic: + k = dic.pop("alias") + + metric_items = dic.items() + metric_items = sorted(metric_items) + + for (mf), v in metric_items: + m, _, f = mf.partition(",") + if m.endswith("_stderr"): + continue + + hib = HIGHER_IS_BETTER_SYMBOLS.get(higher_is_better.get(m), "") + + v = "%.4f" % v if isinstance(v, float) else v + + if m + "_stderr" + "," + f in dic: + se = dic[m + "_stderr" + "," + f] + se = " N/A" if se == "N/A" else "%.4f" % se + values.append([k, version, f, n, m, hib, v, "±", se]) + else: + values.append([k, version, f, n, m, hib, v, "", ""]) + k = "" + version = "" + md_writer.value_matrix = values + latex_writer.value_matrix = values + + # todo: make latex table look good + # print(latex_writer.dumps()) + + return md_writer.dumps() + + +def positional_deprecated(fn): + """ + A decorator to nudge users into passing only keyword args (`kwargs`) to the + wrapped function, `fn`. + """ + + @functools.wraps(fn) + def _wrapper(*args, **kwargs): + if len(args) != 1 if inspect.ismethod(fn) else 0: + print( + f"WARNING: using {fn.__name__} with positional arguments is " + "deprecated and will be disallowed in a future version of " + "lm-evaluation-harness!" + ) + return fn(*args, **kwargs) + + return _wrapper + + +def ignore_constructor(loader, node): + return node + + +def import_function(loader, node): + function_name = loader.construct_scalar(node) + yaml_path = os.path.dirname(loader.name) + + *module_name, function_name = function_name.split(".") + if isinstance(module_name, list): + module_name = ".".join(module_name) + module_path = os.path.normpath(os.path.join(yaml_path, "{}.py".format(module_name))) + + spec = importlib.util.spec_from_file_location(module_name, module_path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + function = getattr(module, function_name) + return function + + +def load_yaml_config(yaml_path=None, yaml_config=None, yaml_dir=None, mode="full"): + if mode == "simple": + constructor_fn = ignore_constructor + elif mode == "full": + constructor_fn = import_function + + # Add the import_function constructor to the YAML loader + yaml.add_constructor("!function", constructor_fn) + if yaml_config is None: + with open(yaml_path, "rb") as file: + yaml_config = yaml.full_load(file) + + if yaml_dir is None: + yaml_dir = os.path.dirname(yaml_path) + + assert yaml_dir is not None + + if "include" in yaml_config: + include_path = yaml_config["include"] + del yaml_config["include"] + + if isinstance(include_path, str): + include_path = [include_path] + + # Load from the last one first + include_path.reverse() + final_yaml_config = {} + for path in include_path: + # Assumes that path is a full path. + # If not found, assume the included yaml + # is in the same dir as the original yaml + if not os.path.isfile(path): + path = os.path.join(yaml_dir, path) + + try: + included_yaml_config = load_yaml_config(yaml_path=path, mode=mode) + final_yaml_config.update(included_yaml_config) + except Exception as ex: + # If failed to load, ignore + raise ex + + final_yaml_config.update(yaml_config) + return final_yaml_config + return yaml_config + + +def regex_replace(string, pattern, repl, count: int = 0): + """Implements the `re.sub` function as a custom Jinja filter.""" + return re.sub(pattern, repl, string, count=count) + + +env = Environment( + loader=BaseLoader, undefined=StrictUndefined, keep_trailing_newline=True +) +env.filters["regex_replace"] = regex_replace + + +def apply_template(template: str, doc: dict) -> str: + rtemplate = env.from_string(template) + return rtemplate.render(**doc) + + +def create_iterator(raw_iterator, *, rank=0, world_size=1, limit=None): + """ + Method for creating a (potentially) sliced and limited + iterator from a raw document iterator. Used for splitting data + among ranks in multigpu setting or only pulling a sample of documents + """ + return islice(raw_iterator, rank, limit, world_size) + + +def weighted_f1_score(items): + from sklearn.metrics import f1_score + + unzipped_list = list(zip(*items)) + golds = unzipped_list[0] + preds = unzipped_list[1] + fscore = f1_score(golds, preds, average="weighted") + return fscore diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/mypy.ini b/lm-quant-toolkit/.deps/lm-evaluation-harness/mypy.ini new file mode 100644 index 0000000000000000000000000000000000000000..76a0c86452e1943edb6680b9a1fdc9627e2f7593 --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/mypy.ini @@ -0,0 +1,29 @@ +[mypy] +python_version = 3.8 +show_traceback = True +check_untyped_defs = True +no_implicit_reexport = True +warn_unreachable = True +warn_unused_configs = True +warn_unused_ignores = True +warn_redundant_casts = True + +# We ignore errors everywhere to gradually add type annotations + +[mypy-lm_eval.*] +ignore_errors = True + +[mypy-lm_eval.api.*] +ignore_errors = True + +[mypy-lm_eval.prompts.*] +ignore_errors = True + +[mypy-lm_eval.models.*] +ignore_errors = True + +[mypy-scripts.*] +ignore_errors = True + +[mypy-main] +ignore_errors = True diff --git a/lm-quant-toolkit/.deps/lm-evaluation-harness/pyproject.toml b/lm-quant-toolkit/.deps/lm-evaluation-harness/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..a26ffceb83ae17d49f6c267bc45e17f207d7192b --- /dev/null +++ b/lm-quant-toolkit/.deps/lm-evaluation-harness/pyproject.toml @@ -0,0 +1,114 @@ +[build-system] +requires = ["setuptools>=40.8.0", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "lm_eval" +version = "0.4.5" +authors = [ + {name="EleutherAI", email="contact@eleuther.ai"} +] +description = "A framework for evaluating language models" +readme = "README.md" +classifiers = [ + "Development Status :: 3 - Alpha", + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] +requires-python = ">=3.8" +license = { "text" = "MIT" } +dependencies = [ + "accelerate>=0.26.0", + "evaluate", + "datasets>=2.16.0", + "evaluate>=0.4.0", + "jsonlines", + "numexpr", + "peft>=0.2.0", + "pybind11>=2.6.2", + "pytablewriter", + "rouge-score>=0.0.4", + "sacrebleu>=1.5.0", + "scikit-learn>=0.24.1", + "sqlitedict", + "torch>=1.8", + "tqdm-multiprocess", + "transformers>=4.1", + "zstandard", + "dill", + "word2number", + "more_itertools", +] + +[tool.setuptools.packages.find] +include = ["lm_eval*"] + +# required to include yaml files in pip installation +[tool.setuptools.package-data] +lm_eval = ["**/*.yaml", "tasks/**/*"] + +[project.scripts] +lm-eval = "lm_eval.__main__:cli_evaluate" +lm_eval = "lm_eval.__main__:cli_evaluate" + +[project.urls] +Homepage = "https://github.com/EleutherAI/lm-evaluation-harness" +Repository = "https://github.com/EleutherAI/lm-evaluation-harness" + +[project.optional-dependencies] +api = ["requests", "aiohttp", "tenacity", "tqdm", "tiktoken"] +dev = ["pytest", "pytest-cov", "pytest-xdist", "pre-commit", "mypy"] +deepsparse = ["deepsparse-nightly[llm]>=1.8.0.20240404"] +gptq = ["auto-gptq[triton]>=0.6.0"] +awq = ["auto-awq>=0.2.6"] +hqq = ["hqq>=0.2.1"] +hf_transfer = ["hf_transfer"] +ibm_watsonx_ai = ["ibm_watsonx_ai>=1.1.22"] +ifeval = ["langdetect", "immutabledict", "nltk>=3.9.1"] +neuronx = ["optimum[neuronx]"] +mamba = ["mamba_ssm", "causal-conv1d==1.0.2"] +math = ["sympy>=1.12", "antlr4-python3-runtime==4.11"] +multilingual = ["nagisa>=0.2.7", "jieba>=0.42.1", "pycountry"] +optimum = ["optimum[openvino]"] +promptsource = ["promptsource>=0.2.3"] +sentencepiece = ["sentencepiece>=0.1.98"] +sparseml = ["sparseml-nightly[llm]>=1.8.0.20240404"] +testing = ["pytest", "pytest-cov", "pytest-xdist"] +vllm = ["vllm>=0.4.2"] +zeno = ["pandas", "zeno-client"] +wandb = ["wandb>=0.16.3", "pandas", "numpy"] +gptqmodel = ["gptqmodel>=1.0.9"] +japanese_leaderboard = ["emoji==2.14.0", "neologdn==0.5.3", "fugashi[unidic-lite]", "rouge_score>=0.1.2"] +all = [ + "lm_eval[anthropic]", + "lm_eval[dev]", + "lm_eval[deepsparse]", + "lm_eval[gptq]", + "lm_eval[hf_transfer]", + "lm_eval[ibm_watsonx_ai]", + "lm_eval[ifeval]", + "lm_eval[mamba]", + "lm_eval[math]", + "lm_eval[multilingual]", + "lm_eval[openai]", + "lm_eval[promptsource]", + "lm_eval[sentencepiece]", + "lm_eval[sparseml]", + "lm_eval[testing]", + "lm_eval[vllm]", + "lm_eval[zeno]", + "lm_eval[wandb]", + "lm_eval[japanese_leaderboard]", +] + +[tool.ruff.lint] +extend-select = ["I"] + +[tool.ruff.lint.isort] +lines-after-imports = 2 +known-first-party = ["lm_eval"] + +[tool.ruff.lint.extend-per-file-ignores] +"__init__.py" = ["F401","F402","F403"] +"utils.py" = ["F401"] diff --git a/lm-quant-toolkit/.editorconfig b/lm-quant-toolkit/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..a0150356a1e6fb915bb4cdd61be1fe41bd0e1d66 --- /dev/null +++ b/lm-quant-toolkit/.editorconfig @@ -0,0 +1,29 @@ +# EditorConfig: http://editorconfig.org/ + +root = true + +[*] +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space + +[*.py] +max_line_length = 80 +indent_style = space +indent_size = 4 + +[*.md] +max_line_length = 80 + +[*.json] +indent_size = 2 + +[*.py] +indent_size = 4 + +[*.sh] +indent_size = 4 + +[*.{yml,yaml}] +indent_size = 2 diff --git a/lm-quant-toolkit/.gitignore b/lm-quant-toolkit/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b198d631f304debca7f6624164cbedd6b11f9712 --- /dev/null +++ b/lm-quant-toolkit/.gitignore @@ -0,0 +1,26 @@ +.DS_Store +credential.ini +*-debug.py +*.log +*.bak +*.swo +*.swp +*.egg +*.egg/ +*.egg-info/ +*.pyc +.tox/ +_build/ +build +dist/ +.coverage +.cache +htmlcov +*requirement*.txt +*.pickle +*.parquet +.*venv/ +# R related files +.Rproj.user +.Rhistory +Rplots.pdf diff --git a/lm-quant-toolkit/LICENSE b/lm-quant-toolkit/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..ad396d05628ddd35d92180c0a834c538f18a1e83 --- /dev/null +++ b/lm-quant-toolkit/LICENSE @@ -0,0 +1,17 @@ +Copyright 2024 Justin Zhang + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +“Software”), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/lm-quant-toolkit/MANIFEST.in b/lm-quant-toolkit/MANIFEST.in new file mode 100644 index 0000000000000000000000000000000000000000..533aa7df34b86451bca0a6d36817987b63462b3a --- /dev/null +++ b/lm-quant-toolkit/MANIFEST.in @@ -0,0 +1,5 @@ +include MANIFEST.in +include README.rst +include LICENSE +recursive-include docs *.rst conf.py Makefile +recursive-include src *.py diff --git a/lm-quant-toolkit/README.md b/lm-quant-toolkit/README.md new file mode 100644 index 0000000000000000000000000000000000000000..82ee2328403f1bd7130254e4c7587ea1507f0e51 --- /dev/null +++ b/lm-quant-toolkit/README.md @@ -0,0 +1,431 @@ +# Overview + +The **lm-quant-toolkit** is a suite of tools to facilitate large neural network +quantization research. It includes a quantization harness tool to drive +quantization experiments on large language models and vision models, to collect +and summarize experiment data for further analysis. It also includes tool to +prepare experiment meta data and visualization tools to interpret experiment +results. Specifically, lm-quant-toolkit consists of: + +- LLM quantization harness tool +- ViT quantization harness tool +- FNorm Metadata Preparation Tool +- Kurtosis Metrics Measuring Tool +- Sensitivity Score Measuring Tool +- Calibration Dataset Generation Tool +- Visualization Tools + +## Citation + +~~~~ +@inproceedings{zhang2025mxq, + title = {A Mixed Quantization Approach for Data-Free Quantization of LLMs}, + author = {Feng Zhang and Yanbin Liu and Weihua Li and Xiaodan Wang and Quan Bai}, + year = {2025}, + url = {https://openreview.net/forum?id=M3Y74vmsMcY}, +} +~~~~ + +## Setup test harness + +Most tools are implemented in Python and are extensively tested under the +Python 3.11.9. The visualization tools are implemented in R. The usages of +these tools are elaborated in the following sections. This section describes +how to setup the lm-quant-toolkit and the companion visualization tools. + +The Python tools dependend on Python libraries such as transformers, datasets, +numpy, PyTorch etc. A few Python libraries are patched to support MXQ. +Specifically, required patched dependencies include AutoGPTQ (for CUDA 12.5 +compatibility), HQQ (support MXQ extension), lm_eval (for end-to-end LLM +performance evaluation), clip_benchmark (for vision model evaluation). These +dependencies are installed automatically as part of setup process. To setup the +Python tools, follow this procedure: + +- Ensure Python and miniconda are installed +- Create a Python virtual enivonrment using Python 3.11.9 and activate this enivonrment +- Clone the lm-quant-toolkit project from [the lm-quant-toolkit project][2] +- Run the script setup-harness.sh under the root directory of the lm-quant-toolkit project + +Or simply use the convenient script `setup-harness.sh` included this project. + +## Setup visualization tools + +The visualization tools are R scripts to transform, aggregate and visualize +experiment results. They are wrapped in bash scripts to automate the whole +experiment loop, which consists of model quantization, perplex evaluation, +memory consumption test and experiment report generation. The R visualization +scripts can also be used separately. To setup the visualization tools, please +follow this procedure: + +- Ensure a recent version of R, for instance R 4.4.1, is installed. +- Optionally, RStudio could be installed to extend and trouble shoot the +visualization tools in an intuitive enivonrment. +- Install the third-party packages required by the visualization tools by +running the script `setup-visualization.sh` under the root directory of the +lm-quant-toolkit project. + +# Quantization tool usage + +## LLM Quantization Harness Tool + +This tool executes various quantization tasks and runs diverse evaluation +benchmarks such as perplexity, GPU memory usage, quantized model storage. It +also supports end-to-end LLM performance evaluation through the integration +with the `lm-eval` tool. This harness tool works with various state-of-art +quantization methods such as GPTQ, AWQ, BitsAndBytes and HQQ, which enables a +fair comparison between the proposed methods and the state-of-art baselines. +Furthermore, it facilitates the complex and time-consuming benchmarking tasks +by offering resumption from failed subtasks, aggregate subtask's evaluation +results. Lastly, this tool provides declarative CLI interface to ease complex +experiment automation through shell scripting. + +## FNorm Metadata Preparation Tool + +This tool calculates the Frobenius norms, a.k.a FNorm, of the quantization +errors of all weight matricies inside a particular large language model. The +FNorm meta-data are crucial to the MXQ quantization scheme as it guides MXQ to +allocate optimal quantization configurations. This tool accepts a list of +Hugging Face-compliant model identifiers. The output of this tool is a series +of .csv files under specified directory. Each file contains the Frobenius +norms for the 12 quantization configurations. + +The tool is implemented in Python and provides a convenient CLI interface to +enable shell scripting. It is located separately in the `dump.py` file +under the `src` folder in the `lm-quant-toolkit` project, which helps +to reduce unnecessary dependencies. A typical usage is demonstrated in the code +snippet as follows: + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="$HOME/work/lm-quant-toolkit" +MODELS="meta-llama/Llama-2-7b-hf meta-llama/Llama-2-13b-hf meta-llama/Llama-3.1-8B" +mkdir -p /tmp/fnorm-dump +python $TOOLKIT_DIR/src/dump.py fnorm \ + --model $MODELS \ + --output-dir /tmp/fnorm-dump +~~~~ + + +## Kurtosis Metrics Measuring Tool + +This tool calculates the Kurtosis metrics of weight matricies layer-by-layer +inside a particular large language model. The Kurtosis metrcis are crucial to +identify sensitive layers to improve the accuracy of MXQ quantization. This +tool accepts a list of Hugging Face-compliant model identifiers. The output of +this tool is a series of .csv files under specified directory. Each file +contains the Kurtosis metrics for corresponding models. + +The tool is implemented in Python and provides a convenient CLI interface to +enable shell scripting. It is included in the `dump.py` file under the +`src` folder in the `lm-quant-toolkit` project. A typical usage is +demonstrated in the code snippet as follows: + +~~~~bash +#!/bin/bash + +MODELS="meta-llama/Llama-2-7b-hf meta-llama/Llama-2-13b-hf meta-llama/Meta-Llama-3-8B" +mkdir -p /tmp/kurtosis-dump +python ../src/dump.py kurtosis \ + --model $MODELS \ + --output-dir /tmp/kurtosis-dump +~~~~ + +This code snippet demonstrates dumping the kurtosis metrics for the three Llama +models into the `/tmp/kurtosis-dump` directory. + +## Sensitivity Score Measuring Tool + +This tool calculates the sensitivity score of each layer of a particular large +language model. The sensitivity score are crucial to identify sensitive layers +to improve the accuracy of MXQ quantization. This tool accepts a list of +Hugging Face-compliant model identifiers. The output of this tool is a series +of .csv files, each contains the sensitivity score for corresponding model. +These files are crucial inputs to guide the SensiBoost and Sensitivity-based +MiLP. + +The tool is implemented in Python and provides a convenient CLI interface to +enable shell scripting. It is compatible with any transformer-based LLMs with +an implementation of the popular Hugging Face transformers library. It is +located separately in the `dump.py` file under the `src` folder in +the `lm-quant-toolkit` project, which helps to reduce unnecessary +dependencies. A typical usage is demonstrated in the code snippet as follows: + + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="$HOME/work/lm-quant-toolkit" +RESULT_BASE_DIR="/data/llm/mxq/results" +CALIB_DATASETS="bos pileval wikitext c4" +CONFIGS="b2g128 b2g64 b2g32 b3g128 b3g64 b3g32 b4g128 b4g64 b4g32 b8g128 b8g64 b8g32" +MODELS="Qwen/Qwen2.5-7B Qwen/Qwen2.5-Coder-7B Qwen/Qwen2.5-Coder-7B-Instruct Qwen/Qwen2.5-Math-7B" + +EXP_NAME=sensi_qwen25 +RESULT_DIR=$RESULT_BASE_DIR/$EXP_NAME +mkdir -p $RESULT_DIR/data + +for DS in $CALIB_DATASETS; do + for CFG in $CONFIGS; do + for MODEL in $MODELS; do + SHORT_ID=$(echo $MODEL | cut -d/ -f2) + OUT_FILE="${RESULT_DIR}/data/qwen25-sensi-${SHORT_ID}-${CFG}-${DS}.csv" + python $TOOLKIT_DIR/src/dump.py sensi \ + --model $MODEL \ + --config $CFG \ + --calib-dataset $DS \ + --output-file $OUT_FILE + done + done +done +~~~~ + +The code snippet demonstrates how to calculate the sensitivity scores for a +series of Qwen2.5 models using 4 calibration datasets under 12 bit budgets. + +## Calibration Dataset Generation Tool + +This tool generates a small synthensized dataset named branch of science +(denoted as BoS, published on Hugging Face), which includes a few hundred of +textual defintions for science, art and business topics such as Mathematics, +Physics, Chemstry, Law, Music and Journalism etc. The dataset is intended to +validate if the sensitivity property generalize to diverse datasets. + +The tool generates an initial dataset in .csv format which requires further +processing. The output of this tool is random due to the generative nature of +LLM. This tool requires a Llama-2-7B model being served with an OpenAI +compatible RESTful API endpoint. User can either use a hosted API endpoint or +deploy a local instance by following the instruction at the end of this section. + +Once the API endpoint is secured, run the following script to generate the BoS dataset: + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="$HOME/work/lm-quant-toolkit" + +$TOOLKIT_DIR/utils/generate.py \ + --model="meta-llama/Llama-2-7b-chat-hf" \ + --variant="vLLM" \ + --topic-file=topics-l1.txt \ + --trace +~~~~ +Lastly, find the result in the csv files under current directory. + +### Local API endpoint +To deploy a local API endpoint using vLLM, create a virtual environment using +`conda` as follows: + +~~~~bash +conda create -n vllm python=3.11 -y +conda activate vllm +pip install vllm==0.6.4.post1 +~~~~ +Then configure and launch the API server +~~~~bash +#!/bin/bash + +vllm serve meta-llama/Llama-2-7b-chat-hf --dtype auto --api-key token-abc123 +~~~~ +Watch the output vLLm to make sure it starts up successfully. + +# Visualization Tool usage + +The visualization tools facilitate visualizing the experiment results and the +weight distribution, and generating insights of the latent features to quantize +LLMs more efficiently. Most visualization tools are implemented in R and +leverages the open-source plot libraries such as ggplot2, circlize, ggbreak, +ggmagnify. They provide CLI interface to simplify integaration with the +quantization harness tool. + +These CLI tools support diverse options to allow user specify input dataset, +select particular model or approach to plot. To get help on these specific CLI +options, type `./plot_xxx.R --help` on command line prompt. For instance, +to get help on the MXQ allocation visualization tool, you may run command as +follows: + +~~~~bash +./plot-mxq-allocation.R --help +Usage: ./plot-mxq-allocation.R [options] + +Options: + -h, --help + Show this help message and exit + + -m CHARACTER, --model=CHARACTER + Model ID + + -b DOUBLE, --budget=DOUBLE + Bit Budget + + -d CHARACTER, --baseline_data_dir=CHARACTER + Data directory of baseline results + + -q CHARACTER, --quant_cfg_allot_file=CHARACTER + The combined quant config allocation csv file + + --attempt1=CHARACTER + The first attempt to plot + + --attempt2=CHARACTER + The second attempt to plot + + --fnorm + Display FNorm value in the bar chart +~~~~ + +## Weight Distribution Visualization Tool + +This tool enables visualizing layer-wised weight distribution of large language +models. It is implemented as an R script, which provides a convenient CLI +interface to enable shell scripting. Given a weight distribution metrics csv +file, it produces a pdf file under the `pdfs` with 3x3 sub-plots of column +digrams for the 9 modules in the Llama family models. + +The tool is named `plot-wdist-llm.R` and located under the +`data-vis` folder in the `lm-quant-toolkit` project. A typical usage +is demonstrated in the code snippet as follows: + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="$HOME/work/lm-quant-toolkit" + +$TOOLKIT_DIR/data-vis/plot-wdist-llm.R -m Llama-2-7b-hf +~~~~ + +## Perplexity vs Bit Budget Visualization Tool + +This tool enables visualizing the relationship between perplexity and bit +budget for diverse MXQ experiments against their baselines. The generated +diagram shows how memory reduction affects perplexity, which facilitates +memory-accuracy trade-off. + +The tool is named `plot-ppl-mem.R` and located under the `data-vis` +folder in the `lm-quant-toolkit` project. It accepts a csv file containing +the perplexity metrics of MXQ and its baselines. The output are series of PDF +files corresponding to the models defined in the input file, which are placed +under the `pdfs` subfolder. A typical usage is demonstrated in the code +snippet as follows: + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="$HOME/work/lm-quant-toolkit" + +$TOOLKIT_DIR/data-vis/plot-ppl-mem.R -d data/combined.csv +~~~~ + +## Quantization Speed Comparison Visualization Tool + +This tool generates column digrams to explore the quantization speed among +various approaches. The tool is also implemented as an R script, which provides a +convenient CLI interface to enable shell scripting. The tool is named +`plot-quant-speed.R` and located under the `data-vis` folder in the +`lm-quant-toolkit` project. Given a combined perplexity metrics csv file, +it produces a column digrams with x-axis in log-scale. Similar to other tools, +the PDF file is placed under the `pdfs` subfolder. A typical usage is +demonstrated in the code snippet as follows: + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="$HOME/work/lm-quant-toolkit" + +$TOOLKIT_DIR/data-vis/plot-quant-speed.R -d data/combined.csv +~~~~ + +## GPU Memory Usage Visualization Tool + +This tool generates column digrams to present the actual GPU memory consumption +of LLMs quantized by diverse methods. The tool is also implemented as an R script, +which provides a convenient CLI interface to enable shell scripting. The tool +is named `plot-mem-consumption.R` and located under the `data-vis` +folder in the `lm-quant-toolkit` project. Given a combined perplexity +metrics csv file, it produces a column digrams of GPU memory usage in +Giga-byte. Similar to other tools, the PDF file is placed under the `pdfs` +subfolder. A typical usage is demonstrated in the code snippet as follows: + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="$HOME/work/lm-quant-toolkit" + +$TOOLKIT_DIR/data-vis/plot-mem-consumption.R -d data/combined.csv +~~~~ + +## Quantization Configuration Allocation Visualization Tool + +This tool offers insights into the way MXQ and its variants allocate bit budget +to modules and layers. The variants, a.k.a. attempt, to include in the plot are +configurable. A maximium of 4 variants can be plotted in a circular layout +thanks to plot library circlize \citep{zuguang_2014}. +The first input expected by the tool is a combined quantization configuration +allocation csv file which should include experiment outcome for diverse methods +such as HQQ and MXQ. The second parameter is the directory where Frobenius +norms csv files are located. The third parameter is the perplexity score csv +file. The tool produces circos digram in PDF format. + +The tool is named `plot-circos-allot.R` and located under the +`data-vis` folder in the `lm-quant-toolkit` project. A typical usage +is demonstrated in the code snippet as follows: + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="../../.." + +MODELS=" +Llama-3-7b-hf +Llama-3-13b-hf +Meta-Llama-3-8B +" +BUDGETS="4.25 3.51" + +STOP=2 +TOPM=2 +for MODEL in $MODELS; do + for BUDGET in $BUDGETS; do + $TOOLKIT_DIR/data-vis/plot-circos-allot.R \ + --model $MODEL \ + --budget $BUDGET \ + --fnorm_data_dir $TOOLKIT_DIR/src/data/ \ + --ppl_csv_file data/combined.csv \ + --quant_cfg_allot_file data/quant-cfg-allocation.csv \ + --attempt1 sensi-boost-${STOP}-${TOPM} \ + --attempt2 kurt-boost-${STOP}-${TOPM} \ + --attempt3 hqq\ + --attempt4 mxq1 + done +done +~~~~ + +This code snippet demonstrates how to generate a quant config allocation +comparison diagram to examine the nuanced difference between the SensiBoost and +kurtBoost approaches, with a stop of 2 and top-{m} 2, as well as the HQQ and +MXQ baselines. + +## SensiBoost/KurtBoost Win-Tie-Loss Visualization Tool + +This tool enables qualitative analysis of effectiveness of the proposed +SensiBoost and KurtBoost methods. It is implemented as an R script, which +provides a conventional CLI interface to ease automation. +Given a combined perplexity metrics csv file, it produces a series of column +digrams in PDF format. The csv file should include experiment outcome for +SensiBoost, KurtBoost, the ablation tests or baseline such as HQQ and MXQ. The +name experiment, a.k.a. attempt, should follow the pattern +`--`. + +This tool is included in the `lm-quant-toolkit` under `data-vis` +folder. A typical usage is demonstrated in the code snippet as follows: + +~~~~bash +#!/bin/bash + +TOOLKIT_DIR="$HOME/work/lm-quant-toolkit" + +$TOOLKIT_DIR/data-vis/plot-win-tie-loss.R -f data/combined.csv +~~~~ + +[1]: https://huggingface.co/docs/leaderboards/leaderboards/intro +[2]: https://github.com/schnell18/lm-quant-toolkit.git diff --git a/lm-quant-toolkit/pyproject.toml b/lm-quant-toolkit/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..f4a6ea95ecf3b0ba338dd93fc425128425804e5c --- /dev/null +++ b/lm-quant-toolkit/pyproject.toml @@ -0,0 +1,70 @@ +[build-system] +requires = ['setuptools', 'setuptools_scm'] +build-backend = 'setuptools.build_meta' + +[project] +name = 'lm_quant_toolkit' +description = 'LLM Quantization Evaluation Harness' +readme = 'README.md' +license = {file = 'LICENSE'} +authors = [{name='Justin Zhang', email='schnell18@gmail.com'}] +dependencies = [ + # "-e git+https://github.com/casper-hansen/AutoAWQ@5f3785dcaa107ca76f5fa5355f459370c86f82d6#egg=autoawq", + # "-e git+ssh://git@github.com/schnell18/hqq.git@5ba2243049f0b96fe5d8843693f919faeb560c02#egg=hqq", + # "-e git+https://github.com/EleutherAI/lm-evaluation-harness@928e8bb6f50d1e93ef5d0bcaa81f8c5fd9a6f4d8#egg=lm_eval", + "accelerate>=0.30.1", + "bitsandbytes>0.37.0", + "antlr4-python3-runtime==4.11.0", + "datasets==2.20.0", + "Jinja2==3.1.4", + "langdetect==1.0.9", + "nltk==3.9.1", + "numpy==1.26.4", + "optimum>=1.21.4", + "pandas==2.2.2", + "safetensors==0.4.3", + "scikit-learn==1.4.2", + "scipy==1.13.0", + "sentencepiece==0.2.0", + "tokenizers>=0.19.1", + "torch>=2.1.0", + "tqdm==4.66.4", + "transformers>=4.41.2" + # "triton>=2.3.0", +] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT No Attribution License (MIT-0)", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: Implementation :: CPython", +] +requires-python = '>=3.7' +dynamic = ['version'] + +[project.scripts] +#fnorm = 'lm_quant_toolkit.prep.fnorm:main' + +[tools.setuptools] + package-dir = {'' = 'src'} + +[tools.setuptools.dynamic] +version = {attr = 'lm_quant_toolkit.version.version'} + +[tool.setuptools_scm] +version_scheme = 'python-simplified-semver' +local_scheme = 'no-local-version' + +[project.urls] +'Homepage' = 'https://github.com/schnell18/lm-quant-toolkit' + +[project.optional-dependencies] +dev = ["bumpver", "pip-tools"] +test = [ 'tox' ] +doc = ['sphinx'] diff --git a/lm-quant-toolkit/setup-harness.sh b/lm-quant-toolkit/setup-harness.sh new file mode 100644 index 0000000000000000000000000000000000000000..942de8faf8d1eb9e7123328bd84737d35ba3d7cc --- /dev/null +++ b/lm-quant-toolkit/setup-harness.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# check if python is installed +which python > /dev/null +if [[ $? -ne 0 ]]; then + echo "python is not installed!" + exit 1 +fi + +# check if miniconda is installed +# if [[ ! -d ~/miniconda3 ]]; then +# echo "miniconda is not installed!" +# exit 2 +# fi + +# check the current activated env +# if [[ $CONDA_DEFAULT_ENV == "base" ]]; then +# echo "Please switch to an environment other than base!" +# exit 3 +# fi + +OLD_DIR=$(pwd) + +# perform an editable install of the lm-quant-toolkit project +# to install all dependencies that are published on PyPI + +python -m pip install -e . + +# install the patched dependencies from source +# clone patched AutoGPTQ from https://github.com/schnell18/AutoGPTQ.git + +# git clone https://github.com/schnell18/AutoGPTQ.git .deps/AutoGPTQ +cd .deps/AutoGPTQ +python -m pip install -e . +cd $OLD_DIR +# 报错,没装上 + +# clone patched hqq from https://github.com/schnell18/hqq.git + +# git clone https://github.com/schnell18/hqq.git .deps/hqq +cd .deps/hqq +python -m pip install -e . +cd $OLD_DIR + +# clone patched lm-evaluation-harness from https://github.com/schnell18/lm-evaluation-harness.git + +# git clone https://github.com/schnell18/lm-evaluation-harness.git .deps/lm-evaluation-harness +cd .deps/lm-evaluation-harness +python -m pip install -e . +cd $OLD_DIR + +# clone patched lm-evaluation-harness from https://github.com/schnell18/CLIP_benchmark.git + +# git clone https://github.com/schnell18/CLIP_benchmark.git .deps/CLIP_benchmark +cd .deps/CLIP_benchmark +python -m pip install -e . +cd $OLD_DIR diff --git a/lm-quant-toolkit/setup-visualization.sh b/lm-quant-toolkit/setup-visualization.sh new file mode 100644 index 0000000000000000000000000000000000000000..0eb4190bf2bdaf2111ba1144131e47fb6fa4998b --- /dev/null +++ b/lm-quant-toolkit/setup-visualization.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +# check if R is installed +which R > /dev/null +if [[ $? -ne 0 ]]; then + echo "R is not installed!" + exit 1 +fi + +which Rscript > /dev/null +if [[ $? -ne 0 ]]; then + echo "Rscript is not installed!" + exit 1 +fi + +Rscript -e ' +install.packages( + c( + "dplyr", + "ggbreak", + "ggplot2", + "ggthemes", + "jsonlite", + "kableExtra", + "knitr", + "openxlsx", + "optparse", + "patchwork", + "plotly", + "plyr", + "pracma", + "RColorBrewer", + "readr", + "safetensors", + "stringr", + "this.path", + "tidyverse" + ) +) + +if (!require("BiocManager", quietly = TRUE)) + install.packages("BiocManager") + +BiocManager::install("ComplexHeatmap") + +install.packages( + "ggmagnify", + repos = c( + "https://hughjonesd.r-universe.dev", + "https://cloud.r-project.org" + ) +) +' diff --git a/lm-quant-toolkit/test.py b/lm-quant-toolkit/test.py new file mode 100644 index 0000000000000000000000000000000000000000..699b5936332ef87e532c9e84968c298f27ab3381 --- /dev/null +++ b/lm-quant-toolkit/test.py @@ -0,0 +1,19 @@ +import pandas as pd +import json +import os +import argparse +parser = argparse.ArgumentParser(description="") +parser.add_argument( + "--model", + type=str, + default="Llama-3.1-70B-Instruct", + ) +args = parser.parse_args() + +file_path =f'/mnt/bn/life-mllm/users/cxr/quantization/lm-quant-toolkit/tmp/kurtosis-dump/{args.model}/kurtosis-models.csv' +df = pd.read_csv(file_path) +kurtosis_means = df.groupby("layer")["kurtosis"].mean().tolist() + +with open(f"kurtosis_means/kurtosis_means-{args.model}.json", "w") as f: + json.dump(kurtosis_means, f, indent=4) + diff --git a/lm-quant-toolkit/test.sh b/lm-quant-toolkit/test.sh new file mode 100644 index 0000000000000000000000000000000000000000..47ceafd277cf52e533f4540e76fb2bbfa9a32672 --- /dev/null +++ b/lm-quant-toolkit/test.sh @@ -0,0 +1,15 @@ +# model_id=("Qwen3-4B" "Qwen3-8B" "Llama-3.2-3B-Instruct" "Llama-2-13b-hf") +model_id=("Llama-3.1-70B-Instruct") + +for m in "${model_id[@]}"; do + echo $m + MODELS="../models/$m" + # MODELS="meta-llama/Llama-2-7b-hf" + mkdir -p tmp/kurtosis-dump/"$(basename $MODELS)" + python src/dump.py kurtosis \ + --model $MODELS \ + --output-dir tmp/kurtosis-dump/"$(basename $MODELS)" + + python test.py --model $m + +done diff --git a/lm-quant-toolkit/tox.ini b/lm-quant-toolkit/tox.ini new file mode 100644 index 0000000000000000000000000000000000000000..c26230cfa2430e2929db582794766fc4eb80f898 --- /dev/null +++ b/lm-quant-toolkit/tox.ini @@ -0,0 +1,59 @@ +[tox] +envlist = + py311, + flake8, + pycodestyle, + pydocstyle, + docs + +[py] +deps= + pytest-cov + pytest-random + pytest-remove-stale-bytecode + +[testenv:py311] +deps= + {[py]deps} +basepython = python3.11 +commands = pytest -v --random --cov=src/lm_quant_toolkit --cov-report=term --cov-report=html + +[testenv:py310] +deps= + {[py]deps} +basepython = python3.10 +commands = pytest -v --random --cov=src/lm_quant_toolkit --cov-report=term --cov-report=html + +[testenv:py39] +deps= + {[py]deps} +basepython = python3.9 +commands = pytest -v --random --cov=src/lm_quant_toolkit --cov-report=term --cov-report=html + +[testenv:pypy3] +deps= + {[py]deps} +basepython = pypy3 +commands = pytest -v --random --cov=src/lm_quant_toolkit --cov-report=term --cov-report=html + +[testenv:flake8] +exclude = .tox/* +deps = flake8 +commands = flake8 src + +[testenv:pycodestyle] +show-source=True +statistics=True +exclude=.git,__pycache__,.tox/*,docs/* +deps=pycodestyle +commands = pycodestyle -v --first src + +[testenv:pydocstyle] +deps=pydocstyle +commands = pydocstyle -v --match='(?!test_|version)(.*)?\.py' src + +[testenv:docs] +deps= + Sphinx + sphinx_rtd_theme +commands = sphinx-build -M html docs/source docs/build